2.51.90 25/305925/1 upstream upstream/2.51.90
authorArtur Świgoń <a.swigon@samsung.com>
Tue, 13 Feb 2024 17:23:58 +0000 (18:23 +0100)
committerArtur Świgoń <a.swigon@samsung.com>
Tue, 13 Feb 2024 17:25:35 +0000 (18:25 +0100)
Change-Id: I48c28aca2d363c4481e265f24bb49b27abeeea0d

534 files changed:
.clang-format [new file with mode: 0644]
.gitignore [new file with mode: 0644]
.gitlab-ci.yml
.gitlab-ci/README.md [deleted file]
.gitlab-ci/gen-coverage.sh [deleted file]
.gitlab-ci/opensuse.Dockerfile [deleted file]
.gitlab-ci/run-docker.sh [deleted file]
.gitlab-ci/run-style-check.sh [deleted file]
.gitlab-ci/run-tests.sh [deleted file]
.gitlab-ci/search-common-ancestor.sh [deleted file]
AUTHORS [deleted file]
INSTALL
NEWS
README.md
README.msvc [new file with mode: 0644]
at-spi2-atk.desktop [new file with mode: 0644]
at-spi2-core.doap
atk-adaptor/accessible-cache.c [new file with mode: 0644]
atk-adaptor/accessible-cache.h [new file with mode: 0644]
atk-adaptor/accessible-leasing.c [new file with mode: 0644]
atk-adaptor/accessible-leasing.h [new file with mode: 0644]
atk-adaptor/accessible-register.c [new file with mode: 0644]
atk-adaptor/accessible-register.h [new file with mode: 0644]
atk-adaptor/accessible-stateset.c [new file with mode: 0644]
atk-adaptor/accessible-stateset.h [new file with mode: 0644]
atk-adaptor/adaptors/accessible-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/action-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/adaptors.h [new file with mode: 0644]
atk-adaptor/adaptors/application-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/cache-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/collection-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/component-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/document-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/editabletext-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/hyperlink-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/hypertext-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/image-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/meson.build [new file with mode: 0644]
atk-adaptor/adaptors/selection-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/socket-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/streamablecontent-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/table-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/table-cell-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/text-adaptor.c [new file with mode: 0644]
atk-adaptor/adaptors/value-adaptor.c [new file with mode: 0644]
atk-adaptor/atk-bridge.h [moved from atspi/atspi-mutter-private.h with 68% similarity]
atk-adaptor/atkbridge.symbols [new file with mode: 0644]
atk-adaptor/bitarray.h [new file with mode: 0644]
atk-adaptor/bridge.c [new file with mode: 0644]
atk-adaptor/bridge.h [new file with mode: 0644]
atk-adaptor/event.c [new file with mode: 0644]
atk-adaptor/event.h [new file with mode: 0644]
atk-adaptor/gtk-2.0/module.c [new file with mode: 0644]
atk-adaptor/meson.build [new file with mode: 0644]
atk-adaptor/object.c [new file with mode: 0644]
atk-adaptor/object.h [new file with mode: 0644]
atk-adaptor/spi-dbus.c [new file with mode: 0644]
atk-adaptor/spi-dbus.h [new file with mode: 0644]
atk/.gitignore [new file with mode: 0644]
atk/atk-autocleanups.h [new file with mode: 0644]
atk/atk-enum-types.c.template [new file with mode: 0644]
atk/atk-enum-types.h.template [new file with mode: 0644]
atk/atk.h [new file with mode: 0644]
atk/atk.rc.in [new file with mode: 0644]
atk/atkaction.c [new file with mode: 0644]
atk/atkaction.h [new file with mode: 0644]
atk/atkcomponent.c [new file with mode: 0644]
atk/atkcomponent.h [new file with mode: 0644]
atk/atkdocument.c [new file with mode: 0644]
atk/atkdocument.h [new file with mode: 0644]
atk/atkeditabletext.c [new file with mode: 0644]
atk/atkeditabletext.h [new file with mode: 0644]
atk/atkgobjectaccessible.c [new file with mode: 0644]
atk/atkgobjectaccessible.h [new file with mode: 0644]
atk/atkhyperlink.c [new file with mode: 0644]
atk/atkhyperlink.h [new file with mode: 0644]
atk/atkhyperlinkimpl.c [new file with mode: 0644]
atk/atkhyperlinkimpl.h [new file with mode: 0644]
atk/atkhypertext.c [new file with mode: 0644]
atk/atkhypertext.h [new file with mode: 0644]
atk/atkimage.c [new file with mode: 0644]
atk/atkimage.h [new file with mode: 0644]
atk/atkmarshal.list [new file with mode: 0644]
atk/atkmisc.c [new file with mode: 0644]
atk/atkmisc.h [new file with mode: 0644]
atk/atknoopobject.c [new file with mode: 0644]
atk/atknoopobject.h [new file with mode: 0644]
atk/atknoopobjectfactory.c [new file with mode: 0644]
atk/atknoopobjectfactory.h [new file with mode: 0644]
atk/atkobject.c [new file with mode: 0644]
atk/atkobject.h [new file with mode: 0644]
atk/atkobjectfactory.c [new file with mode: 0644]
atk/atkobjectfactory.h [new file with mode: 0644]
atk/atkplug.c [new file with mode: 0644]
atk/atkplug.h [new file with mode: 0644]
atk/atkprivate.c [new file with mode: 0644]
atk/atkprivate.h [new file with mode: 0644]
atk/atkrange.c [new file with mode: 0644]
atk/atkrange.h [new file with mode: 0644]
atk/atkregistry.c [new file with mode: 0644]
atk/atkregistry.h [new file with mode: 0644]
atk/atkrelation.c [new file with mode: 0644]
atk/atkrelation.h [new file with mode: 0644]
atk/atkrelationset.c [new file with mode: 0644]
atk/atkrelationset.h [new file with mode: 0644]
atk/atkrelationtype.h [new file with mode: 0644]
atk/atkselection.c [new file with mode: 0644]
atk/atkselection.h [new file with mode: 0644]
atk/atksocket.c [new file with mode: 0644]
atk/atksocket.h [new file with mode: 0644]
atk/atkstate.c [new file with mode: 0644]
atk/atkstate.h [new file with mode: 0644]
atk/atkstateset.c [new file with mode: 0644]
atk/atkstateset.h [new file with mode: 0644]
atk/atkstreamablecontent.c [new file with mode: 0644]
atk/atkstreamablecontent.h [new file with mode: 0644]
atk/atktable.c [new file with mode: 0644]
atk/atktable.h [new file with mode: 0644]
atk/atktablecell.c [new file with mode: 0644]
atk/atktablecell.h [new file with mode: 0644]
atk/atktext.c [new file with mode: 0644]
atk/atktext.h [new file with mode: 0644]
atk/atkutil.c [new file with mode: 0644]
atk/atkutil.h [new file with mode: 0644]
atk/atkvalue.c [new file with mode: 0644]
atk/atkvalue.h [new file with mode: 0644]
atk/atkversion.c [new file with mode: 0644]
atk/atkversion.h.in [new file with mode: 0644]
atk/atkwindow.c [new file with mode: 0644]
atk/atkwindow.h [new file with mode: 0644]
atk/meson.build [new file with mode: 0644]
atspi/atspi-accessible-private.h
atspi/atspi-accessible.c
atspi/atspi-accessible.h
atspi/atspi-action.c
atspi/atspi-action.h
atspi/atspi-application.c
atspi/atspi-application.h
atspi/atspi-collection.c
atspi/atspi-collection.h
atspi/atspi-component.c
atspi/atspi-component.h
atspi/atspi-constants.h
atspi/atspi-device-legacy.c
atspi/atspi-device-legacy.h
atspi/atspi-device-listener-private.h
atspi/atspi-device-listener.c
atspi/atspi-device-listener.h
atspi/atspi-device-mutter.c [new file with mode: 0644]
atspi/atspi-device-mutter.h [new file with mode: 0644]
atspi/atspi-device-x11.c
atspi/atspi-device-x11.h
atspi/atspi-device.c
atspi/atspi-device.h
atspi/atspi-document.c
atspi/atspi-document.h
atspi/atspi-editabletext.c
atspi/atspi-editabletext.h
atspi/atspi-event-listener-private.h
atspi/atspi-event-listener.c
atspi/atspi-event-listener.h
atspi/atspi-gmain.c
atspi/atspi-gmain.h
atspi/atspi-hyperlink.c
atspi/atspi-hyperlink.h
atspi/atspi-hypertext.c
atspi/atspi-hypertext.h
atspi/atspi-image.c
atspi/atspi-image.h
atspi/atspi-matchrule-private.h
atspi/atspi-matchrule.c
atspi/atspi-matchrule.h
atspi/atspi-misc-private.h
atspi/atspi-misc.c
atspi/atspi-misc.h
atspi/atspi-mutter.c [deleted file]
atspi/atspi-object.c
atspi/atspi-object.h
atspi/atspi-private.h
atspi/atspi-registry.c
atspi/atspi-registry.h
atspi/atspi-relation.c
atspi/atspi-relation.h
atspi/atspi-selection.c
atspi/atspi-selection.h
atspi/atspi-stateset.c
atspi/atspi-stateset.h
atspi/atspi-table-cell.c
atspi/atspi-table-cell.h
atspi/atspi-table.c
atspi/atspi-table.h
atspi/atspi-text.c
atspi/atspi-text.h
atspi/atspi-types.h
atspi/atspi-value.c
atspi/atspi-value.h
atspi/atspi-version.h.in [new file with mode: 0644]
atspi/atspi.h
atspi/meson.build
atspi/org.gnome.Mutter.RemoteDesktop.xml [new file with mode: 0644]
atspi/org.gnome.Mutter.ScreenCast.xml [new file with mode: 0644]
atspi/org.gnome.Shell.Introspect.xml [new file with mode: 0644]
bus/at-spi-bus-launcher.c
bus/at-spi-dbus-bus.service.in
bus/meson.build
ci/README.md [new file with mode: 0644]
ci/address-sanitizer.supp [new file with mode: 0644]
ci/container_builds.yml [new file with mode: 0644]
ci/env.sh [new file with mode: 0644]
ci/install-python-tools.sh [new file with mode: 0644]
ci/install-rust.sh [new file with mode: 0644]
ci/lcovrc [moved from .gitlab-ci/lcovrc with 100% similarity]
ci/pull-container-image.sh [new file with mode: 0644]
ci/requirements.txt [new file with mode: 0644]
ci/run-registryd-tests.sh [new file with mode: 0755]
ci/run-style-check.sh [new file with mode: 0755]
ci/run-tests.sh [new file with mode: 0755]
dbind/dbind-any.c
dbind/dbind-any.h
dbind/dbind.c
dbind/dbind.h
dbind/dbtest.c
devel-docs/architecture-modules.svg [new file with mode: 0644]
devel-docs/architecture.rst [new file with mode: 0644]
devel-docs/at-spi3.rst [new file with mode: 0644]
devel-docs/atk-deprecations.rst [new file with mode: 0644]
devel-docs/atspi-python-stack.rst [new file with mode: 0644]
devel-docs/conf.py [new file with mode: 0644]
devel-docs/de-controller.rst [new file with mode: 0644]
devel-docs/gitlab-ci.md [deleted file]
devel-docs/gitlab-ci.rst [new file with mode: 0644]
devel-docs/index.rst [new file with mode: 0644]
devel-docs/meeting-2023-01-13.rst [new file with mode: 0644]
devel-docs/meson.build [new file with mode: 0644]
devel-docs/new-protocol.rst [new file with mode: 0644]
devel-docs/roadmap.rst [new file with mode: 0644]
devel-docs/toolkits.rst [new file with mode: 0644]
devel-docs/xml-changes.rst [new file with mode: 0644]
devel-docs/xml-interfaces.rst [new file with mode: 0644]
doc/atk.toml.in [new file with mode: 0644]
doc/libatspi.toml.in [new file with mode: 0644]
doc/libatspi/Makefile.am [deleted file]
doc/libatspi/libatspi-docs.sgml [deleted file]
doc/libatspi/libatspi-sections.txt [deleted file]
doc/libatspi/libatspi.types [deleted file]
doc/libatspi/meson.build [deleted file]
doc/libatspi/tmpl/atspi-accessible.sgml [deleted file]
doc/libatspi/tmpl/atspi-action.sgml [deleted file]
doc/libatspi/tmpl/atspi-application.sgml [deleted file]
doc/libatspi/tmpl/atspi-collection.sgml [deleted file]
doc/libatspi/tmpl/atspi-component.sgml [deleted file]
doc/libatspi/tmpl/atspi-constants.sgml [deleted file]
doc/libatspi/tmpl/atspi-device-listener.sgml [deleted file]
doc/libatspi/tmpl/atspi-document.sgml [deleted file]
doc/libatspi/tmpl/atspi-editabletext.sgml [deleted file]
doc/libatspi/tmpl/atspi-event-listener.sgml [deleted file]
doc/libatspi/tmpl/atspi-hyperlink.sgml [deleted file]
doc/libatspi/tmpl/atspi-hypertext.sgml [deleted file]
doc/libatspi/tmpl/atspi-image.sgml [deleted file]
doc/libatspi/tmpl/atspi-listener-private.sgml [deleted file]
doc/libatspi/tmpl/atspi-matchrule.sgml [deleted file]
doc/libatspi/tmpl/atspi-misc-private.sgml [deleted file]
doc/libatspi/tmpl/atspi-misc.sgml [deleted file]
doc/libatspi/tmpl/atspi-object.sgml [deleted file]
doc/libatspi/tmpl/atspi-registry.sgml [deleted file]
doc/libatspi/tmpl/atspi-relation.sgml [deleted file]
doc/libatspi/tmpl/atspi-selection.sgml [deleted file]
doc/libatspi/tmpl/atspi-stateset.sgml [deleted file]
doc/libatspi/tmpl/atspi-table.sgml [deleted file]
doc/libatspi/tmpl/atspi-text.sgml [deleted file]
doc/libatspi/tmpl/atspi-types.sgml [deleted file]
doc/libatspi/tmpl/atspi-value.sgml [deleted file]
doc/libatspi/tmpl/libatspi-unused.sgml [deleted file]
doc/libatspi/version.xml.in [deleted file]
doc/logo.png [new file with mode: 0644]
doc/meson.build [new file with mode: 0644]
doc/urlmap.js [new file with mode: 0644]
droute/droute-pairhash.c [new file with mode: 0644]
droute/droute-pairhash.h [new file with mode: 0644]
droute/droute-test.c [new file with mode: 0644]
droute/droute-variant.c [new file with mode: 0644]
droute/droute-variant.h [new file with mode: 0644]
droute/droute.c [new file with mode: 0644]
droute/droute.h [new file with mode: 0644]
droute/meson.build [new file with mode: 0644]
meson.build
meson_options.txt
po/LINGUAS
po/POTFILES.in
po/POTFILES.skip [new file with mode: 0644]
po/ab.po
po/af.po [new file with mode: 0644]
po/am.po [new file with mode: 0644]
po/an.po
po/ar.po [new file with mode: 0644]
po/as.po
po/ast.po
po/az.po [new file with mode: 0644]
po/be.po
po/be@latin.po [new file with mode: 0644]
po/bg.po
po/bn.po [new file with mode: 0644]
po/bn_IN.po
po/bs.po
po/ca.po
po/ca@valencia.po
po/ckb.po [new file with mode: 0644]
po/cs.po
po/cy.po [new file with mode: 0644]
po/da.po
po/de.po
po/dz.po [new file with mode: 0644]
po/el.po
po/en@shaw.po [new file with mode: 0644]
po/en_CA.po
po/en_GB.po
po/eo.po
po/es.po
po/et.po
po/eu.po
po/fa.po
po/fi.po
po/fr.po
po/fur.po
po/ga.po
po/gd.po
po/gl.po
po/gu.po
po/he.po
po/hi.po
po/hr.po
po/hu.po
po/hy.po [new file with mode: 0644]
po/id.po
po/is.po
po/it.po
po/ja.po
po/ka.po [new file with mode: 0644]
po/kk.po
po/km.po
po/kn.po
po/ko.po
po/ku.po [new file with mode: 0644]
po/li.po [new file with mode: 0644]
po/lt.po
po/lv.po
po/mai.po [new file with mode: 0644]
po/mk.po [new file with mode: 0644]
po/ml.po
po/mn.po [new file with mode: 0644]
po/mr.po
po/ms.po
po/nb.po
po/ne.po
po/nl.po
po/nn.po [new file with mode: 0644]
po/oc.po
po/or.po
po/pa.po
po/pl.po
po/ps.po [new file with mode: 0644]
po/pt.po
po/pt_BR.po
po/ro.po
po/ru.po
po/rw.po [new file with mode: 0644]
po/si.po [new file with mode: 0644]
po/sk.po
po/sl.po
po/sq.po
po/sr.po
po/sr@ije.po [new file with mode: 0644]
po/sr@latin.po
po/sv.po
po/ta.po
po/te.po
po/tg.po
po/th.po [new file with mode: 0644]
po/tk.po [new file with mode: 0644]
po/tr.po
po/tt.po [new file with mode: 0644]
po/ug.po
po/uk.po
po/vi.po
po/wa.po [new file with mode: 0644]
po/xh.po [new file with mode: 0644]
po/yi.po [new file with mode: 0644]
po/zh_CN.po
po/zh_HK.po
po/zh_TW.po
po/zu.po [new file with mode: 0644]
registryd/de-marshaller.c [deleted file]
registryd/de-types.h
registryd/deviceeventcontroller-x11.c
registryd/deviceeventcontroller-x11.h
registryd/deviceeventcontroller.c
registryd/deviceeventcontroller.h
registryd/display.c
registryd/event-source.c
registryd/event-source.h
registryd/introspection.c [deleted file]
registryd/introspection.h [deleted file]
registryd/keymasks.h
registryd/marshal-dbus.c [new file with mode: 0644]
registryd/marshal-dbus.h [moved from registryd/de-marshaller.h with 76% similarity]
registryd/meson.build
registryd/paths.h
registryd/reentrant-list.c
registryd/reentrant-list.h
registryd/registry-main.c
registryd/registry.c
registryd/registry.h
registryd/testregistry.py [deleted file]
registryd/ucs2keysym.c
subprojects/gi-docgen.wrap [new file with mode: 0644]
subprojects/glib.wrap [new file with mode: 0644]
subprojects/libffi.wrap [new file with mode: 0644]
subprojects/proxy-libintl.wrap [new file with mode: 0644]
subprojects/zlib.wrap [new file with mode: 0644]
tests/.gitignore [new file with mode: 0644]
tests/at-spi2-atk/README [new file with mode: 0644]
tests/at-spi2-atk/atk-object-xml-loader.c [new file with mode: 0644]
tests/at-spi2-atk/atk-object-xml-loader.h [new file with mode: 0644]
tests/at-spi2-atk/atk_suite.c [new file with mode: 0644]
tests/at-spi2-atk/atk_suite.h [new file with mode: 0644]
tests/at-spi2-atk/atk_test_accessible.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_action.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_collection.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_component.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_document.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_editable_text.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_hyperlink.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_hypertext.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_image.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_selection.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_state_set.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_table.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_table_cell.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_text.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_util.c [new file with mode: 0644]
tests/at-spi2-atk/atk_test_util.h [new file with mode: 0644]
tests/at-spi2-atk/atk_test_value.c [new file with mode: 0644]
tests/at-spi2-atk/data/test-accessible.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-action.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-collection.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-component.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-document.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-editable-text.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-hypertext.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-image.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-selection.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-table.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-text.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test-value.xml [new file with mode: 0644]
tests/at-spi2-atk/data/test.xml [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/meson.build [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-action.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-action.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-component.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-component.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-document.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-document.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-editable-text.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-editable-text.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-hyperlink.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-hyperlink.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-hypertext.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-hypertext.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-image.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-image.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-object.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-object.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-selection.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-selection.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-table-cell.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-table-cell.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-table.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-table.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-text.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-text.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-value.c [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk-value.h [new file with mode: 0644]
tests/at-spi2-atk/dummyatk/my-atk.h [new file with mode: 0644]
tests/at-spi2-atk/meson.build [new file with mode: 0644]
tests/at-spi2-atk/test-application.c [new file with mode: 0644]
tests/atk/README [new file with mode: 0644]
tests/atk/meson.build [new file with mode: 0644]
tests/atk/testatk_vc.mak [new file with mode: 0644]
tests/atk/testdocument.c [new file with mode: 0644]
tests/atk/testrelation.c [new file with mode: 0644]
tests/atk/testrole.c [new file with mode: 0644]
tests/atk/teststateset.c [new file with mode: 0644]
tests/atk/testvalue.c [new file with mode: 0644]
tests/atspi/memory.c [moved from test/memory.c with 65% similarity]
tests/atspi/meson.build [moved from test/meson.build with 84% similarity]
tests/atspi/test-application.c [moved from test/test-application.c with 89% similarity]
tests/dbusmock/mock-gnome-session.py [new file with mode: 0644]
tests/dbusmock/mock_accessible_app.py [new file with mode: 0644]
tests/meson.build [new file with mode: 0644]
tests/registryd/__init__.py [new file with mode: 0644]
tests/registryd/conftest.py [new file with mode: 0644]
tests/registryd/test_introspection.py [new file with mode: 0644]
tests/registryd/test_root.py [new file with mode: 0644]
tests/registryd/test_root_accessible.py [new file with mode: 0644]
tests/registryd/test_root_application.py [new file with mode: 0644]
tests/registryd/test_root_component.py [new file with mode: 0644]
tests/registryd/utils.py [new file with mode: 0644]
xml/Accessibility.xml [deleted file]
xml/Accessible.xml
xml/Action.xml
xml/Application.xml
xml/Cache.xml
xml/Collection.xml
xml/Component.xml
xml/DeviceEventController.xml
xml/DeviceEventListener.xml
xml/Document.xml
xml/EditableText.xml
xml/Event.xml
xml/Hyperlink.xml
xml/Hypertext.xml
xml/Image.xml
xml/Registry.xml
xml/Selection.xml
xml/Socket.xml
xml/Table.xml
xml/TableCell.xml
xml/Text.xml
xml/Value.xml
xml/create-introspection.sh [deleted file]
xml/generate-introspection.py [new file with mode: 0644]
xml/meson.build [new file with mode: 0644]
xml/remove-annotations.xsl [deleted file]
xml/versioned-introspection.py [deleted file]

diff --git a/.clang-format b/.clang-format
new file mode 100644 (file)
index 0000000..59804f8
--- /dev/null
@@ -0,0 +1,13 @@
+# See https://gnome.pages.gitlab.gnome.org/at-spi2-core/devel-docs/gitlab-ci.html#code-formatting
+# for documentation about this configuration for code formatting.
+
+BasedOnStyle: GNU
+AlwaysBreakAfterDefinitionReturnType: All
+BreakBeforeBinaryOperators: None
+BinPackParameters: false
+SpaceAfterCStyleCast: true
+# Our column limit is actually 80, but setting that results in clang-format
+# making a lot of dubious hanging-indent choices; disable it and assume the
+# developer will line wrap appropriately. clang-format will still check
+# existing hanging indents.
+ColumnLimit: 0
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..b25c15b
--- /dev/null
@@ -0,0 +1 @@
+*~
index 963a79e..3290bfd 100644 (file)
 #
 # Introduction to Gitlab CI: https://docs.gitlab.com/ee/ci/quick_start/index.html
 
-variables:
-  OPENSUSE_TUMBLEWEED_IMAGE: "registry.gitlab.gnome.org/gnome/at-spi2-core/opensuse:latest"
+# Include the parameters we need from Freedesktop CI Templates
+include:
+  - local: 'ci/container_builds.yml'
 
 # Stages in the CI pipeline in which jobs will be run
 stages:
-#  - style-check
+  - container-build
+  - style-check
   - build
   - analysis
   - docs
   - deploy
 
-# Base definition for jobs.
-#
-# We have the package dependencies to install on top of a stock opensuse/tumbleweed image,
-# and the rules for when to run each job (on merge requests and on personal branches).
-.only-default:
-  only:
-    - merge_requests
-    - branches
-  except:
-    - tags
-
-# C coding style checker.
-#
-# Disabled for now, since we need to decide to reindent all the code first.
-#
-# style-check-diff:
-#   extends: .only-default
-#   image: fedora:latest
-#   stage: style-check
-#   script:
-#     - dnf install -y clang-tools-extra curl diffutils git
-#     - sh -x ./.gitlab-ci/run-style-check.sh
+# Enable merge request pipelines and avoid duplicate pipelines
+# https://docs.gitlab.com/ee/ci/yaml/index.html#switch-between-branch-pipelines-and-merge-request-pipelines
+workflow:
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push"
+      when: never
+    - if: '$CI_COMMIT_TAG'
+    - if: '$CI_COMMIT_BRANCH'
 
+style-check-diff:
+  extends:
+    - '.container.opensuse@x86_64'
+    - '.fdo.distribution-image@opensuse'
+  needs: ['opensuse-container@x86_64']
+  stage: style-check
+  script:
+    - sh ./ci/run-style-check.sh
 
-# Template for the default build recipe.
+# Default build recipe.
 #
 # Depends on these variables:
 # @MESON_EXTRA_FLAGS: extra arguments for the meson setup invocation
-.build-default:
-  image: $OPENSUSE_TUMBLEWEED_IMAGE
-  extends: .only-default
+opensuse-x86_64:
+  stage: build
+  extends:
+    - '.container.opensuse@x86_64'
+    - '.fdo.distribution-image@opensuse'
+  needs: ['opensuse-container@x86_64']
+  variables:
+    MESON_EXTRA_FLAGS: "--buildtype=debug" # -Dwerror=true
   script:
-    - meson setup ${MESON_EXTRA_FLAGS} --prefix /usr _build .
+    - source ci/env.sh
+    # See https://gitlab.gnome.org/GNOME/at-spi2-core/-/merge_requests/137 for the reason for disable_p2p
+    - meson setup ${MESON_EXTRA_FLAGS} -Ddisable_p2p=true --prefix /usr _build .
     - meson compile -C _build
     - meson install -C _build
     - mkdir /tmp/test+dir+with+funny+chars
     - export XDG_RUNTIME_DIR=/tmp/test+dir+with+funny+chars # See https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/48
-    - dbus-run-session -- .gitlab-ci/run-tests.sh
+    - xvfb-run --auto-servernum dbus-run-session -- ci/run-registryd-tests.sh
+    - xvfb-run --auto-servernum dbus-run-session -- ci/run-tests.sh
   artifacts:
     reports:
-      junit: "_build/meson-logs/testlog.junit.xml"
+      junit:
+        - "_build/meson-logs/testlog.junit.xml"
+        - "_build/tests/registryd/registryd-pytest.junit.xml"
     when: always
     name: "at-spi2-core-${CI_COMMIT_REF_NAME}"
     paths:
-      - "${CI_PROJECT_DIR}/_build/meson-logs"
-      - "${CI_PROJECT_DIR}/_build/atspi/Atspi-2.0.gir"
-
-# Inherit to build the API reference via gi-docgen
-# @PROJECT_DEPS: the dependencies of the project (on Fedora)
-# @MESON_EXTRA_FLAGS: extra arguments for the meson setup invocation
-# @DOCS_FLAGS: doc-related arguments for the meson setup invocation
-# @DOCS_PATH: the docs output directory under the build directory
-# .gidocgen-build:
-#   image: fedora:latest
-#   before_script:
-#     - export PATH="$HOME/.local/bin:$PATH"
-#     - dnf install -y python3 python3-pip python3-wheel gobject-introspection-devel graphviz ninja-build redhat-rpm-config
-#     - dnf install -y ${PROJECT_DEPS}
-#     - pip3 install --user meson==${MESON_VERSION} gi-docgen jinja2 Markdown markupsafe pygments toml typogrify
-#   script:
-#     - meson setup ${MESON_EXTRA_FLAGS} ${DOCS_FLAGS} _docs .
-#     - meson compile -C _docs
-#     - |
-#       pushd "_docs/${DOCS_PATH}" > /dev/null
-#       tar cf ${CI_PROJECT_NAME}-docs.tar .
-#       popd > /dev/null
-#     - mv _docs/${DOCS_PATH}/${CI_PROJECT_NAME}-docs.tar .
-#   artifacts:
-#     when: always
-#     name: 'Documentation'
-#     expose_as: 'Download the API reference'
-#     paths:
-#       - ${CI_PROJECT_NAME}-docs.tar
+      - "_build/meson-logs"
+      - "_build/tests/registryd"
 
-# Build and run the test suite.
-#
-# Look at .build-default for where the artifacts are stored (build/test logs, built binaries).
-opensuse-x86_64:
-  extends: .build-default
+fedora-x86_64:
   stage: build
-  needs: []
+  extends:
+    - '.container.fedora@x86_64'
+    - '.fdo.distribution-image@fedora'
+  needs: ['fedora-container@x86_64']
   variables:
-    MESON_EXTRA_FLAGS: "--buildtype=debug" # -Dwerror=true
+    MESON_EXTRA_FLAGS: "--buildtype=debug -Ddefault_bus=dbus-broker -Ddbus_broker=/usr/bin/dbus-broker-launch" # -Dwerror=true
+  script:
+    - meson setup ${MESON_EXTRA_FLAGS} --prefix /usr _build .
+    - meson compile -C _build
+    - meson install -C _build
+  artifacts:
+    reports:
+      junit: "_build/meson-logs/testlog.junit.xml"
+    when: always
+    name: "at-spi2-core-${CI_COMMIT_REF_NAME}"
+    paths:
+      - "_build/meson-logs"
 
 # Run static analysis on the code.
 #
 # The logs are part of the compilation stderr.
 static-scan:
-  image: $OPENSUSE_TUMBLEWEED_IMAGE
   stage: analysis
-  needs: []
+  extends:
+    - '.container.opensuse@x86_64'
+    - '.fdo.distribution-image@opensuse'
+  needs: ['opensuse-container@x86_64']
   variables:
-    MESON_EXTRA_FLAGS: "--buildtype=debug -Dintrospection=no -Ddocs=false"
+    MESON_EXTRA_FLAGS: "--buildtype=debug -Dintrospection=disabled -Ddocs=false"
   script:
     - meson setup ${MESON_EXTRA_FLAGS} --prefix /usr _scan_build .
     - ninja -C _scan_build scan-build
@@ -121,105 +113,102 @@ static-scan:
 
 # Build and run with address sanitizer (asan).
 asan-build:
-  image: $OPENSUSE_TUMBLEWEED_IMAGE
   stage: analysis
-  needs: []
+  extends:
+    - '.container.opensuse@x86_64'
+    - '.fdo.distribution-image@opensuse'
+  needs: ['opensuse-container@x86_64']
   variables:
-    MESON_EXTRA_FLAGS: "--buildtype=debug -Db_sanitize=address -Db_lundef=false -Dintrospection=no -Ddocs=false"
+    MESON_EXTRA_FLAGS: "--buildtype=debug -Db_sanitize=address -Db_lundef=false -Dintrospection=disabled -Ddocs=false"
+    # Add a suppressions file for address-sanitizer.  Looks like libdbus has a minor leak that is hurting
+    # the tests while run with asan.  Hopefully this will go away once we convert everything to gdbus.
+    #
+    # https://gitlab.freedesktop.org/dbus/dbus/-/issues/326
+    LSAN_OPTIONS: "suppressions=${CI_PROJECT_DIR}/ci/address-sanitizer.supp"
   script:
+    - source ci/env.sh
     - CC=clang meson setup ${MESON_EXTRA_FLAGS} --prefix /usr _build .
     - meson compile -C _build
     - meson install -C _build
-    - dbus-run-session -- .gitlab-ci/run-tests.sh
+    - xvfb-run --auto-servernum dbus-run-session -- ci/run-tests.sh
   artifacts:
     name: "at-spi2-core-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
     when: always
     paths:
-      - "_asan_build/meson-logs"
+      - "${CI_PROJECT_DIR}/_build/meson-logs"
   allow_failure: true
 
 # Run the test suite and extract code coverage information.
 #
 # See the _coverage/ artifact for the HTML report.
 coverage:
-  image: $OPENSUSE_TUMBLEWEED_IMAGE
   stage: analysis
-  needs: []
+  extends:
+    - '.container.opensuse@x86_64'
+    - '.fdo.distribution-image@opensuse'
+  needs: ['opensuse-container@x86_64']
   variables:
-    MESON_EXTRA_FLAGS: "--buildtype=debug -Ddocs=false -Dintrospection=no"
+    MESON_EXTRA_FLAGS: "--buildtype=debug -Ddocs=false -Dintrospection=disabled"
     CFLAGS: "-coverage -ftest-coverage -fprofile-arcs"
   script:
-    - meson setup ${MESON_EXTRA_FLAGS} --prefix /usr _build .
+    - source ./ci/env.sh
+    # See https://gitlab.gnome.org/GNOME/at-spi2-core/-/merge_requests/137 for the reason for disable_p2p
+    - meson setup ${MESON_EXTRA_FLAGS} -Ddisable_p2p=true --prefix /usr _build .
     - meson compile -C _build
     - meson install -C _build
-    - mkdir -p _coverage
-    - lcov --config-file .gitlab-ci/lcovrc --directory _build --capture --initial --output-file "_coverage/${CI_JOB_NAME}-baseline.lcov"
-    - dbus-run-session -- .gitlab-ci/run-tests.sh
-    - lcov --config-file .gitlab-ci/lcovrc --directory _build --capture --output-file "_coverage/${CI_JOB_NAME}.lcov"
-    - bash -x .gitlab-ci/gen-coverage.sh
-    - mkdir -p public/
-    - cp -r _coverage public/coverage
-  coverage: '/^\s+lines\.+:\s+([\d.]+\%)\s+/'
+    - xvfb-run --auto-servernum dbus-run-session -- ci/run-registryd-tests.sh
+    - xvfb-run --auto-servernum dbus-run-session -- ci/run-tests.sh
+    - mkdir -p public
+    - grcov _build --source-dir ./ --prefix-dir ../ --output-type cobertura --branch --ignore-not-existing -o coverage.xml
+    - grcov _build --source-dir ./ --prefix-dir ../ --output-type html --branch --ignore-not-existing -o public/coverage
+    # In the following line, the first grep finds what it is supposed to find, but exits with a nonzero code.
+    # I have no idea why.  So, force the whole pipeline to return true.
+    - (grep -Eo 'line-rate="[^"]+"' coverage.xml | head -n 1 | grep -Eo '[0-9.]+' | awk '{ print "Coverage:", $1 * 100 }') || true
+  coverage: '/Coverage: \d+\.\d+/'
   artifacts:
     name: "at-spi2-core-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
     expire_in: 2 days
     when: always
+    reports:
+      coverage_report:
+        coverage_format: cobertura
+        path: coverage.xml
     paths:
       - "_build/meson-logs"
       - public
+      - coverage.xml
 
-# Build the reference documentation.
-#
-# reference:
-#   stage: docs
-#   needs: []
-#   extends: .gidocgen-build
-#   variables:
-#     PROJECT_DEPS:
-#       gdk-pixbuf2-devel
-#       geocode-glib-devel
-#       gettext
-#       git
-#       gobject-introspection-devel
-#       itstool
-#       libsoup-devel
-#       libxml2-devel
-#       ninja-build
-#       pylint
-#       python3
-#       python3-gobject
-#       python3-pip
-#       python3-wheel
-#       redhat-rpm-config
-#       vala
-#     MESON_VERSION: "0.55.3"
-#     DOCS_FLAGS: -Dgtk_doc=true
-#     DOCS_PATH: doc/libgweather-4.0
-#
-#
-# Publish the generated HTML reference documentation.
-#
-# pages:
-#   stage: deploy
-#   needs: ['reference']
-#   script:
-#     - mkdir public && cd public
-#     - tar xf ../${CI_PROJECT_NAME}-docs.tar
-#   artifacts:
-#     paths:
-#       - public
-#   only:
-#     - master
-#     - main
+reference:
+  stage: docs
+  extends:
+    - '.container.opensuse@x86_64'
+    - '.fdo.distribution-image@opensuse'
+  needs: ['opensuse-container@x86_64']
+  variables:
+    MESON_EXTRA_FLAGS: "--buildtype=release -Ddocs=true"
+  script:
+    - source ci/env.sh
+    - meson setup ${MESON_EXTRA_FLAGS} --prefix /usr _build .
+    - ninja -C _build doc/atk doc/libatspi devel-docs/html
+    - mkdir _reference
+    - mv _build/doc/libatspi _reference/libatspi
+    - mv _build/doc/atk _reference/atk
+    - mv _build/devel-docs/html  _reference/devel-docs
+  artifacts:
+    paths:
+      - _reference
+      - "_build/meson-logs"
 
 # Publish the test coverage report
 pages:
   stage: deploy
-  needs: [ coverage ]
+  needs: [ coverage, reference ]
   script:
-    - echo # dummy - contents were generated in another job
+    - mv _reference/* public/
   artifacts:
     paths:
       - public
   rules:
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH)
+    # Restrict it to the gnome namespace to avoid every fork pushing a set of pages by default
+    # - if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH && $CI_PROJECT_NAMESPACE == "gnome")
diff --git a/.gitlab-ci/README.md b/.gitlab-ci/README.md
deleted file mode 100644 (file)
index 9adfaac..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-# Continuous Integration scripts for at-spi2-core
-
-Please see the general [documentation for at-spi2-core's Gitlab CI][ci-docs].
-
-This directory contains scripts which get called during a run of a CI
-pipeline, and utilities to maintain the CI infrastructure.
-
-## Scripts used during a run of a CI pipeline:
-
-* `run-tests.sh` - Runs the test suite and prints other diagnostics.
-
-* `gen-coverage.sh` - After the test suite is run, merges the various
-  code coverage reports from `lcov`, and generates an HTML report.
-  
-* `lcovrc` - Configuration file for `lcov`, used by `gen-coverage.sh`.
-  Among other things, this tells `lcov` to exclude branch coverage for
-  the unreachable branches of `g_return_if_fail()` and friends.
-  
-* `run-style-check.sh` - Runs `clang-format-diff` to test for source
-  files with inconsistent formatting, and uploads the resulting report
-  to gitlab so it can be viewed as part of a merge request's analysis.
-  
-* `search-common-ancestor.sh` - Utility used from
-  `run-style-check.sh`; finds a git branch point from the current
-  commit.
-
-## Utilities to maintain the CI infrastructure:
-
-To make pipelines fast, and avoid a lot of repeated downloads,
-at-spi2-core uses pre-built container images for CI pipelines, instead
-of using a stock image like opensuse/tumbleweed and then installing
-all the dependencies on top of it every time.
-
-The prebuilt images are stored here:
-https://gitlab.gnome.org/GNOME/at-spi2-core/container_registry
-
-Instead of maintaining those images by hand with `docker` or `podman`
-commands, here is a little script (stolen from [glib][glib-ci]) to
-maintain them, which you can start exploring with `./run-docker.sh help`.
-
-This script knows how to build and upload images from Dockerfiles
-called `foo.Dockerfile`.  The image configurations we have:
-
-* `opensuse.Dockerfile` - starts with an opensuse/tumbleweed image and
-  installs the package dependencies for building at-spi2-core.
-
-If you are one of at-spi2-core's maintainers, you'll want to update
-the CI images periodically.  First, install `podman` and
-`podman-docker`.  Then, run this:
-
-```sh
-# "opensuse" in these commands indicates to use the opensuse.Dockerfile configuration
-
-./run-docker.sh build --base=opensuse      # builds the image, takes a while
-
-./run-docker.sh run --base=opensuse        # launch the container; poke around; see that it works
-
-./run-docker.sh push --base=opensuse       # push the image to registry.gitlab.gnome.org
-```
-
-The `build` subcommand creates an image named
-`registry.gitlab.gnome.org/gnome/at-spi2-core/opensuse/tumbleweed:latest`
-**that is only stored in your localhost**.
-
-The `run` subcommand launches a container with that image and gives
-you a shell prompt.  This is equivalent to `podman run`.
-
-The `push` subcommand takes that built image and uploads it to
-`registry.gitlab.gnome.org`.  It will then be visible from
-https://gitlab.gnome.org/GNOME/at-spi2-core/container_registry - the
-CI configuration in [`.gitlab-ci.yml`](../.gitlab-ci.yml) uses this
-image for the pipeline.
-
-[ci-docs]: ../devel-docs/gitlab-ci.md
-[container-registry-docs]: https://gitlab.gnome.org/help/user/packages/container_registry/index
-[glib-ci]: https://gitlab.gnome.org/GNOME/glib/-/tree/main/.gitlab-ci
diff --git a/.gitlab-ci/gen-coverage.sh b/.gitlab-ci/gen-coverage.sh
deleted file mode 100644 (file)
index 3949256..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-set -e
-
-for path in _coverage/*.lcov; do
-        lcov --config-file .gitlab-ci/lcovrc -r "${path}" '*/_build/*' -o "$(pwd)/${path}"
-        lcov --config-file .gitlab-ci/lcovrc -e "${path}" "$(pwd)/*" -o "$(pwd)/${path}"
-done
-
-genhtml \
-        --ignore-errors=source \
-        --config-file .gitlab-ci/lcovrc \
-        _coverage/*.lcov \
-        -o _coverage/coverage
-
-cd _coverage
-rm -f ./*.lcov
-
-cat >index.html <<EOL
-<html>
-<head><title>at-spi2-core Coverage</title></head>
-<body>
-<div>
-<ul>
-<li><a href="coverage/index.html">Coverage report</a></li>
-</ul>
-</div>
-</body>
-</html>
-EOL
diff --git a/.gitlab-ci/opensuse.Dockerfile b/.gitlab-ci/opensuse.Dockerfile
deleted file mode 100644 (file)
index 0bcdfe4..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# Dockerfile to build container images for Gitlab Continuous Integration
-#
-# This starts with an openSUSE Tumbleweed image, and installs the dependencies
-# for building and testing at-spi2-core.
-#
-# See README.md for documentation.
-
-FROM opensuse/tumbleweed:latest
-
-RUN zypper refresh                              \
- && zypper install -y                           \
-           clang                                \
-           clang-tools                          \
-           findutils                            \
-           gcc                                  \
-           dbus-1                               \
-           dbus-1-devel                         \
-           gettext                              \
-           git                                  \
-           glib2-devel                          \
-           gobject-introspection-devel          \
-           gsettings-desktop-schemas            \
-           itstool                              \
-           libasan6                             \
-           libxml2-devel                        \
-           libxkbcommon-devel                   \
-           libXi-devel                          \
-           libXtst-devel                        \
-           lcov                                 \
-           meson                                \
-           ninja                                \
-           python38                             \
-           python38-gobject                     \
- && zypper clean --all
diff --git a/.gitlab-ci/run-docker.sh b/.gitlab-ci/run-docker.sh
deleted file mode 100755 (executable)
index d6be467..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-#!/bin/bash
-
-read_arg() {
-    # $1 = arg name
-    # $2 = arg value
-    # $3 = arg parameter
-    local rematch='^[^=]*=(.*)$'
-    if [[ $2 =~ $rematch ]]; then
-        read -r "$1" <<< "${BASH_REMATCH[1]}"
-    else
-        read -r "$1" <<< "$3"
-        # There is no way to shift our callers args, so
-        # return 1 to indicate they should do it instead.
-        return 1
-    fi
-}
-
-SUDO_CMD="sudo"
-if docker -v |& grep -q podman; then
-        # Using podman
-        SUDO_CMD=""
-        # Docker is actually implemented by podman, and its OCI output
-        # is incompatible with some of the dockerd instances on GitLab
-        # CI runners.
-        export BUILDAH_FORMAT=docker
-fi
-
-set -e
-
-base=""
-base_version=""
-build=0
-run=0
-push=0
-list=0
-print_help=0
-no_login=0
-
-while (($# > 0)); do
-        case "${1%%=*}" in
-                build) build=1;;
-                run) run=1;;
-                push) push=1;;
-                list) list=1;;
-                help) print_help=1;;
-                --base|-b) read_arg base "$@" || shift;;
-                --base-version) read_arg base_version "$@" || shift;;
-                --no-login) no_login=1;;
-                *) echo -e "\\e[1;31mERROR\\e[0m: Unknown option '$1'"; exit 1;;
-        esac
-        shift
-done
-
-if [ $print_help == 1 ]; then
-        echo "$0 - Build and run Docker images"
-        echo ""
-        echo "Usage: $0 <command> [options] [basename]"
-        echo ""
-        echo "Available commands"
-        echo ""
-        echo "  build --base=<BASENAME> - Build Docker image <BASENAME>.Dockerfile"
-        echo "  run --base=<BASENAME>   - Run Docker image <BASENAME>"
-        echo "  push --base=<BASENAME>  - Push Docker image <BASENAME> to the registry"
-        echo "  list                    - List available images"
-        echo "  help                    - This help message"
-        echo ""
-        exit 0
-fi
-
-cd "$(dirname "$0")"
-
-if [ $list == 1 ]; then
-        echo "Available Docker images:"
-        for f in *.Dockerfile; do
-                filename=$( basename -- "$f" )
-                basename="${filename%.*}"
-
-                echo -e "  \\e[1;39m$basename\\e[0m"
-        done
-        exit 0
-fi
-
-# All commands after this require --base to be set
-if [ -z "${base}" ]; then
-        echo "Usage: $0 <command>"
-        echo "Or use \"$0 help\" for a list of commands"
-        exit 1
-fi
-
-if [ ! -f "$base.Dockerfile" ]; then
-        echo -e "\\e[1;31mERROR\\e[0m: Dockerfile for '$base' not found"
-        exit 1
-fi
-
-if [ -z "${base_version}" ]; then
-        base_version="latest"
-else
-        base_version="v$base_version"
-fi
-
-TAG="registry.gitlab.gnome.org/gnome/at-spi2-core/${base}:${base_version}"
-
-if [ $build == 1 ]; then
-        echo -e "\\e[1;32mBUILDING\\e[0m: ${base} as ${TAG}"
-        $SUDO_CMD docker build \
-                --tag "${TAG}" \
-                --file "${base}.Dockerfile" .
-        exit $?
-fi
-
-if [ $push == 1 ]; then
-        echo -e "\\e[1;32mPUSHING\\e[0m: ${base} as ${TAG}"
-
-        if [ $no_login == 0 ]; then
-                $SUDO_CMD docker login registry.gitlab.gnome.org
-        fi
-
-        $SUDO_CMD docker push $TAG
-        exit $?
-fi
-
-if [ $run == 1 ]; then
-        echo -e "\\e[1;32mRUNNING\\e[0m: ${base} as ${TAG}"
-        $SUDO_CMD docker run \
-                --rm \
-                --volume "$(pwd)/..:/home/user/app" \
-                --workdir "/home/user/app" \
-                --tty \
-                --interactive "${TAG}" \
-                bash
-        exit $?
-fi
diff --git a/.gitlab-ci/run-style-check.sh b/.gitlab-ci/run-style-check.sh
deleted file mode 100755 (executable)
index 9d741bc..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-set -e
-
-ancestor_horizon=28  # days (4 weeks)
-
-# Wrap everything in a subshell so we can propagate the exit status.
-(
-
-source .gitlab-ci/search-common-ancestor.sh
-
-git diff -U0 --no-color "${newest_common_ancestor_sha}" atspi/*.c bus/*.c dbind/*.c registryd/*.c test/*.c | clang-format-diff -p1 > format-diff.log
-
-)
-exit_status=$?
-
-[ ${exit_status} == 0 ] || exit ${exit_status}
-
-format_diff="$(<format-diff.log)"
-
-if [ -n "${format_diff}" ]; then
-  echo 'body=```diff' > format.log
-  cat format-diff.log >> format.log
-  echo '```' >> format.log
-  [ -n "$CI_MERGE_REQUEST_IID" ] && curl \
-    --request POST \
-    --header "Private-Token: $STYLE_CHECK_TOKEN" \
-    --data-urlencode "$(<format.log)" \
-    https://gitlab.gnome.org/api/v4/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID/notes \
-    --insecure
-  unlink format.log
-  exit 1
-fi
diff --git a/.gitlab-ci/run-tests.sh b/.gitlab-ci/run-tests.sh
deleted file mode 100755 (executable)
index f3ce5c2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-
-set -e
-
-echo "About to run the tests.  First we'll launch the accessibility bus by calling GetAddress:"
-
-dbus-send --print-reply --session --dest=org.a11y.Bus /org/a11y/bus org.a11y.Bus.GetAddress
-
-ps auxwww
-
-echo "Now running the tests:"
-
-meson test -C _build
-
-echo "After the tests - calling GetAddress again:"
-
-dbus-send --print-reply --session --dest=org.a11y.Bus /org/a11y/bus org.a11y.Bus.GetAddress
diff --git a/.gitlab-ci/search-common-ancestor.sh b/.gitlab-ci/search-common-ancestor.sh
deleted file mode 100755 (executable)
index bac99d2..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-
-set -e
-
-ancestor_horizon=28  # days (4 weeks)
-
-# We need to add a new remote for the upstream target branch, since this script
-# could be running in a personal fork of the repository which has out of date
-# branches.
-#
-# Limit the fetch to a certain date horizon to limit the amount of data we get.
-# If the branch was forked from origin/main before this horizon, it should
-# probably be rebased.
-if ! git ls-remote --exit-code upstream >/dev/null 2>&1 ; then
-    git remote add upstream https://gitlab.gnome.org/GNOME/${CI_PROJECT_NAME}.git
-fi
-git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" upstream
-
-# Work out the newest common ancestor between the detached HEAD that this CI job
-# has checked out, and the upstream target branch (which will typically be
-# `upstream/main` or `upstream/gnome-40`).
-# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` or `${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}`
-# are only defined if we’re running in a merge request pipeline,
-# fall back to `${CI_DEFAULT_BRANCH}` or `${CI_COMMIT_BRANCH}` respectively
-# otherwise.
-
-source_branch="${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:-${CI_COMMIT_BRANCH}}"
-git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" origin "${source_branch}"
-
-newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent "origin/${source_branch}") | head -1)
-if [ -z "${newest_common_ancestor_sha}" ]; then
-    echo "Couldn’t find common ancestor with upstream main branch. This typically"
-    echo "happens if you branched from main a long time ago. Please update"
-    echo "your clone, rebase, and re-push your branch."
-    exit 1
-fi
diff --git a/AUTHORS b/AUTHORS
deleted file mode 100644 (file)
index 9f0f539..0000000
--- a/AUTHORS
+++ /dev/null
@@ -1,17 +0,0 @@
-
-Authors of AT-SPI D-Bus implementation
---------------------------------------
-
-Mike Gorse <mgorse@suse.com>
-Mark Doffman <mark.doffman@codethink.co.uk>
-
-
-Authors of AT-SPI spec & implementation in CORBA
-------------------------------------------------
-
-Bill Haneman <bill.haneman@sun.com>
-Marc Mulcahy <marc.mulchay@sun.com>
-Michael Meeks <micheal@ximian.com>
-
-with contributions from:
-Mark McLoughlin <mark@skynet.ie>
diff --git a/INSTALL b/INSTALL
index c9d569f..20be10d 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -4,6 +4,7 @@ Install procedure
 tar -xJf at-spi2-core-2.34.0.tar.xz                      # unpack the sources
         % cd at-spi2-core-2.34.0                         # change to the toplevel directory
 mkdir build                                              # create a build directory
+cd build                                                 # change to build directory
 meson ..                                                 # configure
 ninja                                                    # build at-spi2-core
 
diff --git a/NEWS b/NEWS
index b4c1230..d99013c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,179 @@
+What's new in at-spi2-core 2.51.90:
+
+    Add an attribute-changed signal in atk, and update libatspi attribute cache.
+
+* Add GetTextSelection and SetTextSelection to Document interface.
+
+* Add atspi_device_generate_mouse_event, and implement for mutter.
+
+* Have atspi_device_add_key_grab return 0 if XIGrabKeycode fails.
+
+* xml: Add Embedded to the Socket interface
+
+* Don't return uninitialized values if atspi_component_get_size/position fail.
+
+What's new in at-spi2-core 2.51.0:
+
+* atk-adaptor: Fix critical when no table cell array is returned.
+
+* accessible: Do not rename deprecated methods to the new names.
+
+* Add HelpText property and corresponding functions in atk and libatspi.
+
+What's new in at-spi2-core 2.50.0:
+
+* Fix at-spi2-atk test when running under a non-English locale.
+
+What's new in at-spi2-core 2.49.91:
+
+* collection: Avoid locking up if an object has a very large child count
+
+* Fix possible NULL pointer dereference when deregistering an event listener.
+
+* Various fixes for the new key grabbing API.
+
+* Don't wait for a reply when registering or deregistering keystroke
+  listeners.
+
+* Add a meson option to exclude the gtk2 atk-bridge module.
+
+What's new in at-spi2-core 2.49.90:
+
+* Fix a test failure/timeout.
+
+* Add atspi_get_version() to return the runtime version of the library.
+
+* Collection: fix match testing for attributes.
+
+* Fix a NULL pointer dereference when deregistering an event listener that
+  doesn't include a detail.
+
+* Fix the documentation for interfaces in collection match rules.
+
+* Add an AtspiLive enum to specify the politeness level for live regions,
+  and document that this should be used for Announcement signals. Also add a
+  notification signal in atk to replace the announcement signal that lacks
+  the politeness information.
+
+* Add an asynchronous version of atspi_generate_mouse_event.
+
+What's new in at-spi2-core 2.49.1:
+
+* TableCell.xml: Add Get{Column,Row}HeaderCells methods
+
+* atspi_accessible_get_localized_role_name: Use internal names when possible.
+
+* Add a non-recursive function to clear a single object's cache.
+
+* Code clean-ups.
+
+What's new in at-spi2-core 2.48.3:
+
+* Fix the build when dbus-broker is not set to be used by default.
+
+* Fix a couple of use after frees when finalizing devices.
+
+* atk-adaptor: Fix handling of sockets in impl_GetChildren.
+
+What's new in at-spi2-core 2.48.2:
+
+* Fixed a regression in 2.48.1 where the bus launcher would fail if
+  dbus-broker was configured at build time but not installed on the system.
+
+What's new in at-spi2-core 2.48.1:
+
+* Fixes for atk-only builds under Windows.
+
+* meson: Avoid requiring libsystemd when configured to use dbus-daemon
+
+* Fix crash when a bad index is passed to atspi_accessible_get_child_at_index.
+
+* Fix possible infinite recursion in atspi_accessible_clear_cache.
+
+What's new in at-spi2-core 2.48.0:
+
+* Add a "atk-only" build option. This allows atk to be built without libdbus
+  installed, but it does not build libatspi or the atk bridge.
+
+* Fix some typos in the documentation.
+
+What's new in at-spi2-core 2.47.90:
+
+* Downgrade meson requirement to 0.63.
+
+*  at-spi-dbus-bus service: set stop timeout to 5s
+    
+* Fix possible crash in screen_reader_signal_watcher.
+
+What's new in at-spi2-core 2.47.1:
+* The meson options -Dx11 and -Dintrospection are now implemented with
+  meson features - https://mesonbuild.com/Build-options.html#features
+
+  Instead of accepting values of "yes/no/auto", they take
+  "enabled/disabled/auto".  Please change your build scripts
+  accordingly if you use these options.
+
+* Use gi-docgen to generate documentation.
+
+* Register key grabs using the focused window, rather than the root window.
+  This should prevent the window from losing focus when a key grab is used.
+
+* atk-adaptor: Handle sockets in GetChildren.
+
+* Improve documentation of the dbus interfaces.
+
+* Various code clean-ups. Some unused code has been removed.
+
+What's new in at-spi2-core 2.46.0:
+
+* Fix GetInterfaces documentation on org.a11y.atspi.Accessible
+  interface.
+
+What's new in at-spi2-core 2.45.91:
+
+* Send device event controller events using the same signature as other
+  events.
+
+* Document the Accessible, Action, and Cache dbus interfaces.
+
+* Fix license of atspi-gmain.c (#87).
+
+What's new in at-spi2-core 2.45.90:
+
+* xml: Add some documentation.
+
+* xml: Fix event arguments.
+
+* xml: Add some missing DeviceEventController methods.
+
+* Bind the AT-SPI bus to the graphical session.
+
+* Mark bus service as belonging to the session slice.
+
+* Add ATSPI_ROLE_PUSH_BUTTON_MENU.
+
+* Add an "announcement" event/signal to allow objects to send
+  notifications (!63).
+
+* Various code clean-ups and test improvements.
+
+What's new in at-spi2-core 2.45.1:
+
+* Atk and at-spi2-atk are now merged into this project.
+
+* Now requires meson 0.56.2 and glib 2.67.4.
+
+* at-spi2-atk: Expose the accessible hierarchy via dbus introspection.
+
+* Properly escape the AT-SPI bus address; fixes warnings about the address
+  not containing a colon (!55).
+
+* Add a text value to AtspiValue, so that a value can expose a textual
+  description, as in the new Atk value API.
+
+* Add atspi_event_listener_register_with_app, to allow an event listener
+  to be registered only for a given application (!52).
+
 What's new in at-spi2-core 2.44.1:
 
 * Fix use after free when removing a hung process.
index 6085fa8..2126924 100644 (file)
--- a/README.md
+++ b/README.md
@@ -1,14 +1,19 @@
-# Assistive Technology Service Provider Interface (AT-SPI)
+# Accessibility infrastructure
 
-This repository contains the [DBus][DBus] interface definitions for AT-SPI, the Assistive
-Technology Service Provider Interface — the core of an accessibility stack for free
-software systems.  It also contains the basic daemons of the accessibility stack.
+This repository contains the [DBus][DBus] interface definitions for
+AT-SPI (Assistive Technology Service Provider Interface) — the core of
+an accessibility stack for free software systems.  It also contains
+the basic daemons of the accessibility stack, the ATK library to make
+applications and GUI toolkits accessible, and the internal hooks
+between AT-SPI and ATK.
 
 The version control repository and bug tracker are at https://gitlab.gnome.org/GNOME/at-spi2-core/
 
-The code in this repository is not intended for application programmers.  To write
-accessible applications, look into [ATK][ATK] or your programming language's bindings for
-the `xml` DBus interfaces mentioned below.
+You can visit an ever-changing roadmap in [`devel-docs/roadmap.md`](devel-docs/roadmap.md).
+
+To write accessible applications, look into `atk` or your
+programming language's bindings for the `xml` DBus interfaces
+mentioned below.
 
 While this module started within the [GNOME][GNOME] project's umbrella, it is not used
 only in GNOME.  Other sources of relevant information about AT-SPI and Accessibility
@@ -18,6 +23,18 @@ include:
 * [KDE Accessibility wiki][kde-a11y-wiki]
 * [Accessibility documentation for GNOME users][docs-users]
 
+## Documentation
+
+* [ATK reference documentation][atk-docs]
+* [libatspi reference documentation][libatspi-docs]
+
+## Development resources
+
+* [Development guide for the accessibility infrastructure][devel-docs]
+* [Code coverage report for the test suite][coverage]
+* [Container registry for CI images][registry]
+* [Continuous integration pipelines][pipelines]
+* [Development documentation](devel-docs/)
 
 ## Summary of this repository's contents
 
@@ -32,13 +49,24 @@ include:
   and lets them talk to each other and to assistive technologies (ATs) like screen
   readers.
 
+* `atk` - GObject-based API to implement accessible applications and
+  GUI toolkits.  It is not mandatory to use this library for an
+  accessible application; your application or toolkit can use bindings to the
+  `xml` DBus APIs directly.
+  
 * `atspi` - Hand-written binding for the `xml` DBus interface above, for use from C with
   [GObject][GObject].  This is not normally what you would use; use a language-specific
-  binding instead.  This module is for use mainly by [`at-spi2-atk`][at-spi2-atk].
+  binding instead.  This module is for use mainly by `atk-adaptor` below.
+  
+* `atk-adaptor` - Translates from the ATK API to the atspi API.
+  Application programmers can ignore this and just consider it as an
+  implementation detail.
 
 * `dbind` - DBus utilities for use by `atspi` above.  `atspi` was written before the more
   modern C bindings like [GDBusConnection][GDBus] were available, so there is a lot of
   hand-written IPC here.
+  
+* `droute` - DBus utilities for use by `atk-adaptor` above.
 
 * Documentation for the Gitlab [Continuous Integration pipeline](devel-docs/gitlab-ci.md).
 
@@ -64,8 +92,13 @@ not been kept up to date.
 [GObject]: https://docs.gtk.org/gobject/
 [at-spi2-atk]: https://gitlab.gnome.org/GNOME/at-spi2-atk
 [GDBus]: https://docs.gtk.org/gio/class.DBusConnection.html
-[ATK]: https://gitlab.gnome.org/GNOME/atk/
 [GNOME]: https://www.gnome.org
 [docs-users]: https://help.gnome.org/users/gnome-help/stable/a11y.html
 [gnome-a11y-wiki]: https://wiki.gnome.org/Accessibility
 [kde-a11y-wiki]: https://community.kde.org/Accessibility
+[atk-docs]: https://gnome.pages.gitlab.gnome.org/at-spi2-core/atk
+[libatspi-docs]: https://gnome.pages.gitlab.gnome.org/at-spi2-core/libatspi
+[coverage]: https://gnome.pages.gitlab.gnome.org/at-spi2-core/coverage/index.html
+[registry]: https://gitlab.gnome.org/GNOME/at-spi2-core/container_registry
+[pipelines]: https://gitlab.gnome.org/GNOME/at-spi2-core/-/pipelines
+[devel-docs]: https://gnome.pages.gitlab.gnome.org/at-spi2-core/devel-docs/index.html
diff --git a/README.msvc b/README.msvc
new file mode 100644 (file)
index 0000000..d53f734
--- /dev/null
@@ -0,0 +1,79 @@
+Building ATK with Visual Studio\r
+===============================\r
+\r
+Meson is now the supported method of building ATK using Visual Studio.\r
+\r
+Building ATK requires GLib, which should preferably be built with the\r
+same compiler that is now being used to build ATK.  If building the\r
+introspection files are desired, GObject-Introspection is also needed.\r
+\r
+You will need the following tools to build ATK, in addition to Visual\r
+Studio (2008 and later are supported).\r
+\r
+-Python 3.6.x.  You will then need to install or update Meson by using pip.\r
+-The Ninja build tool, required for Visual Studio 2008, 2012 and 2013 builds,\r
+ and optional for 2010, 2015 and 2017 builds, where Visual Studio projects\r
+ can be generated instead of the Ninja build files.\r
+-GIT for Windows is highly recommended, in the case where some required\r
+ dependencies are not found, and Meson makes use of GIT to download\r
+ the sources to build in the build process.\r
+-pkg-config or pkgconf is highly recommended (pkg-config is used to denote\r
+ this from this point on).  Note that pkg-config 0.29.1 and later can be\r
+ built with Visual Studio directly from the sources since we need GLib here\r
+ already.  Note that the pkg-config files for GLib needs to be found by\r
+ pkg-config, possibly by setting PKG_CONFIG_PATH in the current Visual Studio\r
+ command prompt to contain the path that GLib's pkg-config files are located.\r
+\r
+Note that you will need GLib, which should preferably be built with the\r
+same compiler that is now being used to build GLib.  As GLib and\r
+GObject-Introspection are also built using Meson on Visual Studio, ensure that\r
+their pkg-config (.pc) files can be found by pkg-config, possibly\r
+by setting the PKG_CONFIG_PATH environment variable in the Visual Studio\r
+command prompt that is being used to build ATK.\r
+\r
+One can also refer to the following page for building the dependencies:\r
+\r
+https://wiki.gnome.org/Projects/GTK%2B/Win32/MSVCCompilationOfGTKStack\r
+\r
+To do a build using Meson, do the following:\r
+\r
+-Open a Visual Studio (or SDK) command prompt that matches the Visual Studio\r
+ version and build platform (Win32/x86, x64, etc.) that will be used in all\r
+ the following steps.\r
+\r
+-Create an empty directory/folder for the build.  It needs to be in the same\r
+ drive as where your ATK sources are located (i.e. $(ATK_SRCDIR)).  cd into\r
+ that directory/folder.\r
+\r
+-Setup your PATH envvar:\r
+\r
+   set PATH=%PATH%;$(PYTHON_INSTALL_DIR);$(NINJA_DIR)\r
+\r
+ where PYTHON_INSTALL_DIR is where Python 3.6.x+ is installed to, and NINJA_DIR\r
+ is where your ninja executable can be found.  The NINJA_DIR can be omitted if one\r
+ passes --backend=vs to the Meson configuration line, for Visual Studio 2010, 2015\r
+ and 2017 builds.\r
+\r
+-Configure the build using Meson:\r
+\r
+    python $(PYTHON_INSTALL_DIR)\scripts\meson.py $(ATK_SRCDIR) --buildtype=$(build_configuration) --prefix=$(INSTALL_PREFIX) [--backend=vs]\r
+\r
+ Please see the Meson docs for an explanation for --buildtype, the path passed for\r
+ --prefix need not to be on the same drive as where the build is carried out, but\r
+ it is recommended to use forward slashes for this path.  The --backend=vs can be\r
+ used if the Visual Studio project generator is preferred over using Ninja, for\r
+ Visual Studio 2010, 2015 and 2017 builds.\r
+\r
+-Build, test and install the build:\r
+ Run ninja (and ninja test and ninja install) or open the generated Visual Studio\r
+ projects to compile, test and install the build.\r
+\r
+Note that if building the sources with Visual Studio 2008, note the following\r
+additional items:\r
+\r
+-You need to run the following lines from your build directory, to embed the manifests\r
+ that are generated during the build, assuming the built binaries are installed\r
+ to $(PREFIX), after a successful build/installation:\r
+\r
+for /r %f in (*.dll.manifest) do if exist $(PREFIX)\bin\%~nf mt /manifest %f $(PREFIX)\bin\%~nf;2\r
+for /r %f in (*.exe.manifest) do if exist $(PREFIX)\bin\%~nf mt /manifest %f $(PREFIX)\bin\%~nf;1\r
diff --git a/at-spi2-atk.desktop b/at-spi2-atk.desktop
new file mode 100644 (file)
index 0000000..9b6d2fa
--- /dev/null
@@ -0,0 +1,6 @@
+[GTK Module]
+Name=AT-SPI2 ATK
+Description=Accessibility ToolKit GTK+ Module
+X-GTK-Module-Name=gail:atk-bridge
+X-GTK-Module-Enabled-Schema=org.gnome.desktop.interface
+X-GTK-Module-Enabled-Key=toolkit-accessibility
index 7c1cde3..d092d61 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
          xmlns:foaf="http://xmlns.com/foaf/0.1/"
@@ -13,7 +14,17 @@ simulate keyboard and mouse events. It can also be used for automated testing.
 
 The at-spi2-core module contains the D-Bus specification, the registry daemon,
 and a C library for use by access technologies that provides a convenient
-wrapper around the DBus interfaces.</description>
+wrapper around the DBus interfaces.
+
+ATK is a library providing interface definitions that are consumed by
+toolkits that wish to integrate with the GNOME accessibility
+infrastructure.
+
+at-spi2-atk is the library used to bridge ATK to AT-SPI, allowing
+applications exposing information via ATK to interface with clients
+that use AT-SPI. This module provides the necessary inter-process
+communication to allow accessibility-oriented software to operate.
+  </description>
   <homepage rdf:resource="http://www.linuxfoundation.org/en/Accessibility/ATK/AT-SPI/AT-SPI_on_D-Bus"/>
   <license rdf:resource="http://usefulinc.com/doap/licenses/lgpl" />
   <bug-database rdf:resource="https://gitlab.gnome.org/GNOME/at-spi2-core/issues/" />
@@ -22,6 +33,8 @@ wrapper around the DBus interfaces.</description>
   <category rdf:resource="http://api.gnome.org/doap-extensions#core" />
   <programming-language>C</programming-language>
 
+  <!-- at-spi2-core maintainers -->
+
   <maintainer>
     <foaf:Person>
       <foaf:name>Mike Gorse</foaf:name>
@@ -36,4 +49,31 @@ wrapper around the DBus interfaces.</description>
       <gnome:userid>federico</gnome:userid>
     </foaf:Person>
   </maintainer>
+
+  <!-- ATK maintainers -->
+
+  <maintainer>
+    <foaf:Person>
+      <foaf:name>Alejandro Piñeiro Iglesias</foaf:name>
+      <foaf:mbox rdf:resource="mailto:apinheiro@igalia.com" />
+      <gnome:userid>apinheiro</gnome:userid>
+    </foaf:Person>
+  </maintainer>
+  <maintainer>
+    <foaf:Person>
+      <foaf:name>Emmanuele Bassi</foaf:name>
+      <foaf:mbox rdf:resource="mailto:ebassi@gnome.org" />
+      <gnome:userid>ebassi</gnome:userid>
+    </foaf:Person>
+  </maintainer>
+
+  <!-- Marge-bot to automatically handle merge requests with successful pipelines  -->
+
+  <maintainer>
+    <foaf:Person>
+      <foaf:name>Marge Bot</foaf:name>
+      <gnome:userid>marge-bot</gnome:userid>
+    </foaf:Person>
+  </maintainer>
+
 </Project>
diff --git a/atk-adaptor/accessible-cache.c b/atk-adaptor/accessible-cache.c
new file mode 100644 (file)
index 0000000..1452a10
--- /dev/null
@@ -0,0 +1,457 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2009, 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <string.h>
+
+#include "accessible-cache.h"
+#include "accessible-register.h"
+#include "bridge.h"
+#include "event.h"
+
+SpiCache *spi_global_cache = NULL;
+
+static gboolean
+child_added_listener (GSignalInvocationHint *signal_hint,
+                      guint n_param_values,
+                      const GValue *param_values,
+                      gpointer data);
+
+static void
+toplevel_added_listener (AtkObject *accessible,
+                         guint index,
+                         AtkObject *child);
+
+static void
+remove_object (GObject *source, GObject *gobj, gpointer data);
+
+static void
+add_object (SpiCache *cache, GObject *gobj);
+
+static void
+add_subtree (SpiCache *cache, AtkObject *accessible);
+
+static gboolean
+add_pending_items (gpointer data);
+
+/*---------------------------------------------------------------------------*/
+
+static void
+spi_cache_finalize (GObject *object);
+
+/*---------------------------------------------------------------------------*/
+
+enum
+{
+  OBJECT_ADDED,
+  OBJECT_REMOVED,
+  LAST_SIGNAL
+};
+static guint cache_signals[LAST_SIGNAL] = { 0 };
+
+/*---------------------------------------------------------------------------*/
+
+G_DEFINE_TYPE (SpiCache, spi_cache, G_TYPE_OBJECT)
+
+static void
+spi_cache_class_init (SpiCacheClass *klass)
+{
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  spi_cache_parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+  object_class->finalize = spi_cache_finalize;
+
+  cache_signals[OBJECT_ADDED] =
+      g_signal_new ("object-added",
+                    SPI_CACHE_TYPE,
+                    G_SIGNAL_ACTION,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_VOID__OBJECT,
+                    G_TYPE_NONE,
+                    1,
+                    G_TYPE_OBJECT);
+
+  cache_signals[OBJECT_REMOVED] =
+      g_signal_new ("object-removed",
+                    SPI_CACHE_TYPE,
+                    G_SIGNAL_ACTION,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_VOID__OBJECT,
+                    G_TYPE_NONE,
+                    1,
+                    G_TYPE_OBJECT);
+}
+
+static void
+spi_cache_init (SpiCache *cache)
+{
+  cache->objects = g_hash_table_new (g_direct_hash, g_direct_equal);
+  cache->add_traversal = g_queue_new ();
+
+#ifdef SPI_ATK_DEBUG
+  if (g_thread_supported ())
+    g_message ("AT-SPI: Threads enabled");
+
+  g_debug ("AT-SPI: Initial Atk tree regisration");
+#endif
+
+  g_signal_connect (spi_global_register,
+                    "object-deregistered",
+                    (GCallback) remove_object, cache);
+
+  add_subtree (cache, spi_global_app_data->root);
+
+  cache->child_added_listener = atk_add_global_event_listener (child_added_listener,
+                                                               "Gtk:AtkObject:children-changed");
+
+  g_signal_connect (G_OBJECT (spi_global_app_data->root),
+                    "children-changed::add",
+                    (GCallback) toplevel_added_listener, NULL);
+}
+
+static void
+spi_cache_finalize (GObject *object)
+{
+  SpiCache *cache = SPI_CACHE (object);
+
+  while (!g_queue_is_empty (cache->add_traversal))
+    g_object_unref (G_OBJECT (g_queue_pop_head (cache->add_traversal)));
+  g_queue_free (cache->add_traversal);
+  g_hash_table_unref (cache->objects);
+
+  g_signal_handlers_disconnect_by_func (spi_global_register,
+                                        (GCallback) remove_object, cache);
+
+  g_signal_handlers_disconnect_by_func (G_OBJECT (spi_global_app_data->root),
+                                        (GCallback) toplevel_added_listener, NULL);
+
+  atk_remove_global_event_listener (cache->child_added_listener);
+
+  G_OBJECT_CLASS (spi_cache_parent_class)->finalize (object);
+}
+
+/*---------------------------------------------------------------------------*/
+
+static void
+remove_object (GObject *source, GObject *gobj, gpointer data)
+{
+  SpiCache *cache = SPI_CACHE (data);
+
+  if (spi_cache_in (cache, gobj))
+    {
+#ifdef SPI_ATK_DEBUG
+      g_debug ("CACHE REM - %s - %d - %s\n", atk_object_get_name (ATK_OBJECT (gobj)),
+               atk_object_get_role (ATK_OBJECT (gobj)),
+               spi_register_object_to_path (spi_global_register, gobj));
+#endif
+      g_signal_emit (cache, cache_signals[OBJECT_REMOVED], 0, gobj);
+      g_hash_table_remove (cache->objects, gobj);
+    }
+  else if (g_queue_remove (cache->add_traversal, gobj))
+    {
+      g_object_unref (gobj);
+    }
+}
+
+static void
+add_object (SpiCache *cache, GObject *gobj)
+{
+  g_return_if_fail (G_IS_OBJECT (gobj));
+
+  g_hash_table_insert (cache->objects, gobj, NULL);
+
+#ifdef SPI_ATK_DEBUG
+  g_debug ("CACHE ADD - %s - %d - %s\n", atk_object_get_name (ATK_OBJECT (gobj)),
+           atk_object_get_role (ATK_OBJECT (gobj)),
+           spi_register_object_to_path (spi_global_register, gobj));
+#endif
+
+  g_signal_emit (cache, cache_signals[OBJECT_ADDED], 0, gobj);
+}
+
+/*---------------------------------------------------------------------------*/
+
+static GRecMutex cache_mutex;
+
+#ifdef SPI_ATK_DEBUG
+static GStaticMutex recursion_check_guard = G_STATIC_MUTEX_INIT;
+static gboolean recursion_check = FALSE;
+
+static gboolean
+recursion_check_and_set ()
+{
+  gboolean ret;
+  g_static_mutex_lock (&recursion_check_guard);
+  ret = recursion_check;
+  recursion_check = TRUE;
+  g_static_mutex_unlock (&recursion_check_guard);
+  return ret;
+}
+
+static void
+recursion_check_unset ()
+{
+  g_static_mutex_lock (&recursion_check_guard);
+  recursion_check = FALSE;
+  g_static_mutex_unlock (&recursion_check_guard);
+}
+#endif /* SPI_ATK_DEBUG */
+
+/*---------------------------------------------------------------------------*/
+
+static void
+append_children (AtkObject *accessible, GQueue *traversal)
+{
+  AtkObject *current;
+  guint i;
+  gint count = atk_object_get_n_accessible_children (accessible);
+
+  if (count < 0)
+    count = 0;
+  for (i = 0; i < count; i++)
+    {
+      current = atk_object_ref_accessible_child (accessible, i);
+      if (current)
+        {
+          g_queue_push_tail (traversal, current);
+        }
+    }
+}
+
+/*
+ * Adds a subtree of accessible objects
+ * to the cache at the accessible object provided.
+ *
+ * The leaf nodes do not have their children
+ * registered. A node is considered a leaf
+ * if it has the state "manages-descendants"
+ * or if it has already been registered.
+ */
+static void
+add_subtree (SpiCache *cache, AtkObject *accessible)
+{
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  g_object_ref (accessible);
+  g_queue_push_tail (cache->add_traversal, accessible);
+  add_pending_items (cache);
+}
+
+static gboolean
+add_pending_items (gpointer data)
+{
+  SpiCache *cache = SPI_CACHE (data);
+  AtkObject *current;
+  GQueue *to_add;
+
+  to_add = g_queue_new ();
+
+  while (!g_queue_is_empty (cache->add_traversal))
+    {
+      AtkStateSet *set;
+
+      /* cache->add_traversal holds a ref to current */
+      current = g_queue_pop_head (cache->add_traversal);
+      set = atk_object_ref_state_set (current);
+
+      if (set && !atk_state_set_contains_state (set, ATK_STATE_TRANSIENT))
+        {
+          /* transfer the ref into to_add */
+          g_queue_push_tail (to_add, current);
+          if (!spi_cache_in (cache, G_OBJECT (current)) &&
+              !atk_state_set_contains_state (set, ATK_STATE_MANAGES_DESCENDANTS) &&
+              !atk_state_set_contains_state (set, ATK_STATE_DEFUNCT))
+            {
+              append_children (current, cache->add_traversal);
+            }
+        }
+      else
+        {
+          /* drop the ref for the removed object */
+          g_object_unref (current);
+        }
+
+      if (set)
+        g_object_unref (set);
+    }
+
+  while (!g_queue_is_empty (to_add))
+    {
+      current = g_queue_pop_head (to_add);
+
+      /* Make sure object is registerd so we are notified if it goes away */
+      g_free (spi_register_object_to_path (spi_global_register,
+                                           G_OBJECT (current)));
+
+      add_object (cache, G_OBJECT (current));
+      g_object_unref (G_OBJECT (current));
+    }
+
+  g_queue_free (to_add);
+  cache->add_pending_idle = 0;
+  return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static gboolean
+child_added_listener (GSignalInvocationHint *signal_hint,
+                      guint n_param_values,
+                      const GValue *param_values,
+                      gpointer data)
+{
+  SpiCache *cache = spi_global_cache;
+  AtkObject *accessible;
+
+  const gchar *detail = NULL;
+
+  /*
+   * Ensure that only accessibles already in the cache
+   * have their signals processed.
+   */
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), TRUE);
+
+  g_rec_mutex_lock (&cache_mutex);
+
+  if (spi_cache_in (cache, G_OBJECT (accessible)))
+    {
+#ifdef SPI_ATK_DEBUG
+      if (recursion_check_and_set ())
+        g_warning ("AT-SPI: Recursive use of cache module");
+
+      g_debug ("AT-SPI: Tree update listener");
+#endif
+      if (signal_hint->detail)
+        detail = g_quark_to_string (signal_hint->detail);
+
+      if (detail && !strncmp (detail, "add", 3))
+        {
+          gpointer child;
+          child = g_value_get_pointer (param_values + 2);
+          if (!child)
+            {
+              g_rec_mutex_unlock (&cache_mutex);
+              return TRUE;
+            }
+
+          g_object_ref (child);
+          g_queue_push_tail (cache->add_traversal, child);
+
+          if (cache->add_pending_idle == 0)
+            cache->add_pending_idle = spi_idle_add (add_pending_items, cache);
+        }
+#ifdef SPI_ATK_DEBUG
+      recursion_check_unset ();
+#endif
+    }
+
+  g_rec_mutex_unlock (&cache_mutex);
+
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static void
+toplevel_added_listener (AtkObject *accessible,
+                         guint index,
+                         AtkObject *child)
+{
+  SpiCache *cache = spi_global_cache;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  g_rec_mutex_lock (&cache_mutex);
+
+  if (spi_cache_in (cache, G_OBJECT (accessible)))
+    {
+#ifdef SPI_ATK_DEBUG
+      if (recursion_check_and_set ())
+        g_warning ("AT-SPI: Recursive use of registration module");
+
+      g_debug ("AT-SPI: Toplevel added listener");
+#endif
+      if (!ATK_IS_OBJECT (child))
+        {
+          child = atk_object_ref_accessible_child (accessible, index);
+        }
+      else
+        g_object_ref (child);
+
+      g_queue_push_tail (cache->add_traversal, child);
+
+      if (cache->add_pending_idle == 0)
+        cache->add_pending_idle = spi_idle_add (add_pending_items, cache);
+#ifdef SPI_ATK_DEBUG
+      recursion_check_unset ();
+#endif
+    }
+
+  g_rec_mutex_unlock (&cache_mutex);
+}
+
+/*---------------------------------------------------------------------------*/
+
+void
+spi_cache_foreach (SpiCache *cache, GHFunc func, gpointer data)
+{
+  g_hash_table_foreach (cache->objects, func, data);
+}
+
+gboolean
+spi_cache_in (SpiCache *cache, GObject *object)
+{
+  if (!cache)
+    return FALSE;
+
+  if (g_hash_table_lookup_extended (cache->objects,
+                                    object,
+                                    NULL,
+                                    NULL))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+#ifdef SPI_ATK_DEBUG
+void
+spi_cache_print_info (GObject *obj)
+{
+  char *path = spi_register_object_to_path (spi_global_register, obj);
+
+  if (spi_cache_in (spi_global_cache, obj))
+    g_printf ("%s IC\n", path);
+  else
+    g_printf ("%s NC\n", path);
+
+  if (path)
+    g_free (path);
+}
+#endif
+
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/accessible-cache.h b/atk-adaptor/accessible-cache.h
new file mode 100644 (file)
index 0000000..af29dbd
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ACCESSIBLE_CACHE_H
+#define ACCESSIBLE_CACHE_H
+
+#include <glib-object.h>
+#include <glib.h>
+
+typedef struct _SpiCache SpiCache;
+typedef struct _SpiCacheClass SpiCacheClass;
+
+G_BEGIN_DECLS
+
+#define SPI_CACHE_TYPE (spi_cache_get_type ())
+#define SPI_CACHE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_CACHE_TYPE, SpiCache))
+#define SPI_CACHE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SPI_CACHE_TYPE, SpiCacheClass))
+#define SPI_IS_CACHE(o) (G_TYPE_CHECK__INSTANCE_TYPE ((o), SPI_CACHE_TYPE))
+#define SPI_IS_CACHE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SPI_CACHE_TYPE))
+
+struct _SpiCache
+{
+  GObject parent;
+
+  GHashTable *objects;
+  GQueue *add_traversal;
+  gint add_pending_idle;
+
+  guint child_added_listener;
+};
+
+struct _SpiCacheClass
+{
+  GObjectClass parent_class;
+};
+
+GType spi_cache_get_type (void);
+
+extern SpiCache *spi_global_cache;
+
+void
+spi_cache_foreach (SpiCache *cache, GHFunc func, gpointer data);
+
+gboolean
+spi_cache_in (SpiCache *cache, GObject *object);
+
+G_END_DECLS
+#endif /* ACCESSIBLE_CACHE_H */
diff --git a/atk-adaptor/accessible-leasing.c b/atk-adaptor/accessible-leasing.c
new file mode 100644 (file)
index 0000000..e662fbc
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2009, 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "accessible-leasing.h"
+#include "event.h"
+
+#ifdef SPI_ATK_DEBUG
+#include "accessible-cache.h"
+#endif
+
+/*---------------------------------------------------------------------------*/
+
+SpiLeasing *spi_global_leasing;
+
+typedef struct _ExpiryElement
+{
+  gint64 expiry_s;
+  GObject *object;
+} ExpiryElement;
+
+static void spi_leasing_dispose (GObject *object);
+
+static void spi_leasing_finalize (GObject *object);
+
+static void add_expiry_timeout (SpiLeasing *leasing);
+
+/*---------------------------------------------------------------------------*/
+
+G_DEFINE_TYPE (SpiLeasing, spi_leasing, G_TYPE_OBJECT)
+
+static void
+spi_leasing_class_init (SpiLeasingClass *klass)
+{
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  spi_leasing_parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+  object_class->finalize = spi_leasing_finalize;
+  object_class->dispose = spi_leasing_dispose;
+}
+
+static void
+spi_leasing_init (SpiLeasing *leasing)
+{
+  leasing->expiry_queue = g_queue_new ();
+  leasing->expiry_func_id = 0;
+}
+
+static void
+spi_leasing_finalize (GObject *object)
+{
+  SpiLeasing *leasing = SPI_LEASING (object);
+
+  if (leasing->expiry_func_id)
+    g_source_remove (leasing->expiry_func_id);
+  g_queue_free (leasing->expiry_queue);
+  G_OBJECT_CLASS (spi_leasing_parent_class)->finalize (object);
+}
+
+static void
+spi_leasing_dispose (GObject *object)
+{
+  SpiLeasing *leasing = SPI_LEASING (object);
+
+  ExpiryElement *head;
+  while ((head = g_queue_pop_head (leasing->expiry_queue)))
+    {
+      g_object_unref (head->object);
+      g_slice_free (ExpiryElement, head);
+    }
+  G_OBJECT_CLASS (spi_leasing_parent_class)->dispose (object);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+  End the lease on all objects whose expiry time has passed.
+
+  Check when the next event is and set the next expiry func.
+*/
+static gboolean
+expiry_func (gpointer data)
+{
+  SpiLeasing *leasing = SPI_LEASING (data);
+
+  ExpiryElement *head, *current;
+  gint64 secs = g_get_monotonic_time () / 1000000;
+
+  head = g_queue_peek_head (leasing->expiry_queue);
+  while (head != NULL && head->expiry_s <= secs)
+    {
+      current = g_queue_pop_head (leasing->expiry_queue);
+
+#ifdef SPI_ATK_DEBUG
+      g_debug ("REVOKE - ");
+      spi_cache_print_info (current->object);
+#endif
+
+      g_object_unref (current->object);
+      g_slice_free (ExpiryElement, current);
+
+      head = g_queue_peek_head (leasing->expiry_queue);
+    }
+
+  leasing->expiry_func_id = 0;
+  add_expiry_timeout (leasing);
+
+  return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+  Checks if an expiry timeout is already scheduled, if so returns.
+  This is becasue events will always be added to the end of the queue.
+  Events are always later in time to previoulsy added events.
+
+  Otherwise calculate the next wake time using the top of the queue
+  and add the next expiry function.
+
+  This function is called when a lease is added or at the end of the
+  expiry function to add the next expiry timeout.
+*/
+static void
+add_expiry_timeout (SpiLeasing *leasing)
+{
+  ExpiryElement *elem;
+  gint64 secs = g_get_monotonic_time () / 1000000;
+  guint next_expiry;
+
+  if (leasing->expiry_func_id != 0)
+    return;
+
+  elem = (ExpiryElement *) g_queue_peek_head (leasing->expiry_queue);
+  if (elem == NULL)
+    return;
+
+  next_expiry = elem->expiry_s - secs;
+  leasing->expiry_func_id = spi_timeout_add_seconds (next_expiry,
+                                                     expiry_func, leasing);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+  The lease time is expected to be in seconds, the rounding is going to be to
+  intervals of 1 second.
+
+  The lease time is going to be rounded up, as the lease time should be
+  considered a MINIMUM that the object will be leased for.
+*/
+#define LEASE_TIME_S 15
+#define EXPIRY_TIME_S (LEASE_TIME_S + 1)
+
+GObject *
+spi_leasing_take (SpiLeasing *leasing, GObject *object)
+{
+  /*
+     Get the current time.
+     Quantize the time.
+     Add the release event to the queue.
+     Check the next expiry.
+   */
+
+  gint64 secs = g_get_monotonic_time () / 1000000;
+  guint expiry_s;
+
+  ExpiryElement *elem;
+
+  expiry_s = secs + EXPIRY_TIME_S;
+
+  elem = g_slice_new (ExpiryElement);
+  elem->expiry_s = expiry_s;
+  elem->object = g_object_ref (object);
+
+  g_queue_push_tail (leasing->expiry_queue, elem);
+
+  add_expiry_timeout (leasing);
+
+#ifdef SPI_ATK_DEBUG
+  g_debug ("LEASE - ");
+  spi_cache_print_info (object);
+#endif
+
+  return object;
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/accessible-leasing.h b/atk-adaptor/accessible-leasing.h
new file mode 100644 (file)
index 0000000..eefc7f1
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008, 2009 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ACCESSIBLE_LEASING_H
+#define ACCESSIBLE_LEASING_H
+
+#include <glib-object.h>
+#include <glib.h>
+
+typedef struct _SpiLeasing SpiLeasing;
+typedef struct _SpiLeasingClass SpiLeasingClass;
+
+G_BEGIN_DECLS
+
+#define SPI_LEASING_TYPE (spi_leasing_get_type ())
+#define SPI_LEASING(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_LEASING_TYPE, SpiLeasing))
+#define SPI_LEASING_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SPI_LEASING_TYPE, SpiLeasingClass))
+#define SPI_IS_LEASING(o) (G_TYPE_CHECK__INSTANCE_TYPE ((o), SPI_LEASING_TYPE))
+#define SPI_IS_LEASING_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SPI_LEASING_TYPE))
+
+struct _SpiLeasing
+{
+  GObject parent;
+
+  GQueue *expiry_queue;
+  guint expiry_func_id;
+};
+
+struct _SpiLeasingClass
+{
+  GObjectClass parent_class;
+};
+
+GType spi_leasing_get_type (void);
+
+extern SpiLeasing *spi_global_leasing;
+
+GObject *spi_leasing_take (SpiLeasing *leasing, GObject *object);
+
+G_END_DECLS
+#endif /* ACCESSIBLE_LEASING_H */
diff --git a/atk-adaptor/accessible-register.c b/atk-adaptor/accessible-register.c
new file mode 100644 (file)
index 0000000..6361ec4
--- /dev/null
@@ -0,0 +1,320 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008, 2009, 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "accessible-register.h"
+#include "bridge.h"
+
+/*
+ * This module is responsible for keeping track of all the AtkObjects in
+ * the application, so that they can be accessed remotely and placed in
+ * a client side cache.
+ *
+ * To access an AtkObject remotely we need to provide a D-Bus object
+ * path for it. The D-Bus object paths used have a standard prefix
+ * (SPI_ATK_OBJECT_PATH_PREFIX). Appended to this prefix is a string
+ * representation of an integer reference. So to access an AtkObject
+ * remotely we keep a Hashtable that maps the given reference to
+ * the AtkObject pointer. An object in this hash table is said to be 'registered'.
+ *
+ * The architecture of AT-SPI dbus is such that AtkObjects are not
+ * remotely reference counted. This means that we need to keep track of
+ * object destruction. When an object is destroyed it must be 'deregistered'
+ * To do this lookup we keep a dbus-id attribute on each AtkObject.
+ *
+ */
+
+#define SPI_ATK_PATH_PREFIX_LENGTH 27
+#define SPI_ATK_OBJECT_PATH_PREFIX "/org/a11y/atspi/accessible/"
+#define SPI_ATK_OBJECT_PATH_ROOT "root"
+
+#define SPI_ATK_OBJECT_REFERENCE_TEMPLATE SPI_ATK_OBJECT_PATH_PREFIX "%d"
+
+#define SPI_DBUS_ID "spi-dbus-id"
+
+SpiRegister *spi_global_register = NULL;
+
+static const gchar *spi_register_root_path = SPI_ATK_OBJECT_PATH_PREFIX SPI_ATK_OBJECT_PATH_ROOT;
+
+enum
+{
+  OBJECT_REGISTERED,
+  OBJECT_DEREGISTERED,
+  LAST_SIGNAL
+};
+static guint register_signals[LAST_SIGNAL] = { 0 };
+
+/*---------------------------------------------------------------------------*/
+
+static void
+spi_register_finalize (GObject *object);
+
+/*---------------------------------------------------------------------------*/
+
+G_DEFINE_TYPE (SpiRegister, spi_register, G_TYPE_OBJECT)
+
+static void
+spi_register_class_init (SpiRegisterClass *klass)
+{
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  spi_register_parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+  object_class->finalize = spi_register_finalize;
+
+  register_signals[OBJECT_REGISTERED] =
+      g_signal_new ("object-registered",
+                    SPI_REGISTER_TYPE,
+                    G_SIGNAL_ACTION,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_VOID__OBJECT,
+                    G_TYPE_NONE,
+                    1,
+                    G_TYPE_OBJECT);
+
+  register_signals[OBJECT_DEREGISTERED] =
+      g_signal_new ("object-deregistered",
+                    SPI_REGISTER_TYPE,
+                    G_SIGNAL_ACTION,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_VOID__OBJECT,
+                    G_TYPE_NONE,
+                    1,
+                    G_TYPE_OBJECT);
+}
+
+static void
+spi_register_init (SpiRegister *reg)
+{
+  reg->ref2ptr = g_hash_table_new (g_direct_hash, g_direct_equal);
+  reg->reference_counter = 0;
+}
+
+static void
+deregister_object (gpointer data, GObject *gobj)
+{
+  SpiRegister *reg = SPI_REGISTER (data);
+
+  spi_register_deregister_object (reg, gobj, FALSE);
+}
+
+static void
+spi_register_remove_weak_ref (gpointer key, gpointer val, gpointer reg)
+{
+  g_object_weak_unref (val, deregister_object, reg);
+}
+
+static void
+spi_register_finalize (GObject *object)
+{
+  SpiRegister *reg = SPI_REGISTER (object);
+
+  g_hash_table_foreach (reg->ref2ptr, spi_register_remove_weak_ref, reg);
+  g_hash_table_unref (reg->ref2ptr);
+
+  G_OBJECT_CLASS (spi_register_parent_class)->finalize (object);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Each AtkObject must be asssigned a D-Bus path (Reference)
+ *
+ * This function provides an integer reference for a new
+ * AtkObject.
+ *
+ * TODO: Make this reference a little more unique, this is shoddy.
+ */
+static guint
+assign_reference (SpiRegister *reg)
+{
+  reg->reference_counter++;
+  /* Reference of 0 not allowed as used as direct key in hash table */
+  if (reg->reference_counter == 0)
+    reg->reference_counter++;
+  return reg->reference_counter;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Returns the reference of the object, or 0 if it is not registered.
+ */
+static guint
+object_to_ref (GObject *gobj)
+{
+  return GPOINTER_TO_INT (g_object_get_data (gobj, SPI_DBUS_ID));
+}
+
+/*
+ * Converts the Accessible object reference to its D-Bus object path
+ */
+static gchar *
+ref_to_path (guint ref)
+{
+  return g_strdup_printf (SPI_ATK_OBJECT_REFERENCE_TEMPLATE, ref);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Callback for when a registered AtkObject is destroyed.
+ *
+ * Removes the AtkObject from the reference lookup tables, meaning
+ * it is no longer exposed over D-Bus.
+ */
+void
+spi_register_deregister_object (SpiRegister *reg, GObject *gobj, gboolean unref)
+{
+  guint ref;
+
+  ref = object_to_ref (gobj);
+  if (ref != 0)
+    {
+      g_signal_emit (reg,
+                     register_signals[OBJECT_DEREGISTERED],
+                     0,
+                     gobj);
+      if (unref)
+        g_object_weak_unref (gobj, deregister_object, reg);
+      g_hash_table_remove (reg->ref2ptr, GINT_TO_POINTER (ref));
+
+#ifdef SPI_ATK_DEBUG
+      g_debug ("DEREG  - %d", ref);
+#endif
+    }
+}
+
+static void
+register_object (SpiRegister *reg, GObject *gobj)
+{
+  guint ref;
+  g_return_if_fail (G_IS_OBJECT (gobj));
+
+  ref = assign_reference (reg);
+
+  g_hash_table_insert (reg->ref2ptr, GINT_TO_POINTER (ref), gobj);
+  g_object_set_data (G_OBJECT (gobj), SPI_DBUS_ID, GINT_TO_POINTER (ref));
+  g_object_weak_ref (G_OBJECT (gobj), deregister_object, reg);
+
+#ifdef SPI_ATK_DEBUG
+  g_debug ("REG  - %d", ref);
+#endif
+
+  g_signal_emit (reg, register_signals[OBJECT_REGISTERED], 0, gobj);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Used to lookup an GObject from its D-Bus path.
+ *
+ * If the D-Bus path is not found this function returns NULL.
+ */
+GObject *
+spi_register_path_to_object (SpiRegister *reg, const char *path)
+{
+  guint index;
+  void *data;
+
+  g_return_val_if_fail (path, NULL);
+
+  if (strncmp (path, SPI_ATK_OBJECT_PATH_PREFIX, SPI_ATK_PATH_PREFIX_LENGTH) != 0)
+    return NULL;
+
+  path += SPI_ATK_PATH_PREFIX_LENGTH; /* Skip over the prefix */
+
+  /* Map the root path to the root object. */
+  if (!g_strcmp0 (SPI_ATK_OBJECT_PATH_ROOT, path))
+    return G_OBJECT (spi_global_app_data->root);
+
+  index = atoi (path);
+  data = g_hash_table_lookup (reg->ref2ptr, GINT_TO_POINTER (index));
+  if (data)
+    return G_OBJECT (data);
+  else
+    return NULL;
+}
+
+GObject *
+spi_global_register_path_to_object (const char *path)
+{
+  return spi_register_path_to_object (spi_global_register, path);
+}
+
+/*
+ * Used to lookup a D-Bus path from the GObject.
+ *
+ * If the objects is not already registered,
+ * this function will register it.
+ */
+gchar *
+spi_register_object_to_path (SpiRegister *reg, GObject *gobj)
+{
+  guint ref;
+
+  if (gobj == NULL)
+    return NULL;
+
+  /* Map the root object to the root path. */
+  if ((void *) gobj == (void *) spi_global_app_data->root)
+    return g_strdup (spi_register_root_path);
+
+  ref = object_to_ref (gobj);
+  if (!ref)
+    {
+      register_object (reg, gobj);
+      ref = object_to_ref (gobj);
+    }
+
+  if (!ref)
+    return NULL;
+  else
+    return ref_to_path (ref);
+}
+
+guint
+spi_register_object_to_ref (GObject *gobj)
+{
+  return object_to_ref (gobj);
+}
+
+/*
+ * Gets the path that indicates the accessible desktop object.
+ * This object is logically located on the registry daemon and not
+ * within any particular application.
+ */
+gchar *
+spi_register_root_object_path ()
+{
+  return g_strdup (SPI_ATK_OBJECT_PATH_PREFIX SPI_ATK_OBJECT_PATH_ROOT);
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/accessible-register.h b/atk-adaptor/accessible-register.h
new file mode 100644 (file)
index 0000000..3d1bb75
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008, 2009 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ACCESSIBLE_REGISTER_H
+#define ACCESSIBLE_REGISTER_H
+
+#include <glib-object.h>
+#include <glib.h>
+
+typedef struct _SpiRegister SpiRegister;
+typedef struct _SpiRegisterClass SpiRegisterClass;
+
+G_BEGIN_DECLS
+
+#define SPI_REGISTER_TYPE (spi_register_get_type ())
+#define SPI_REGISTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_REGISTER_TYPE, SpiRegister))
+#define SPI_REGISTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SPI_REGISTER_TYPE, SpiRegisterClass))
+#define SPI_IS_REGISTER(o) (G_TYPE_CHECK__INSTANCE_TYPE ((o), SPI_REGISTER_TYPE))
+#define SPI_IS_REGISTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SPI_REGISTER_TYPE))
+
+struct _SpiRegister
+{
+  GObject parent;
+
+  GHashTable *ref2ptr;
+  guint reference_counter;
+};
+
+struct _SpiRegisterClass
+{
+  GObjectClass parent_class;
+};
+
+GType spi_register_get_type (void);
+
+extern SpiRegister *spi_global_register;
+
+/*---------------------------------------------------------------------------*/
+
+GObject *
+spi_register_path_to_object (SpiRegister *reg, const char *path);
+
+GObject *
+spi_global_register_path_to_object (const char *path);
+
+gchar *
+spi_register_object_to_path (SpiRegister *reg, GObject *gobj);
+
+guint
+spi_register_object_to_ref (GObject *gobj);
+
+gchar *
+spi_register_root_object_path ();
+
+void
+spi_register_deregister_object (SpiRegister *reg, GObject *gobj, gboolean unref);
+
+/*---------------------------------------------------------------------------*/
+
+#endif /* ACCESSIBLE_REGISTER_H */
diff --git a/atk-adaptor/accessible-stateset.c b/atk-adaptor/accessible-stateset.c
new file mode 100644 (file)
index 0000000..09f8962
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* stateset.c : implements the StateSet interface */
+
+#include "config.h"
+
+#include "accessible-stateset.h"
+#include "bitarray.h"
+
+#include <stdio.h>
+
+static AtspiStateType *accessible_state_types = NULL;
+static AtkStateType *atk_state_types = NULL;
+
+static gboolean
+spi_init_state_type_tables (void)
+{
+  gint i;
+
+  if (accessible_state_types || atk_state_types)
+    return FALSE;
+  if (!accessible_state_types)
+    accessible_state_types = g_new (AtspiStateType, ATK_STATE_LAST_DEFINED);
+  if (!atk_state_types)
+    atk_state_types = g_new (AtkStateType, ATSPI_STATE_LAST_DEFINED);
+  g_return_val_if_fail (accessible_state_types, FALSE);
+  g_return_val_if_fail (atk_state_types, FALSE);
+
+  for (i = 0; i < ATSPI_STATE_LAST_DEFINED; i++)
+    {
+      atk_state_types[i] = ATK_STATE_INVALID;
+    }
+
+  for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
+    {
+      accessible_state_types[i] = ATSPI_STATE_INVALID;
+    }
+
+  accessible_state_types[ATK_STATE_ACTIVE] = ATSPI_STATE_ACTIVE;
+  atk_state_types[ATSPI_STATE_ACTIVE] = ATK_STATE_ACTIVE;
+  accessible_state_types[ATK_STATE_ANIMATED] = ATSPI_STATE_ANIMATED;
+  atk_state_types[ATSPI_STATE_ANIMATED] = ATK_STATE_ANIMATED;
+  accessible_state_types[ATK_STATE_ARMED] = ATSPI_STATE_ARMED;
+  atk_state_types[ATSPI_STATE_ARMED] = ATK_STATE_ARMED;
+  accessible_state_types[ATK_STATE_BUSY] = ATSPI_STATE_BUSY;
+  atk_state_types[ATSPI_STATE_BUSY] = ATK_STATE_BUSY;
+  accessible_state_types[ATK_STATE_CHECKED] = ATSPI_STATE_CHECKED;
+  atk_state_types[ATSPI_STATE_CHECKED] = ATK_STATE_CHECKED;
+  accessible_state_types[ATK_STATE_DEFUNCT] = ATSPI_STATE_DEFUNCT;
+  atk_state_types[ATSPI_STATE_DEFUNCT] = ATK_STATE_DEFUNCT;
+  accessible_state_types[ATK_STATE_EDITABLE] = ATSPI_STATE_EDITABLE;
+  atk_state_types[ATSPI_STATE_EDITABLE] = ATK_STATE_EDITABLE;
+  accessible_state_types[ATK_STATE_ENABLED] = ATSPI_STATE_ENABLED;
+  atk_state_types[ATSPI_STATE_ENABLED] = ATK_STATE_ENABLED;
+  accessible_state_types[ATK_STATE_EXPANDABLE] = ATSPI_STATE_EXPANDABLE;
+  atk_state_types[ATSPI_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
+  accessible_state_types[ATK_STATE_EXPANDED] = ATSPI_STATE_EXPANDED;
+  atk_state_types[ATSPI_STATE_EXPANDED] = ATK_STATE_EXPANDED;
+  accessible_state_types[ATK_STATE_FOCUSABLE] = ATSPI_STATE_FOCUSABLE;
+  atk_state_types[ATSPI_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
+  accessible_state_types[ATK_STATE_FOCUSED] = ATSPI_STATE_FOCUSED;
+  atk_state_types[ATSPI_STATE_FOCUSED] = ATK_STATE_FOCUSED;
+  accessible_state_types[ATK_STATE_HORIZONTAL] = ATSPI_STATE_HORIZONTAL;
+  atk_state_types[ATSPI_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
+  accessible_state_types[ATK_STATE_ICONIFIED] = ATSPI_STATE_ICONIFIED;
+  atk_state_types[ATSPI_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
+  accessible_state_types[ATK_STATE_MODAL] = ATSPI_STATE_MODAL;
+  atk_state_types[ATSPI_STATE_MODAL] = ATK_STATE_MODAL;
+  accessible_state_types[ATK_STATE_MULTI_LINE] = ATSPI_STATE_MULTI_LINE;
+  atk_state_types[ATSPI_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
+  accessible_state_types[ATK_STATE_MULTISELECTABLE] = ATSPI_STATE_MULTISELECTABLE;
+  atk_state_types[ATSPI_STATE_MULTISELECTABLE] = ATK_STATE_MULTISELECTABLE;
+  accessible_state_types[ATK_STATE_OPAQUE] = ATSPI_STATE_OPAQUE;
+  atk_state_types[ATSPI_STATE_OPAQUE] = ATK_STATE_OPAQUE;
+  accessible_state_types[ATK_STATE_PRESSED] = ATSPI_STATE_PRESSED;
+  atk_state_types[ATSPI_STATE_PRESSED] = ATK_STATE_PRESSED;
+  accessible_state_types[ATK_STATE_RESIZABLE] = ATSPI_STATE_RESIZABLE;
+  atk_state_types[ATSPI_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
+  accessible_state_types[ATK_STATE_SELECTABLE] = ATSPI_STATE_SELECTABLE;
+  atk_state_types[ATSPI_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
+  accessible_state_types[ATK_STATE_SELECTED] = ATSPI_STATE_SELECTED;
+  atk_state_types[ATSPI_STATE_SELECTED] = ATK_STATE_SELECTED;
+  accessible_state_types[ATK_STATE_SENSITIVE] = ATSPI_STATE_SENSITIVE;
+  atk_state_types[ATSPI_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
+  accessible_state_types[ATK_STATE_SHOWING] = ATSPI_STATE_SHOWING;
+  atk_state_types[ATSPI_STATE_SHOWING] = ATK_STATE_SHOWING;
+  accessible_state_types[ATK_STATE_SINGLE_LINE] = ATSPI_STATE_SINGLE_LINE;
+  atk_state_types[ATSPI_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
+  accessible_state_types[ATK_STATE_STALE] = ATSPI_STATE_STALE;
+  atk_state_types[ATSPI_STATE_STALE] = ATK_STATE_STALE;
+  accessible_state_types[ATK_STATE_TRANSIENT] = ATSPI_STATE_TRANSIENT;
+  atk_state_types[ATSPI_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
+  accessible_state_types[ATK_STATE_VERTICAL] = ATSPI_STATE_VERTICAL;
+  atk_state_types[ATSPI_STATE_VERTICAL] = ATK_STATE_VERTICAL;
+  accessible_state_types[ATK_STATE_VISIBLE] = ATSPI_STATE_VISIBLE;
+  atk_state_types[ATSPI_STATE_VISIBLE] = ATK_STATE_VISIBLE;
+  accessible_state_types[ATK_STATE_MANAGES_DESCENDANTS] = ATSPI_STATE_MANAGES_DESCENDANTS;
+  atk_state_types[ATSPI_STATE_MANAGES_DESCENDANTS] = ATK_STATE_MANAGES_DESCENDANTS;
+  accessible_state_types[ATK_STATE_INDETERMINATE] = ATSPI_STATE_INDETERMINATE;
+  atk_state_types[ATSPI_STATE_INDETERMINATE] = ATK_STATE_INDETERMINATE;
+  accessible_state_types[ATK_STATE_TRUNCATED] = ATSPI_STATE_TRUNCATED;
+  atk_state_types[ATSPI_STATE_TRUNCATED] = ATK_STATE_TRUNCATED;
+  accessible_state_types[ATK_STATE_REQUIRED] = ATSPI_STATE_REQUIRED;
+  atk_state_types[ATSPI_STATE_REQUIRED] = ATK_STATE_REQUIRED;
+  accessible_state_types[ATK_STATE_INVALID_ENTRY] = ATSPI_STATE_INVALID_ENTRY;
+  atk_state_types[ATSPI_STATE_INVALID_ENTRY] = ATK_STATE_INVALID_ENTRY;
+  accessible_state_types[ATK_STATE_SUPPORTS_AUTOCOMPLETION] = ATSPI_STATE_SUPPORTS_AUTOCOMPLETION;
+  atk_state_types[ATSPI_STATE_SUPPORTS_AUTOCOMPLETION] = ATK_STATE_SUPPORTS_AUTOCOMPLETION;
+  accessible_state_types[ATK_STATE_SELECTABLE_TEXT] = ATSPI_STATE_SELECTABLE_TEXT;
+  atk_state_types[ATSPI_STATE_SELECTABLE_TEXT] = ATK_STATE_SELECTABLE_TEXT;
+  accessible_state_types[ATK_STATE_DEFAULT] = ATSPI_STATE_IS_DEFAULT;
+  atk_state_types[ATSPI_STATE_IS_DEFAULT] = ATK_STATE_DEFAULT;
+  accessible_state_types[ATK_STATE_VISITED] = ATSPI_STATE_VISITED;
+  atk_state_types[ATSPI_STATE_VISITED] = ATK_STATE_VISITED;
+  accessible_state_types[ATK_STATE_HAS_POPUP] = ATSPI_STATE_HAS_POPUP;
+  atk_state_types[ATSPI_STATE_HAS_POPUP] = ATK_STATE_HAS_POPUP;
+  accessible_state_types[ATK_STATE_CHECKABLE] = ATSPI_STATE_CHECKABLE;
+  atk_state_types[ATSPI_STATE_CHECKABLE] = ATK_STATE_CHECKABLE;
+  accessible_state_types[ATK_STATE_HAS_TOOLTIP] = ATSPI_STATE_HAS_TOOLTIP;
+  atk_state_types[ATSPI_STATE_HAS_TOOLTIP] = ATK_STATE_HAS_TOOLTIP;
+  accessible_state_types[ATK_STATE_READ_ONLY] = ATSPI_STATE_READ_ONLY;
+  atk_state_types[ATSPI_STATE_READ_ONLY] = ATK_STATE_READ_ONLY;
+  accessible_state_types[ATK_STATE_COLLAPSED] = ATSPI_STATE_COLLAPSED;
+  atk_state_types[ATSPI_STATE_COLLAPSED] = ATK_STATE_COLLAPSED;
+
+  return TRUE;
+}
+
+static inline AtkState
+state_spi_to_atk (AtspiStateType state)
+{
+  guint idx = state;
+  if (idx < ATSPI_STATE_LAST_DEFINED)
+    return atk_state_types[idx];
+  else
+    return ATK_STATE_INVALID;
+}
+
+AtkState
+spi_atk_state_from_spi_state (AtspiStateType state)
+{
+  spi_init_state_type_tables ();
+  return state_spi_to_atk (state);
+}
+
+AtkStateSet *
+spi_state_set_cache_from_sequence (GArray *seq)
+{
+  int i;
+  AtkStateSet *set;
+  AtkStateType *states;
+
+  spi_init_state_type_tables ();
+
+  states = g_newa (AtkStateType, seq->len);
+  for (i = 0; i < seq->len; i++)
+    states[i] = state_spi_to_atk (g_array_index (seq, dbus_int32_t, i));
+
+  set = atk_state_set_new ();
+  atk_state_set_add_states (set, states, seq->len);
+
+  g_array_free (seq, TRUE);
+  return set;
+}
+
+void
+spi_atk_state_to_dbus_array (AtkObject *object, dbus_uint32_t *array)
+{
+  AtkStateSet *set = atk_object_ref_state_set (object);
+  spi_atk_state_set_to_dbus_array (set, array);
+  g_clear_object (&set);
+}
+
+void
+spi_atk_state_set_to_dbus_array (AtkStateSet *set, dbus_uint32_t *array)
+{
+  int i;
+
+  array[0] = 0;
+  array[1] = 0;
+  if (!set)
+    return;
+  spi_init_state_type_tables ();
+
+  g_assert (ATK_STATE_LAST_DEFINED <= 64);
+  for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
+    {
+      if (atk_state_set_contains_state (set, i))
+        {
+          int a = accessible_state_types[i];
+          g_assert (a < 64);
+          BITARRAY_SET (array, a);
+        }
+    }
+}
diff --git a/atk-adaptor/accessible-stateset.h b/atk-adaptor/accessible-stateset.h
new file mode 100644 (file)
index 0000000..cffab53
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ACCESSIBLE_STATE_SET_H_
+#define ACCESSIBLE_STATE_SET_H_
+
+#include "atk/atk.h"
+#include "atspi/atspi.h"
+
+G_BEGIN_DECLS
+
+/* private - internal API to abstract away atk API */
+AtkStateSet *spi_state_set_cache_from_sequence (GArray *seq);
+AtkState spi_atk_state_from_spi_state (AtspiStateType state);
+void spi_atk_state_to_dbus_array (AtkObject *object, dbus_uint32_t *array);
+void spi_atk_state_set_to_dbus_array (AtkStateSet *set, dbus_uint32_t *array);
+#define spi_state_set_cache_ref(s) g_object_ref (s)
+#define spi_state_set_cache_unref(s) g_object_unref (s)
+#define spi_state_set_cache_new(seq) spi_state_set_cache_from_sequence (seq)
+#define spi_state_set_cache_contains(s, a) atk_state_set_contains_state (ATK_STATE_SET (s), \
+                                                                         spi_atk_state_from_spi_state (a))
+#define spi_state_set_cache_add(s, a) atk_state_set_add_state (ATK_STATE_SET (s), \
+                                                               spi_atk_state_from_spi_state (a))
+#define spi_state_set_cache_remove(s, a) atk_state_set_remove_state (ATK_STATE_SET (s), \
+                                                                     spi_atk_state_from_spi_state (a))
+#define spi_state_set_cache_xor(a, b) atk_state_set_xor_sets (ATK_STATE_SET (a), ATK_STATE_SET (b))
+#define spi_state_set_cache_is_empty(a) atk_state_set_is_empty (ATK_STATE_SET (a))
+
+G_END_DECLS
+
+#endif /* ACCESSIBLE_STATE_SET_H_ */
diff --git a/atk-adaptor/adaptors/accessible-adaptor.c b/atk-adaptor/adaptors/accessible-adaptor.c
new file mode 100644 (file)
index 0000000..97b8967
--- /dev/null
@@ -0,0 +1,615 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "accessible-stateset.h"
+#include "atspi/atspi.h"
+#include "introspection.h"
+#include "object.h"
+#include "spi-dbus.h"
+#include <string.h>
+
+static dbus_bool_t
+impl_get_Name (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  return droute_return_v_string (iter, atk_object_get_name (object));
+}
+
+static dbus_bool_t
+impl_get_Description (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  return droute_return_v_string (iter, atk_object_get_description (object));
+}
+
+static dbus_bool_t
+impl_get_Locale (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  return droute_return_v_string (iter, atk_object_get_object_locale (object));
+}
+
+static dbus_bool_t
+impl_get_Parent (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *obj = (AtkObject *) user_data;
+  AtkObject *parent;
+  DBusMessageIter iter_variant;
+  dbus_uint32_t role;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  role = spi_accessible_role_from_atk_role (atk_object_get_role (obj));
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)",
+                                    &iter_variant);
+
+  parent = atk_object_get_parent (obj);
+  if (parent == NULL)
+    {
+      /* TODO, move in to a 'Plug' wrapper. */
+      if (ATK_IS_PLUG (obj))
+        {
+          char *id = g_object_get_data (G_OBJECT (obj), "dbus-plug-parent");
+          char *bus_parent;
+          char *path_parent;
+
+          if (id)
+            {
+              bus_parent = g_strdup (id);
+              if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':')))
+                {
+                  DBusMessageIter iter_parent;
+                  *(path_parent++) = '\0';
+                  dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL,
+                                                    &iter_parent);
+                  dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_STRING, &bus_parent);
+                  dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_OBJECT_PATH, &path_parent);
+                  dbus_message_iter_close_container (&iter_variant, &iter_parent);
+                }
+              else
+                {
+                  spi_object_append_null_reference (&iter_variant);
+                }
+            }
+          else
+            {
+              spi_object_append_null_reference (&iter_variant);
+            }
+        }
+      else if (role != ATSPI_ROLE_APPLICATION)
+        spi_object_append_null_reference (&iter_variant);
+      else
+        spi_object_append_desktop_reference (&iter_variant);
+    }
+  else
+    {
+      spi_object_append_reference (&iter_variant, parent);
+    }
+
+  dbus_message_iter_close_container (iter, &iter_variant);
+  return TRUE;
+}
+
+static dbus_bool_t
+impl_get_ChildCount (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  int childCount;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  childCount = (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)))
+                   ? 1
+                   : atk_object_get_n_accessible_children (object);
+  return droute_return_v_int32 (iter, childCount);
+}
+
+static DBusMessage *
+impl_GetChildAtIndex (DBusConnection *bus,
+                      DBusMessage *message,
+                      void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  DBusMessage *reply;
+  dbus_int32_t i;
+  AtkObject *child;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  if (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)) && i == 0)
+    {
+      AtkSocket *socket = ATK_SOCKET (object);
+      gchar *child_name, *child_path;
+      child_name = g_strdup (socket->embedded_plug_id);
+      child_path = g_utf8_strchr (child_name + 1, -1, ':');
+      if (child_path)
+        {
+          DBusMessageIter iter, iter_socket;
+          *(child_path++) = '\0';
+          reply = dbus_message_new_method_return (message);
+          if (!reply)
+            return NULL;
+          dbus_message_iter_init_append (reply, &iter);
+          dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL,
+                                            &iter_socket);
+          dbus_message_iter_append_basic (&iter_socket, DBUS_TYPE_STRING, &child_name);
+          dbus_message_iter_append_basic (&iter_socket, DBUS_TYPE_OBJECT_PATH, &child_path);
+          g_free (child_name);
+          dbus_message_iter_close_container (&iter, &iter_socket);
+          return reply;
+        }
+      g_free (child_name);
+    }
+  child = atk_object_ref_accessible_child (object, i);
+  reply = spi_object_return_reference (message, child);
+  if (child)
+    g_object_unref (child);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_GetChildren (DBusConnection *bus,
+                  DBusMessage *message,
+                  void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  gint i;
+  gint count;
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  count = atk_object_get_n_accessible_children (object);
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    goto oom;
+  dbus_message_iter_init_append (reply, &iter);
+  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array))
+    goto oom;
+
+  if (ATK_IS_SOCKET (object) && atk_socket_is_occupied (ATK_SOCKET (object)))
+    {
+      AtkSocket *socket = ATK_SOCKET (object);
+      gchar *child_name, *child_path;
+      child_name = g_strdup (socket->embedded_plug_id);
+      child_path = g_utf8_strchr (child_name + 1, -1, ':');
+      if (child_path)
+        {
+          DBusMessageIter iter_struct;
+          *(child_path++) = '\0';
+          dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL,
+                                            &iter_struct);
+          dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING,
+                                          &child_name);
+          dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH,
+                                          &child_path);
+          dbus_message_iter_close_container (&iter_array, &iter_struct);
+          g_free (child_name);
+          if (!dbus_message_iter_close_container (&iter, &iter_array))
+            goto oom;
+          return reply;
+        }
+      g_free (child_name);
+    }
+
+  for (i = 0; i < count; i++)
+    {
+      AtkObject *child = atk_object_ref_accessible_child (object, i);
+      spi_object_append_reference (&iter_array, child);
+      if (child)
+        g_object_unref (child);
+    }
+  if (!dbus_message_iter_close_container (&iter, &iter_array))
+    goto oom;
+  return reply;
+oom:
+  // TODO: handle out-of-memory
+  return reply;
+}
+
+static DBusMessage *
+impl_GetIndexInParent (DBusConnection *bus,
+                       DBusMessage *message,
+                       void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  dbus_int32_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  rv = atk_object_get_index_in_parent (object);
+  reply = dbus_message_new_method_return (message);
+  dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv, DBUS_TYPE_INVALID);
+  return reply;
+}
+
+static gboolean
+spi_init_relation_type_table (AtspiRelationType *types)
+{
+  gint i;
+
+  for (i = 0; i < ATK_RELATION_LAST_DEFINED; i++)
+    types[i] = ATSPI_RELATION_NULL;
+
+  types[ATK_RELATION_CONTROLLED_BY] = ATSPI_RELATION_CONTROLLED_BY;
+  types[ATK_RELATION_CONTROLLER_FOR] = ATSPI_RELATION_CONTROLLER_FOR;
+  types[ATK_RELATION_LABEL_FOR] = ATSPI_RELATION_LABEL_FOR;
+  types[ATK_RELATION_LABELLED_BY] = ATSPI_RELATION_LABELLED_BY;
+  types[ATK_RELATION_MEMBER_OF] = ATSPI_RELATION_MEMBER_OF;
+  types[ATK_RELATION_NODE_CHILD_OF] = ATSPI_RELATION_NODE_CHILD_OF;
+  types[ATK_RELATION_FLOWS_TO] = ATSPI_RELATION_FLOWS_TO;
+  types[ATK_RELATION_FLOWS_FROM] = ATSPI_RELATION_FLOWS_FROM;
+  types[ATK_RELATION_SUBWINDOW_OF] = ATSPI_RELATION_SUBWINDOW_OF;
+  types[ATK_RELATION_EMBEDS] = ATSPI_RELATION_EMBEDS;
+  types[ATK_RELATION_EMBEDDED_BY] = ATSPI_RELATION_EMBEDDED_BY;
+  types[ATK_RELATION_POPUP_FOR] = ATSPI_RELATION_POPUP_FOR;
+  types[ATK_RELATION_PARENT_WINDOW_OF] =
+      ATSPI_RELATION_PARENT_WINDOW_OF;
+  types[ATK_RELATION_DESCRIPTION_FOR] =
+      ATSPI_RELATION_DESCRIPTION_FOR;
+  types[ATK_RELATION_DESCRIBED_BY] = ATSPI_RELATION_DESCRIBED_BY;
+  types[ATK_RELATION_DETAILS] = ATSPI_RELATION_DETAILS;
+  types[ATK_RELATION_DETAILS_FOR] = ATSPI_RELATION_DETAILS_FOR;
+  types[ATK_RELATION_ERROR_MESSAGE] = ATSPI_RELATION_ERROR_MESSAGE;
+  types[ATK_RELATION_ERROR_FOR] = ATSPI_RELATION_ERROR_FOR;
+  types[ATK_RELATION_NODE_PARENT_OF] = ATSPI_RELATION_NODE_PARENT_OF;
+
+  return TRUE;
+}
+
+static AtspiRelationType
+spi_relation_type_from_atk_relation_type (AtkRelationType type)
+{
+  static gboolean is_initialized = FALSE;
+  static AtspiRelationType
+      spi_relation_type_table[ATK_RELATION_LAST_DEFINED];
+  AtspiRelationType spi_type;
+
+  if (!is_initialized)
+    is_initialized = spi_init_relation_type_table (spi_relation_type_table);
+
+  if (type > ATK_RELATION_NULL && type < ATK_RELATION_LAST_DEFINED)
+    spi_type = spi_relation_type_table[type];
+  else
+    spi_type = ATSPI_RELATION_EXTENDED;
+  return spi_type;
+}
+
+static DBusMessage *
+impl_GetRelationSet (DBusConnection *bus,
+                     DBusMessage *message,
+                     void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  DBusMessage *reply;
+  AtkRelationSet *set;
+  DBusMessageIter iter, iter_array, iter_struct, iter_targets;
+  gint count;
+  gint i, j;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    return NULL;
+  set = atk_object_ref_relation_set (object);
+  dbus_message_iter_init_append (reply, &iter);
+  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ua(so))", &iter_array))
+    {
+      goto oom;
+    }
+  count = 0;
+  if (set)
+    count = atk_relation_set_get_n_relations (set);
+  for (i = 0; i < count; i++)
+    {
+      AtkRelation *r = atk_relation_set_get_relation (set, i);
+      AtkRelationType rt;
+      GPtrArray *target;
+      dbus_uint32_t type;
+      if (!r)
+        continue;
+      rt = atk_relation_get_relation_type (r);
+      type = spi_relation_type_from_atk_relation_type (rt);
+      target = atk_relation_get_target (r);
+      if (!dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct))
+        {
+          goto oom;
+        }
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &type);
+      if (!dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "(so)", &iter_targets))
+        {
+          goto oom;
+        }
+      for (j = 0; j < target->len; j++)
+        {
+          AtkObject *obj = target->pdata[j];
+          if (!obj)
+            continue;
+          spi_object_append_reference (&iter_targets, obj);
+        }
+      dbus_message_iter_close_container (&iter_struct, &iter_targets);
+      dbus_message_iter_close_container (&iter_array, &iter_struct);
+    }
+  dbus_message_iter_close_container (&iter, &iter_array);
+oom:
+  if (set)
+    g_object_unref (set);
+  // TODO: handle out of memory */
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRole (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  gint role;
+  dbus_uint32_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  role = atk_object_get_role (object);
+  rv = spi_accessible_role_from_atk_role (role);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_UINT32, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRoleName (DBusConnection *bus,
+                  DBusMessage *message,
+                  void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  gint role;
+  const char *role_name;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  role = atk_object_get_role (object);
+  role_name = atk_role_get_name (role);
+  if (!role_name)
+    role_name = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &role_name,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetLocalizedRoleName (DBusConnection *bus,
+                           DBusMessage *message,
+                           void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  gint role;
+  const char *role_name;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  role = atk_object_get_role (object);
+  role_name = atk_role_get_localized_name (role);
+  if (!role_name)
+    role_name = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &role_name,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetState (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+
+  DBusMessage *reply = NULL;
+  DBusMessageIter iter, iter_array;
+
+  dbus_uint32_t states[2];
+
+  guint count;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  reply = dbus_message_new_method_return (message);
+  dbus_message_iter_init_append (reply, &iter);
+
+  spi_atk_state_to_dbus_array (object, states);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "u", &iter_array);
+  for (count = 0; count < 2; count++)
+    {
+      dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_UINT32,
+                                      &states[count]);
+    }
+  dbus_message_iter_close_container (&iter, &iter_array);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAttributes (DBusConnection *bus,
+                    DBusMessage *message,
+                    void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  AtkAttributeSet *attributes;
+  DBusMessage *reply = NULL;
+  DBusMessageIter iter;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  attributes = atk_object_get_attributes (object);
+
+  reply = dbus_message_new_method_return (message);
+  dbus_message_iter_init_append (reply, &iter);
+  spi_object_append_attribute_set (&iter, attributes);
+
+  atk_attribute_set_free (attributes);
+
+  return reply;
+}
+
+static dbus_bool_t
+impl_get_Attributes (DBusMessageIter *iter, void *user_data)
+{
+  DBusMessageIter iter_variant;
+  AtkObject *object = (AtkObject *) user_data;
+  AtkAttributeSet *attributes;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  attributes = atk_object_get_attributes (object);
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "a{ss}", &iter_variant);
+  spi_object_append_attribute_set (&iter_variant, attributes);
+  dbus_message_iter_close_container (iter, &iter_variant);
+
+  atk_attribute_set_free (attributes);
+
+  return TRUE;
+}
+
+static DBusMessage *
+impl_GetApplication (DBusConnection *bus,
+                     DBusMessage *message,
+                     void *user_data)
+{
+  return spi_object_return_reference (message, atk_get_root ());
+}
+
+static DBusMessage *
+impl_GetInterfaces (DBusConnection *bus,
+                    DBusMessage *message,
+                    void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_iter_init_append (reply, &iter);
+      dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "s",
+                                        &iter_array);
+      spi_object_append_interfaces (&iter_array, object);
+      dbus_message_iter_close_container (&iter, &iter_array);
+    }
+  return reply;
+}
+
+static dbus_bool_t
+impl_get_AccessibleId (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  return droute_return_v_string (iter, atk_object_get_accessible_id (object));
+}
+
+static dbus_bool_t
+impl_get_HelpText (DBusMessageIter *iter, void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data), FALSE);
+
+  return droute_return_v_string (iter, atk_object_get_help_text (object));
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetChildAtIndex, "GetChildAtIndex" },
+  { impl_GetChildren, "GetChildren" },
+  { impl_GetIndexInParent, "GetIndexInParent" },
+  { impl_GetRelationSet, "GetRelationSet" },
+  { impl_GetRole, "GetRole" },
+  { impl_GetRoleName, "GetRoleName" },
+  { impl_GetLocalizedRoleName, "GetLocalizedRoleName" },
+  { impl_GetState, "GetState" },
+  { impl_GetAttributes, "GetAttributes" },
+  { impl_GetApplication, "GetApplication" },
+  { impl_GetInterfaces, "GetInterfaces" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_Name, NULL, "Name" },
+  { impl_get_Description, NULL, "Description" },
+  { impl_get_Locale, NULL, "Locale" },
+  { impl_get_Parent, NULL, "Parent" },
+  { impl_get_ChildCount, NULL, "ChildCount" },
+  { impl_get_Attributes, NULL, "Attributes" },
+  { impl_get_AccessibleId, NULL, "AccessibleId" },
+  { impl_get_HelpText, NULL, "HelpText" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_accessible (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_ACCESSIBLE,
+                         spi_org_a11y_atspi_Accessible,
+                         methods, properties);
+};
diff --git a/atk-adaptor/adaptors/action-adaptor.c b/atk-adaptor/adaptors/action-adaptor.c
new file mode 100644 (file)
index 0000000..284fd29
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+
+static dbus_bool_t
+impl_get_NActions (DBusMessageIter *iter, void *user_data)
+{
+  AtkAction *action = (AtkAction *) user_data;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_action_get_n_actions (action));
+}
+
+static DBusMessage *
+impl_get_description (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkAction *action = (AtkAction *) user_data;
+  DBusMessage *reply;
+  dbus_int32_t index;
+  const char *desc;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  desc = atk_action_get_description (action, index);
+  if (!desc)
+    desc = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &desc,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_get_name (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+  dbus_int32_t index;
+  const char *name;
+  AtkAction *action = (AtkAction *) user_data;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  name = atk_action_get_name (action, index);
+  if (!name)
+    name = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &name,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_get_localized_name (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+  dbus_int32_t index;
+  const char *name;
+  AtkAction *action = (AtkAction *) user_data;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  name = atk_action_get_localized_name (action, index);
+  if (!name)
+    name = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &name,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_get_keybinding (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+  dbus_int32_t index;
+  const char *kb;
+  AtkAction *action = (AtkAction *) user_data;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  kb = atk_action_get_keybinding (action, index);
+  if (!kb)
+    kb = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &kb,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetActions (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkAction *action = (AtkAction *) user_data;
+  DBusMessage *reply;
+  gint count;
+  gint i;
+  DBusMessageIter iter, iter_array, iter_struct;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data),
+                        droute_not_yet_handled_error (message));
+  count = atk_action_get_n_actions (action);
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    goto oom;
+  dbus_message_iter_init_append (reply, &iter);
+  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(sss)", &iter_array))
+    goto oom;
+  for (i = 0; i < count; i++)
+    {
+      const char *lname = atk_action_get_localized_name (action, i);
+      const char *desc = atk_action_get_description (action, i);
+      const char *kb = atk_action_get_keybinding (action, i);
+      if (!lname)
+        lname = "";
+      if (!desc)
+        desc = "";
+      if (!kb)
+        kb = "";
+      if (!dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct))
+        goto oom;
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &lname);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &desc);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &kb);
+      if (!dbus_message_iter_close_container (&iter_array, &iter_struct))
+        goto oom;
+    }
+  if (!dbus_message_iter_close_container (&iter, &iter_array))
+    goto oom;
+  return reply;
+oom:
+  // TODO: handle out-of-memory
+  return reply;
+}
+
+static DBusMessage *
+impl_DoAction (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkAction *action = (AtkAction *) user_data;
+  dbus_int32_t index;
+  dbus_bool_t rv = TRUE;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_ACTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  dbus_connection_send (bus, reply, NULL);
+  dbus_message_unref (reply);
+  atk_action_do_action (action, index);
+  return NULL;
+}
+
+DRouteMethod methods[] = {
+  { impl_get_description, "GetDescription" },
+  { impl_get_name, "GetName" },
+  { impl_get_localized_name, "GetLocalizedName" },
+  { impl_get_keybinding, "GetKeyBinding" },
+  { impl_GetActions, "GetActions" },
+  { impl_DoAction, "DoAction" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_NActions, NULL, "NActions" },
+  { NULL, NULL }
+};
+
+void
+spi_initialize_action (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_ACTION,
+                         spi_org_a11y_atspi_Action, methods, properties);
+};
diff --git a/atk-adaptor/adaptors/adaptors.h b/atk-adaptor/adaptors/adaptors.h
new file mode 100644 (file)
index 0000000..28691a7
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ADAPTORS_H
+#define ADAPTORS_H
+
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+AtspiRole spi_accessible_role_from_atk_role (AtkRole role);
+
+void spi_initialize_accessible (DRoutePath *path);
+void spi_initialize_action (DRoutePath *path);
+void spi_initialize_application (DRoutePath *path);
+void spi_initialize_collection (DRoutePath *path);
+void spi_initialize_component (DRoutePath *path);
+void spi_initialize_document (DRoutePath *path);
+void spi_initialize_editabletext (DRoutePath *path);
+void spi_initialize_hyperlink (DRoutePath *path);
+void spi_initialize_hypertext (DRoutePath *path);
+void spi_initialize_image (DRoutePath *path);
+void spi_initialize_selection (DRoutePath *path);
+void spi_initialize_socket (DRoutePath *path);
+void spi_initialize_table (DRoutePath *path);
+void spi_initialize_table_cell (DRoutePath *path);
+void spi_initialize_text (DRoutePath *path);
+void spi_initialize_value (DRoutePath *path);
+void spi_initialize_cache (DRoutePath *path);
+
+#endif /* ADAPTORS_H */
diff --git a/atk-adaptor/adaptors/application-adaptor.c b/atk-adaptor/adaptors/application-adaptor.c
new file mode 100644 (file)
index 0000000..2c0d83d
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <droute/droute.h>
+
+#include "introspection.h"
+#include "spi-dbus.h"
+
+/* for spi_global_app_data  is there a better way? */
+#include "../bridge.h"
+
+static dbus_bool_t
+impl_get_ToolkitName (DBusMessageIter *iter, void *user_data)
+{
+  return droute_return_v_string (iter, atk_get_toolkit_name ());
+}
+
+static dbus_bool_t
+impl_get_Version (DBusMessageIter *iter, void *user_data)
+{
+  return droute_return_v_string (iter, atk_get_toolkit_version ());
+}
+
+static dbus_bool_t
+impl_get_AtspiVersion (DBusMessageIter *iter, void *user_data)
+{
+  return droute_return_v_string (iter, "2.1");
+}
+
+static dbus_int32_t id;
+
+static dbus_bool_t
+impl_get_Id (DBusMessageIter *iter, void *user_data)
+{
+  return droute_return_v_int32 (iter, id);
+}
+
+static dbus_bool_t
+impl_set_Id (DBusMessageIter *iter, void *user_data)
+{
+  id = droute_get_v_int32 (iter);
+  return TRUE;
+}
+
+static DBusMessage *
+impl_registerToolkitEventListener (DBusConnection *bus,
+                                   DBusMessage *message,
+                                   void *user_data)
+{
+  return NULL;
+}
+
+static DBusMessage *
+impl_registerObjectEventListener (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  return NULL;
+}
+
+static DBusMessage *
+impl_GetLocale (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  return NULL;
+}
+
+static DBusMessage *
+impl_get_app_bus (DBusConnection *bus, DBusMessage *msg, void *data)
+{
+  DBusMessage *reply;
+
+  if (bus == spi_global_app_data->bus)
+    spi_atk_add_client (dbus_message_get_sender (msg));
+
+  if (!spi_global_app_data->app_bus_addr)
+    spi_atk_create_socket (spi_global_app_data);
+
+  reply = dbus_message_new_method_return (msg);
+  if (reply)
+    {
+      const char *retval = (atspi_is_initialized () ? "" : spi_global_app_data->app_bus_addr);
+      if (!retval)
+        retval = "";
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &retval, DBUS_TYPE_INVALID);
+    }
+
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_registerToolkitEventListener, "registerToolkitEventListener" },
+  { impl_registerObjectEventListener, "registerObjectEventListener" },
+  { impl_GetLocale, "GetLocale" },
+  { impl_get_app_bus, "GetApplicationBusAddress" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_ToolkitName, NULL, "ToolkitName" },
+  { impl_get_Version, NULL, "Version" },
+  { impl_get_AtspiVersion, NULL, "AtspiVersion" },
+  { impl_get_Id, impl_set_Id, "Id" },
+  { NULL, NULL, NULL }
+};
+
+/*static long
+obj_is_root (const char *path, void *user_data)
+{
+  AtkObject *obj = atk_dbus_get_object (path);
+  return (obj == atk_get_root ());
+}*/
+
+void
+spi_initialize_application (DRoutePath *path)
+{
+  droute_path_add_interface (path,
+                             ATSPI_DBUS_INTERFACE_APPLICATION,
+                             spi_org_a11y_atspi_Application,
+                             methods, properties);
+};
diff --git a/atk-adaptor/adaptors/cache-adaptor.c b/atk-adaptor/adaptors/cache-adaptor.c
new file mode 100644 (file)
index 0000000..63a984b
--- /dev/null
@@ -0,0 +1,355 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ * Copyright 2008, 2009 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <string.h>
+
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "accessible-cache.h"
+#include "accessible-stateset.h"
+#include "bridge.h"
+#include "introspection.h"
+#include "object.h"
+#include "spi-dbus.h"
+
+/* TODO - This should possibly be a common define */
+#define SPI_OBJECT_PREFIX "/org/a11y/atspi"
+#define SPI_CACHE_OBJECT_SUFFIX "/cache"
+#define SPI_CACHE_OBJECT_PATH SPI_OBJECT_PREFIX SPI_CACHE_OBJECT_SUFFIX
+
+#define SPI_OBJECT_REFERENCE_SIGNATURE "(" DBUS_TYPE_STRING_AS_STRING \
+    DBUS_TYPE_OBJECT_PATH_AS_STRING                                   \
+                                       ")"
+
+#define SPI_CACHE_ITEM_SIGNATURE "(" SPI_OBJECT_REFERENCE_SIGNATURE    \
+    SPI_OBJECT_REFERENCE_SIGNATURE                                     \
+        SPI_OBJECT_REFERENCE_SIGNATURE                                 \
+            DBUS_TYPE_INT32_AS_STRING                                  \
+                DBUS_TYPE_INT32_AS_STRING                              \
+                    DBUS_TYPE_ARRAY_AS_STRING                          \
+                        DBUS_TYPE_STRING_AS_STRING                     \
+                            DBUS_TYPE_STRING_AS_STRING                 \
+                                DBUS_TYPE_UINT32_AS_STRING             \
+                                    DBUS_TYPE_STRING_AS_STRING         \
+                                        DBUS_TYPE_ARRAY_AS_STRING      \
+                                            DBUS_TYPE_UINT32_AS_STRING \
+                                 ")"
+
+/*---------------------------------------------------------------------------*/
+
+static const char *
+get_toolkit_name (AtkObject *obj)
+{
+  static const char *toolkit_name = NULL;
+
+  if (!toolkit_name)
+    toolkit_name = atk_get_toolkit_name ();
+
+  if (!toolkit_name)
+    return "no toolkit name set yet";
+
+  /* TODO: query object attributes */
+  return toolkit_name;
+}
+
+static gboolean
+should_call_index_in_parent (AtkObject *obj, AtkStateSet *set)
+{
+  if (atk_state_set_contains_state (set, ATK_STATE_TRANSIENT))
+    return FALSE;
+
+  if (!strcmp (get_toolkit_name (obj), "gtk") &&
+      atk_object_get_role (obj) == ATK_ROLE_MENU_ITEM)
+    return FALSE;
+
+  return TRUE;
+}
+
+static gboolean
+should_cache_children (AtkObject *obj, AtkStateSet *set)
+{
+  if (atk_state_set_contains_state (set, ATK_STATE_MANAGES_DESCENDANTS) ||
+      atk_state_set_contains_state (set, ATK_STATE_DEFUNCT))
+    return FALSE;
+
+  if (!strcmp (get_toolkit_name (obj), "gtk") &&
+      atk_object_get_role (obj) == ATK_ROLE_MENU)
+    return FALSE;
+
+  return TRUE;
+}
+
+/*
+ * Marshals the given AtkObject into the provided D-Bus iterator.
+ *
+ * The object is marshalled including all its client side cache data.
+ * The format of the structure is (o(so)iiassusau).
+ */
+static void
+append_cache_item (AtkObject *obj, gpointer data)
+{
+  DBusMessageIter iter_struct, iter_sub_array;
+  dbus_uint32_t states[2];
+  dbus_int32_t count, index;
+  AtkStateSet *set;
+  DBusMessageIter *iter_array = (DBusMessageIter *) data;
+  const char *name, *desc;
+  dbus_uint32_t role;
+
+  set = atk_object_ref_state_set (obj);
+  AtkObject *application, *parent;
+
+  dbus_message_iter_open_container (iter_array, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+
+  /* Marshal object path */
+  spi_object_append_reference (&iter_struct, obj);
+
+  role = spi_accessible_role_from_atk_role (atk_object_get_role (obj));
+
+  /* Marshal application */
+  application = spi_global_app_data->root;
+  spi_object_append_reference (&iter_struct, application);
+
+  /* Marshal parent */
+  parent = atk_object_get_parent (obj);
+  if (parent == NULL)
+    {
+      /* TODO, move in to a 'Plug' wrapper. */
+      if (ATK_IS_PLUG (obj))
+        {
+          char *id = g_object_get_data (G_OBJECT (obj), "dbus-plug-parent");
+          char *bus_parent;
+          char *path_parent;
+
+          if (id)
+            {
+              bus_parent = g_strdup (id);
+              if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':')))
+                {
+                  DBusMessageIter iter_parent;
+                  *(path_parent++) = '\0';
+                  dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_STRUCT, NULL,
+                                                    &iter_parent);
+                  dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_STRING, &bus_parent);
+                  dbus_message_iter_append_basic (&iter_parent, DBUS_TYPE_OBJECT_PATH, &path_parent);
+                  dbus_message_iter_close_container (&iter_struct, &iter_parent);
+                }
+              else
+                {
+                  spi_object_append_null_reference (&iter_struct);
+                }
+            }
+          else
+            {
+              spi_object_append_null_reference (&iter_struct);
+            }
+        }
+      else if (role != ATSPI_ROLE_APPLICATION)
+        spi_object_append_null_reference (&iter_struct);
+      else
+        spi_object_append_desktop_reference (&iter_struct);
+    }
+  else
+    {
+      spi_object_append_reference (&iter_struct, parent);
+    }
+
+  /* Marshal index in parent */
+  index = (should_call_index_in_parent (obj, set)
+               ? atk_object_get_index_in_parent (obj)
+               : -1);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &index);
+
+  /* marshal child count */
+  count = (should_cache_children (obj, set)
+               ? atk_object_get_n_accessible_children (obj)
+               : -1);
+
+  if (ATK_IS_SOCKET (obj) && atk_socket_is_occupied (ATK_SOCKET (obj)))
+    count = 1;
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &count);
+
+  /* Marshal interfaces */
+  dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "s",
+                                    &iter_sub_array);
+  spi_object_append_interfaces (&iter_sub_array, obj);
+  dbus_message_iter_close_container (&iter_struct, &iter_sub_array);
+
+  /* Marshal name */
+  name = atk_object_get_name (obj);
+  if (!name)
+    name = "";
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+
+  /* Marshal role */
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &role);
+
+  /* Marshal description */
+  desc = atk_object_get_description (obj);
+  if (!desc)
+    desc = "";
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &desc);
+
+  /* Marshal state set */
+  spi_atk_state_set_to_dbus_array (set, states);
+  dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "u",
+                                    &iter_sub_array);
+  for (count = 0; count < 2; count++)
+    {
+      dbus_message_iter_append_basic (&iter_sub_array, DBUS_TYPE_UINT32,
+                                      &states[count]);
+    }
+  dbus_message_iter_close_container (&iter_struct, &iter_sub_array);
+
+  dbus_message_iter_close_container (iter_array, &iter_struct);
+  g_object_unref (set);
+}
+
+/*---------------------------------------------------------------------------*/
+
+static void
+ref_accessible_hf (gpointer key, gpointer obj_data, gpointer data)
+{
+  g_object_ref (key);
+}
+
+/* For use as a GHFunc */
+static void
+append_accessible_hf (gpointer key, gpointer obj_data, gpointer data)
+{
+  /* Make sure it isn't a hyperlink */
+  if (ATK_IS_OBJECT (key))
+    append_cache_item (ATK_OBJECT (key), data);
+}
+
+static void
+add_to_list_hf (gpointer key, gpointer obj_data, gpointer data)
+{
+  GSList **listptr = data;
+  *listptr = g_slist_prepend (*listptr, key);
+}
+
+/*---------------------------------------------------------------------------*/
+
+static void
+emit_cache_remove (SpiCache *cache, GObject *obj)
+{
+  DBusMessage *message;
+
+  if ((message = dbus_message_new_signal (SPI_CACHE_OBJECT_PATH,
+                                          ATSPI_DBUS_INTERFACE_CACHE,
+                                          "RemoveAccessible")))
+    {
+      DBusMessageIter iter;
+
+      dbus_message_iter_init_append (message, &iter);
+
+      spi_object_append_reference (&iter, ATK_OBJECT (obj));
+
+      dbus_connection_send (spi_global_app_data->bus, message, NULL);
+
+      dbus_message_unref (message);
+    }
+}
+
+static void
+emit_cache_add (SpiCache *cache, GObject *obj)
+{
+  AtkObject *accessible = ATK_OBJECT (obj);
+  DBusMessage *message;
+
+  if ((message = dbus_message_new_signal (SPI_CACHE_OBJECT_PATH,
+                                          ATSPI_DBUS_INTERFACE_CACHE,
+                                          "AddAccessible")))
+    {
+      DBusMessageIter iter;
+
+      dbus_message_iter_init_append (message, &iter);
+      g_object_ref (accessible);
+      append_cache_item (accessible, &iter);
+      g_object_unref (accessible);
+
+      dbus_connection_send (spi_global_app_data->bus, message, NULL);
+
+      dbus_message_unref (message);
+    }
+}
+
+/*---------------------------------------------------------------------------*/
+
+static DBusMessage *
+impl_GetRoot (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  return spi_object_return_reference (message, spi_global_app_data->root);
+}
+
+/*---------------------------------------------------------------------------*/
+
+static DBusMessage *
+impl_GetItems (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+  GSList *pending_unrefs = NULL;
+
+  if (bus == spi_global_app_data->bus)
+    spi_atk_add_client (dbus_message_get_sender (message));
+
+  reply = dbus_message_new_method_return (message);
+
+  dbus_message_iter_init_append (reply, &iter);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
+                                    SPI_CACHE_ITEM_SIGNATURE, &iter_array);
+  spi_cache_foreach (spi_global_cache, ref_accessible_hf, NULL);
+  spi_cache_foreach (spi_global_cache, append_accessible_hf, &iter_array);
+  spi_cache_foreach (spi_global_cache, add_to_list_hf, &pending_unrefs);
+  g_slist_free_full (pending_unrefs, g_object_unref);
+  dbus_message_iter_close_container (&iter, &iter_array);
+  return reply;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static DRouteMethod methods[] = {
+  { impl_GetRoot, "GetRoot" },
+  { impl_GetItems, "GetItems" },
+  { NULL, NULL }
+};
+
+void
+spi_initialize_cache (DRoutePath *path)
+{
+  droute_path_add_interface (path, ATSPI_DBUS_INTERFACE_CACHE, spi_org_a11y_atspi_Cache, methods, NULL);
+
+  g_signal_connect (spi_global_cache, "object-added",
+                    (GCallback) emit_cache_add, NULL);
+
+  g_signal_connect (spi_global_cache, "object-removed",
+                    (GCallback) emit_cache_remove, NULL);
+};
+
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/adaptors/collection-adaptor.c b/atk-adaptor/adaptors/collection-adaptor.c
new file mode 100644 (file)
index 0000000..cd9d375
--- /dev/null
@@ -0,0 +1,1338 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2007 IBM Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* collection.c: implements the Collection interface */
+
+#include <string.h>
+#include <strings.h>
+
+#include "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "accessible-stateset.h"
+#include "bitarray.h"
+#include "spi-dbus.h"
+
+#include "accessible-register.h"
+#include "introspection.h"
+#include "object.h"
+
+#define MAX_CHILDREN 65536
+
+typedef struct _MatchRulePrivate MatchRulePrivate;
+struct _MatchRulePrivate
+{
+  gint *states;
+  AtspiCollectionMatchType statematchtype;
+  AtkAttributeSet *attributes;
+  AtspiCollectionMatchType attributematchtype;
+  gint *roles;
+  AtspiCollectionMatchType rolematchtype;
+  gchar **ifaces;
+  AtspiCollectionMatchType interfacematchtype;
+  gboolean invert;
+};
+
+static gboolean
+child_interface_p (AtkObject *child, gchar *repo_id)
+{
+  if (!strcasecmp (repo_id, "action"))
+    return ATK_IS_ACTION (child);
+  if (!strcasecmp (repo_id, "component"))
+    return ATK_IS_COMPONENT (child);
+  if (!strcasecmp (repo_id, "editabletext"))
+    return ATK_IS_EDITABLE_TEXT (child);
+  if (!strcasecmp (repo_id, "text"))
+    return ATK_IS_TEXT (child);
+  if (!strcasecmp (repo_id, "hypertext"))
+    return ATK_IS_HYPERTEXT (child);
+  if (!strcasecmp (repo_id, "image"))
+    return ATK_IS_IMAGE (child);
+  if (!strcasecmp (repo_id, "selection"))
+    return ATK_IS_SELECTION (child);
+  if (!strcasecmp (repo_id, "table"))
+    return ATK_IS_TABLE (child);
+  if (!strcasecmp (repo_id, "value"))
+    return ATK_IS_VALUE (child);
+  if (!strcasecmp (repo_id, "streamablecontent"))
+    return ATK_IS_STREAMABLE_CONTENT (child);
+  if (!strcasecmp (repo_id, "document"))
+    return ATK_IS_DOCUMENT (child);
+  return FALSE;
+}
+
+#define child_collection_p(ch) (TRUE)
+
+static gboolean
+match_states_all_p (AtkObject *child, gint *set)
+{
+  AtkStateSet *chs;
+  gint i;
+  gboolean ret = TRUE;
+
+  if (set == NULL || set[0] == BITARRAY_SEQ_TERM)
+    return TRUE;
+
+  chs = atk_object_ref_state_set (child);
+
+  // TODO: use atk-state_set_contains_states; would be more efficient
+  for (i = 0; set[i] != BITARRAY_SEQ_TERM; i++)
+    {
+      if (!atk_state_set_contains_state (chs, set[i]))
+        {
+          ret = FALSE;
+          break;
+        }
+    }
+
+  g_object_unref (chs);
+  return ret;
+}
+
+static gboolean
+match_states_any_p (AtkObject *child, gint *set)
+{
+  AtkStateSet *chs;
+  gint i;
+  gboolean ret = FALSE;
+
+  if (set == NULL || set[0] == BITARRAY_SEQ_TERM)
+    return TRUE;
+
+  chs = atk_object_ref_state_set (child);
+
+  for (i = 0; set[i] != BITARRAY_SEQ_TERM; i++)
+    {
+      if (atk_state_set_contains_state (chs, set[i]))
+        {
+          ret = TRUE;
+          break;
+        }
+    }
+
+  g_object_unref (chs);
+  return ret;
+}
+
+static gboolean
+match_states_none_p (AtkObject *child, gint *set)
+{
+  AtkStateSet *chs;
+  gint i;
+  gboolean ret = TRUE;
+
+  if (set == NULL || set[0] == BITARRAY_SEQ_TERM)
+    return TRUE;
+
+  chs = atk_object_ref_state_set (child);
+
+  for (i = 0; set[i] != BITARRAY_SEQ_TERM; i++)
+    {
+      if (atk_state_set_contains_state (chs, set[i]))
+        {
+          ret = FALSE;
+          break;
+        }
+    }
+
+  g_object_unref (chs);
+  return ret;
+}
+
+// TODO: need to convert at-spi roles/states to atk roles/states */
+static gboolean
+match_states_lookup (AtkObject *child, MatchRulePrivate *mrp)
+{
+  switch (mrp->statematchtype)
+    {
+    case ATSPI_Collection_MATCH_ALL:
+      if (match_states_all_p (child, mrp->states))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_ANY:
+      if (match_states_any_p (child, mrp->states))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_NONE:
+      if (match_states_none_p (child, mrp->states))
+        return TRUE;
+      break;
+
+    default:
+      break;
+    }
+
+  return FALSE;
+}
+
+// TODO: Map at-spi -> atk roles at mrp creation instead of doing this;
+// would be more efficient
+#define spi_get_role(obj) spi_accessible_role_from_atk_role (atk_object_get_role (obj))
+
+static gboolean
+match_roles_all_p (AtkObject *child, gint *roles)
+{
+  if (roles == NULL || roles[0] == BITARRAY_SEQ_TERM)
+    return TRUE;
+  else if (roles[1] != BITARRAY_SEQ_TERM)
+    return FALSE;
+
+  return (atk_object_get_role (child) == roles[0]);
+}
+
+static gboolean
+match_roles_any_p (AtkObject *child, gint *roles)
+{
+  AtspiRole role;
+  int i;
+
+  if (roles == NULL || roles[0] == BITARRAY_SEQ_TERM)
+    return TRUE;
+
+  role = spi_accessible_role_from_atk_role (atk_object_get_role (child));
+
+  for (i = 0; roles[i] != BITARRAY_SEQ_TERM; i++)
+    if (role == roles[i])
+      return TRUE;
+
+  return FALSE;
+}
+
+static gboolean
+match_roles_none_p (AtkObject *child, gint *roles)
+{
+  AtkRole role;
+  int i;
+
+  if (roles == NULL || roles[0] == BITARRAY_SEQ_TERM)
+    return TRUE;
+
+  role = atk_object_get_role (child);
+
+  for (i = 0; roles[i] != BITARRAY_SEQ_TERM; i++)
+    if (role == roles[i])
+      return FALSE;
+
+  return TRUE;
+}
+
+static gboolean
+match_roles_lookup (AtkObject *child, MatchRulePrivate *mrp)
+{
+  switch (mrp->rolematchtype)
+    {
+    case ATSPI_Collection_MATCH_ALL:
+      if (match_roles_all_p (child, mrp->roles))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_ANY:
+      if (match_roles_any_p (child, mrp->roles))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_NONE:
+      if (match_roles_none_p (child, mrp->roles))
+        return TRUE;
+      break;
+
+    default:
+      break;
+    }
+  return FALSE;
+}
+
+static gboolean
+match_interfaces_all_p (AtkObject *obj, gchar **ifaces)
+{
+  gint i;
+
+  if (ifaces == NULL)
+    return TRUE;
+
+  for (i = 0; ifaces[i]; i++)
+    if (!child_interface_p (obj, ifaces[i]))
+      {
+        return FALSE;
+      }
+  return TRUE;
+}
+
+static gboolean
+match_interfaces_any_p (AtkObject *obj, gchar **ifaces)
+{
+  gint i;
+
+  if (ifaces == NULL)
+    return TRUE;
+
+  for (i = 0; ifaces[i]; i++)
+    if (child_interface_p (obj, ifaces[i]))
+      {
+        return TRUE;
+      }
+  return FALSE;
+}
+
+static gboolean
+match_interfaces_none_p (AtkObject *obj, gchar **ifaces)
+{
+  gint i;
+
+  for (i = 0; ifaces[i]; i++)
+    if (child_interface_p (obj, ifaces[i]))
+      return FALSE;
+
+  return TRUE;
+}
+
+static gboolean
+match_interfaces_lookup (AtkObject *child, MatchRulePrivate *mrp)
+{
+  switch (mrp->interfacematchtype)
+    {
+
+    case ATSPI_Collection_MATCH_ALL:
+      if (match_interfaces_all_p (child, mrp->ifaces))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_ANY:
+      if (match_interfaces_any_p (child, mrp->ifaces))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_NONE:
+      if (match_interfaces_none_p (child, mrp->ifaces))
+        return TRUE;
+      break;
+
+    default:
+      break;
+    }
+
+  return FALSE;
+}
+
+#define split_attributes(attributes) (g_strsplit (attributes, ";", 0))
+
+static gboolean
+match_attributes_all_p (AtkObject *child, AtkAttributeSet *attributes)
+{
+  int i, k;
+  AtkAttributeSet *oa;
+  gint length, oa_length;
+  gboolean flag = FALSE;
+
+  if (attributes == NULL || g_slist_length (attributes) == 0)
+    return TRUE;
+
+  oa = atk_object_get_attributes (child);
+  length = g_slist_length (attributes);
+  oa_length = g_slist_length (oa);
+
+  for (i = 0; i < length; i++)
+    {
+      AtkAttribute *attr = g_slist_nth_data (attributes, i);
+      for (k = 0; k < oa_length; k++)
+        {
+          AtkAttribute *oa_attr = g_slist_nth_data (oa, k);
+          if (!g_ascii_strcasecmp (oa_attr->name, attr->name) &&
+              !g_ascii_strcasecmp (oa_attr->value, attr->value))
+            {
+              flag = TRUE;
+              break;
+            }
+          else
+            flag = FALSE;
+        }
+      if (!flag)
+        {
+          atk_attribute_set_free (oa);
+          return FALSE;
+        }
+    }
+  atk_attribute_set_free (oa);
+  return TRUE;
+}
+
+static gboolean
+match_attributes_any_p (AtkObject *child, AtkAttributeSet *attributes)
+{
+  int i, k;
+
+  AtkAttributeSet *oa;
+  gint length, oa_length;
+
+  length = g_slist_length (attributes);
+  if (length == 0)
+    return TRUE;
+
+  oa = atk_object_get_attributes (child);
+  oa_length = g_slist_length (oa);
+
+  for (i = 0; i < length; i++)
+    {
+      AtkAttribute *attr = g_slist_nth_data (attributes, i);
+      for (k = 0; k < oa_length; k++)
+        {
+          AtkAttribute *oa_attr = g_slist_nth_data (oa, k);
+          if (!g_ascii_strcasecmp (oa_attr->name, attr->name) &&
+              !g_ascii_strcasecmp (oa_attr->value, attr->value))
+            {
+              atk_attribute_set_free (oa);
+              return TRUE;
+            }
+        }
+    }
+  atk_attribute_set_free (oa);
+  return FALSE;
+}
+
+static gboolean
+match_attributes_none_p (AtkObject *child, AtkAttributeSet *attributes)
+{
+  int i, k;
+
+  AtkAttributeSet *oa;
+  gint length, oa_length;
+
+  length = g_slist_length (attributes);
+  if (length == 0)
+    return TRUE;
+
+  oa = atk_object_get_attributes (child);
+  oa_length = g_slist_length (oa);
+
+  for (i = 0; i < length; i++)
+    {
+      AtkAttribute *attr = g_slist_nth_data (attributes, i);
+      for (k = 0; k < oa_length; k++)
+        {
+          AtkAttribute *oa_attr = g_slist_nth_data (oa, k);
+          if (!g_ascii_strcasecmp (oa_attr->name, attr->name) &&
+              !g_ascii_strcasecmp (oa_attr->value, attr->value))
+            {
+              atk_attribute_set_free (oa);
+              return FALSE;
+            }
+        }
+    }
+  atk_attribute_set_free (oa);
+  return TRUE;
+}
+
+static gboolean
+match_attributes_lookup (AtkObject *child, MatchRulePrivate *mrp)
+{
+  switch (mrp->attributematchtype)
+    {
+
+    case ATSPI_Collection_MATCH_ALL:
+      if (match_attributes_all_p (child, mrp->attributes))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_ANY:
+      if (match_attributes_any_p (child, mrp->attributes))
+        return TRUE;
+      break;
+
+    case ATSPI_Collection_MATCH_NONE:
+      if (match_attributes_none_p (child, mrp->attributes))
+        return TRUE;
+      break;
+
+    default:
+      break;
+    }
+  return FALSE;
+}
+
+static gboolean
+traverse_p (AtkObject *child, const gboolean traverse)
+{
+  if (traverse)
+    return TRUE;
+  else
+    return !child_collection_p (child);
+}
+
+static int
+sort_order_canonical (MatchRulePrivate *mrp, GList *ls, gint kount, gint max, AtkObject *obj, glong index, gboolean flag, AtkObject *pobj, gboolean recurse, gboolean traverse)
+{
+  gint i = index;
+  glong acount = atk_object_get_n_accessible_children (obj);
+  gboolean prev = pobj ? TRUE : FALSE;
+
+  if (acount > MAX_CHILDREN)
+    acount = MAX_CHILDREN;
+  for (; i < acount && (max == 0 || kount < max); i++)
+    {
+      AtkObject *child = atk_object_ref_accessible_child (obj, i);
+
+      if (!child)
+        continue;
+
+      if (prev && child == pobj)
+        {
+          g_object_unref (child);
+          return kount;
+        }
+
+      if (flag && match_interfaces_lookup (child, mrp) && match_states_lookup (child, mrp) && match_roles_lookup (child, mrp) && match_attributes_lookup (child, mrp))
+        {
+
+          ls = g_list_append (ls, child);
+          kount++;
+        }
+
+      if (!flag)
+        flag = TRUE;
+
+      if (recurse && traverse_p (child, traverse))
+        kount = sort_order_canonical (mrp, ls, kount,
+                                      max, child, 0, TRUE,
+                                      pobj, recurse, traverse);
+      g_object_unref (child);
+    }
+  return kount;
+}
+
+static int
+sort_order_rev_canonical (MatchRulePrivate *mrp, GList *ls, gint kount, gint max, AtkObject *obj, gboolean flag, AtkObject *pobj)
+{
+  AtkObject *nextobj;
+  AtkObject *parent;
+  glong indexinparent;
+
+  /* This breaks us out of the recursion. */
+  if (!obj || obj == pobj)
+    {
+      return kount;
+    }
+
+  /* Add to the list if it matches */
+  if (flag && match_interfaces_lookup (obj, mrp) && match_states_lookup (obj, mrp) && match_roles_lookup (obj, mrp) && match_attributes_lookup (obj, mrp) && (max == 0 || kount < max))
+    {
+      ls = g_list_append (ls, obj);
+      kount++;
+    }
+
+  /* Get the current nodes index in it's parent and the parent object. */
+  indexinparent = atk_object_get_index_in_parent (obj);
+  parent = atk_object_get_parent (obj);
+
+  if (indexinparent > 0 && (max == 0 || kount < max))
+    {
+      /* there are still some siblings to visit so get the previous sibling
+         and get it's last descendant.
+         First, get the previous sibling */
+      nextobj = atk_object_ref_accessible_child (parent, indexinparent - 1);
+
+      /* Now, drill down the right side to the last descendant */
+      while (nextobj && atk_object_get_n_accessible_children (nextobj) > 0)
+        {
+          AtkObject *follow;
+          gint count = atk_object_get_n_accessible_children (nextobj);
+          if (count > MAX_CHILDREN)
+            count = MAX_CHILDREN;
+
+          follow = atk_object_ref_accessible_child (nextobj, count - 1);
+          g_object_unref (nextobj);
+          nextobj = follow;
+        }
+      /* recurse with the last descendant */
+      kount = sort_order_rev_canonical (mrp, ls, kount, max,
+                                        nextobj, TRUE, pobj);
+      if (nextobj)
+        g_object_unref (nextobj);
+    }
+  else if (max == 0 || kount < max)
+    {
+      /* no more siblings so next node must be the parent */
+      kount = sort_order_rev_canonical (mrp, ls, kount, max,
+                                        parent, TRUE, pobj);
+    }
+  return kount;
+}
+
+static int
+query_exec (MatchRulePrivate *mrp, AtspiCollectionSortOrder sortby, GList *ls, gint kount, gint max, AtkObject *obj, glong index, gboolean flag, AtkObject *pobj, gboolean recurse, gboolean traverse)
+{
+  switch (sortby)
+    {
+    case ATSPI_Collection_SORT_ORDER_CANONICAL:
+      kount = sort_order_canonical (mrp, ls, 0, max, obj, index, flag,
+                                    pobj, recurse, traverse);
+      break;
+    case ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL:
+      kount = sort_order_canonical (mrp, ls, 0, max, obj, index, flag,
+                                    pobj, recurse, traverse);
+      break;
+    default:
+      kount = 0;
+      g_warning ("Sort method not implemented yet");
+      break;
+    }
+
+  return kount;
+}
+
+static gboolean
+bitarray_to_seq (dbus_uint32_t *array, int array_count, int **ret)
+{
+  int out_size = 4;
+  int out_count = 0;
+  int i, j;
+  int *out = (int *) g_malloc (out_size * sizeof (int));
+
+  for (i = 0; i < array_count; i++)
+    {
+      for (j = 0; j < 32; j++)
+        {
+          if (array[i] & (1 << j))
+            {
+              if (out_count == out_size - 2)
+                {
+                  out_size <<= 1;
+                  out = (int *) g_realloc (out, out_size * sizeof (int));
+                }
+              out[out_count++] = i * 32 + j;
+            }
+        }
+    }
+  out[out_count] = BITARRAY_SEQ_TERM;
+  *ret = out;
+  return TRUE;
+}
+
+static dbus_bool_t
+read_mr (DBusMessageIter *iter, MatchRulePrivate *mrp)
+{
+  DBusMessageIter iter_struct, iter_array, iter_dict, iter_dict_entry;
+  dbus_uint32_t *array;
+  dbus_int32_t matchType;
+  int array_count;
+  AtkAttribute *attr;
+  int i;
+
+  dbus_message_iter_recurse (iter, &iter_struct);
+
+  /* states */
+  dbus_message_iter_recurse (&iter_struct, &iter_array);
+  dbus_message_iter_get_fixed_array (&iter_array, &array, &array_count);
+  bitarray_to_seq (array, array_count, &mrp->states);
+  for (i = 0; mrp->states[i] != BITARRAY_SEQ_TERM; i++)
+    {
+      mrp->states[i] = spi_atk_state_from_spi_state (mrp->states[i]);
+    }
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &matchType);
+  dbus_message_iter_next (&iter_struct);
+  mrp->statematchtype = matchType;
+  ;
+
+  /* attributes */
+  mrp->attributes = NULL;
+  dbus_message_iter_recurse (&iter_struct, &iter_dict);
+  while (dbus_message_iter_get_arg_type (&iter_dict) != DBUS_TYPE_INVALID)
+    {
+      const char *key, *val;
+      const char *p, *q;
+      dbus_message_iter_recurse (&iter_dict, &iter_dict_entry);
+      dbus_message_iter_get_basic (&iter_dict_entry, &key);
+      dbus_message_iter_next (&iter_dict_entry);
+      dbus_message_iter_get_basic (&iter_dict_entry, &val);
+      p = q = val;
+      for (;;)
+        {
+          if (*q == '\0' || (*q == ':' && (q == val || q[-1] != '\\')))
+            {
+              char *tmp;
+              attr = g_new (AtkAttribute, 1);
+              attr->name = g_strdup (key);
+              attr->value = g_strdup (p);
+              attr->value[q - p] = '\0';
+              tmp = attr->value;
+              while (*tmp != '\0')
+                {
+                  if (*tmp == '\\')
+                    memmove (tmp, tmp + 1, strlen (tmp));
+                  else
+                    tmp++;
+                }
+              mrp->attributes = g_slist_prepend (mrp->attributes, attr);
+              if (*q == '\0')
+                break;
+              else
+                p = ++q;
+            }
+          else
+            q++;
+        }
+      dbus_message_iter_next (&iter_dict);
+    }
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &matchType);
+  mrp->attributematchtype = matchType;
+  ;
+  dbus_message_iter_next (&iter_struct);
+
+  /* Get roles and role match */
+  dbus_message_iter_recurse (&iter_struct, &iter_array);
+  dbus_message_iter_get_fixed_array (&iter_array, &array, &array_count);
+  bitarray_to_seq (array, array_count, &mrp->roles);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &matchType);
+  mrp->rolematchtype = matchType;
+  ;
+  dbus_message_iter_next (&iter_struct);
+
+  /* Get interfaces and interface match */
+  dbus_message_iter_recurse (&iter_struct, &iter_array);
+  mrp->ifaces = g_new0 (gchar *, 16);
+  i = 0;
+  while (i < 15 && dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      char *iface;
+      dbus_message_iter_get_basic (&iter_array, &iface);
+      mrp->ifaces[i] = g_strdup (iface);
+      i++;
+      dbus_message_iter_next (&iter_array);
+    }
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &matchType);
+  mrp->interfacematchtype = matchType;
+  ;
+  dbus_message_iter_next (&iter_struct);
+  /* get invert */
+  dbus_message_iter_get_basic (&iter_struct, &mrp->invert);
+  dbus_message_iter_next (iter);
+  return TRUE;
+}
+
+static DBusMessage *
+return_and_free_list (DBusMessage *message, GList *ls)
+{
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+  GList *item;
+
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    return NULL;
+  dbus_message_iter_init_append (reply, &iter);
+  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array))
+    goto oom;
+  for (item = ls; item; item = g_list_next (item))
+    {
+      spi_object_append_reference (&iter_array, ATK_OBJECT (item->data));
+    }
+  if (!dbus_message_iter_close_container (&iter, &iter_array))
+    goto oom;
+  g_list_free (ls);
+  return reply;
+oom:
+  // TODO: Handle out of memory
+  g_list_free (ls);
+  return reply;
+}
+
+static void
+free_mrp_data (MatchRulePrivate *mrp)
+{
+  g_free (mrp->states);
+  atk_attribute_set_free (mrp->attributes);
+  g_free (mrp->roles);
+  g_strfreev (mrp->ifaces);
+}
+
+static DBusMessage *
+GetMatchesFrom (DBusMessage *message,
+                AtkObject *current_object,
+                MatchRulePrivate *mrp,
+                const AtspiCollectionSortOrder sortby,
+                const dbus_bool_t isrestrict,
+                dbus_int32_t count,
+                const dbus_bool_t traverse)
+{
+  GList *ls = NULL;
+  AtkObject *parent;
+  glong index = atk_object_get_index_in_parent (current_object);
+
+  ls = g_list_append (ls, current_object);
+
+  if (!isrestrict)
+    {
+      parent = atk_object_get_parent (current_object);
+      query_exec (mrp, sortby, ls, 0, count, parent, index,
+                  FALSE, NULL, TRUE, traverse);
+    }
+  else
+    query_exec (mrp, sortby, ls, 0, count,
+                current_object, 0, FALSE, NULL, TRUE, traverse);
+
+  ls = g_list_remove (ls, ls->data);
+
+  if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
+    ls = g_list_reverse (ls);
+
+  free_mrp_data (mrp);
+  return return_and_free_list (message, ls);
+}
+
+/*
+  inorder traversal from a given object in the hierarchy
+*/
+
+static int
+inorder (AtkObject *collection, MatchRulePrivate *mrp, GList *ls, gint kount, gint max, AtkObject *obj, gboolean flag, AtkObject *pobj, dbus_bool_t traverse)
+{
+  int i = 0;
+
+  /* First, look through the children recursively. */
+  kount = sort_order_canonical (mrp, ls, kount, max, obj, 0, TRUE,
+                                NULL, TRUE, TRUE);
+
+  /* Next, we look through the right subtree */
+  while ((max == 0 || kount < max) && obj && obj != collection)
+    {
+      AtkObject *parent = atk_object_get_parent (obj);
+      i = atk_object_get_index_in_parent (obj);
+      kount = sort_order_canonical (mrp, ls, kount, max, parent,
+                                    i + 1, TRUE, FALSE, TRUE, TRUE);
+      obj = parent;
+    }
+
+  if (max == 0 || kount < max)
+    {
+      kount = sort_order_canonical (mrp, ls, kount, max,
+                                    obj, i + 1, TRUE, FALSE, TRUE, TRUE);
+    }
+
+  return kount;
+}
+
+/*
+  GetMatchesInOrder: get matches from a given object in an inorder traversal.
+*/
+
+static DBusMessage *
+GetMatchesInOrder (DBusMessage *message,
+                   AtkObject *current_object,
+                   MatchRulePrivate *mrp,
+                   const AtspiCollectionSortOrder sortby,
+                   const dbus_bool_t recurse,
+                   dbus_int32_t count,
+                   const dbus_bool_t traverse)
+{
+  GList *ls = NULL;
+  AtkObject *obj;
+
+  ls = g_list_append (ls, current_object);
+
+  obj = ATK_OBJECT (spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
+
+  inorder (obj, mrp, ls, 0, count,
+           current_object, TRUE, NULL, traverse);
+
+  ls = g_list_remove (ls, ls->data);
+
+  if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
+    ls = g_list_reverse (ls);
+
+  free_mrp_data (mrp);
+  return return_and_free_list (message, ls);
+}
+
+/*
+  GetMatchesInBackOrder: get matches from a given object in a
+  reverse order traversal.
+*/
+
+static DBusMessage *
+GetMatchesInBackOrder (DBusMessage *message,
+                       AtkObject *current_object,
+                       MatchRulePrivate *mrp,
+                       const AtspiCollectionSortOrder sortby,
+                       dbus_int32_t count)
+{
+  GList *ls = NULL;
+  AtkObject *collection;
+
+  ls = g_list_append (ls, current_object);
+
+  collection = ATK_OBJECT (spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
+
+  sort_order_rev_canonical (mrp, ls, 0, count, current_object,
+                            FALSE, collection);
+
+  ls = g_list_remove (ls, ls->data);
+
+  if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
+    ls = g_list_reverse (ls);
+
+  free_mrp_data (mrp);
+  return return_and_free_list (message, ls);
+}
+
+static DBusMessage *
+GetMatchesTo (DBusMessage *message,
+              AtkObject *current_object,
+              MatchRulePrivate *mrp,
+              const AtspiCollectionSortOrder sortby,
+              const dbus_bool_t recurse,
+              const dbus_bool_t isrestrict,
+              dbus_int32_t count,
+              const dbus_bool_t traverse)
+{
+  GList *ls = NULL;
+  AtkObject *obj;
+  ls = g_list_append (ls, current_object);
+
+  if (recurse)
+    {
+      obj = ATK_OBJECT (atk_object_get_parent (current_object));
+      query_exec (mrp, sortby, ls, 0, count,
+                  obj, 0, TRUE, current_object, TRUE, traverse);
+    }
+  else
+    {
+      obj = ATK_OBJECT (spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
+      query_exec (mrp, sortby, ls, 0, count,
+                  obj, 0, TRUE, current_object, TRUE, traverse);
+    }
+
+  ls = g_list_remove (ls, ls->data);
+
+  if (sortby != ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
+    ls = g_list_reverse (ls);
+
+  free_mrp_data (mrp);
+  return return_and_free_list (message, ls);
+}
+
+static DBusMessage *
+impl_GetMatchesFrom (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  char *current_object_path = NULL;
+  AtkObject *current_object;
+  DBusMessageIter iter;
+  MatchRulePrivate rule;
+  dbus_uint32_t sortby;
+  dbus_uint32_t tree;
+  dbus_int32_t count;
+  dbus_bool_t traverse;
+  const char *signature;
+
+  signature = dbus_message_get_signature (message);
+  if (strcmp (signature, "o(aiia{ss}iaiiasib)uuib") != 0)
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_get_basic (&iter, &current_object_path);
+  current_object = ATK_OBJECT (spi_register_path_to_object (spi_global_register, current_object_path));
+  if (!current_object)
+    {
+      // TODO: object-not-found error
+      return spi_dbus_general_error (message);
+    }
+  dbus_message_iter_next (&iter);
+  if (!read_mr (&iter, &rule))
+    {
+      return spi_dbus_general_error (message);
+    }
+  dbus_message_iter_get_basic (&iter, &sortby);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &tree);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &count);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &traverse);
+  dbus_message_iter_next (&iter);
+
+  switch (tree)
+    {
+    case ATSPI_Collection_TREE_RESTRICT_CHILDREN:
+      return GetMatchesFrom (message, current_object,
+                             &rule, sortby, TRUE, count, traverse);
+      break;
+    case ATSPI_Collection_TREE_RESTRICT_SIBLING:
+      return GetMatchesFrom (message, current_object,
+                             &rule, sortby, FALSE, count, traverse);
+      break;
+    case ATSPI_Collection_TREE_INORDER:
+      return GetMatchesInOrder (message, current_object,
+                                &rule, sortby, TRUE, count, traverse);
+      break;
+    default:
+      return NULL;
+    }
+}
+
+static DBusMessage *
+impl_GetMatchesTo (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  char *current_object_path = NULL;
+  AtkObject *current_object;
+  DBusMessageIter iter;
+  MatchRulePrivate rule;
+  dbus_uint32_t sortby;
+  dbus_uint32_t tree;
+  dbus_bool_t recurse;
+  dbus_int32_t count;
+  dbus_bool_t traverse;
+  const char *signature;
+
+  signature = dbus_message_get_signature (message);
+  if (strcmp (signature, "o(aiia{ss}iaiiasib)uubib") != 0)
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_get_basic (&iter, &current_object_path);
+  current_object = ATK_OBJECT (spi_register_path_to_object (spi_global_register, current_object_path));
+  if (!current_object)
+    {
+      // TODO: object-not-found error
+      return spi_dbus_general_error (message);
+    }
+  dbus_message_iter_next (&iter);
+  if (!read_mr (&iter, &rule))
+    {
+      return spi_dbus_general_error (message);
+    }
+  dbus_message_iter_get_basic (&iter, &sortby);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &tree);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &recurse);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &count);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &traverse);
+  dbus_message_iter_next (&iter);
+
+  switch (tree)
+    {
+    case ATSPI_Collection_TREE_RESTRICT_CHILDREN:
+      return GetMatchesTo (message, current_object,
+                           &rule, sortby, recurse, TRUE, count, traverse);
+      break;
+    case ATSPI_Collection_TREE_RESTRICT_SIBLING:
+      return GetMatchesTo (message, current_object,
+                           &rule, sortby, recurse, FALSE, count, traverse);
+      break;
+    case ATSPI_Collection_TREE_INORDER:
+      return GetMatchesInBackOrder (message, current_object,
+                                    &rule, sortby, count);
+      break;
+    default:
+      return NULL;
+    }
+}
+
+static void
+append_accessible_properties (DBusMessageIter *iter, AtkObject *obj, GArray *properties)
+{
+  DBusMessageIter iter_struct, iter_dict, iter_dict_entry;
+  AtkStateSet *set;
+  gint i;
+  gint count;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL, &iter_struct);
+  spi_object_append_reference (&iter_struct, obj);
+  dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "{sv}", &iter_dict);
+  if (properties && properties->len)
+    {
+      gint i;
+      for (i = 0; i < properties->len; i++)
+        {
+          gchar *prop = g_array_index (properties, char *, i);
+          DRoutePropertyFunction func;
+          GType type;
+          func = _atk_bridge_find_property_func (prop, &type);
+          if (func && G_TYPE_CHECK_INSTANCE_TYPE (obj, type))
+            {
+              dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY,
+                                                NULL, &iter_dict_entry);
+              dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &prop);
+              func (&iter_dict_entry, obj);
+              dbus_message_iter_close_container (&iter_dict, &iter_dict_entry);
+            }
+        }
+    }
+  else
+    {
+      GHashTableIter hi;
+      gpointer key, value;
+      g_hash_table_iter_init (&hi, spi_global_app_data->property_hash);
+      while (g_hash_table_iter_next (&hi, &key, &value))
+        {
+          const DRouteProperty *prop = value;
+          GType type = _atk_bridge_type_from_iface (key);
+          if (!G_TYPE_CHECK_INSTANCE_TYPE (obj, type))
+            continue;
+          for (; prop->name; prop++)
+            {
+              const char *p = key + strlen (key);
+              gchar *property_name;
+              while (p[-1] != '.')
+                p--;
+              if (!strcmp (p, "Accessible"))
+                property_name = g_strdup (prop->name);
+              else
+                property_name = g_strconcat (p, ".", prop->name, NULL);
+              dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY,
+                                                NULL, &iter_dict_entry);
+              dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &property_name);
+              g_free (property_name);
+              prop->get (&iter_dict_entry, obj);
+              dbus_message_iter_close_container (&iter_dict, &iter_dict_entry);
+            }
+        }
+    }
+  dbus_message_iter_close_container (&iter_struct, &iter_dict);
+  dbus_message_iter_close_container (iter, &iter_struct);
+
+  set = atk_object_ref_state_set (obj);
+  if (set)
+    {
+      gboolean md = atk_state_set_contains_state (set, ATK_STATE_MANAGES_DESCENDANTS);
+      g_object_unref (set);
+      if (md)
+        return;
+    }
+  count = atk_object_get_n_accessible_children (obj);
+  if (count > MAX_CHILDREN)
+    count = MAX_CHILDREN;
+  for (i = 0; i < count; i++)
+    {
+      AtkObject *child = atk_object_ref_accessible_child (obj, i);
+      if (child)
+        {
+          append_accessible_properties (iter, child, properties);
+          g_object_unref (child);
+        }
+    }
+}
+
+#if 0
+static void
+skip (const char **p)
+{
+  const char *sig = *p;
+  gint nest = (*sig != 'a');
+
+  sig++;
+  while (*sig)
+  {
+    if (*sig == '(' || *sig == '{')
+      nest++;
+    else if (*sig == ')' || *sig == '}')
+      nest--;
+    sig++;
+  }
+  *p = sig;
+}
+static gboolean
+types_match (DBusMessageIter *iter, char c)
+{
+  char t = dbus_message_iter_get_arg_type (iter);
+
+  if (t == 'r' && c == '(')
+    return TRUE;
+  else
+    return (t == c);
+}
+
+static void
+walk (DBusMessageIter *iter, const char *sig, gboolean array)
+{
+  while (*sig && *sig != ')' && *sig != '}')
+  {
+    if (array && dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_INVALID)
+    break;
+    if (!types_match (iter, *sig))
+    {
+      g_error ("Expected %s, got %c", sig, dbus_message_iter_get_arg_type (iter));
+    }
+    switch (*sig)
+    {
+    case 's':
+      {
+        const char *str;
+        DBusError error;
+        dbus_error_init (&error);
+        dbus_message_iter_get_basic (iter, &str);
+        g_print ("%s\n", str);
+        if (!dbus_validate_utf8 (str, &error))
+          g_error ("Bad UTF-8 string");
+      }
+      break;
+    case 'a':
+      {
+        DBusMessageIter iter_array;
+        dbus_message_iter_recurse (iter, &iter_array);
+        walk (&iter_array, sig + 1, TRUE);
+        skip (&sig);
+      }
+      break;
+    case DBUS_TYPE_STRUCT:
+    case DBUS_TYPE_DICT_ENTRY:
+      {
+        DBusMessageIter iter_struct;
+        dbus_message_iter_recurse (iter, &iter_struct);
+        walk (&iter_struct, sig + 1, FALSE);
+        skip (&sig);
+      }   
+    }
+    dbus_message_iter_next (iter);
+    if (!array)
+      sig++;
+  }
+  if (dbus_message_iter_get_arg_type (iter) != DBUS_TYPE_INVALID)
+    g_error ("Unexpected data '%c'", dbus_message_iter_get_arg_type (iter));
+}
+
+static void
+walkm (DBusMessage *message)
+{
+  DBusMessageIter iter;
+  const char *sig = dbus_message_get_signature (message);
+
+  g_print ("sig: %s\n", sig);
+  dbus_message_iter_init (message, &iter);
+  walk (&iter, sig, FALSE);
+}
+#endif
+
+static DBusMessage *
+impl_GetTree (DBusConnection *bus,
+              DBusMessage *message,
+              void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+  MatchRulePrivate rule;
+  GArray *properties;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (strcmp (dbus_message_get_signature (message), "(aiia{ss}iaiiasib)as") != 0)
+    return droute_invalid_arguments_error (message);
+
+  properties = g_array_new (TRUE, TRUE, sizeof (char *));
+  dbus_message_iter_init (message, &iter);
+  if (!read_mr (&iter, &rule))
+    {
+      return spi_dbus_general_error (message);
+    }
+
+  dbus_message_iter_recurse (&iter, &iter_array);
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      const char *prop;
+      dbus_message_iter_get_basic (&iter_array, &prop);
+      g_array_append_val (properties, prop);
+      dbus_message_iter_next (&iter_array);
+    }
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_iter_init_append (reply, &iter);
+      dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "((so)a{sv})",
+                                        &iter_array);
+      append_accessible_properties (&iter_array, object, properties);
+      dbus_message_iter_close_container (&iter, &iter_array);
+    }
+#if 0
+  walkm (reply);
+#endif
+  return reply;
+}
+
+static DBusMessage *
+impl_GetMatches (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkObject *obj = ATK_OBJECT (spi_register_path_to_object (spi_global_register, dbus_message_get_path (message)));
+  DBusMessageIter iter;
+  MatchRulePrivate rule;
+  dbus_uint32_t sortby;
+  dbus_int32_t count;
+  dbus_bool_t traverse;
+  GList *ls = NULL;
+  const char *signature;
+
+  signature = dbus_message_get_signature (message);
+  if (strcmp (signature, "(aiia{ss}iaiiasib)uib") != 0)
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  dbus_message_iter_init (message, &iter);
+  if (!read_mr (&iter, &rule))
+    {
+      return spi_dbus_general_error (message);
+    }
+  dbus_message_iter_get_basic (&iter, &sortby);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &count);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &traverse);
+  dbus_message_iter_next (&iter);
+  ls = g_list_prepend (ls, obj);
+  count = query_exec (&rule, sortby, ls, 0, count,
+                      obj, 0, TRUE, NULL, TRUE, traverse);
+  ls = g_list_remove (ls, ls->data);
+
+  if (sortby == ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL)
+    ls = g_list_reverse (ls);
+  free_mrp_data (&rule);
+  return return_and_free_list (message, ls);
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetMatchesFrom, "GetMatchesFrom" },
+  { impl_GetMatchesTo, "GetMatchesTo" },
+  { impl_GetTree, "GetTree" },
+  { impl_GetMatches, "GetMatches" },
+  { NULL, NULL }
+};
+
+void
+spi_initialize_collection (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_COLLECTION, spi_org_a11y_atspi_Collection, methods, NULL);
+};
diff --git a/atk-adaptor/adaptors/component-adaptor.c b/atk-adaptor/adaptors/component-adaptor.c
new file mode 100644 (file)
index 0000000..102ea34
--- /dev/null
@@ -0,0 +1,505 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#define ATK_DISABLE_DEPRECATION_WARNINGS
+#include "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+#include <string.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static DBusMessage *
+impl_Contains (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_int32_t x, y;
+  dbus_uint32_t coord_type;
+  dbus_bool_t retval;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_UINT32, &coord_type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  retval =
+      atk_component_contains (component, x, y, (AtkCoordType) coord_type);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &retval,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAccessibleAtPoint (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_int32_t x, y;
+  dbus_uint32_t coord_type;
+  DBusMessage *reply;
+  AtkObject *child;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_UINT32, &coord_type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  child =
+      atk_component_ref_accessible_at_point (component, x, y,
+                                             (AtkCoordType) coord_type);
+  reply = spi_object_return_reference (message, child);
+  if (child)
+    g_object_unref (child);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_GetExtents (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_uint32_t coord_type;
+  gint ix, iy, iwidth, iheight;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_UINT32, &coord_type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_component_get_extents (component, &ix, &iy, &iwidth, &iheight,
+                             (AtkCoordType) coord_type);
+  return spi_dbus_return_rect (message, ix, iy, iwidth, iheight);
+}
+
+static DBusMessage *
+impl_GetPosition (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_uint32_t coord_type;
+  gint ix = 0, iy = 0;
+  dbus_int32_t x, y;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_UINT32, &coord_type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_component_get_position (component, &ix, &iy, (AtkCoordType) coord_type);
+  x = ix;
+  y = iy;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
+                                &y, DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetSize (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  gint iwidth = 0, iheight = 0;
+  dbus_int32_t width, height;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  atk_component_get_size (component, &iwidth, &iheight);
+  width = iwidth;
+  height = iheight;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &width,
+                                DBUS_TYPE_INT32, &height, DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetLayer (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  AtkLayer atklayer;
+  dbus_uint32_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  atklayer = atk_component_get_layer (component);
+
+  switch (atklayer)
+    {
+    case ATK_LAYER_BACKGROUND:
+      rv = ATSPI_LAYER_BACKGROUND;
+      break;
+    case ATK_LAYER_CANVAS:
+      rv = ATSPI_LAYER_CANVAS;
+      break;
+    case ATK_LAYER_WIDGET:
+      rv = ATSPI_LAYER_WIDGET;
+      break;
+    case ATK_LAYER_MDI:
+      rv = ATSPI_LAYER_MDI;
+      break;
+    case ATK_LAYER_POPUP:
+      rv = ATSPI_LAYER_POPUP;
+      break;
+    case ATK_LAYER_OVERLAY:
+      rv = ATSPI_LAYER_OVERLAY;
+      break;
+    case ATK_LAYER_WINDOW:
+      rv = ATSPI_LAYER_WINDOW;
+      break;
+    default:
+      rv = ATSPI_LAYER_INVALID;
+      break;
+    }
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_UINT32, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetMDIZOrder (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_int16_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  rv = atk_component_get_mdi_zorder (component);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT16, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GrabFocus (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  rv = atk_component_grab_focus (component);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+#if 0
+static DBusMessage *
+impl_registerFocusHandler (DBusConnection * bus, DBusMessage * message,
+                           void *user_data)
+{
+}
+
+static DBusMessage *
+impl_deregisterFocusHandler (DBusConnection * bus, DBusMessage * message,
+                             void *user_data)
+{
+}
+#endif
+
+static DBusMessage *
+impl_GetAlpha (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  double rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  rv = atk_component_get_alpha (component);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_DOUBLE, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_SetExtents (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  DBusMessageIter iter, iter_struct;
+  dbus_uint32_t coord_type;
+  dbus_int32_t x, y, width, height;
+  dbus_bool_t ret;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (strcmp (dbus_message_get_signature (message), "(iiii)u") != 0)
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_recurse (&iter, &iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &x);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &y);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &width);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &height);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &coord_type);
+
+  ret = atk_component_set_extents (component, x, y, width, height, coord_type);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+
+  return reply;
+}
+
+static DBusMessage *
+impl_SetPosition (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_uint32_t coord_type;
+  dbus_int32_t x, y;
+  dbus_bool_t ret;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_UINT32, &coord_type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  ret = atk_component_set_position (component, x, y, coord_type);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+
+  return reply;
+}
+
+static dbus_bool_t
+impl_get_ScreenExtents (DBusMessageIter *iter, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  DBusMessageIter iter_variant, iter_struct;
+  gint ix = -1, iy = -1, iwidth = -1, iheight = -1;
+  dbus_uint32_t x, y, width, height;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data), FALSE);
+
+  atk_component_get_extents (component, &ix, &iy, &iwidth, &iheight, ATK_XY_SCREEN);
+  x = ix;
+  y = iy;
+  width = iwidth;
+  height = iheight;
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(uuuu)",
+                                    &iter_variant);
+  dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &x);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &y);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &width);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &height);
+  dbus_message_iter_close_container (&iter_variant, &iter_struct);
+  dbus_message_iter_close_container (iter, &iter_variant);
+  return TRUE;
+}
+
+static DBusMessage *
+impl_SetSize (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_int32_t width, height;
+  dbus_bool_t ret;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32, &height,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  ret = atk_component_set_size (component, width, height);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+
+  return reply;
+}
+
+static DBusMessage *
+impl_ScrollTo (DBusConnection *bus,
+               DBusMessage *message,
+               void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_uint32_t type;
+  dbus_bool_t ret;
+  DBusMessage *reply = NULL;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_UINT32, &type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  ret = atk_component_scroll_to (component, type);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_ScrollToPoint (DBusConnection *bus,
+                    DBusMessage *message,
+                    void *user_data)
+{
+  AtkComponent *component = (AtkComponent *) user_data;
+  dbus_uint32_t type;
+  dbus_int32_t x, y;
+  dbus_bool_t ret;
+  DBusMessage *reply = NULL;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_UINT32, &type,
+                              DBUS_TYPE_INT32, &x,
+                              DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  ret = atk_component_scroll_to_point (component, type, x, y);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_Contains, "Contains" },
+  { impl_GetAccessibleAtPoint, "GetAccessibleAtPoint" },
+  { impl_GetExtents, "GetExtents" },
+  { impl_GetPosition, "GetPosition" },
+  { impl_GetSize, "GetSize" },
+  { impl_GetLayer, "GetLayer" },
+  { impl_GetMDIZOrder, "GetMDIZOrder" },
+  { impl_GrabFocus, "GrabFocus" },
+  //{impl_registerFocusHandler, "registerFocusHandler"},
+  //{impl_deregisterFocusHandler, "deregisterFocusHandler"},
+  { impl_GetAlpha, "GetAlpha" },
+  { impl_SetExtents, "SetExtents" },
+  { impl_SetPosition, "SetPosition" },
+  { impl_SetSize, "SetSize" },
+  { impl_ScrollTo, "ScrollTo" },
+  { impl_ScrollToPoint, "ScrollToPoint" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_ScreenExtents, NULL, "ScreenExtents" },
+  { NULL, NULL, NULL }
+};
+void
+spi_initialize_component (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_COMPONENT, spi_org_a11y_atspi_Component, methods, properties);
+};
diff --git a/atk-adaptor/adaptors/document-adaptor.c b/atk-adaptor/adaptors/document-adaptor.c
new file mode 100644 (file)
index 0000000..a01bd6b
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#define ATK_DISABLE_DEPRECATION_WARNINGS
+#include "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static dbus_bool_t
+impl_get_CurrentPageNumber (DBusMessageIter *iter, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_document_get_current_page_number (document));
+}
+
+static dbus_bool_t
+impl_get_PageCount (DBusMessageIter *iter, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_document_get_page_count (document));
+}
+
+static DBusMessage *
+impl_GetLocale (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  const gchar *lc;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
+                        droute_not_yet_handled_error (message));
+  lc = atk_document_get_locale (document);
+  if (!lc)
+    lc = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &lc,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAttributeValue (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  gchar *attributename;
+  const gchar *atr;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &attributename, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atr = atk_document_get_attribute_value (document, attributename);
+  if (!atr)
+    atr = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &atr,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAttributes (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  DBusMessage *reply;
+  AtkAttributeSet *attributes;
+  DBusMessageIter iter;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  attributes = atk_document_get_attributes (document);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_iter_init_append (reply, &iter);
+      spi_object_append_attribute_set (&iter, attributes);
+    }
+
+  if (attributes)
+    atk_attribute_set_free (attributes);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetTextSelections (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  GArray *selections;
+  gint i, count;
+  DBusMessageIter iter, iter_array, iter_struct;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  selections = atk_document_get_text_selections (document);
+  count = (selections ? selections->len : 0);
+
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    goto done;
+  dbus_message_iter_init_append (reply, &iter);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "((so)i(so)ib)", &iter_array);
+  for (i = 0; i < count; i++)
+    {
+      dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
+      AtkTextSelection *item = &g_array_index (selections, AtkTextSelection, i);
+      spi_object_append_reference (&iter_struct, item->start_object);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &item->start_offset);
+      spi_object_append_reference (&iter_struct, item->end_object);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &item->end_offset);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_BOOLEAN, &item->start_is_active);
+      dbus_message_iter_close_container (&iter_array, &iter_struct);
+    }
+  dbus_message_iter_close_container (&iter, &iter_array);
+
+done:
+  if (selections)
+    g_array_free (selections, TRUE);
+  return reply;
+}
+
+static DBusMessage *
+impl_SetTextSelections (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkDocument *document = (AtkDocument *) user_data;
+  GArray *selections;
+  DBusMessageIter iter, iter_array, iter_struct;
+  gboolean ret;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (strcmp (dbus_message_get_signature (message), "a((so)i(so)ib)") != 0)
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  selections = g_array_new (FALSE, TRUE, sizeof (AtkTextSelection));
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      AtkTextSelection selection;
+      dbus_message_iter_recurse (&iter_array, &iter_struct);
+      selection.start_object = ATK_OBJECT (spi_dbus_get_object_from_iter (&iter_struct));
+      dbus_message_iter_get_basic (&iter_struct, &selection.start_offset);
+      dbus_message_iter_next (&iter_struct);
+      selection.end_object = ATK_OBJECT (spi_dbus_get_object_from_iter (&iter_struct));
+      dbus_message_iter_get_basic (&iter_struct, &selection.end_offset);
+      dbus_message_iter_next (&iter_struct);
+      dbus_message_iter_get_basic (&iter_struct, &selection.start_is_active);
+      g_array_append_val (selections, selection);
+      dbus_message_iter_next (&iter_array);
+    }
+
+  ret = atk_document_set_text_selections (document, selections);
+  g_array_free (selections, TRUE);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetLocale, "GetLocale" },
+  { impl_GetAttributeValue, "GetAttributeValue" },
+  { impl_GetAttributes, "GetAttributes" },
+  { impl_GetTextSelections, "GetTextSelections" },
+  { impl_SetTextSelections, "SetTextSelections" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_CurrentPageNumber, NULL, "CurrentPageNumber" },
+  { impl_get_PageCount, NULL, "PageCount" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_document (DRoutePath *path)
+{
+  droute_path_add_interface (path,
+                             ATSPI_DBUS_INTERFACE_DOCUMENT, spi_org_a11y_atspi_Document, methods, properties);
+};
diff --git a/atk-adaptor/adaptors/editabletext-adaptor.c b/atk-adaptor/adaptors/editabletext-adaptor.c
new file mode 100644 (file)
index 0000000..81ec42f
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include "introspection.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+static DBusMessage *
+impl_SetTextContents (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkEditableText *editable = (AtkEditableText *) user_data;
+  const char *newContents;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &newContents, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_editable_text_set_text_contents (editable, newContents);
+  rv = TRUE;
+  // TODO decide if we really need this return value
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_InsertText (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkEditableText *editable = (AtkEditableText *) user_data;
+  dbus_int32_t position, length;
+  char *text;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+  gint ip;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &position, DBUS_TYPE_STRING, &text,
+                              DBUS_TYPE_INT32, &length, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ip = position;
+  atk_editable_text_insert_text (editable, text, length, &ip);
+  rv = TRUE;
+  // TODO decide if we really need this return value
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_CopyText (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkEditableText *editable = (AtkEditableText *) user_data;
+  dbus_int32_t startPos, endPos;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startPos, DBUS_TYPE_INT32, &endPos,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_editable_text_copy_text (editable, startPos, endPos);
+  return dbus_message_new_method_return (message);
+}
+
+static DBusMessage *
+impl_CutText (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkEditableText *editable = (AtkEditableText *) user_data;
+  dbus_int32_t startPos, endPos;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startPos, DBUS_TYPE_INT32, &endPos,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_editable_text_cut_text (editable, startPos, endPos);
+  rv = TRUE;
+  // TODO decide if we really need this return value
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_DeleteText (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkEditableText *editable = (AtkEditableText *) user_data;
+  dbus_int32_t startPos, endPos;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startPos, DBUS_TYPE_INT32, &endPos,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_editable_text_delete_text (editable, startPos, endPos);
+  rv = TRUE;
+  // TODO decide if we really need this return value
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_PasteText (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkEditableText *editable = (AtkEditableText *) user_data;
+  dbus_int32_t position;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &position, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_editable_text_paste_text (editable, position);
+  rv = TRUE;
+  // TODO decide if we really need this return value
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_SetTextContents, "SetTextContents" },
+  { impl_InsertText, "InsertText" },
+  { impl_CopyText, "CopyText" },
+  { impl_CutText, "CutText" },
+  { impl_DeleteText, "DeleteText" },
+  { impl_PasteText, "PasteText" },
+  { NULL, NULL }
+};
+
+void
+spi_initialize_editabletext (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_EDITABLE_TEXT, spi_org_a11y_atspi_EditableText, methods, NULL);
+};
diff --git a/atk-adaptor/adaptors/hyperlink-adaptor.c b/atk-adaptor/adaptors/hyperlink-adaptor.c
new file mode 100644 (file)
index 0000000..a90946c
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static AtkHyperlink *
+get_hyperlink (void *user_data)
+{
+  if (ATK_IS_HYPERLINK (user_data))
+    return ATK_HYPERLINK (user_data);
+  if (ATK_IS_HYPERLINK_IMPL (user_data))
+    return atk_hyperlink_impl_get_hyperlink (ATK_HYPERLINK_IMPL (user_data));
+  return NULL;
+}
+
+static dbus_bool_t
+impl_get_NAnchors (DBusMessageIter *iter, void *user_data)
+{
+  AtkHyperlink *link = get_hyperlink (user_data);
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), FALSE);
+  return droute_return_v_int32 (iter, atk_hyperlink_get_n_anchors (link));
+}
+
+static dbus_bool_t
+impl_get_StartIndex (DBusMessageIter *iter, void *user_data)
+{
+  AtkHyperlink *link = get_hyperlink (user_data);
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), FALSE);
+  return droute_return_v_int32 (iter, atk_hyperlink_get_start_index (link));
+}
+
+static dbus_bool_t
+impl_get_EndIndex (DBusMessageIter *iter, void *user_data)
+{
+  AtkHyperlink *link = get_hyperlink (user_data);
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), FALSE);
+  return droute_return_v_int32 (iter, atk_hyperlink_get_end_index (link));
+}
+
+static DBusMessage *
+impl_GetObject (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkHyperlink *link = get_hyperlink (user_data);
+  dbus_int32_t i;
+  AtkObject *atk_object;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_object = atk_hyperlink_get_object (link, i);
+  return spi_object_return_reference (message, atk_object);
+}
+
+static DBusMessage *
+impl_GetURI (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkHyperlink *link = get_hyperlink (user_data);
+  dbus_int32_t i;
+  gchar *rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  rv = atk_hyperlink_get_uri (link, i);
+  if (!rv)
+    rv = g_strdup ("");
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  g_free (rv);
+  return reply;
+}
+
+static DBusMessage *
+impl_IsValid (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkHyperlink *link = get_hyperlink (user_data);
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link),
+                        droute_not_yet_handled_error (message));
+
+  rv = atk_hyperlink_is_valid (link);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetObject, "GetObject" },
+  { impl_GetURI, "GetURI" },
+  { impl_IsValid, "IsValid" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_NAnchors, NULL, "NAnchors" },
+  { impl_get_StartIndex, NULL, "StartIndex" },
+  { impl_get_EndIndex, NULL, "EndIndex" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_hyperlink (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_HYPERLINK,
+                         spi_org_a11y_atspi_Hyperlink,
+                         methods, properties);
+};
diff --git a/atk-adaptor/adaptors/hypertext-adaptor.c b/atk-adaptor/adaptors/hypertext-adaptor.c
new file mode 100644 (file)
index 0000000..b00acb7
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static DBusMessage *
+impl_GetNLinks (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkHypertext *hypertext = (AtkHypertext *) user_data;
+  gint rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_HYPERTEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  rv = atk_hypertext_get_n_links (hypertext);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetLink (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkHypertext *hypertext = (AtkHypertext *) user_data;
+  dbus_int32_t linkIndex;
+  AtkHyperlink *link;
+
+  g_return_val_if_fail (ATK_IS_HYPERTEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &linkIndex, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  link = atk_hypertext_get_link (hypertext, linkIndex);
+  /*The above line doesn't ref the link, and the next call is going to unref*/
+  if (link)
+    g_object_ref (link);
+  return spi_hyperlink_return_reference (message, link);
+}
+
+static DBusMessage *
+impl_GetLinkIndex (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkHypertext *hypertext = (AtkHypertext *) user_data;
+  dbus_int32_t characterIndex;
+  dbus_int32_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_HYPERTEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &characterIndex, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_hypertext_get_link_index (hypertext, characterIndex);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetNLinks, "GetNLinks" },
+  { impl_GetLink, "GetLink" },
+  { impl_GetLinkIndex, "GetLinkIndex" },
+  { NULL, NULL }
+};
+
+void
+spi_initialize_hypertext (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_HYPERTEXT, spi_org_a11y_atspi_Hypertext, methods, NULL);
+};
diff --git a/atk-adaptor/adaptors/image-adaptor.c b/atk-adaptor/adaptors/image-adaptor.c
new file mode 100644 (file)
index 0000000..350e037
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static dbus_bool_t
+impl_get_ImageDescription (DBusMessageIter *iter, void *user_data)
+{
+  AtkImage *image = (AtkImage *) user_data;
+  g_return_val_if_fail (ATK_IS_IMAGE (user_data), FALSE);
+  return droute_return_v_string (iter,
+                                 atk_image_get_image_description (image));
+}
+
+static dbus_bool_t
+impl_get_ImageLocale (DBusMessageIter *iter, void *user_data)
+{
+  AtkImage *image = (AtkImage *) user_data;
+  g_return_val_if_fail (ATK_IS_IMAGE (user_data), FALSE);
+  return droute_return_v_string (iter, atk_image_get_image_locale (image));
+}
+
+static DBusMessage *
+impl_GetImageExtents (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkImage *image = (AtkImage *) user_data;
+  dbus_uint32_t coordType;
+  gint ix, iy, iwidth, iheight;
+
+  g_return_val_if_fail (ATK_IS_IMAGE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_image_get_image_size (image, &iwidth, &iheight);
+  atk_image_get_image_position (image, &ix, &iy, (AtkCoordType) coordType);
+  return spi_dbus_return_rect (message, ix, iy, iwidth, iheight);
+}
+
+static DBusMessage *
+impl_GetImagePosition (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkImage *image = (AtkImage *) user_data;
+  dbus_uint32_t coord_type;
+  gint ix = 0, iy = 0;
+  dbus_int32_t x, y;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_IMAGE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_UINT32, &coord_type, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_image_get_image_position (image, &ix, &iy, (AtkCoordType) coord_type);
+  x = ix;
+  y = iy;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
+                                &y, DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetImageSize (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkImage *image = (AtkImage *) user_data;
+  gint iwidth = 0, iheight = 0;
+  dbus_int32_t width, height;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_IMAGE (user_data),
+                        droute_not_yet_handled_error (message));
+  atk_image_get_image_size (image, &iwidth, &iheight);
+  width = iwidth;
+  height = iheight;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &width,
+                                DBUS_TYPE_INT32, &height, DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetImageExtents, "GetImageExtents" },
+  { impl_GetImagePosition, "GetImagePosition" },
+  { impl_GetImageSize, "GetImageSize" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_ImageDescription, NULL, "ImageDescription" },
+  { impl_get_ImageLocale, NULL, "ImageLocale" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_image (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_IMAGE, spi_org_a11y_atspi_Image, methods, properties);
+};
diff --git a/atk-adaptor/adaptors/meson.build b/atk-adaptor/adaptors/meson.build
new file mode 100644 (file)
index 0000000..a62eaac
--- /dev/null
@@ -0,0 +1,32 @@
+source = [
+  introspection_generated,
+  'accessible-adaptor.c',
+  'action-adaptor.c',
+  'application-adaptor.c',
+  'cache-adaptor.c',
+  'collection-adaptor.c',
+  'component-adaptor.c',
+  'document-adaptor.c',
+  'editabletext-adaptor.c',
+  'hyperlink-adaptor.c',
+  'hypertext-adaptor.c',
+  'image-adaptor.c',
+  'selection-adaptor.c',
+  'socket-adaptor.c',
+  'table-adaptor.c',
+  'table-cell-adaptor.c',
+  'text-adaptor.c',
+  'value-adaptor.c',
+]
+
+libatk_bridge_adaptors = static_library('atk-bridge-adaptors', source,
+                                        include_directories: [
+                                          root_inc,
+                                          include_directories('..'),
+                                        ],
+                                        dependencies: [ libdbus_dep, atspi_dep, libatk_dep ],
+                                        c_args: p2p_cflags)
+
+libatk_bridge_adaptors_dep = declare_dependency(link_with: libatk_bridge_adaptors,
+                                                dependencies: [ libdbus_dep, atspi_dep, libatk_dep ],
+                                                include_directories: include_directories('.'))
diff --git a/atk-adaptor/adaptors/selection-adaptor.c b/atk-adaptor/adaptors/selection-adaptor.c
new file mode 100644 (file)
index 0000000..ec9f8ab
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static dbus_bool_t
+impl_get_NSelectedChildren (DBusMessageIter *iter, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data), FALSE);
+  return droute_return_v_int32 (iter,
+                                atk_selection_get_selection_count (selection));
+}
+
+/*static char *
+impl_get_NSelectedChildren_str (void *datum)
+{
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data), FALSE);
+  return g_strdup_printf ("%d",
+                          atk_selection_get_selection_count ((AtkSelection *)
+                                                             datum));
+}*/
+
+static DBusMessage *
+impl_GetSelectedChild (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  DBusMessage *reply;
+  dbus_int32_t selectedChildIndex;
+  AtkObject *atk_object;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &selectedChildIndex,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_object = atk_selection_ref_selection (selection, selectedChildIndex);
+  reply = spi_object_return_reference (message, atk_object);
+  if (atk_object)
+    g_object_unref (atk_object);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_SelectChild (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  dbus_int32_t childIndex;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &childIndex, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_selection_add_selection (selection, childIndex);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_DeselectSelectedChild (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  dbus_int32_t selectedChildIndex;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &selectedChildIndex,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_selection_remove_selection (selection, selectedChildIndex);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_IsChildSelected (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  dbus_int32_t childIndex;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &childIndex, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_selection_is_child_selected (selection, childIndex);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_SelectAll (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  rv = atk_selection_select_all_selection (selection);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_ClearSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  rv = atk_selection_clear_selection (selection);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_DeselectChild (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkSelection *selection = (AtkSelection *) user_data;
+  dbus_int32_t selectedChildIndex;
+  dbus_bool_t rv = FALSE;
+  gint i, nselected;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &selectedChildIndex,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  nselected = atk_selection_get_selection_count (selection);
+  for (i = 0; i < nselected; ++i)
+    {
+      AtkObject *selected_obj = atk_selection_ref_selection (selection, i);
+      if (atk_object_get_index_in_parent (selected_obj) == selectedChildIndex)
+        {
+          g_object_unref (G_OBJECT (selected_obj));
+          rv = atk_selection_remove_selection (selection, i);
+          break;
+        }
+      g_object_unref (G_OBJECT (selected_obj));
+    }
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetSelectedChild, "GetSelectedChild" },
+  { impl_SelectChild, "SelectChild" },
+  { impl_DeselectSelectedChild, "DeselectSelectedChild" },
+  { impl_IsChildSelected, "IsChildSelected" },
+  { impl_SelectAll, "SelectAll" },
+  { impl_ClearSelection, "ClearSelection" },
+  { impl_DeselectChild, "DeselectChild" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_NSelectedChildren, NULL, "NSelectedChildren" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_selection (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_SELECTION,
+                         spi_org_a11y_atspi_Selection,
+                         methods, properties);
+};
diff --git a/atk-adaptor/adaptors/socket-adaptor.c b/atk-adaptor/adaptors/socket-adaptor.c
new file mode 100644 (file)
index 0000000..91a5f10
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <droute/droute.h>
+
+#include "accessible-stateset.h"
+#include "bridge.h"
+#include "introspection.h"
+#include "object.h"
+#include "spi-dbus.h"
+
+static DBusMessage *
+new_socket_call_message (AtkComponent *component, const char *member)
+{
+  char *id = g_object_get_data (G_OBJECT (component), "dbus-plug-parent");
+  char *bus_parent;
+  char *path_parent;
+
+  if (!id)
+    {
+      g_warning ("new_socket_call_message: no id");
+      return NULL;
+    }
+  bus_parent = g_strdup (id);
+  if (bus_parent && (path_parent = g_utf8_strchr (bus_parent + 1, -1, ':')))
+    {
+      DBusMessage *message;
+      *(path_parent++) = '\0';
+      message = dbus_message_new_method_call (bus_parent, path_parent,
+                                              ATSPI_DBUS_INTERFACE_COMPONENT,
+                                              member);
+      g_free (bus_parent);
+      return message;
+    }
+  return NULL;
+}
+
+static void
+atspi_plug_component_get_extents (AtkComponent *component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type)
+{
+  DBusMessage *message = new_socket_call_message (component, "GetExtents");
+  DBusMessage *reply;
+  dbus_uint32_t coord_type_dbus = coord_type;
+  DBusError error;
+  const char *signature;
+  DBusMessageIter iter, iter_struct;
+  dbus_int32_t tmp;
+
+  dbus_error_init (&error);
+  dbus_message_append_args (message, DBUS_TYPE_UINT32, &coord_type_dbus, DBUS_TYPE_INVALID);
+  reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus,
+                                                     message, -1, &error);
+  dbus_message_unref (message);
+  if (!reply)
+    {
+      *x = -1;
+      *y = -1;
+      *width = -1;
+      *height = -1;
+      return;
+    }
+  signature = dbus_message_get_signature (reply);
+  if (g_strcmp0 (signature, "(iiii)") != 0)
+    {
+      g_warning ("Got unexpected signature %s from GetExtents\n", signature);
+      dbus_message_unref (reply);
+      *x = -1;
+      *y = -1;
+      *width = -1;
+      *height = -1;
+      return;
+    }
+  dbus_message_iter_init (reply, &iter);
+  dbus_message_iter_recurse (&iter, &iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &tmp);
+  *x = tmp;
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &tmp);
+  *y = tmp;
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &tmp);
+  *width = tmp;
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &tmp);
+  *height = tmp;
+  dbus_message_unref (reply);
+}
+
+static void
+atspi_plug_component_get_position (AtkComponent *component, gint *x, gint *y, AtkCoordType coord_type)
+{
+  DBusMessage *message = new_socket_call_message (component, "GetPosition");
+  DBusMessage *reply;
+  dbus_uint32_t coord_type_dbus = coord_type;
+  DBusError error;
+  dbus_int32_t x_dbus, y_dbus;
+
+  dbus_error_init (&error);
+  dbus_message_append_args (message, DBUS_TYPE_UINT32, &coord_type_dbus, DBUS_TYPE_INVALID);
+  reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus,
+                                                     message, -1, &error);
+  dbus_message_unref (message);
+  if (!reply)
+    {
+      *x = -1;
+      *y = -1;
+      return;
+    }
+  if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_INT32, &x_dbus,
+                              DBUS_TYPE_INT32, &y_dbus, DBUS_TYPE_INVALID))
+    {
+      g_warning ("GetPosition failed: %s", error.message);
+      dbus_error_free (&error);
+      *x = -1;
+      *y = -1;
+    }
+  else
+    {
+      *x = x_dbus;
+      *y = y_dbus;
+    }
+  dbus_message_unref (reply);
+}
+
+static void
+atspi_plug_component_get_size (AtkComponent *component,
+                               gint *width,
+                               gint *height)
+{
+  DBusMessage *message = new_socket_call_message (component, "GetSize");
+  DBusMessage *reply;
+  DBusError error;
+  dbus_uint32_t width_dbus, height_dbus;
+
+  dbus_error_init (&error);
+  reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus,
+                                                     message, -1, &error);
+  dbus_message_unref (message);
+  if (!reply)
+    {
+      *width = -1;
+      *height = -1;
+      return;
+    }
+  if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_INT32, &width_dbus,
+                              DBUS_TYPE_INT32, &height_dbus, DBUS_TYPE_INVALID))
+    {
+      g_warning ("GetSize failed: %s", error.message);
+      dbus_error_free (&error);
+      *width = -1;
+      *height = -1;
+    }
+  else
+    {
+      *width = width_dbus;
+      *height = height_dbus;
+    }
+  dbus_message_unref (reply);
+}
+
+static DBusMessage *
+impl_Embedded (DBusConnection *bus,
+               DBusMessage *message,
+               void *user_data)
+{
+  AtkObject *object = (AtkObject *) user_data;
+  char *path;
+  gchar *id;
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  id = g_strconcat (dbus_message_get_sender (message), ":", path, NULL);
+  g_object_set_data_full (G_OBJECT (object), "dbus-plug-parent", id, (GDestroyNotify) g_free);
+
+  if (ATK_IS_COMPONENT (object))
+    {
+      AtkComponent *component = ATK_COMPONENT (object);
+      AtkComponentIface *iface = ATK_COMPONENT_GET_IFACE (component);
+      iface->get_extents = atspi_plug_component_get_extents;
+      iface->get_size = atspi_plug_component_get_size;
+      iface->get_position = atspi_plug_component_get_position;
+    }
+
+  /* Retrieve some info about the children, if they exist, when
+     embedding the plug to ensure the a11y subtree is generated.
+     https://bugzilla.gnome.org/show_bug.cgi?id=663876 */
+  atk_object_get_n_accessible_children (object);
+
+  return dbus_message_new_method_return (message);
+}
+
+static DRouteMethod methods[] = {
+  { impl_Embedded, "Embedded" },
+  { NULL, NULL }
+};
+
+void
+spi_initialize_socket (DRoutePath *path)
+{
+  droute_path_add_interface (path,
+                             ATSPI_DBUS_INTERFACE_SOCKET,
+                             spi_org_a11y_atspi_Socket,
+                             methods, NULL);
+};
diff --git a/atk-adaptor/adaptors/streamablecontent-adaptor.c b/atk-adaptor/adaptors/streamablecontent-adaptor.c
new file mode 100644 (file)
index 0000000..c09768f
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/* streamablecontent.c : implements the StreamableContent interface */
+
+#include "config.h"
+
+#include <libspi/component.h>
+#include <libspi/streamablecontent.h>
+
+#include <stdio.h>
+#include <string.h>
+
+/* Our parent Gtk object type */
+#define PARENT_TYPE SPI_TYPE_BASE
+
+/* A pointer to our parent object class */
+static GObjectClass *spi_streamable_parent_class;
+
+#define SPI_CONTENT_STREAM_TYPE (spi_content_stream_get_type ())
+#define SPI_CONTENT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SPI_CONTENT_STREAM_TYPE, SpiContentStream))
+#define SPI_CONTENT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SPI_CONTENT_STREAM_TYPE, SpiContentStreamClass))
+#define SPI_IS_CONTENT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SPI_CONTENT_STREAM_TYPE))
+#define SPI_IS_CONTENT_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SPI_CONTENT_STREAM_TYPE))
+
+typedef struct _SpiContentStream SpiContentStream;
+typedef struct _SpiContentStreamClass SpiContentStreamClass;
+
+struct _SpiContentStream
+{
+  BonoboObject parent;
+  GIOChannel *gio;
+};
+
+struct _SpiContentStreamClass
+{
+  BonoboObjectClass parent_class;
+  POA_Accessibility_ContentStream__epv epv;
+};
+
+GType spi_content_stream_get_type (void);
+
+static SpiContentStream *
+spi_content_stream_new (GIOChannel *gio)
+{
+  SpiContentStream *new_stream = g_object_new (SPI_CONTENT_STREAM_TYPE, NULL);
+  new_stream->gio = gio;
+  return new_stream;
+}
+
+static void
+spi_content_stream_dispose (GObject *o)
+{
+  if (SPI_IS_CONTENT_STREAM (o))
+    {
+      SpiContentStream *stream = SPI_CONTENT_STREAM (o);
+      if (stream->gio)
+        g_io_channel_unref (stream->gio);
+    }
+}
+
+static CORBA_long
+impl_content_stream_seek (PortableServer_Servant servant,
+                          const CORBA_long offset,
+                          const Accessibility_ContentStream_SeekType whence,
+                          CORBA_Environment *ev)
+{
+  SpiContentStream *stream =
+      SPI_CONTENT_STREAM (bonobo_object_from_servant (servant));
+  if (stream && stream->gio)
+    {
+      GError *err;
+      GSeekType seektype = G_SEEK_SET;
+      switch (whence)
+        {
+        case Accessibility_ContentStream_SEEK_CURRENT:
+          seektype = G_SEEK_CUR;
+          break;
+        case Accessibility_ContentStream_SEEK_END:
+          seektype = G_SEEK_END;
+          break;
+        }
+      if (g_io_channel_seek_position (stream->gio, (gint64) offset,
+                                      seektype, &err) == G_IO_STATUS_NORMAL)
+        return offset;
+      else
+        return -1;
+    }
+  else
+    return -1;
+}
+
+static CORBA_long
+impl_content_stream_read (PortableServer_Servant servant,
+                          const CORBA_long count,
+                          Accessibility_ContentStream_iobuf **buffer,
+                          CORBA_Environment *ev)
+{
+  SpiContentStream *stream =
+      SPI_CONTENT_STREAM (bonobo_object_from_servant (servant));
+  CORBA_long realcount = 0;
+
+  if (stream && stream->gio)
+    {
+      gchar *gbuf = NULL;
+      GIOStatus status;
+      GError *err = NULL;
+
+      /* read the giochannel and determine the actual bytes read... */
+      if (count != -1)
+        {
+          gbuf = g_malloc (count + 1);
+          status =
+              g_io_channel_read_chars (stream->gio, gbuf, count, &realcount,
+                                       &err);
+        }
+      else
+        status =
+            g_io_channel_read_to_end (stream->gio, &gbuf, &realcount, &err);
+
+      if (status == G_IO_STATUS_NORMAL || status == G_IO_STATUS_EOF)
+        {
+          *buffer = Bonobo_Stream_iobuf__alloc ();
+          CORBA_sequence_set_release (*buffer, TRUE);
+
+          (*buffer)->_buffer =
+              CORBA_sequence_CORBA_octet_allocbuf (realcount);
+          (*buffer)->_length = realcount;
+
+          g_memmove ((*buffer)->_buffer, gbuf, realcount);
+        }
+
+      g_free (gbuf);
+    }
+
+  return realcount;
+}
+
+static void
+impl_content_stream_close (PortableServer_Servant servant,
+                           CORBA_Environment *ev)
+{
+  GIOStatus status;
+  GError *err;
+  SpiContentStream *stream =
+      SPI_CONTENT_STREAM (bonobo_object_from_servant (servant));
+  if (stream && stream->gio)
+    {
+      status = g_io_channel_shutdown (stream->gio, TRUE, &err);
+      g_io_channel_unref (stream->gio);
+    }
+  if (err)
+    g_free (err);
+}
+
+static void
+spi_content_stream_class_init (SpiContentStreamClass *klass)
+{
+  POA_Accessibility_ContentStream__epv *epv = &klass->epv;
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  epv->seek = impl_content_stream_seek;
+  epv->read = impl_content_stream_read;
+  epv->close = impl_content_stream_close;
+
+  object_class->dispose = spi_content_stream_dispose;
+}
+
+static void
+spi_content_stream_init (SpiContentStream *stream)
+{
+}
+
+BONOBO_TYPE_FUNC_FULL (SpiContentStream,
+                       Accessibility_ContentStream,
+                       BONOBO_TYPE_OBJECT,
+                       spi_content_stream)
+static AtkStreamableContent
+    *
+    get_streamable_from_servant (PortableServer_Servant servant)
+{
+  SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant));
+  g_return_val_if_fail (object != NULL, NULL);
+  g_return_val_if_fail (ATK_IS_STREAMABLE_CONTENT (object->gobj), NULL);
+  return ATK_STREAMABLE_CONTENT (object->gobj);
+}
+
+/*
+ * CORBA Accessibility::StreamableContent::getContentTypes method implementation
+ */
+static Accessibility_StringSeq *
+impl_accessibility_streamable_get_content_types (PortableServer_Servant
+                                                     servant,
+                                                 CORBA_Environment *ev)
+{
+  Accessibility_StringSeq *typelist = Accessibility_StringSeq__alloc ();
+  AtkStreamableContent *streamable = get_streamable_from_servant (servant);
+  int n_types, i;
+
+  typelist->_length = typelist->_maximum = 0;
+
+  g_return_val_if_fail (streamable != NULL, typelist);
+
+  n_types = atk_streamable_content_get_n_mime_types (streamable);
+
+  if (n_types)
+    {
+      typelist->_length = typelist->_maximum = n_types;
+      typelist->_buffer = Accessibility_StringSeq_allocbuf (n_types);
+      for (i = 0; i < n_types; ++i)
+        {
+          const gchar *mimetype =
+              atk_streamable_content_get_mime_type (streamable, i);
+          typelist->_buffer[i] = CORBA_string_dup (mimetype ? mimetype : "");
+        }
+    }
+  return typelist;
+}
+
+/*
+ * CORBA Accessibility::StreamableContent::getContent method implementation
+ */
+static Bonobo_Stream
+impl_accessibility_streamable_get_content (PortableServer_Servant servant,
+                                           const CORBA_char *content_type,
+                                           CORBA_Environment *ev)
+{
+  Bonobo_Stream stream;
+  AtkStreamableContent *streamable = get_streamable_from_servant (servant);
+  GIOChannel *gio;
+
+  g_return_val_if_fail (streamable != NULL, NULL);
+
+  gio = atk_streamable_content_get_stream (streamable, content_type);
+
+  stream = CORBA_OBJECT_NIL; /* deprecated,
+                              * and it was never implemented,
+                              * so don't bother fixing this
+                              */
+  return stream;
+}
+
+/*
+ * CORBA Accessibility::StreamableContent::getStream method implementation
+ */
+static Accessibility_ContentStream
+impl_accessibility_streamable_get_stream (PortableServer_Servant servant,
+                                          const CORBA_char *content_type,
+                                          CORBA_Environment *ev)
+{
+  SpiContentStream *stream;
+  AtkStreamableContent *streamable = get_streamable_from_servant (servant);
+  GIOChannel *gio;
+
+  g_return_val_if_fail (streamable != NULL, NULL);
+
+  gio = atk_streamable_content_get_stream (streamable, content_type);
+
+  stream = spi_content_stream_new (gio);
+
+  return bonobo_object_dup_ref (BONOBO_OBJREF (stream), ev);
+}
+
+/*
+ * CORBA Accessibility::StreamableContent::GetURI method implementation
+ */
+static CORBA_string
+impl_accessibility_streamable_get_uri (PortableServer_Servant servant,
+                                       const CORBA_char *content_type,
+                                       CORBA_Environment *ev)
+{
+  gchar *uri;
+  AtkStreamableContent *streamable = get_streamable_from_servant (servant);
+
+  g_return_val_if_fail (streamable != NULL, NULL);
+
+  uri = atk_streamable_content_get_uri (streamable, content_type);
+
+  return (uri != NULL ? CORBA_string_dup (uri) : CORBA_string_dup (""));
+}
+
+static void
+spi_streamable_class_init (SpiStreamableClass *klass)
+{
+  POA_Accessibility_StreamableContent__epv *epv = &klass->epv;
+  spi_streamable_parent_class = g_type_class_peek_parent (klass);
+
+  epv->getContentTypes = impl_accessibility_streamable_get_content_types;
+  epv->getContent = impl_accessibility_streamable_get_content;
+  epv->getStream = impl_accessibility_streamable_get_stream;
+  epv->GetURI = impl_accessibility_streamable_get_uri;
+}
+
+static void
+spi_streamable_init (SpiStreamable *streamable)
+{
+}
+
+SpiStreamable *
+spi_streamable_interface_new (AtkObject *o)
+{
+  SpiStreamable *retval = g_object_new (SPI_STREAMABLE_TYPE, NULL);
+
+  spi_base_construct (SPI_BASE (retval), G_OBJECT (o));
+
+  return retval;
+}
+
+BONOBO_TYPE_FUNC_FULL (SpiStreamable,
+                       Accessibility_StreamableContent,
+                       PARENT_TYPE,
+                       spi_streamable)
diff --git a/atk-adaptor/adaptors/table-adaptor.c b/atk-adaptor/adaptors/table-adaptor.c
new file mode 100644 (file)
index 0000000..9b9ed52
--- /dev/null
@@ -0,0 +1,639 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#define ATK_DISABLE_DEPRECATION_WARNINGS
+#include "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static dbus_bool_t
+impl_get_NRows (DBusMessageIter *iter, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_table_get_n_rows (table));
+}
+
+static dbus_bool_t
+impl_get_NColumns (DBusMessageIter *iter, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_table_get_n_columns (table));
+}
+
+static dbus_bool_t
+impl_get_Caption (DBusMessageIter *iter, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
+  spi_object_append_v_reference (iter, atk_table_get_caption (table));
+  return TRUE;
+}
+
+static dbus_bool_t
+impl_get_Summary (DBusMessageIter *iter, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
+  spi_object_append_v_reference (iter, atk_table_get_summary (table));
+  return TRUE;
+}
+
+static dbus_bool_t
+impl_get_NSelectedRows (DBusMessageIter *iter, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  gint *selected_rows = NULL;
+  int count;
+  g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
+  count = atk_table_get_selected_rows (table, &selected_rows);
+  if (selected_rows)
+    g_free (selected_rows);
+  return droute_return_v_int32 (iter, count);
+}
+
+static dbus_bool_t
+impl_get_NSelectedColumns (DBusMessageIter *iter, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  gint *selected_columns = NULL;
+  int count;
+  g_return_val_if_fail (ATK_IS_TABLE (user_data), FALSE);
+  count = atk_table_get_selected_columns (table, &selected_columns);
+  if (selected_columns)
+    g_free (selected_columns);
+  return droute_return_v_int32 (iter, count);
+}
+
+static DBusMessage *
+impl_GetAccessibleAt (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row, column;
+  DBusMessage *reply;
+  AtkObject *obj;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  obj = atk_table_ref_at (table, row, column);
+  reply = spi_object_return_reference (message, obj);
+  if (obj)
+    g_object_unref (obj);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_GetIndexAt (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row, column;
+  dbus_int32_t index;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  index = atk_table_get_index_at (table, row, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &index,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRowAtIndex (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t index;
+  dbus_int32_t row;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  row = atk_table_get_row_at_index (table, index);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &row,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetColumnAtIndex (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t index;
+  dbus_int32_t column;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  column = atk_table_get_column_at_index (table, index);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &column,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static const gchar *
+validate_unallocated_string (const gchar *str)
+{
+  if (!str)
+    return "";
+  if (!g_utf8_validate (str, -1, NULL))
+    {
+      g_warning ("atk-bridge: received bad UTF-8 string from a table function");
+      return "";
+    }
+  return str;
+}
+
+static DBusMessage *
+impl_GetRowDescription (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  dbus_int32_t row;
+  AtkTable *table = (AtkTable *) user_data;
+  const gchar *description;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  description = atk_table_get_row_description (table, row);
+  description = validate_unallocated_string (description);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetColumnDescription (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t column;
+  const char *description;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  description = atk_table_get_column_description (table, column);
+  description = validate_unallocated_string (description);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &description,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRowExtentAt (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row, column;
+  dbus_int32_t extent;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  extent = atk_table_get_row_extent_at (table, row, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetColumnExtentAt (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row, column;
+  dbus_int32_t extent;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  extent = atk_table_get_column_extent_at (table, row, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &extent,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRowHeader (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row;
+  AtkObject *obj = NULL;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  obj = atk_table_get_row_header (table, row);
+  return spi_object_return_reference (message, obj);
+}
+
+static DBusMessage *
+impl_GetColumnHeader (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t column;
+  AtkObject *obj;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  obj = atk_table_get_column_header (table, column);
+  return spi_object_return_reference (message, obj);
+}
+
+static DBusMessage *
+impl_GetSelectedRows (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  gint *selected_rows = NULL;
+  gint count;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  count = atk_table_get_selected_rows (table, &selected_rows);
+  if (!selected_rows)
+    count = 0;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      /* tbd - figure out if this is safe for a 0-length array */
+      dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_INT32,
+                                &selected_rows, count, DBUS_TYPE_INVALID);
+    }
+  if (selected_rows)
+    g_free (selected_rows);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetSelectedColumns (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  gint *selected_columns = NULL;
+  gint count;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  count = atk_table_get_selected_columns (table, &selected_columns);
+  if (!selected_columns)
+    count = 0;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      /* tbd - figure out if this is safe for a 0-length array */
+      dbus_message_append_args (reply, DBUS_TYPE_ARRAY, DBUS_TYPE_INT32,
+                                &selected_columns, count, DBUS_TYPE_INVALID);
+    }
+  if (selected_columns)
+    g_free (selected_columns);
+  return reply;
+}
+
+static DBusMessage *
+impl_IsRowSelected (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_is_row_selected (table, row);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_IsColumnSelected (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t column;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_is_column_selected (table, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_IsSelected (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row, column;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32, &column,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_is_selected (table, row, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_AddRowSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_add_row_selection (table, row);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_AddColumnSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t column;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_add_column_selection (table, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_RemoveRowSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t row;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &row, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_remove_row_selection (table, row);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_RemoveColumnSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t column;
+  DBusMessage *reply;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &column, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ret = atk_table_remove_column_selection (table, column);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRowColumnExtentsAtIndex (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTable *table = (AtkTable *) user_data;
+  dbus_int32_t index;
+  dbus_int32_t row, column, row_extents, col_extents;
+  dbus_bool_t is_selected;
+  dbus_bool_t ret;
+  DBusMessage *reply;
+  AtkObject *cell;
+  AtkRole role = ATK_ROLE_INVALID;
+
+  g_return_val_if_fail (ATK_IS_TABLE (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &index, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  column = atk_table_get_column_at_index (table, index);
+  row = atk_table_get_row_at_index (table, index);
+  row_extents = atk_table_get_row_extent_at (table, row, column);
+  col_extents = atk_table_get_column_extent_at (table, row, column);
+  is_selected = atk_table_is_selected (table, row, column);
+  cell = atk_table_ref_at (table, row, column);
+  if (cell)
+    {
+      role = atk_object_get_role (cell);
+      g_object_unref (cell);
+    }
+  ret = (role == ATK_ROLE_TABLE_CELL ? TRUE : FALSE);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INT32, &row, DBUS_TYPE_INT32,
+                                &column, DBUS_TYPE_INT32, &row_extents,
+                                DBUS_TYPE_INT32, &col_extents,
+                                DBUS_TYPE_BOOLEAN, &is_selected,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetAccessibleAt, "GetAccessibleAt" },
+  { impl_GetIndexAt, "GetIndexAt" },
+  { impl_GetRowAtIndex, "GetRowAtIndex" },
+  { impl_GetColumnAtIndex, "GetColumnAtIndex" },
+  { impl_GetRowDescription, "GetRowDescription" },
+  { impl_GetColumnDescription, "GetColumnDescription" },
+  { impl_GetRowExtentAt, "GetRowExtentAt" },
+  { impl_GetColumnExtentAt, "GetColumnExtentAt" },
+  { impl_GetRowHeader, "GetRowHeader" },
+  { impl_GetColumnHeader, "GetColumnHeader" },
+  { impl_GetSelectedRows, "GetSelectedRows" },
+  { impl_GetSelectedColumns, "GetSelectedColumns" },
+  { impl_IsRowSelected, "IsRowSelected" },
+  { impl_IsColumnSelected, "IsColumnSelected" },
+  { impl_IsSelected, "IsSelected" },
+  { impl_AddRowSelection, "AddRowSelection" },
+  { impl_AddColumnSelection, "AddColumnSelection" },
+  { impl_RemoveRowSelection, "RemoveRowSelection" },
+  { impl_RemoveColumnSelection, "RemoveColumnSelection" },
+  { impl_GetRowColumnExtentsAtIndex, "GetRowColumnExtentsAtIndex" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_NRows, NULL, "NRows" },
+  { impl_get_NColumns, NULL, "NColumns" },
+  { impl_get_Caption, NULL, "Caption" },
+  { impl_get_Summary, NULL, "Summary" },
+  { impl_get_NSelectedRows, NULL, "NSelectedRows" },
+  { impl_get_NSelectedColumns, NULL, "NSelectedColumns" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_table (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_TABLE, spi_org_a11y_atspi_Table, methods, properties);
+};
diff --git a/atk-adaptor/adaptors/table-cell-adaptor.c b/atk-adaptor/adaptors/table-cell-adaptor.c
new file mode 100644 (file)
index 0000000..8e29d56
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2013 SUSE LLC.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static dbus_bool_t
+impl_get_ColumnSpan (DBusMessageIter *iter, void *user_data)
+{
+  AtkTableCell *cell = (AtkTableCell *) user_data;
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_table_cell_get_column_span (cell));
+}
+
+static DBusMessage *
+message_from_object_array (DBusMessage *message, GPtrArray *array)
+{
+  DBusMessage *reply;
+  DBusMessageIter iter, iter_array;
+  gint len;
+  gint i;
+
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    return NULL;
+
+  dbus_message_iter_init_append (reply, &iter);
+
+  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array))
+    return reply; /* TODO: handle out of memory */
+  len = (array ? array->len : 0);
+  for (i = 0; i < len; i++)
+    {
+      spi_object_append_reference (&iter_array, g_ptr_array_index (array, i));
+    }
+  dbus_message_iter_close_container (&iter, &iter_array);
+  if (array)
+    g_ptr_array_unref (array);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetColumnHeaderCells (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTableCell *cell = user_data;
+  GPtrArray *array;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data),
+                        droute_not_yet_handled_error (message));
+
+  array = atk_table_cell_get_column_header_cells (cell);
+  return message_from_object_array (message, array);
+}
+
+static dbus_bool_t
+impl_get_RowSpan (DBusMessageIter *iter, void *user_data)
+{
+  AtkTableCell *cell = (AtkTableCell *) user_data;
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_table_cell_get_row_span (cell));
+}
+
+static DBusMessage *
+impl_GetRowHeaderCells (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTableCell *cell = user_data;
+  GPtrArray *array;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data),
+                        droute_not_yet_handled_error (message));
+
+  array = atk_table_cell_get_row_header_cells (cell);
+  return message_from_object_array (message, array);
+}
+
+static dbus_bool_t
+impl_get_Position (DBusMessageIter *iter, void *user_data)
+{
+  AtkTableCell *cell = (AtkTableCell *) user_data;
+  gint row = -1, column = -1;
+  DBusMessageIter iter_struct, iter_variant;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
+  if (!atk_table_cell_get_position (cell, &row, &column))
+    return FALSE;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(ii)", &iter_variant);
+  dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL, &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, (dbus_int32_t *) &row);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, (dbus_int32_t *) &column);
+  dbus_message_iter_close_container (&iter_variant, &iter_struct);
+  dbus_message_iter_close_container (iter, &iter_variant);
+  return TRUE;
+}
+
+static dbus_bool_t
+impl_get_Table (DBusMessageIter *iter, void *user_data)
+{
+  AtkTableCell *cell = (AtkTableCell *) user_data;
+  AtkObject *table;
+  DBusMessageIter iter_variant;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data), FALSE);
+
+  table = atk_table_cell_get_table (cell);
+  if (!table)
+    return FALSE;
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)", &iter_variant);
+  spi_object_append_reference (&iter_variant, table);
+  dbus_message_iter_close_container (iter, &iter_variant);
+  return TRUE;
+}
+
+static DBusMessage *
+impl_GetRowColumnSpan (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkTableCell *cell = (AtkTableCell *) user_data;
+  gint row, column, row_span, column_span;
+  dbus_int32_t d_row, d_column, d_row_span, d_column_span;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (user_data),
+                        droute_not_yet_handled_error (message));
+  atk_table_cell_get_row_column_span (cell, &row, &column, &row_span,
+                                      &column_span);
+  d_row = row;
+  d_column = column;
+  d_row_span = row_span;
+  d_column_span = column_span;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &d_row, DBUS_TYPE_INT32,
+                                &d_column, DBUS_TYPE_INT32, &d_row_span,
+                                DBUS_TYPE_INT32, &d_column_span,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetRowHeaderCells, "GetRowHeaderCells" },
+  { impl_GetColumnHeaderCells, "GetColumnHeaderCells" },
+  { impl_GetRowColumnSpan, "GetRowColumnSpan" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_ColumnSpan, NULL, "ColumnSpan" },
+  { impl_get_Position, NULL, "Position" },
+  { impl_get_RowSpan, NULL, "RowSpan" },
+  { impl_get_Table, NULL, "Table" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_table_cell (DRoutePath *path)
+{
+  droute_path_add_interface (path,
+                             ATSPI_DBUS_INTERFACE_TABLE_CELL,
+                             spi_org_a11y_atspi_TableCell,
+                             methods, properties);
+};
diff --git a/atk-adaptor/adaptors/text-adaptor.c b/atk-adaptor/adaptors/text-adaptor.c
new file mode 100644 (file)
index 0000000..7a7a37b
--- /dev/null
@@ -0,0 +1,916 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <string.h>
+
+#define ATK_DISABLE_DEPRECATION_WARNINGS
+#include "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "spi-dbus.h"
+
+#include "introspection.h"
+#include "object.h"
+
+static dbus_bool_t
+impl_get_CharacterCount (DBusMessageIter *iter, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_text_get_character_count (text));
+}
+
+static dbus_bool_t
+impl_get_CaretOffset (DBusMessageIter *iter, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  g_return_val_if_fail (ATK_IS_TEXT (user_data), FALSE);
+  return droute_return_v_int32 (iter, atk_text_get_caret_offset (text));
+}
+
+static gchar *
+validate_allocated_string (gchar *str)
+{
+  if (!str)
+    return g_strdup ("");
+  if (!g_utf8_validate (str, -1, NULL))
+    {
+      g_warning ("atk-bridge: received bad UTF-8 string from a get_text function");
+      g_free (str);
+      return g_strdup ("");
+    }
+  return str;
+}
+
+static DBusMessage *
+impl_GetText (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t startOffset, endOffset;
+  gchar *txt;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
+                              &endOffset, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  txt = atk_text_get_text (text, startOffset, endOffset);
+  txt = validate_allocated_string (txt);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
+                                DBUS_TYPE_INVALID);
+    }
+  g_free (txt);
+  return reply;
+}
+
+static DBusMessage *
+impl_SetCaretOffset (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_text_set_caret_offset (text, offset);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetTextBeforeOffset (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_uint32_t type;
+  gchar *txt;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset = 0, intend_offset = 0;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  txt =
+      atk_text_get_text_before_offset (text, offset, (AtkTextBoundary) type,
+                                       &intstart_offset, &intend_offset);
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  txt = validate_allocated_string (txt);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
+                                DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
+    }
+  g_free (txt);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetTextAtOffset (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset, type;
+  gchar *txt;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset = 0, intend_offset = 0;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  txt =
+      atk_text_get_text_at_offset (text, offset, (AtkTextBoundary) type,
+                                   &intstart_offset, &intend_offset);
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  txt = validate_allocated_string (txt);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
+                                DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
+    }
+  g_free (txt);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetTextAfterOffset (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_uint32_t type;
+  gchar *txt;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset = 0, intend_offset = 0;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &type,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  txt =
+      atk_text_get_text_after_offset (text, offset, (AtkTextBoundary) type,
+                                      &intstart_offset, &intend_offset);
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  txt = validate_allocated_string (txt);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
+                                DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
+    }
+  g_free (txt);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetCharacterAtOffset (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_int32_t ch;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  ch = atk_text_get_character_at_offset (text, offset);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &ch,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static gchar *
+get_text_for_legacy_implementations (AtkText *text,
+                                     gint offset,
+                                     AtkTextGranularity granularity,
+                                     gint *start_offset,
+                                     gint *end_offset)
+{
+  gchar *txt = 0;
+  AtkTextBoundary boundary = 0;
+  switch (granularity)
+    {
+    case ATK_TEXT_GRANULARITY_CHAR:
+      boundary = ATK_TEXT_BOUNDARY_CHAR;
+      break;
+
+    case ATK_TEXT_GRANULARITY_WORD:
+      boundary = ATK_TEXT_BOUNDARY_WORD_START;
+      break;
+
+    case ATK_TEXT_GRANULARITY_SENTENCE:
+      boundary = ATK_TEXT_BOUNDARY_SENTENCE_START;
+      break;
+
+    case ATK_TEXT_GRANULARITY_LINE:
+      boundary = ATK_TEXT_BOUNDARY_LINE_START;
+      break;
+
+    case ATK_TEXT_GRANULARITY_PARAGRAPH:
+      /* This is not implemented in previous versions of ATK */
+      txt = g_strdup ("");
+      break;
+
+    default:
+      g_assert_not_reached ();
+    }
+
+  if (!txt)
+    {
+      txt =
+          atk_text_get_text_at_offset (text, offset, boundary,
+                                       start_offset, end_offset);
+    }
+
+  return txt;
+}
+
+static DBusMessage *
+impl_GetStringAtOffset (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_uint32_t granularity;
+  gchar *txt = 0;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset = 0, intend_offset = 0;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32, &granularity,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  txt =
+      atk_text_get_string_at_offset (text, offset, (AtkTextGranularity) granularity,
+                                     &intstart_offset, &intend_offset);
+
+  /* Accessibility layers implementing an older version of ATK (even if
+   * a new enough version of libatk is installed) might return NULL due
+   * not to provide an implementation for get_string_at_offset(), so we
+   * try with the legacy implementation if that's the case. */
+  if (!txt)
+    txt = get_text_for_legacy_implementations (text, offset,
+                                               (AtkTextGranularity) granularity,
+                                               &intstart_offset, &intend_offset);
+
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  txt = validate_allocated_string (txt);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &txt,
+                                DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
+    }
+  g_free (txt);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAttributeValue (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  char *attributeName;
+  gint intstart_offset = 0, intend_offset = 0;
+  char *rv = NULL;
+  DBusMessage *reply;
+  AtkAttributeSet *set;
+  GSList *cur_attr;
+  AtkAttribute *at;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_STRING,
+                              &attributeName, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  set = atk_text_get_run_attributes (text, offset,
+                                     &intstart_offset, &intend_offset);
+  cur_attr = (GSList *) set;
+  while (cur_attr)
+    {
+      at = (AtkAttribute *) cur_attr->data;
+      if (!strcmp (at->name, attributeName))
+        {
+          rv = at->value;
+          break;
+        }
+      cur_attr = cur_attr->next;
+    }
+  if (!rv)
+    rv = "";
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &rv, DBUS_TYPE_INVALID);
+    }
+  atk_attribute_set_free (set);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAttributes (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset, intend_offset;
+  DBusMessage *reply;
+  AtkAttributeSet *set;
+  DBusMessageIter iter;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  set = atk_text_get_run_attributes (text, offset,
+                                     &intstart_offset, &intend_offset);
+
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_iter_init_append (reply, &iter);
+      spi_object_append_attribute_set (&iter, set);
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
+    }
+  atk_attribute_set_free (set);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetDefaultAttributes (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  DBusMessage *reply;
+  AtkAttributeSet *set;
+  DBusMessageIter iter;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  set = atk_text_get_default_attributes (text);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_iter_init_append (reply, &iter);
+      spi_object_append_attribute_set (&iter, set);
+    }
+  atk_attribute_set_free (set);
+  return reply;
+}
+
+static DBusMessage *
+impl_GetCharacterExtents (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_uint32_t coordType;
+  dbus_int32_t x, y, width, height;
+  gint ix = 0, iy = 0, iw = 0, ih = 0;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_UINT32,
+                              &coordType, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  atk_text_get_character_extents (text, offset, &ix, &iy, &iw, &ih,
+                                  (AtkCoordType) coordType);
+  x = ix;
+  y = iy;
+  width = iw;
+  height = ih;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
+                                &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
+                                &height, DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetOffsetAtPoint (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t x, y;
+  dbus_uint32_t coordType;
+  dbus_int32_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_text_get_offset_at_point (text, x, y, coordType);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetNSelections (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  rv = atk_text_get_n_selections (text);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t selectionNum;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset = 0, intend_offset = 0;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  /* atk_text_get_selection returns gchar * which we discard */
+  g_free (atk_text_get_selection (text, selectionNum, &intstart_offset, &intend_offset));
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &startOffset,
+                                DBUS_TYPE_INT32, &endOffset,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_AddSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t startOffset, endOffset;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
+                              &endOffset, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_text_add_selection (text, startOffset, endOffset);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_RemoveSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t selectionNum;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_text_remove_selection (text, selectionNum);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_SetSelection (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t selectionNum, startOffset, endOffset;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &selectionNum, DBUS_TYPE_INT32,
+                              &startOffset, DBUS_TYPE_INT32, &endOffset, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rv = atk_text_set_selection (text, selectionNum, startOffset, endOffset);
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_GetRangeExtents (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t startOffset, endOffset;
+  dbus_uint32_t coordType;
+  AtkTextRectangle rect;
+  dbus_int32_t x, y, width, height;
+  DBusMessage *reply;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startOffset, DBUS_TYPE_INT32,
+                              &endOffset, DBUS_TYPE_UINT32, &coordType, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  memset (&rect, 0, sizeof (rect));
+  atk_text_get_range_extents (text, startOffset, endOffset,
+                              (AtkCoordType) coordType, &rect);
+  x = rect.x;
+  y = rect.y;
+  width = rect.width;
+  height = rect.height;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32,
+                                &y, DBUS_TYPE_INT32, &width, DBUS_TYPE_INT32,
+                                &height, DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+#define MAXRANGELEN 512
+
+static DBusMessage *
+impl_GetBoundedRanges (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t x, y, width, height;
+  dbus_uint32_t coordType, xClipType, yClipType;
+  AtkTextRange **range_list = NULL;
+  AtkTextRectangle rect;
+  DBusMessage *reply;
+  DBusMessageIter iter, array, struc, variant;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_INT32, &height, DBUS_TYPE_INT32, &width, DBUS_TYPE_UINT32,
+                              &coordType, DBUS_TYPE_UINT32, &xClipType, DBUS_TYPE_UINT32, &yClipType,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+  rect.x = x;
+  rect.y = y;
+  rect.width = width;
+  rect.height = height;
+
+  range_list =
+      atk_text_get_bounded_ranges (text, &rect, (AtkCoordType) coordType,
+                                   (AtkTextClipType) xClipType,
+                                   (AtkTextClipType) yClipType);
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    return NULL;
+  /* This isn't pleasant. */
+  dbus_message_iter_init_append (reply, &iter);
+  if (dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(iisv)", &array))
+    {
+      int len;
+      int count = (range_list ? MAXRANGELEN : 0);
+      for (len = 0; len < count && range_list[len]; ++len)
+        {
+          if (dbus_message_iter_open_container (&array, DBUS_TYPE_STRUCT, NULL, &struc))
+            {
+              dbus_int32_t val;
+              val = range_list[len]->start_offset;
+              dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
+              val = range_list[len]->end_offset;
+              dbus_message_iter_append_basic (&struc, DBUS_TYPE_INT32, &val);
+              dbus_message_iter_append_basic (&struc, DBUS_TYPE_STRING,
+                                              &range_list[len]->content);
+              /* The variant is unimplemented in atk, but I don't want to
+               * unilaterally muck with the spec and remove it, so I'll just
+               * throw in a dummy value */
+              if (dbus_message_iter_open_container (&struc, DBUS_TYPE_VARIANT, "i", &variant))
+                {
+                  dbus_uint32_t dummy = 0;
+                  dbus_message_iter_append_basic (&variant, DBUS_TYPE_INT32,
+                                                  &dummy);
+                  dbus_message_iter_close_container (&struc, &variant);
+                }
+              dbus_message_iter_close_container (&array, &struc);
+              g_free (range_list[len]->content);
+              g_free (range_list[len]);
+            }
+        }
+      dbus_message_iter_close_container (&iter, &array);
+    }
+
+  if (range_list)
+    g_free (range_list);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_GetAttributeRun (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t offset;
+  dbus_bool_t includeDefaults;
+  dbus_int32_t startOffset, endOffset;
+  gint intstart_offset = 0, intend_offset = 0;
+  DBusMessage *reply;
+  AtkAttributeSet *attributes = NULL;
+  DBusMessageIter iter;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &offset, DBUS_TYPE_BOOLEAN,
+                              &includeDefaults, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  if (includeDefaults)
+    {
+      attributes = g_slist_concat (attributes,
+                                   atk_text_get_default_attributes (text));
+    }
+
+  attributes = g_slist_concat (attributes,
+                               atk_text_get_run_attributes (text, offset,
+                                                            &intstart_offset,
+                                                            &intend_offset));
+
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    return NULL;
+
+  dbus_message_iter_init_append (reply, &iter);
+  spi_object_append_attribute_set (&iter, attributes);
+
+  startOffset = intstart_offset;
+  endOffset = intend_offset;
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &startOffset);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &endOffset);
+
+  atk_attribute_set_free (attributes);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_GetDefaultAttributeSet (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  DBusMessage *reply;
+  DBusMessageIter iter;
+  AtkAttributeSet *attributes;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  attributes = atk_text_get_default_attributes (text);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_iter_init_append (reply, &iter);
+      spi_object_append_attribute_set (&iter, attributes);
+    }
+
+  if (attributes)
+    atk_attribute_set_free (attributes);
+
+  return reply;
+}
+
+static DBusMessage *
+impl_ScrollSubstringTo (DBusConnection *bus,
+                        DBusMessage *message,
+                        void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t startOffset, endOffset;
+  dbus_uint32_t type;
+  dbus_bool_t ret;
+  DBusMessage *reply = NULL;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startOffset,
+                              DBUS_TYPE_INT32, &endOffset,
+                              DBUS_TYPE_UINT32, &type,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  ret = atk_text_scroll_substring_to (text, startOffset, endOffset, type);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DBusMessage *
+impl_ScrollSubstringToPoint (DBusConnection *bus,
+                             DBusMessage *message,
+                             void *user_data)
+{
+  AtkText *text = (AtkText *) user_data;
+  dbus_int32_t startOffset, endOffset;
+  dbus_uint32_t type;
+  dbus_int32_t x, y;
+  dbus_bool_t ret;
+  DBusMessage *reply = NULL;
+
+  g_return_val_if_fail (ATK_IS_TEXT (user_data),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &startOffset,
+                              DBUS_TYPE_INT32, &endOffset,
+                              DBUS_TYPE_UINT32, &type,
+                              DBUS_TYPE_INT32, &x,
+                              DBUS_TYPE_INT32, &y,
+                              DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  ret = atk_text_scroll_substring_to_point (text, startOffset, endOffset, type, x, y);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static DRouteMethod methods[] = {
+  { impl_GetText, "GetText" },
+  { impl_SetCaretOffset, "SetCaretOffset" },
+  { impl_GetTextBeforeOffset, "GetTextBeforeOffset" },
+  { impl_GetTextAtOffset, "GetTextAtOffset" },
+  { impl_GetTextAfterOffset, "GetTextAfterOffset" },
+  { impl_GetStringAtOffset, "GetStringAtOffset" },
+  { impl_GetCharacterAtOffset, "GetCharacterAtOffset" },
+  { impl_GetAttributeValue, "GetAttributeValue" },
+  { impl_GetAttributes, "GetAttributes" },
+  { impl_GetDefaultAttributes, "GetDefaultAttributes" },
+  { impl_GetCharacterExtents, "GetCharacterExtents" },
+  { impl_GetOffsetAtPoint, "GetOffsetAtPoint" },
+  { impl_GetNSelections, "GetNSelections" },
+  { impl_GetSelection, "GetSelection" },
+  { impl_AddSelection, "AddSelection" },
+  { impl_RemoveSelection, "RemoveSelection" },
+  { impl_SetSelection, "SetSelection" },
+  { impl_GetRangeExtents, "GetRangeExtents" },
+  { impl_GetBoundedRanges, "GetBoundedRanges" },
+  { impl_GetAttributeRun, "GetAttributeRun" },
+  { impl_GetDefaultAttributeSet, "GetDefaultAttributeSet" },
+  { impl_ScrollSubstringTo, "ScrollSubstringTo" },
+  { impl_ScrollSubstringToPoint, "ScrollSubstringToPoint" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_CharacterCount, NULL, "CharacterCount" },
+  { impl_get_CaretOffset, NULL, "CaretOffset" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_text (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_TEXT, spi_org_a11y_atspi_Text, methods, properties);
+};
diff --git a/atk-adaptor/adaptors/value-adaptor.c b/atk-adaptor/adaptors/value-adaptor.c
new file mode 100644 (file)
index 0000000..dd076a4
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <math.h>
+
+#define ATK_DISABLE_DEPRECATION_WARNINGS
+#include "bridge.h"
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+#include "introspection.h"
+#include "spi-dbus.h"
+
+static dbus_bool_t
+impl_get_MinimumValue (DBusMessageIter *iter, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  GValue src = { 0 };
+  GValue dest = { 0 };
+  gdouble dub;
+
+  g_return_val_if_fail (ATK_IS_VALUE (user_data), FALSE);
+  AtkValueIface *iface = ATK_VALUE_GET_IFACE (value);
+  if (iface->get_range)
+    {
+      AtkRange *range = atk_value_get_range (value);
+      dub = atk_range_get_lower_limit (range);
+      atk_range_free (range);
+      return droute_return_v_double (iter, dub);
+    }
+
+  g_value_init (&src, G_TYPE_DOUBLE);
+  atk_value_get_minimum_value (value, &src);
+  g_value_init (&dest, G_TYPE_DOUBLE);
+
+  if (g_value_transform (&src, &dest))
+    {
+      dub = g_value_get_double (&dest);
+      return droute_return_v_double (iter, dub);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+static dbus_bool_t
+impl_get_MaximumValue (DBusMessageIter *iter, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  GValue src = { 0 };
+  GValue dest = { 0 };
+  gdouble dub = 0;
+
+  g_return_val_if_fail (ATK_IS_VALUE (user_data), FALSE);
+
+  AtkValueIface *iface = ATK_VALUE_GET_IFACE (value);
+  if (iface->get_range)
+    {
+      AtkRange *range = atk_value_get_range (value);
+      dub = atk_range_get_upper_limit (range);
+      atk_range_free (range);
+      return droute_return_v_double (iter, dub);
+    }
+
+  g_value_init (&src, G_TYPE_DOUBLE);
+  atk_value_get_maximum_value (value, &src);
+  g_value_init (&dest, G_TYPE_DOUBLE);
+
+  if (g_value_transform (&src, &dest))
+    {
+      dub = g_value_get_double (&dest);
+    }
+  return droute_return_v_double (iter, dub);
+}
+
+static dbus_bool_t
+impl_get_MinimumIncrement (DBusMessageIter *iter, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  GValue src = { 0 };
+  GValue dest = { 0 };
+  gdouble dub = 0;
+
+  g_return_val_if_fail (ATK_IS_VALUE (user_data), FALSE);
+
+  AtkValueIface *iface = ATK_VALUE_GET_IFACE (value);
+  if (iface->get_increment)
+    {
+      dub = atk_value_get_increment (value);
+      return droute_return_v_double (iter, dub);
+    }
+
+  g_value_init (&src, G_TYPE_DOUBLE);
+  atk_value_get_minimum_increment (value, &src);
+  g_value_init (&dest, G_TYPE_DOUBLE);
+
+  if (g_value_transform (&src, &dest))
+    {
+      dub = g_value_get_double (&dest);
+    }
+  return droute_return_v_double (iter, dub);
+}
+
+static dbus_bool_t
+impl_get_CurrentValue (DBusMessageIter *iter, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  GValue src = { 0 };
+  GValue dest = { 0 };
+  gdouble dub = 0;
+
+  g_return_val_if_fail (ATK_IS_VALUE (user_data), FALSE);
+
+  AtkValueIface *iface = ATK_VALUE_GET_IFACE (value);
+  if (iface->get_value_and_text)
+    {
+      gchar *text = NULL;
+      atk_value_get_value_and_text (value, &dub, &text);
+      return droute_return_v_double (iter, dub);
+    }
+
+  g_value_init (&src, G_TYPE_DOUBLE);
+  atk_value_get_current_value (value, &src);
+  g_value_init (&dest, G_TYPE_DOUBLE);
+
+  if (g_value_transform (&src, &dest))
+    {
+      dub = g_value_get_double (&dest);
+    }
+  return droute_return_v_double (iter, dub);
+}
+
+static dbus_bool_t
+impl_set_CurrentValue (DBusMessageIter *iter, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  GValue src = { 0 };
+  GValue dest = { 0 };
+  gdouble dub;
+  DBusMessageIter iter_variant;
+
+  g_return_val_if_fail (ATK_IS_VALUE (user_data), FALSE);
+
+  dbus_message_iter_recurse (iter, &iter_variant);
+  if (dbus_message_iter_get_arg_type (&iter_variant) != DBUS_TYPE_DOUBLE)
+    {
+      g_warning ("TODO: Support setting value from a non-double");
+      return FALSE;
+    }
+  dbus_message_iter_get_basic (&iter_variant, &dub);
+
+  AtkValueIface *iface = ATK_VALUE_GET_IFACE (value);
+  if (iface->set_value)
+    {
+      atk_value_set_value (value, dub);
+      return TRUE;
+    }
+
+  g_value_init (&src, G_TYPE_DOUBLE);
+  g_value_set_double (&src, dub);
+
+  atk_value_get_current_value (value, &dest);
+
+  if (g_value_transform (&src, &dest))
+    {
+      atk_value_set_current_value (value, &dest);
+      return TRUE;
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+/* keeping this method around for backwards-compatibility for now; see
+ *  * BGO#652596 */
+static DBusMessage *
+impl_SetCurrentValue (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  dbus_bool_t rv;
+  DBusMessage *reply;
+  gdouble dub = 0;
+  GValue new_value = { 0 };
+
+  g_return_val_if_fail (ATK_IS_VALUE (value),
+                        droute_not_yet_handled_error (message));
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_DOUBLE, &dub, DBUS_TYPE_INVALID))
+    {
+      return droute_invalid_arguments_error (message);
+    }
+
+  g_value_init (&new_value, G_TYPE_DOUBLE);
+  g_value_set_double (&new_value, dub);
+  rv = atk_value_set_current_value (value, &new_value);
+
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &rv,
+                                DBUS_TYPE_INVALID);
+    }
+  return reply;
+}
+
+static dbus_bool_t
+impl_get_Text (DBusMessageIter *iter, void *user_data)
+{
+  AtkValue *value = (AtkValue *) user_data;
+  gdouble dub;
+  gchar *text = NULL;
+  dbus_bool_t ret;
+
+  g_return_val_if_fail (ATK_IS_VALUE (user_data), FALSE);
+
+  AtkValueIface *iface = ATK_VALUE_GET_IFACE (value);
+  if (iface->get_value_and_text)
+    {
+      atk_value_get_value_and_text (value, &dub, &text);
+      ret = droute_return_v_string (iter, text);
+      g_free (text);
+      return ret;
+    }
+
+  return droute_return_v_string (iter, "");
+}
+
+static DRouteMethod methods[] = {
+  { impl_SetCurrentValue, "SetCurrentValue" },
+  { NULL, NULL }
+};
+
+static DRouteProperty properties[] = {
+  { impl_get_MinimumValue, NULL, "MinimumValue" },
+  { impl_get_MaximumValue, NULL, "MaximumValue" },
+  { impl_get_MinimumIncrement, NULL, "MinimumIncrement" },
+  { impl_get_CurrentValue, impl_set_CurrentValue, "CurrentValue" },
+  { impl_get_Text, NULL, "Text" },
+  { NULL, NULL, NULL }
+};
+
+void
+spi_initialize_value (DRoutePath *path)
+{
+  spi_atk_add_interface (path,
+                         ATSPI_DBUS_INTERFACE_VALUE, spi_org_a11y_atspi_Value, methods, properties);
+};
similarity index 68%
rename from atspi/atspi-mutter-private.h
rename to atk-adaptor/atk-bridge.h
index 49140d0..32c8897 100644 (file)
@@ -2,8 +2,9 @@
  * AT-SPI - Assistive Technology Service Provider Interface
  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
  *
- * Copyright 2019 SUSE LLC.
- *           
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.,
+ * Copyright 2001, 2002, 2003 Ximian, Inc.
+ * Copyright 2008, 2009, 2010 Codethink Ltd.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef _ATSPI_MUTTER_H_
-#define _ATSPI_MUTTER_H_
+#ifndef ATK_BRIDGE_H
+#define ATK_BRIDGE_H
 
-G_BEGIN_DECLS
+#include <glib.h>
 
-gboolean _atspi_mutter_generate_keyboard_event (glong keyval, const gchar *keystring, AtspiKeySynthType synth_type, GError **error);
+G_BEGIN_DECLS
 
-gboolean _atspi_mutter_generate_mouse_event (glong x, glong y, const gchar *name, GError **error);
+int atk_bridge_adaptor_init (int *argc, char **argv[]);
+void atk_bridge_adaptor_cleanup (void);
+void atk_bridge_set_event_context (GMainContext *cnx);
 
-void _atspi_mutter_set_reference_window (AtspiAccessible *accessible);
 G_END_DECLS
 
-#endif /* _ATSPI_MUTTER_H_ */
+#endif /* ATK_BRIDGE_H */
diff --git a/atk-adaptor/atkbridge.symbols b/atk-adaptor/atkbridge.symbols
new file mode 100644 (file)
index 0000000..cfaa509
--- /dev/null
@@ -0,0 +1,3 @@
+atk_bridge_adaptor_init
+atk_bridge_adaptor_cleanup
+atk_bridge_set_event_context
diff --git a/atk-adaptor/bitarray.h b/atk-adaptor/bitarray.h
new file mode 100644 (file)
index 0000000..ccce17b
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _BITARRAY_H
+#define _BITARRAY_H
+
+#include "dbus/dbus.h"
+#include "glib.h"
+
+#define BITARRAY_SEQ_TERM 0xffffffff
+
+#define BITARRAY_SET(p, n) ((p)[n >> 5] |= (1 << (n & 31)))
+#endif /* _BITARRAY_H */
diff --git a/atk-adaptor/bridge.c b/atk-adaptor/bridge.c
new file mode 100644 (file)
index 0000000..899cf32
--- /dev/null
@@ -0,0 +1,1357 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008, 2009 Codethink Ltd.
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.,
+ * Copyright 2001, 2002, 2003 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#define _GNU_SOURCE
+#include "config.h"
+
+#include <atk/atk.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <atk-bridge.h>
+#include <atspi/atspi.h>
+#include <droute/droute.h>
+
+#include "accessible-stateset.h"
+#include "adaptors.h"
+#include "bridge.h"
+#include "event.h"
+#include "object.h"
+
+#include "accessible-cache.h"
+#include "accessible-leasing.h"
+#include "accessible-register.h"
+
+#include "spi-dbus.h"
+
+/*---------------------------------------------------------------------------*/
+
+static DBusHandlerResult
+signal_filter (DBusConnection *bus, DBusMessage *message, void *user_data);
+
+SpiBridge *spi_global_app_data = NULL;
+
+static gboolean inited = FALSE;
+static gboolean atexit_added = FALSE;
+
+/*---------------------------------------------------------------------------*/
+
+static event_data *
+add_event (const char *bus_name, const char *event)
+{
+  event_data *evdata;
+  gchar **data;
+
+  spi_atk_add_client (bus_name);
+  evdata = g_new0 (event_data, 1);
+  data = g_strsplit (event, ":", 3);
+  if (!data)
+    {
+      g_free (evdata);
+      return NULL;
+    }
+  evdata->bus_name = g_strdup (bus_name);
+  evdata->data = data;
+  spi_global_app_data->events = g_list_append (spi_global_app_data->events, evdata);
+  return evdata;
+}
+
+static GSList *clients = NULL;
+
+static void
+tally_event_reply ()
+{
+  static int replies_received = 0;
+
+  if (!spi_global_app_data)
+    return;
+
+  replies_received++;
+  if (replies_received == 3)
+    {
+      if (!clients)
+        spi_atk_deregister_event_listeners ();
+      spi_global_app_data->events_initialized = TRUE;
+    }
+}
+
+GType
+_atk_bridge_type_from_iface (const char *iface)
+{
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_ACCESSIBLE))
+    return ATK_TYPE_OBJECT;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_ACTION))
+    return ATK_TYPE_ACTION;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_COMPONENT))
+    return ATK_TYPE_COMPONENT;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_DOCUMENT))
+    return ATK_TYPE_DOCUMENT;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_HYPERTEXT))
+    return ATK_TYPE_HYPERTEXT;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_HYPERLINK))
+    return ATK_TYPE_HYPERLINK;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_IMAGE))
+    return ATK_TYPE_IMAGE;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_SELECTION))
+    return ATK_TYPE_SELECTION;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_TABLE))
+    return ATK_TYPE_TABLE;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_TEXT))
+    return ATK_TYPE_TEXT;
+  if (!strcmp (iface, ATSPI_DBUS_INTERFACE_VALUE))
+    return ATK_TYPE_VALUE;
+  return 0;
+}
+
+DRoutePropertyFunction
+_atk_bridge_find_property_func (const char *property, GType *type)
+{
+  const char *iface;
+  const char *member;
+  DRouteProperty *dp;
+
+  if (!strncasecmp (property, "action.", 7))
+    {
+      iface = ATSPI_DBUS_INTERFACE_ACTION;
+      member = property + 7;
+    }
+  else if (!strncasecmp (property, "component.", 10))
+    {
+      iface = ATSPI_DBUS_INTERFACE_COMPONENT;
+      member = property + 10;
+    }
+  else if (!strncasecmp (property, "selection.", 10))
+    {
+      iface = ATSPI_DBUS_INTERFACE_SELECTION;
+      member = property + 10;
+    }
+  else if (!strncasecmp (property, "table.", 6))
+    {
+      iface = ATSPI_DBUS_INTERFACE_TABLE;
+      member = property + 6;
+    }
+  else if (!strncasecmp (property, "text.", 5))
+    {
+      iface = ATSPI_DBUS_INTERFACE_TEXT;
+      member = property + 5;
+    }
+  else if (!strncasecmp (property, "value.", 6))
+    {
+      iface = ATSPI_DBUS_INTERFACE_VALUE;
+      member = property + 6;
+    }
+  else
+    {
+      iface = ATSPI_DBUS_INTERFACE_ACCESSIBLE;
+      member = property;
+    }
+
+  *type = _atk_bridge_type_from_iface (iface);
+
+  dp = g_hash_table_lookup (spi_global_app_data->property_hash, iface);
+
+  if (!dp)
+    return NULL;
+
+  for (; dp->name; dp++)
+    {
+      if (!strcasecmp (dp->name, member))
+        {
+          return dp->get;
+        }
+    }
+  return NULL;
+}
+
+static void
+add_property_to_event (event_data *evdata, const char *property)
+{
+  AtspiPropertyDefinition *prop = g_new0 (AtspiPropertyDefinition, 1);
+  prop->func = _atk_bridge_find_property_func (property, &prop->type);
+  if (!prop->func)
+    {
+      g_warning ("atk-bridge: Request for unknown property '%s'", property);
+      g_free (prop);
+      return;
+    }
+
+  prop->name = g_strdup (property);
+  evdata->properties = g_slist_append (evdata->properties, prop);
+}
+
+static void
+add_event_from_iter (DBusMessageIter *iter)
+{
+  const char *bus_name, *event;
+  event_data *evdata;
+
+  dbus_message_iter_get_basic (iter, &bus_name);
+  dbus_message_iter_next (iter);
+  dbus_message_iter_get_basic (iter, &event);
+  dbus_message_iter_next (iter);
+  evdata = add_event (bus_name, event);
+  if (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY)
+    {
+      DBusMessageIter iter_sub_array;
+      dbus_message_iter_recurse (iter, &iter_sub_array);
+      while (dbus_message_iter_get_arg_type (&iter_sub_array) != DBUS_TYPE_INVALID)
+        {
+          const char *property;
+          dbus_message_iter_get_basic (&iter_sub_array, &property);
+          add_property_to_event (evdata, property);
+          dbus_message_iter_next (&iter_sub_array);
+        }
+    }
+}
+
+static void
+get_events_reply (DBusPendingCall *pending, void *user_data)
+{
+  DBusMessage *reply = dbus_pending_call_steal_reply (pending);
+  DBusMessageIter iter, iter_array, iter_struct;
+
+  if (!reply || !spi_global_app_data)
+    goto done;
+
+  if (strcmp (dbus_message_get_signature (reply), "a(ss)") != 0 &&
+      strcmp (dbus_message_get_signature (reply), "a(ssas)") != 0)
+    {
+      g_warning ("atk-bridge: GetRegisteredEvents returned message with unknown signature");
+      goto done;
+    }
+
+  dbus_message_iter_init (reply, &iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      dbus_message_iter_recurse (&iter_array, &iter_struct);
+      add_event_from_iter (&iter_struct);
+      dbus_message_iter_next (&iter_array);
+    }
+
+done:
+  if (reply)
+    dbus_message_unref (reply);
+  if (pending)
+    dbus_pending_call_unref (pending);
+
+  tally_event_reply ();
+}
+
+static void
+get_device_events_reply (DBusPendingCall *pending, void *user_data)
+{
+  DBusMessage *reply = dbus_pending_call_steal_reply (pending);
+  DBusMessageIter iter, iter_array, iter_struct;
+
+  if (!reply)
+    goto done;
+
+  if (strncmp (dbus_message_get_signature (reply), "a(s", 3) != 0)
+    {
+      g_warning ("atk-bridge: get_device_events_reply: unknown signature");
+      goto done;
+    }
+
+  dbus_message_iter_init (reply, &iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      char *bus_name;
+      dbus_message_iter_recurse (&iter_array, &iter_struct);
+      dbus_message_iter_get_basic (&iter_struct, &bus_name);
+      spi_atk_add_client (bus_name);
+      dbus_message_iter_next (&iter_array);
+    }
+
+done:
+  if (reply)
+    dbus_message_unref (reply);
+  if (pending)
+    dbus_pending_call_unref (pending);
+
+  tally_event_reply ();
+}
+
+static void
+get_registered_event_listeners (SpiBridge *app)
+{
+  DBusMessage *message;
+  DBusPendingCall *pending = NULL;
+
+  message = dbus_message_new_method_call (SPI_DBUS_NAME_REGISTRY,
+                                          ATSPI_DBUS_PATH_REGISTRY,
+                                          ATSPI_DBUS_INTERFACE_REGISTRY,
+                                          "GetRegisteredEvents");
+  if (!message)
+    return;
+
+  dbus_connection_send_with_reply (app->bus, message, &pending, -1);
+  dbus_message_unref (message);
+  if (!pending)
+    {
+      spi_global_app_data->events_initialized = TRUE;
+      return;
+    }
+  dbus_pending_call_set_notify (pending, get_events_reply, NULL, NULL);
+
+  message = dbus_message_new_method_call (SPI_DBUS_NAME_REGISTRY,
+                                          ATSPI_DBUS_PATH_DEC,
+                                          ATSPI_DBUS_INTERFACE_DEC,
+                                          "GetKeystrokeListeners");
+  if (!message)
+    return;
+  pending = NULL;
+  dbus_connection_send_with_reply (app->bus, message, &pending, -1);
+  dbus_message_unref (message);
+  if (!pending)
+    {
+      spi_global_app_data->events_initialized = TRUE;
+      return;
+    }
+  dbus_pending_call_set_notify (pending, get_device_events_reply, NULL, NULL);
+}
+
+static void
+register_reply (DBusPendingCall *pending, void *user_data)
+{
+  DBusMessage *reply;
+  SpiBridge *app = user_data;
+
+  reply = dbus_pending_call_steal_reply (pending);
+  dbus_pending_call_unref (pending);
+
+  if (!spi_global_app_data)
+    {
+      if (reply)
+        dbus_message_unref (reply);
+      return;
+    }
+
+  if (reply)
+    {
+      gchar *app_name, *obj_path;
+
+      if (strcmp (dbus_message_get_signature (reply), "(so)") != 0)
+        {
+          g_warning ("AT-SPI: Could not obtain desktop path or name\n");
+        }
+      else
+        {
+          DBusMessageIter iter, iter_struct;
+          dbus_message_iter_init (reply, &iter);
+          dbus_message_iter_recurse (&iter, &iter_struct);
+          dbus_message_iter_get_basic (&iter_struct, &app_name);
+          dbus_message_iter_next (&iter_struct);
+          dbus_message_iter_get_basic (&iter_struct, &obj_path);
+
+          g_free (app->desktop_name);
+          app->desktop_name = g_strdup (app_name);
+          g_free (app->desktop_path);
+          app->desktop_path = g_strdup (obj_path);
+        }
+    }
+  else
+    {
+      g_warning ("AT-SPI: Could not embed inside desktop");
+      return;
+    }
+  dbus_message_unref (reply);
+
+  if (!spi_global_app_data->events_initialized)
+    get_registered_event_listeners (spi_global_app_data);
+}
+
+static gboolean
+register_application (gpointer data)
+{
+  SpiBridge *app = data;
+  DBusMessage *message;
+  DBusMessageIter iter;
+  DBusPendingCall *pending;
+
+  spi_global_app_data->registration_pending = 0;
+
+  message = dbus_message_new_method_call (SPI_DBUS_NAME_REGISTRY,
+                                          ATSPI_DBUS_PATH_ROOT,
+                                          ATSPI_DBUS_INTERFACE_SOCKET,
+                                          "Embed");
+
+  dbus_message_iter_init_append (message, &iter);
+  spi_object_append_reference (&iter, app->root);
+
+  if (!dbus_connection_send_with_reply (app->bus, message, &pending, -1) || !pending)
+    {
+      if (pending)
+        dbus_pending_call_unref (pending);
+
+      dbus_message_unref (message);
+      return FALSE;
+    }
+
+  dbus_pending_call_set_notify (pending, register_reply, app, NULL);
+
+  if (message)
+    dbus_message_unref (message);
+
+  return FALSE;
+}
+
+void
+_atk_bridge_schedule_application_registration (SpiBridge *app)
+{
+  /* We need the callback to be called first thing, before any other of ours
+   * (and possibly of client apps), so use a high priority and a short timeout
+   * to try and be called first by the main loop. */
+  if (!app->registration_pending)
+    app->registration_pending = spi_timeout_add_full (G_PRIORITY_HIGH, 0,
+                                                      register_application,
+                                                      app, NULL);
+}
+
+gboolean
+_atk_bridge_remove_pending_application_registration (SpiBridge *app)
+{
+  if (app->registration_pending)
+    {
+      g_source_remove (app->registration_pending);
+      app->registration_pending = 0;
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static void
+remove_socket ()
+{
+  if (!spi_global_app_data)
+    return;
+
+  if (spi_global_app_data->app_bus_addr &&
+      !strncmp (spi_global_app_data->app_bus_addr, "unix:path=", 10))
+    {
+      unlink (spi_global_app_data->app_bus_addr + 10);
+      g_free (spi_global_app_data->app_bus_addr);
+      spi_global_app_data->app_bus_addr = NULL;
+    }
+
+  if (spi_global_app_data->app_tmp_dir)
+    {
+      rmdir (spi_global_app_data->app_tmp_dir);
+      g_free (spi_global_app_data->app_tmp_dir);
+      spi_global_app_data->app_tmp_dir = NULL;
+    }
+}
+
+static void
+deregister_application (SpiBridge *app)
+{
+  DBusMessage *message;
+  DBusMessageIter iter;
+  const char *uname;
+
+  if (_atk_bridge_remove_pending_application_registration (spi_global_app_data))
+    return;
+
+  message = dbus_message_new_method_call (SPI_DBUS_NAME_REGISTRY,
+                                          ATSPI_DBUS_PATH_REGISTRY,
+                                          ATSPI_DBUS_INTERFACE_REGISTRY,
+                                          "DeregisterApplication");
+  dbus_message_set_no_reply (message, TRUE);
+
+  uname = dbus_bus_get_unique_name (app->bus);
+
+  dbus_message_iter_init_append (message, &iter);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &uname);
+  dbus_connection_send (app->bus, message, NULL);
+  if (message)
+    dbus_message_unref (message);
+
+  remove_socket ();
+
+  g_free (app->desktop_name);
+  app->desktop_name = NULL;
+  g_free (app->desktop_path);
+  app->desktop_path = NULL;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+
+static AtkPlugClass *plug_class;
+static AtkSocketClass *socket_class;
+
+static gchar *
+get_plug_id (AtkPlug *plug)
+{
+  const char *uname = dbus_bus_get_unique_name (spi_global_app_data->bus);
+  gchar *path;
+  GString *str = g_string_new (NULL);
+
+  path = spi_register_object_to_path (spi_global_register, G_OBJECT (plug));
+  g_string_printf (str, "%s:%s", uname, path);
+  g_free (path);
+  return g_string_free (str, FALSE);
+}
+
+AtkStateSet *
+socket_ref_state_set (AtkObject *accessible)
+{
+  char *child_name, *child_path;
+  AtkSocket *socket = ATK_SOCKET (accessible);
+  int count = 0;
+  int j;
+  int v;
+  DBusMessage *message, *reply;
+  DBusMessageIter iter, iter_array;
+  AtkStateSet *set;
+
+  set = atk_state_set_new ();
+
+  if (!socket->embedded_plug_id)
+    return set;
+
+  child_name = g_strdup (socket->embedded_plug_id);
+  if (!child_name)
+    return set;
+  child_path = g_utf8_strchr (child_name + 1, -1, ':');
+  if (!child_path)
+    {
+      g_free (child_name);
+      return set;
+    }
+  *(child_path++) = '\0';
+  message = dbus_message_new_method_call (child_name, child_path, ATSPI_DBUS_INTERFACE_ACCESSIBLE, "GetState");
+  g_free (child_name);
+  reply = dbus_connection_send_with_reply_and_block (spi_global_app_data->bus, message, 1, NULL);
+  dbus_message_unref (message);
+  if (reply == NULL)
+    return set;
+  if (strcmp (dbus_message_get_signature (reply), "au") != 0)
+    {
+      dbus_message_unref (reply);
+      return set;
+    }
+
+  dbus_message_iter_init (reply, &iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+  do
+    {
+      dbus_message_iter_get_basic (&iter_array, &v);
+      for (j = 0; j < 32; j++)
+        {
+          if (v & (1 << j))
+            {
+              AtkState state = spi_atk_state_from_spi_state ((count << 5) + j);
+              atk_state_set_add_state (set, state);
+            }
+        }
+      count++;
+    }
+  while (dbus_message_iter_next (&iter_array));
+  dbus_message_unref (reply);
+  return set;
+}
+
+static void
+socket_embed_hook (AtkSocket *socket, const gchar *plug_id)
+{
+  g_return_if_fail (spi_global_register != NULL);
+
+  AtkObject *accessible = ATK_OBJECT (socket);
+  gchar *plug_name, *plug_path;
+  AtkObjectClass *klass;
+
+  /* Force registration */
+  gchar *path = spi_register_object_to_path (spi_global_register, G_OBJECT (accessible));
+  /* Let the plug know that it has been embedded */
+  plug_name = g_strdup (plug_id);
+  if (!plug_name)
+    {
+      g_free (path);
+      return;
+    }
+  plug_path = g_utf8_strchr (plug_name + 1, -1, ':');
+  if (plug_path)
+    {
+      DBusMessage *message;
+      *(plug_path++) = '\0';
+      message = dbus_message_new_method_call (plug_name, plug_path, ATSPI_DBUS_INTERFACE_SOCKET, "Embedded");
+      dbus_message_append_args (message, DBUS_TYPE_STRING, &path, DBUS_TYPE_INVALID);
+      dbus_connection_send (spi_global_app_data->bus, message, NULL);
+    }
+  g_free (plug_name);
+  g_free (path);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  klass->ref_state_set = socket_ref_state_set;
+}
+
+static void
+install_plug_hooks ()
+{
+  gpointer data;
+
+  data = g_type_class_ref (ATK_TYPE_PLUG);
+  plug_class = ATK_PLUG_CLASS (data);
+  data = g_type_class_ref (ATK_TYPE_SOCKET);
+  socket_class = ATK_SOCKET_CLASS (data);
+  plug_class->get_object_id = get_plug_id;
+  socket_class->embed = socket_embed_hook;
+}
+
+#ifndef DISABLE_P2P
+static guint
+get_ancestral_uid (guint pid)
+{
+  FILE *fp;
+  char buf[80];
+  int ppid = 0;
+  int uid = 0;
+  gboolean got_ppid = 0;
+  gboolean got_uid = 0;
+
+  sprintf (buf, "/proc/%d/status", pid);
+  fp = fopen (buf, "r");
+  if (!fp)
+    return 0;
+  while ((!got_ppid || !got_uid) && fgets (buf, sizeof (buf), fp))
+    {
+      if (sscanf (buf, "PPid:\t%d", &ppid) == 1)
+        got_ppid = TRUE;
+      else if (sscanf (buf, "Uid:\t%d", &uid) == 1)
+        got_uid = TRUE;
+    }
+  fclose (fp);
+
+  if (!got_ppid || !got_uid)
+    return 0;
+  if (uid != 0)
+    return uid;
+  if (ppid == 0 || ppid == 1)
+    return 0;
+  return get_ancestral_uid (ppid);
+}
+
+static dbus_bool_t
+user_check (DBusConnection *bus, unsigned long uid, void *data)
+{
+  if (uid == getuid () || uid == geteuid ())
+    return TRUE;
+  if (getuid () == 0)
+    {
+      guint ancestor = get_ancestral_uid (getpid ());
+      return (ancestor == uid || ancestor == 1 || ancestor == 0);
+    }
+  return FALSE;
+}
+
+static void
+new_connection_cb (DBusServer *server, DBusConnection *con, void *data)
+{
+  dbus_connection_set_unix_user_function (con, user_check, NULL, NULL);
+  dbus_connection_ref (con);
+  atspi_dbus_connection_setup_with_g_main (con, spi_context);
+  droute_intercept_dbus (con);
+  droute_context_register (spi_global_app_data->droute, con);
+
+  spi_global_app_data->direct_connections = g_list_append (spi_global_app_data->direct_connections, con);
+}
+#endif
+
+static gchar *atspi_dbus_name = NULL;
+static gboolean atspi_no_register = FALSE;
+
+static GOptionEntry atspi_option_entries[] = {
+  { "atspi-dbus-name", 0, 0, G_OPTION_ARG_STRING, &atspi_dbus_name,
+    "D-Bus bus name to register as", NULL },
+  { "atspi-no-register", 0, 0, G_OPTION_ARG_NONE, &atspi_no_register,
+    "Do not register with Registry Daemon", NULL },
+  { NULL }
+};
+
+static void
+add_objects_for_introspection (AtkObject *obj, GString *str)
+{
+  gchar *path;
+  AtkStateSet *set;
+  char *p;
+  gint i;
+  gint count;
+
+  if (!obj)
+    return;
+
+  path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
+  p = strrchr (path, '/') + 1;
+  g_string_append_printf (str, "<node name=\"%s\"/>\n", p);
+  g_free (path);
+
+  if (ATK_IS_SOCKET (obj))
+    return;
+
+  set = atk_object_ref_state_set (obj);
+  if (atk_state_set_contains_state (set, ATK_STATE_MANAGES_DESCENDANTS))
+    {
+      g_object_unref (set);
+      return;
+    }
+  g_object_unref (set);
+
+  count = atk_object_get_n_accessible_children (obj);
+  for (i = 0; i < count; i++)
+    {
+      AtkObject *child = atk_object_ref_accessible_child (obj, i);
+      add_objects_for_introspection (child, str);
+      g_object_unref (child);
+    }
+}
+
+static gchar *
+introspect_children_cb (const char *path, void *data)
+{
+  if (!strcmp (path, "/org/a11y/atspi/accessible"))
+    {
+      GString *str = g_string_new (NULL);
+      add_objects_for_introspection (spi_global_app_data->root, str);
+      return g_string_free (str, FALSE);
+    }
+
+  return NULL;
+}
+
+static void
+handle_event_listener_registered (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessageIter iter;
+  const char *signature = dbus_message_get_signature (message);
+
+  if (strcmp (signature, "ssas") != 0 &&
+      strcmp (signature, "ss") != 0)
+    {
+      g_warning ("got RegisterEvent with invalid signature '%s'", signature);
+      return;
+    }
+
+  dbus_message_iter_init (message, &iter);
+  add_event_from_iter (&iter);
+}
+
+static void
+free_property_definition (void *data)
+{
+  AtspiPropertyDefinition *pd = data;
+
+  g_free (pd->name);
+  g_free (pd);
+}
+
+static void
+remove_events (const char *bus_name, const char *event)
+{
+  gchar **remove_data;
+  GList *list;
+
+  remove_data = g_strsplit (event, ":", 3);
+  if (!remove_data)
+    {
+      return;
+    }
+
+  for (list = spi_global_app_data->events; list;)
+    {
+      event_data *evdata = list->data;
+      if (!g_strcmp0 (evdata->bus_name, bus_name) &&
+          spi_event_is_subtype (evdata->data, remove_data))
+        {
+          GList *next;
+          GList *events = spi_global_app_data->events;
+
+          g_strfreev (evdata->data);
+          g_free (evdata->bus_name);
+          g_slist_free_full (evdata->properties, free_property_definition);
+          g_free (evdata);
+
+          next = list->next;
+          spi_global_app_data->events = g_list_delete_link (events, list);
+          list = next;
+        }
+      else
+        {
+          list = list->next;
+        }
+    }
+
+  g_strfreev (remove_data);
+}
+
+static void
+handle_event_listener_deregistered (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  gchar *name;
+  char *sender;
+
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &sender,
+                              DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
+    return;
+
+  remove_events (sender, name);
+}
+
+static void
+handle_device_listener_registered (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  char *sender;
+  DBusMessageIter iter, iter_struct;
+
+  if (strncmp (dbus_message_get_signature (message), "(s", 2) != 0)
+    {
+      g_warning ("atk-bridge: handle_device_listener_register: unknown signature");
+      return;
+    }
+
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_recurse (&iter, &iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &sender);
+  spi_atk_add_client (sender);
+}
+
+static DBusHandlerResult
+signal_filter (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  const char *interface = dbus_message_get_interface (message);
+  const char *member = dbus_message_get_member (message);
+  DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+  static gboolean registry_lost = FALSE;
+
+  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL)
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_REGISTRY))
+    {
+      result = DBUS_HANDLER_RESULT_HANDLED;
+      if (!strcmp (member, "EventListenerRegistered"))
+        handle_event_listener_registered (bus, message, user_data);
+      else if (!strcmp (member, "EventListenerDeregistered"))
+        handle_event_listener_deregistered (bus, message, user_data);
+      else
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+  else if (!strcmp (interface, ATSPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER))
+    {
+      result = DBUS_HANDLER_RESULT_HANDLED;
+      if (!strcmp (member, "KeystrokeListenerRegistered"))
+        handle_device_listener_registered (bus, message, user_data);
+      else
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+
+  if (!g_strcmp0 (interface, DBUS_INTERFACE_DBUS) &&
+      !g_strcmp0 (member, "NameOwnerChanged"))
+    {
+      char *name, *old, *new;
+      if (dbus_message_get_args (message, NULL,
+                                 DBUS_TYPE_STRING, &name,
+                                 DBUS_TYPE_STRING, &old,
+                                 DBUS_TYPE_STRING, &new,
+                                 DBUS_TYPE_INVALID))
+        {
+          if (!strcmp (name, "org.a11y.atspi.Registry"))
+            {
+              if (registry_lost && !old[0])
+                {
+                  register_application (spi_global_app_data);
+                  registry_lost = FALSE;
+                }
+              else if (!new[0])
+                registry_lost = TRUE;
+            }
+          else if (*old != '\0' && *new == '\0')
+            spi_atk_remove_client (old);
+        }
+    }
+
+  return result;
+}
+
+int
+spi_atk_create_socket (SpiBridge *app)
+{
+#ifndef DISABLE_P2P
+  DBusServer *server;
+  DBusError error;
+  const gchar *user_runtime_dir = g_get_user_runtime_dir ();
+  char *socket_path;
+  char *escaped_socket_path;
+
+  if (g_mkdir_with_parents (user_runtime_dir, 0700) != 0)
+    return -1;
+
+  if (getuid () != 0)
+    {
+      app->app_tmp_dir = g_build_filename (user_runtime_dir,
+                                           "at-spi2-XXXXXX", NULL);
+      if (!g_mkdtemp (app->app_tmp_dir))
+        {
+          g_free (app->app_tmp_dir);
+          app->app_tmp_dir = NULL;
+          return -1;
+        }
+    }
+
+  if (app->app_tmp_dir)
+    {
+      socket_path = g_strdup_printf ("%s/socket", app->app_tmp_dir);
+    }
+  else
+    {
+      socket_path = g_strdup_printf ("%s/at-spi2-socket-%d",
+                                     user_runtime_dir, getpid ());
+    }
+
+  escaped_socket_path = dbus_address_escape_value (socket_path);
+  g_free (socket_path);
+
+  app->app_bus_addr = g_strconcat ("unix:path=", escaped_socket_path, NULL);
+  dbus_free (escaped_socket_path);
+
+  dbus_error_init (&error);
+  server = dbus_server_listen (app->app_bus_addr, &error);
+  if (server == NULL)
+    {
+      g_warning ("atk-bridge: Couldn't listen on dbus server: %s", error.message);
+      dbus_error_free (&error);
+      app->app_bus_addr[0] = '\0';
+      return -1;
+    }
+
+  atspi_dbus_server_setup_with_g_main (server, spi_context);
+  dbus_server_set_new_connection_function (server, new_connection_cb, NULL, NULL);
+
+  app->server = server;
+#endif
+
+  return 0;
+}
+
+/*
+ * Checks the status of the environment variables
+ *
+ * At this moment it only checks NO_AT_BRIDGE
+ *
+ * Returns TRUE if there isn't anything on the environment preventing
+ * you to load the bridge, FALSE otherwise
+ */
+static gboolean
+check_envvar (void)
+{
+  const gchar *envvar;
+
+  envvar = g_getenv ("NO_AT_BRIDGE");
+
+  if (envvar && atoi (envvar) == 1)
+    return FALSE;
+  else
+    return TRUE;
+}
+
+void
+spi_atk_activate ()
+{
+  DRoutePath *treepath;
+
+  spi_atk_register_event_listeners ();
+  if (!spi_global_cache)
+    {
+      spi_global_cache = g_object_new (SPI_CACHE_TYPE, NULL);
+      treepath = droute_add_one (spi_global_app_data->droute,
+                                 "/org/a11y/atspi/cache", spi_global_cache);
+
+      if (!treepath)
+        {
+          g_warning ("atk-bridge: Error in droute_add_one().  Already running?");
+          return;
+        }
+      spi_initialize_cache (treepath);
+      if (spi_global_app_data->bus)
+        droute_path_register (treepath, spi_global_app_data->bus);
+    }
+}
+
+static gboolean
+spi_object_has_dbus_interface (void *obj, const char *interface)
+{
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_ACCESSIBLE))
+    return TRUE;
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_ACTION))
+    return ATK_IS_ACTION (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_COLLECTION))
+    return TRUE;
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_COMPONENT))
+    return ATK_IS_COMPONENT (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_DOCUMENT))
+    return ATK_IS_DOCUMENT (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_EDITABLE_TEXT))
+    return ATK_IS_EDITABLE_TEXT (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_HYPERLINK))
+    return ATK_IS_HYPERLINK (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_HYPERTEXT))
+    return ATK_IS_HYPERTEXT (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_IMAGE))
+    return ATK_IS_IMAGE (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_SELECTION))
+    return ATK_IS_SELECTION (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_SOCKET))
+    return TRUE;
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_TABLE))
+    return ATK_IS_TABLE (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_TABLE_CELL))
+    return ATK_IS_TABLE_CELL (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_TEXT))
+    return ATK_IS_TEXT (obj);
+  if (!strcmp (interface, ATSPI_DBUS_INTERFACE_VALUE))
+    return ATK_IS_VALUE (obj);
+
+  return FALSE;
+
+  return TRUE;
+}
+
+/**
+ * atk_bridge_adaptor_init: initializes the atk bridge adaptor
+ *
+ * The following needs to be initialized.
+ *
+ * - DRoute for routing message to their accessible objects.
+ * - Event handlers for emmitting signals on specific ATK events.
+ * - setup the bus for p2p communication
+ * - Application registration with the AT-SPI registry.
+ *
+ * Returns: 0 if the bridge gets or was already initialized
+ * succesfully, -1 otherwise
+ */
+int
+atk_bridge_adaptor_init (gint *argc, gchar **argv[])
+{
+  GOptionContext *opt;
+  GError *err = NULL;
+  DBusError error;
+  AtkObject *root;
+  gboolean load_bridge;
+  DRoutePath *accpath;
+
+  load_bridge = check_envvar ();
+  if (inited && !load_bridge)
+    g_warning ("ATK Bridge is disabled but a11y has already been enabled.");
+
+  if (inited)
+    return 0;
+  if (!load_bridge)
+    return -1;
+
+  inited = TRUE;
+
+  root = atk_get_root ();
+  g_warn_if_fail (root);
+  if (!root)
+    {
+      inited = FALSE;
+      return -1;
+    }
+
+  /* Parse command line options */
+  opt = g_option_context_new (NULL);
+  g_option_context_add_main_entries (opt, atspi_option_entries, NULL);
+  g_option_context_set_ignore_unknown_options (opt, TRUE);
+  if (!g_option_context_parse (opt, argc, argv, &err))
+    {
+      g_warning ("AT-SPI Option parsing failed: %s\n", err->message);
+      g_error_free (err);
+    }
+  g_option_context_free (opt);
+
+  /* Allocate global data and do ATK initializations */
+  spi_global_app_data = g_new0 (SpiBridge, 1);
+  spi_global_app_data->root = g_object_ref (root);
+  spi_global_app_data->desktop_name = g_strdup (ATSPI_DBUS_NAME_REGISTRY);
+  spi_global_app_data->desktop_path = g_strdup (ATSPI_DBUS_PATH_ROOT);
+
+  /* Set up D-Bus connection and register bus name */
+  dbus_error_init (&error);
+  spi_global_app_data->bus = atspi_get_a11y_bus ();
+  if (!spi_global_app_data->bus)
+    {
+      g_free (spi_global_app_data);
+      spi_global_app_data = NULL;
+      inited = FALSE;
+      return -1;
+    }
+
+  if (atspi_dbus_name != NULL)
+    {
+      if (dbus_bus_request_name (spi_global_app_data->bus, atspi_dbus_name, 0, &error))
+        {
+          g_print ("AT-SPI Received D-Bus name - %s\n", atspi_dbus_name);
+        }
+      else
+        {
+          g_print ("AT-SPI D-Bus name requested but could not be allocated - %s\n",
+                   atspi_dbus_name);
+        }
+    }
+
+  spi_global_app_data->main_context = g_main_context_new ();
+
+  atspi_dbus_connection_setup_with_g_main (spi_global_app_data->bus, NULL);
+
+  /* Hook our plug-and socket functions */
+  install_plug_hooks ();
+
+  /*
+   * Create the leasing, register and cache objects.
+   * The order is important here, the cache depends on the
+   * register object.
+   */
+  spi_global_register = g_object_new (SPI_REGISTER_TYPE, NULL);
+  spi_global_leasing = g_object_new (SPI_LEASING_TYPE, NULL);
+
+  /* Register droute for routing AT-SPI messages */
+  spi_global_app_data->droute =
+      droute_new ();
+
+  accpath = droute_add_many (spi_global_app_data->droute,
+                             "/org/a11y/atspi/accessible",
+                             NULL,
+                             introspect_children_cb,
+                             NULL,
+                             (DRouteGetDatumFunction)
+                                 spi_global_register_path_to_object,
+                             spi_object_has_dbus_interface);
+
+  /* Register all interfaces with droute and set up application accessible db */
+  spi_initialize_accessible (accpath);
+  spi_initialize_application (accpath);
+  spi_initialize_action (accpath);
+  spi_initialize_collection (accpath);
+  spi_initialize_component (accpath);
+  spi_initialize_document (accpath);
+  spi_initialize_editabletext (accpath);
+  spi_initialize_hyperlink (accpath);
+  spi_initialize_hypertext (accpath);
+  spi_initialize_image (accpath);
+  spi_initialize_selection (accpath);
+  spi_initialize_socket (accpath);
+  spi_initialize_table (accpath);
+  spi_initialize_table_cell (accpath);
+  spi_initialize_text (accpath);
+  spi_initialize_value (accpath);
+
+  droute_context_register (spi_global_app_data->droute,
+                           spi_global_app_data->bus);
+
+  /* Register methods to send D-Bus signals on certain ATK events */
+  if (clients)
+    spi_atk_activate ();
+
+  /* Set up filter and match rules to catch signals */
+  dbus_bus_add_match (spi_global_app_data->bus, "type='signal', interface='org.a11y.atspi.Registry', sender='org.a11y.atspi.Registry'", NULL);
+  dbus_bus_add_match (spi_global_app_data->bus, "type='signal', interface='org.a11y.atspi.DeviceEventListener', sender='org.a11y.atspi.Registry'", NULL);
+  dbus_bus_add_match (spi_global_app_data->bus, "type='signal', arg0='org.a11y.atspi.Registry', interface='org.freedesktop.DBus', member='NameOwnerChanged'", NULL);
+  dbus_connection_add_filter (spi_global_app_data->bus, signal_filter, NULL,
+                              NULL);
+
+  /* Register this app by sending a signal out to AT-SPI registry daemon */
+  if (!atspi_no_register && (!root || !ATK_IS_PLUG (root)))
+    _atk_bridge_schedule_application_registration (spi_global_app_data);
+  else
+    get_registered_event_listeners (spi_global_app_data);
+
+  if (!atexit_added)
+    atexit (remove_socket);
+  atexit_added = TRUE;
+
+  dbus_error_free (&error);
+  return 0;
+}
+
+void
+atk_bridge_adaptor_cleanup (void)
+{
+  GList *l;
+  GSList *ls;
+
+  if (!inited)
+    return;
+
+  if (!spi_global_app_data)
+    return;
+
+  spi_atk_tidy_windows ();
+  spi_atk_deregister_event_listeners ();
+
+  deregister_application (spi_global_app_data);
+
+  if (spi_global_app_data->bus)
+    {
+      dbus_connection_remove_filter (spi_global_app_data->bus, signal_filter, NULL);
+      droute_context_unregister (spi_global_app_data->droute, spi_global_app_data->bus);
+
+      if (atspi_dbus_name != NULL)
+        {
+          DBusError error;
+          int result;
+
+          dbus_error_init (&error);
+          result = dbus_bus_release_name (spi_global_app_data->bus, atspi_dbus_name, &error);
+          if (result == -1)
+            {
+              g_warning ("atk-bridge: could not release dbus name: %s", error.message);
+            }
+          else
+            {
+              g_print ("bridge: released name, result %d\n", result);
+            }
+
+          dbus_error_free (&error);
+        }
+
+      dbus_connection_close (spi_global_app_data->bus);
+      dbus_connection_unref (spi_global_app_data->bus);
+      spi_global_app_data->bus = NULL;
+    }
+
+  for (l = spi_global_app_data->direct_connections; l; l = l->next)
+    {
+      DBusConnection *connection;
+
+      connection = l->data;
+
+      droute_context_unregister (spi_global_app_data->droute, connection);
+      droute_unintercept_dbus (connection);
+      dbus_connection_close (connection);
+      dbus_connection_unref (connection);
+    }
+  g_list_free (spi_global_app_data->direct_connections);
+  spi_global_app_data->direct_connections = NULL;
+
+  for (ls = clients; ls; ls = ls->next)
+    g_free (ls->data);
+  g_slist_free (clients);
+  clients = NULL;
+
+  g_clear_object (&spi_global_cache);
+  g_clear_object (&spi_global_leasing);
+  g_clear_object (&spi_global_register);
+
+  if (spi_global_app_data->main_context)
+    g_main_context_unref (spi_global_app_data->main_context);
+
+  droute_free (spi_global_app_data->droute);
+
+  g_free (spi_global_app_data);
+  spi_global_app_data = NULL;
+
+  inited = FALSE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static gchar *name_match_tmpl =
+    "type='signal', interface='org.freedesktop.DBus', member='NameOwnerChanged', arg0='%s'";
+
+void
+spi_atk_add_client (const char *bus_name)
+{
+  GSList *l;
+  gchar *match;
+
+  for (l = clients; l; l = l->next)
+    {
+      if (!g_strcmp0 (l->data, bus_name))
+        return;
+    }
+  if (!clients)
+    spi_atk_activate ();
+  clients = g_slist_append (clients, g_strdup (bus_name));
+  match = g_strdup_printf (name_match_tmpl, bus_name);
+  dbus_bus_add_match (spi_global_app_data->bus, match, NULL);
+  g_free (match);
+}
+
+void
+spi_atk_remove_client (const char *bus_name)
+{
+  GSList *l;
+  GSList *next_node;
+
+  l = clients;
+  while (l)
+    {
+      next_node = l->next;
+
+      if (!g_strcmp0 (l->data, bus_name))
+        {
+          gchar *match = g_strdup_printf (name_match_tmpl, l->data);
+          dbus_bus_remove_match (spi_global_app_data->bus, match, NULL);
+          g_free (match);
+          g_free (l->data);
+          clients = g_slist_delete_link (clients, l);
+          if (!clients)
+            spi_atk_deregister_event_listeners ();
+          return;
+        }
+
+      l = next_node;
+    }
+}
+
+void
+spi_atk_add_interface (DRoutePath *path,
+                       const char *name,
+                       const char *introspect,
+                       const DRouteMethod *methods,
+                       const DRouteProperty *properties)
+{
+  droute_path_add_interface (path, name, introspect, methods, properties);
+
+  if (properties)
+    {
+      if (!spi_global_app_data->property_hash)
+        spi_global_app_data->property_hash = g_hash_table_new_full (g_str_hash,
+                                                                    g_str_equal,
+                                                                    g_free, NULL);
+      g_hash_table_insert (spi_global_app_data->property_hash, g_strdup (name),
+                           (gpointer) properties);
+    }
+}
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/bridge.h b/atk-adaptor/bridge.h
new file mode 100644 (file)
index 0000000..8b6f91d
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.,
+ * Copyright 2001, 2002, 2003 Ximian, Inc.
+ * Copyright 2008, 2009, 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 BRIDGE_H
+#define BRIDGE_H
+
+#include <atk/atk.h>
+#include <droute/droute.h>
+
+typedef struct _SpiBridge SpiBridge;
+typedef struct _SpiBridgeClass SpiBridgeClass;
+
+G_BEGIN_DECLS
+
+typedef struct _AtspiPropertyDefinition AtspiPropertyDefinition;
+struct _AtspiPropertyDefinition
+{
+  char *name;
+  GType type;
+  DRoutePropertyFunction func;
+};
+
+typedef struct _event_data event_data;
+struct _event_data
+{
+  gchar *bus_name;
+  gchar **data;
+  GSList *properties;
+};
+
+struct _SpiBridge
+{
+  GObject parent;
+
+  AtkObject *root;
+
+  DBusConnection *bus;
+  DRouteContext *droute;
+  GMainContext *main_context;
+  DBusServer *server;
+  GList *direct_connections;
+
+  /*
+    SpiRegister *reg;
+    SpiCache    *cache;
+    SpiLeasing  *leasing;
+  */
+  gchar *desktop_name;
+  gchar *desktop_path;
+  gchar *app_tmp_dir;
+  gchar *app_bus_addr;
+  GList *events;
+  gboolean events_initialized;
+  GHashTable *property_hash;
+  guint registration_pending;
+};
+
+extern SpiBridge *spi_global_app_data;
+
+void spi_atk_add_client (const char *bus_name);
+void spi_atk_remove_client (const char *bus_name);
+
+int spi_atk_create_socket (SpiBridge *app);
+
+void spi_atk_add_interface (DRoutePath *path,
+                            const char *name,
+                            const char *introspect,
+                            const DRouteMethod *methods,
+                            const DRouteProperty *properties);
+
+DRoutePropertyFunction _atk_bridge_find_property_func (const char *property,
+                                                       GType *type);
+
+GType _atk_bridge_type_from_iface (const char *iface);
+
+void _atk_bridge_schedule_application_registration (SpiBridge *app);
+gboolean _atk_bridge_remove_pending_application_registration (SpiBridge *app);
+G_END_DECLS
+
+#endif /* BRIDGE_H */
diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c
new file mode 100644 (file)
index 0000000..8017bec
--- /dev/null
@@ -0,0 +1,1550 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2011, F123 Consulting & Mais Diferenças
+ * Copyright 2008, 2009, Codethink Ltd.
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.,
+ * Copyright 2001, 2002, 2003 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <ctype.h>
+#include <string.h>
+
+#define ATK_DISABLE_DEPRECATION_WARNINGS
+#include <atk/atk.h>
+#include <atspi/atspi.h>
+#include <droute/droute.h>
+
+#include "accessible-register.h"
+#include "bridge.h"
+
+#include "event.h"
+#include "object.h"
+#include "spi-dbus.h"
+
+static GArray *listener_ids = NULL;
+
+static gint atk_bridge_key_event_listener_id;
+static gint atk_bridge_focus_tracker_id;
+
+GMainContext *spi_context = NULL;
+
+/*---------------------------------------------------------------------------*/
+
+#define ITF_EVENT_OBJECT "org.a11y.atspi.Event.Object"
+#define ITF_EVENT_WINDOW "org.a11y.atspi.Event.Window"
+#define ITF_EVENT_DOCUMENT "org.a11y.atspi.Event.Document"
+#define ITF_EVENT_FOCUS "org.a11y.atspi.Event.Focus"
+
+/*---------------------------------------------------------------------------*/
+
+typedef struct _SpiReentrantCallClosure
+{
+  DBusConnection *bus;
+  GMainLoop *loop;
+  DBusMessage *reply;
+  guint timeout;
+} SpiReentrantCallClosure;
+
+static void
+switch_main_context (GMainContext *cnx)
+{
+  GList *list;
+
+  if (spi_global_app_data->server)
+    atspi_dbus_server_setup_with_g_main (spi_global_app_data->server, cnx);
+  atspi_dbus_connection_setup_with_g_main (spi_global_app_data->bus, cnx);
+  atspi_set_main_context (cnx);
+  for (list = spi_global_app_data->direct_connections; list; list = list->next)
+    atspi_dbus_connection_setup_with_g_main (list->data, cnx);
+
+  if (_atk_bridge_remove_pending_application_registration (spi_global_app_data))
+    _atk_bridge_schedule_application_registration (spi_global_app_data);
+}
+
+guint
+spi_idle_add (GSourceFunc function, gpointer data)
+{
+  GSource *source;
+  guint id;
+
+  source = g_idle_source_new ();
+  g_source_set_callback (source, function, data, NULL);
+  id = g_source_attach (source, spi_context);
+  g_source_unref (source);
+
+  return id;
+}
+
+guint
+spi_timeout_add_seconds (gint interval, GSourceFunc function, gpointer data)
+{
+  GSource *source;
+  guint id;
+
+  source = g_timeout_source_new_seconds (interval);
+  g_source_set_callback (source, function, data, NULL);
+  id = g_source_attach (source, spi_context);
+  g_source_unref (source);
+
+  return id;
+}
+
+guint
+spi_timeout_add_full (gint priority, guint interval, GSourceFunc function, gpointer data, GDestroyNotify notify)
+{
+  GSource *source;
+  guint id;
+
+  source = g_timeout_source_new (interval);
+  g_source_set_priority (source, priority);
+  g_source_set_callback (source, function, data, notify);
+  id = g_source_attach (source, spi_context);
+  g_source_unref (source);
+
+  return id;
+}
+
+static void
+set_reply (DBusPendingCall *pending, void *user_data)
+{
+  SpiReentrantCallClosure *closure = (SpiReentrantCallClosure *) user_data;
+
+  closure->reply = dbus_pending_call_steal_reply (pending);
+  dbus_pending_call_unref (pending);
+  switch_main_context (spi_context);
+  g_main_loop_quit (closure->loop);
+}
+
+static gboolean
+timeout_reply (void *data)
+{
+  SpiReentrantCallClosure *closure = data;
+
+  switch_main_context (spi_context);
+  g_main_loop_quit (closure->loop);
+  closure->timeout = -1;
+  return FALSE;
+}
+
+static DBusMessage *
+send_and_allow_reentry (DBusConnection *bus, DBusMessage *message)
+{
+  DBusPendingCall *pending;
+  SpiReentrantCallClosure closure;
+  GSource *source;
+
+  closure.bus = bus;
+  closure.loop = g_main_loop_new (spi_global_app_data->main_context, FALSE);
+  closure.reply = NULL;
+  switch_main_context (spi_global_app_data->main_context);
+
+  if (!dbus_connection_send_with_reply (bus, message, &pending, 9000) || !pending)
+    {
+      switch_main_context (spi_context);
+      return NULL;
+    }
+  dbus_pending_call_set_notify (pending, set_reply, (void *) &closure, NULL);
+  source = g_timeout_source_new (500);
+  g_source_set_callback (source, timeout_reply, &closure, NULL);
+  closure.timeout = g_source_attach (source, spi_global_app_data->main_context);
+  g_source_unref (source);
+  g_main_loop_run (closure.loop);
+  if (closure.timeout != -1)
+    g_source_destroy (source);
+
+  g_main_loop_unref (closure.loop);
+  if (!closure.reply)
+    dbus_pending_call_cancel (pending);
+  return closure.reply;
+}
+
+void
+atk_bridge_set_event_context (GMainContext *cnx)
+{
+  spi_context = cnx;
+  switch_main_context (spi_context);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Functionality related to sending device events from the application.
+ *
+ * This is used for forwarding key events on to the registry daemon.
+ */
+
+static gboolean
+Accessibility_DeviceEventController_NotifyListenersSync (const AtspiDeviceEvent
+                                                             *key_event)
+{
+  DBusMessage *message;
+  dbus_bool_t consumed = FALSE;
+
+  message =
+      dbus_message_new_method_call (SPI_DBUS_NAME_REGISTRY,
+                                    ATSPI_DBUS_PATH_DEC,
+                                    ATSPI_DBUS_INTERFACE_DEC,
+                                    "NotifyListenersSync");
+
+  if (spi_dbus_marshal_deviceEvent (message, key_event))
+    {
+      DBusMessage *reply =
+          send_and_allow_reentry (spi_global_app_data->bus, message);
+      if (reply)
+        {
+          DBusError error;
+          dbus_error_init (&error);
+          if (!dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN,
+                                      &consumed, DBUS_TYPE_INVALID))
+            {
+              /* TODO: print a warning */
+              dbus_error_free (&error);
+            }
+          dbus_message_unref (reply);
+        }
+    }
+  dbus_message_unref (message);
+  return consumed;
+}
+
+static void
+spi_init_keystroke_from_atk_key_event (AtspiDeviceEvent *keystroke,
+                                       AtkKeyEventStruct *event)
+{
+  keystroke->id = (dbus_int32_t) event->keyval;
+  keystroke->hw_code = (dbus_int16_t) event->keycode;
+  keystroke->timestamp = (dbus_uint32_t) event->timestamp;
+  keystroke->modifiers = (dbus_uint16_t) (event->state & 0xFFFF);
+  if (event->string)
+    {
+      gunichar c;
+
+      keystroke->event_string = g_strdup (event->string);
+      c = g_utf8_get_char_validated (event->string, -1);
+      if (c > 0 && g_unichar_isprint (c))
+        keystroke->is_text = TRUE;
+      else
+        keystroke->is_text = FALSE;
+    }
+  else
+    {
+      keystroke->event_string = g_strdup ("");
+      keystroke->is_text = FALSE;
+    }
+  switch (event->type)
+    {
+    case (ATK_KEY_EVENT_PRESS):
+      keystroke->type = ATSPI_KEY_PRESSED_EVENT;
+      break;
+    case (ATK_KEY_EVENT_RELEASE):
+      keystroke->type = ATSPI_KEY_RELEASED_EVENT;
+      break;
+    default:
+      g_error ("atk passed us an AtkKeyEventStruct invalid type %d", event->type);
+      return;
+    }
+#if 0
+  g_print
+    ("key_event type %d; val=%d code=%d modifiers=%x name=%s is_text=%d, time=%lx\n",
+     (int) keystroke->type, (int) keystroke->id, (int) keystroke->hw_code,
+     (int) keystroke->modifiers, keystroke->event_string,
+     (int) keystroke->is_text, (unsigned long) keystroke->timestamp);
+#endif
+}
+
+static gint
+spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
+{
+  gboolean result;
+  AtspiDeviceEvent key_event;
+
+  spi_init_keystroke_from_atk_key_event (&key_event, event);
+
+  result =
+      Accessibility_DeviceEventController_NotifyListenersSync (&key_event);
+
+  if (key_event.event_string)
+    g_free (key_event.event_string);
+
+  return result;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static const void *
+validate_for_dbus (const gint type,
+                   const void *val)
+{
+  switch (type)
+    {
+    case DBUS_TYPE_STRING:
+    case DBUS_TYPE_OBJECT_PATH:
+      if (!val)
+        return "";
+      else if (!g_utf8_validate (val, -1, NULL))
+        {
+          g_warning ("atk-bridge: Received bad UTF-8 string when emitting event");
+          return "";
+        }
+      else
+        return val;
+    default:
+      return val;
+    }
+}
+
+static void
+append_basic (DBusMessageIter *iter,
+              const char *type,
+              const void *val)
+{
+  DBusMessageIter sub;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, type, &sub);
+
+  val = validate_for_dbus ((int) *type, val);
+  dbus_message_iter_append_basic (&sub, (int) *type, &val);
+
+  dbus_message_iter_close_container (iter, &sub);
+}
+
+static void
+append_rect (DBusMessageIter *iter,
+             const char *type,
+             const void *val)
+{
+  DBusMessageIter variant, sub;
+  const AtkRectangle *rect = (const AtkRectangle *) val;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, type, &variant);
+
+  dbus_message_iter_open_container (&variant, DBUS_TYPE_STRUCT, NULL, &sub);
+
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &(rect->x));
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &(rect->y));
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &(rect->width));
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &(rect->height));
+
+  dbus_message_iter_close_container (&variant, &sub);
+
+  dbus_message_iter_close_container (iter, &variant);
+}
+
+static void
+append_object (DBusMessageIter *iter,
+               const char *type,
+               const void *val)
+{
+  spi_object_append_v_reference (iter, ATK_OBJECT (val));
+}
+
+static gchar *
+signal_name_to_dbus (const gchar *s)
+{
+  gchar *ret = g_strdup (s);
+  gchar *t;
+
+  if (!ret)
+    return NULL;
+  ret[0] = toupper (ret[0]);
+  while ((t = strchr (ret, '-')) != NULL)
+    {
+      memmove (t, t + 1, strlen (t));
+      *t = toupper (*t);
+    }
+  return ret;
+}
+
+/*
+ * Converts names of the form "active-descendant-changed" to
+ * "ActiveDescendantChanged"
+ */
+static gchar *
+ensure_proper_format (const char *name)
+{
+  gchar *ret = (gchar *) g_malloc (strlen (name) * 2 + 2);
+  gchar *p = ret;
+  gboolean need_upper = TRUE;
+
+  if (!ret)
+    return NULL;
+  while (*name)
+    {
+      if (need_upper)
+        {
+          *p++ = toupper (*name);
+          need_upper = FALSE;
+        }
+      else if (*name == '-')
+        need_upper = TRUE;
+      else if (*name == ':')
+        {
+          need_upper = TRUE;
+          *p++ = *name;
+        }
+      else
+        *p++ = *name;
+      name++;
+    }
+  *p = '\0';
+  return ret;
+}
+
+void
+append_properties (GArray *properties, event_data *evdata)
+{
+  GSList *ls;
+  gint i;
+
+  for (ls = evdata->properties; ls; ls = ls->next)
+    {
+      gboolean dup = FALSE;
+      for (i = 0; i < properties->len; i++)
+        {
+          if (ls->data == g_array_index (properties, AtspiPropertyDefinition *, i))
+            {
+              dup = TRUE;
+              break;
+            }
+        }
+      if (!dup)
+        g_array_append_val (properties, ls->data);
+    }
+}
+
+static gboolean
+signal_is_needed (AtkObject *obj, const gchar *klass, const gchar *major, const gchar *minor, GArray **properties)
+{
+  gchar *data[4];
+  event_data *evdata;
+  gboolean ret = FALSE;
+  GList *list;
+  GArray *props = NULL;
+
+  if (!spi_global_app_data->events_initialized)
+    return TRUE;
+
+  data[0] = ensure_proper_format (klass[0] ? klass + 21 : klass);
+  data[1] = ensure_proper_format (major);
+  data[2] = ensure_proper_format (minor);
+  data[3] = NULL;
+
+  /* Hack: Always pass events that update the cache.
+   * TODO: FOr 2.2, have at-spi2-core define a special "cache listener" for
+   * this instead, so that we don't send these if no one is listening */
+  if (!g_strcmp0 (data[1], "ChildrenChanged") ||
+      ((!g_strcmp0 (data[1], "PropertyChange")) &&
+       (!g_strcmp0 (data[2], "AccessibleName") ||
+        !g_strcmp0 (data[2], "AccessibleDescription") ||
+        !g_strcmp0 (data[2], "AccessibleParent") ||
+        !g_strcmp0 (data[2], "AccessibleRole"))) ||
+      !g_strcmp0 (data[1], "StateChanged"))
+    {
+      if (minor && !g_strcmp0 (minor, "defunct"))
+        ret = TRUE;
+      else
+        {
+          AtkStateSet *set = atk_object_ref_state_set (obj);
+          AtkState state = ((!g_strcmp0 (data[1], "ChildrenChanged")) ? ATK_STATE_MANAGES_DESCENDANTS : ATK_STATE_TRANSIENT);
+          ret = !atk_state_set_contains_state (set, state);
+          g_object_unref (set);
+        }
+    }
+
+  /* Hack: events such as "object::text-changed::insert:system" as
+     generated by Gecko */
+  data[2][strcspn (data[2], ":")] = '\0';
+
+  for (list = spi_global_app_data->events; list; list = list->next)
+    {
+      evdata = list->data;
+      if (spi_event_is_subtype (data, evdata->data))
+        {
+          ret = TRUE;
+          if (!props)
+            props = g_array_new (TRUE, TRUE, sizeof (AtspiPropertyDefinition *));
+          append_properties (props, evdata);
+        }
+    }
+
+  g_free (data[2]);
+  g_free (data[1]);
+  g_free (data[0]);
+  *properties = props;
+  return ret;
+}
+
+/* Convert a : to a / so that listeners can use arg0path to match only
+ *  * the prefix */
+static char *
+adapt_minor_for_dbus (const char *source)
+{
+  gchar *ret = g_strdup (source);
+  int i = strcspn (ret, ":");
+  if (ret[i] == ':')
+    ret[i] = '/';
+  return ret;
+}
+
+/*
+ * Emits an AT-SPI event.
+ * AT-SPI events names are split into three parts:
+ * class:major:minor
+ * This is mapped onto D-Bus events as:
+ * D-Bus Interface:Signal Name:Detail argument
+ *
+ * Marshals a basic type into the 'any_data' attribute of
+ * the AT-SPI event.
+ */
+static void
+emit_event (AtkObject *obj,
+            const char *klass,
+            const char *major,
+            const char *minor,
+            dbus_int32_t detail1,
+            dbus_int32_t detail2,
+            const char *type,
+            const void *val,
+            void (*append_variant) (DBusMessageIter *, const char *, const void *))
+{
+  DBusConnection *bus = spi_global_app_data->bus;
+  char *path;
+  char *minor_dbus;
+
+  gchar *cname;
+  DBusMessage *sig;
+  DBusMessageIter iter, iter_dict, iter_dict_entry;
+  GArray *properties = NULL;
+
+  if (!klass)
+    klass = "";
+  if (!major)
+    major = "";
+  if (!minor)
+    minor = "";
+  if (!type)
+    type = "u";
+
+  if (!signal_is_needed (obj, klass, major, minor, &properties))
+    return;
+
+  path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
+  g_return_if_fail (path != NULL);
+
+  /*
+   * This is very annoying, but as '-' isn't a legal signal
+   * name in D-Bus (Why not??!?) The names need converting
+   * on this side, and again on the client side.
+   */
+  cname = signal_name_to_dbus (major);
+  sig = dbus_message_new_signal (path, klass, cname);
+
+  dbus_message_iter_init_append (sig, &iter);
+
+  minor_dbus = adapt_minor_for_dbus (minor);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &minor_dbus);
+  g_free (minor_dbus);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail1);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail2);
+  append_variant (&iter, type, val);
+
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_dict);
+  /* Add requested properties, unless the object is being marked defunct, in
+     which case it's safest not to touch it */
+  if (minor == NULL || strcmp (minor, "defunct") != 0 || detail1 == 0)
+    {
+      if (properties)
+        {
+          gint i;
+          for (i = 0; i < properties->len; i++)
+            {
+              AtspiPropertyDefinition *prop = g_array_index (properties, AtspiPropertyDefinition *, i);
+              dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY, NULL,
+                                                &iter_dict_entry);
+              dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &prop->name);
+              prop->func (&iter_dict_entry, obj);
+              dbus_message_iter_close_container (&iter_dict, &iter_dict_entry);
+            }
+          g_array_free (properties, TRUE);
+        }
+    }
+  dbus_message_iter_close_container (&iter, &iter_dict);
+
+  dbus_connection_send (bus, sig, NULL);
+  dbus_message_unref (sig);
+
+  if (g_strcmp0 (cname, "ChildrenChanged") != 0)
+    spi_object_lease_if_needed (G_OBJECT (obj));
+
+  g_free (cname);
+  g_free (path);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * The focus listener handles the ATK 'focus' signal and forwards it
+ * as the AT-SPI event, 'focus:'
+ */
+static void
+focus_tracker (AtkObject *accessible)
+{
+  emit_event (accessible, ITF_EVENT_FOCUS, "focus", "", 0, 0,
+              DBUS_TYPE_INT32_AS_STRING, 0, append_basic);
+}
+
+/*---------------------------------------------------------------------------*/
+
+#define PCHANGE "PropertyChange"
+
+/*
+ * This handler handles the following ATK signals and
+ * converts them to AT-SPI events:
+ *
+ * Gtk:AtkObject:property-change -> object:property-change:(property-name)
+ *
+ * The property-name is part of the ATK property-change signal.
+ */
+static gboolean
+property_event_listener (GSignalInvocationHint *signal_hint,
+                         guint n_param_values,
+                         const GValue *param_values,
+                         gpointer data)
+{
+  AtkObject *accessible;
+  AtkPropertyValues *values;
+
+  const gchar *pname = NULL;
+
+  AtkObject *otemp;
+  const gchar *s1;
+  gint i;
+
+  accessible = g_value_get_object (&param_values[0]);
+  values = (AtkPropertyValues *) g_value_get_pointer (&param_values[1]);
+
+  pname = values[0].property_name;
+
+  /* TODO Could improve this control statement by matching
+   * on only the end of the signal names,
+   */
+  if (strcmp (pname, "accessible-name") == 0)
+    {
+      s1 = atk_object_get_name (accessible);
+      if (s1 != NULL)
+        emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                    DBUS_TYPE_STRING_AS_STRING, s1, append_basic);
+    }
+  else if (strcmp (pname, "accessible-description") == 0)
+    {
+      s1 = atk_object_get_description (accessible);
+      if (s1 != NULL)
+        emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                    DBUS_TYPE_STRING_AS_STRING, s1, append_basic);
+    }
+  else if (strcmp (pname, "accessible-parent") == 0)
+    {
+      otemp = atk_object_get_parent (accessible);
+      if (otemp != NULL)
+        emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                    "(so)", otemp, append_object);
+    }
+  else if (strcmp (pname, "accessible-role") == 0)
+    {
+      i = atk_object_get_role (accessible);
+      emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                  DBUS_TYPE_UINT32_AS_STRING, GINT_TO_POINTER (i), append_basic);
+    }
+  else if (strcmp (pname, "accessible-table-summary") == 0)
+    {
+      otemp = atk_table_get_summary (ATK_TABLE (accessible));
+      if (otemp != NULL)
+        emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                    "(so)", otemp, append_object);
+    }
+  else if (strcmp (pname, "accessible-table-column-header") == 0)
+    {
+      i = g_value_get_int (&(values->new_value));
+      otemp = atk_table_get_column_header (ATK_TABLE (accessible), i);
+      if (otemp != NULL)
+        emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                    "(so)", otemp, append_object);
+    }
+  else if (strcmp (pname, "accessible-table-row-header") == 0)
+    {
+      i = g_value_get_int (&(values->new_value));
+      otemp = atk_table_get_row_header (ATK_TABLE (accessible), i);
+      if (otemp != NULL)
+        emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                    "(so)", otemp, append_object);
+    }
+  else if (strcmp (pname, "accessible-table-row-description") == 0)
+    {
+      i = g_value_get_int (&(values->new_value));
+      s1 = atk_table_get_row_description (ATK_TABLE (accessible), i);
+      emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                  DBUS_TYPE_STRING_AS_STRING, s1, append_basic);
+    }
+  else if (strcmp (pname, "accessible-table-column-description") == 0)
+    {
+      i = g_value_get_int (&(values->new_value));
+      s1 = atk_table_get_column_description (ATK_TABLE (accessible), i);
+      emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                  DBUS_TYPE_STRING_AS_STRING, s1, append_basic);
+    }
+  else if (strcmp (pname, "accessible-table-caption-object") == 0)
+    {
+      otemp = atk_table_get_caption (ATK_TABLE (accessible));
+      emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                  "(so)", otemp, append_object);
+    }
+  else
+    {
+      emit_event (accessible, ITF_EVENT_OBJECT, PCHANGE, pname, 0, 0,
+                  DBUS_TYPE_INT32_AS_STRING, 0, append_basic);
+    }
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+#define STATE_CHANGED "state-changed"
+
+/*
+ * The state event listener handles 'Gtk:AtkObject:state-change' ATK signals
+ * and forwards them as object:state-changed:(param-name) AT-SPI events. Where
+ * the param-name is part of the ATK state-change signal.
+ */
+static gboolean
+state_event_listener (GSignalInvocationHint *signal_hint,
+                      guint n_param_values,
+                      const GValue *param_values,
+                      gpointer data)
+{
+  AtkObject *accessible;
+  const gchar *pname;
+  guint detail1;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  pname = g_value_get_string (&param_values[1]);
+
+  detail1 = (g_value_get_boolean (&param_values[2])) ? 1 : 0;
+  emit_event (accessible, ITF_EVENT_OBJECT, STATE_CHANGED, pname, detail1, 0,
+              DBUS_TYPE_INT32_AS_STRING, 0, append_basic);
+
+  if (!g_strcmp0 (pname, "defunct") && detail1)
+    spi_register_deregister_object (spi_global_register, G_OBJECT (accessible),
+                                    TRUE);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * The window event listener handles the following ATK signals and forwards
+ * them as AT-SPI events:
+ *
+ * window:create     -> window:create
+ * window:destroy    -> window:destroy
+ * window:minimize   -> window:minimize
+ * window:maximize   -> window:maximize
+ * window:activate   -> window:activate
+ * window:deactivate -> window:deactivate
+ */
+static gboolean
+window_event_listener (GSignalInvocationHint *signal_hint,
+                       guint n_param_values,
+                       const GValue *param_values,
+                       gpointer data)
+{
+  AtkObject *accessible;
+  GSignalQuery signal_query;
+  const gchar *name, *s;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  s = atk_object_get_name (accessible);
+  emit_event (accessible, ITF_EVENT_WINDOW, name, "", 0, 0,
+              DBUS_TYPE_STRING_AS_STRING, s, append_basic);
+
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * The document event listener handles the following ATK signals
+ * and converts them to AT-SPI events:
+ *
+ * Gtk:AtkDocument:load-complete ->  document:load-complete
+ * Gtk:AtkDocument:load-stopped  ->  document:load-stopped
+ * Gtk:AtkDocument:reload        ->  document:reload
+ * Gtk:AtkDocument:page-changed  ->  document:page-changed
+ */
+static gboolean
+document_event_listener (GSignalInvocationHint *signal_hint,
+                         guint n_param_values,
+                         const GValue *param_values,
+                         gpointer data)
+{
+  AtkObject *accessible;
+  GSignalQuery signal_query;
+  const gchar *name, *s;
+  gint detail1 = 0;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  if (n_param_values > 0) // on the case of page-changed
+    if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_INT)
+      detail1 = g_value_get_int (&param_values[1]);
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  s = atk_object_get_name (accessible);
+  emit_event (accessible, ITF_EVENT_DOCUMENT, name, "", detail1, 0,
+              DBUS_TYPE_STRING_AS_STRING, s, append_basic);
+
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Signal handler for  "Gtk:AtkComponent:bounds-changed". Converts
+ * this to an AT-SPI event - "object:bounds-changed".
+ */
+static gboolean
+bounds_event_listener (GSignalInvocationHint *signal_hint,
+                       guint n_param_values,
+                       const GValue *param_values,
+                       gpointer data)
+{
+  AtkObject *accessible;
+  AtkRectangle *atk_rect;
+  GSignalQuery signal_query;
+  const gchar *name;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+
+  if (G_VALUE_HOLDS_BOXED (param_values + 1))
+    {
+      atk_rect = g_value_get_boxed (param_values + 1);
+
+      emit_event (accessible, ITF_EVENT_OBJECT, name, "", 0, 0,
+                  "(iiii)", atk_rect, append_rect);
+    }
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Handles the ATK signal 'Gtk:AtkObject:active-descendant-changed' and
+ * converts it to the AT-SPI signal - 'object:active-descendant-changed'.
+ *
+ */
+static gboolean
+active_descendant_event_listener (GSignalInvocationHint *signal_hint,
+                                  guint n_param_values,
+                                  const GValue *param_values,
+                                  gpointer data)
+{
+  AtkObject *accessible;
+  AtkObject *child;
+  GSignalQuery signal_query;
+  const gchar *name;
+  gint detail1;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  child = ATK_OBJECT (g_value_get_pointer (&param_values[1]));
+  g_return_val_if_fail (ATK_IS_OBJECT (child), TRUE);
+
+  detail1 = atk_object_get_index_in_parent (child);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, "", detail1, 0,
+              "(so)", child, append_object);
+  return TRUE;
+}
+
+static gboolean
+announcement_event_listener (GSignalInvocationHint *signal_hint,
+                             guint n_param_values,
+                             const GValue *param_values,
+                             gpointer data)
+{
+  AtkObject *accessible;
+  const gchar *text;
+  GSignalQuery signal_query;
+  const gchar *name;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  text = g_value_get_string (&param_values[1]);
+  g_return_val_if_fail (text != NULL, TRUE);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, "", ATSPI_LIVE_POLITE, 0,
+              "s", text, append_basic);
+  return TRUE;
+}
+
+static gboolean
+notification_event_listener (GSignalInvocationHint *signal_hint,
+                             guint n_param_values,
+                             const GValue *param_values,
+                             gpointer data)
+{
+  AtkObject *accessible;
+  const gchar *text;
+  gint politeness;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  text = g_value_get_string (&param_values[1]);
+  g_return_val_if_fail (text != NULL, TRUE);
+  politeness = g_value_get_int (&param_values[2]);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, "announcement", "", politeness, 0,
+              "s", text, append_basic);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Handles the ATK signal 'Gtk:AtkHypertext:link-selected' and
+ * converts it to the AT-SPI signal - 'object:link-selected'
+ *
+ */
+static gboolean
+link_selected_event_listener (GSignalInvocationHint *signal_hint,
+                              guint n_param_values,
+                              const GValue *param_values,
+                              gpointer data)
+{
+  AtkObject *accessible;
+  GSignalQuery signal_query;
+  const gchar *name, *minor;
+  gint detail1 = 0;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  minor = g_quark_to_string (signal_hint->detail);
+
+  if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_INT)
+    detail1 = g_value_get_int (&param_values[1]);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, 0,
+              DBUS_TYPE_INT32_AS_STRING, 0, append_basic);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Handles the ATK signal 'Gtk:AtkText:text-changed' and
+ * converts it to the AT-SPI signal - 'object:text-changed'
+ * This signal is deprecated by Gtk:AtkText:text-insert
+ * and Gtk:AtkText:text-remove
+ *
+ */
+static gboolean
+text_changed_event_listener (GSignalInvocationHint *signal_hint,
+                             guint n_param_values,
+                             const GValue *param_values,
+                             gpointer data)
+{
+  AtkObject *accessible;
+  GSignalQuery signal_query;
+  const gchar *name, *minor;
+  gchar *selected;
+  gint detail1 = 0, detail2 = 0;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  minor = g_quark_to_string (signal_hint->detail);
+
+  if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_INT)
+    detail1 = g_value_get_int (&param_values[1]);
+
+  if (G_VALUE_TYPE (&param_values[2]) == G_TYPE_INT)
+    detail2 = g_value_get_int (&param_values[2]);
+
+  selected =
+      atk_text_get_text (ATK_TEXT (accessible), detail1, detail1 + detail2);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+              DBUS_TYPE_STRING_AS_STRING, selected, append_basic);
+  g_free (selected);
+
+  return TRUE;
+}
+
+/*
+ * Handles the ATK signal 'Gtk:AtkText:text-insert' and
+ * converts it to the AT-SPI signal - 'object:text-changed'
+ *
+ */
+static gboolean
+text_insert_event_listener (GSignalInvocationHint *signal_hint,
+                            guint n_param_values,
+                            const GValue *param_values,
+                            gpointer data)
+{
+  AtkObject *accessible;
+  guint text_changed_signal_id;
+  GSignalQuery signal_query;
+  const gchar *name;
+  const gchar *minor_raw, *text;
+  gchar *minor;
+  gint detail1 = 0, detail2 = 0;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  /* Get signal name for 'Gtk:AtkText:text-changed' so
+   * we convert it to the AT-SPI signal - 'object:text-changed'
+   */
+  text_changed_signal_id = g_signal_lookup ("text-changed", G_OBJECT_TYPE (accessible));
+  g_signal_query (text_changed_signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  /* Add the insert and keep any detail coming from atk */
+  minor_raw = g_quark_to_string (signal_hint->detail);
+  if (minor_raw)
+    minor = g_strconcat ("insert:", minor_raw, NULL);
+  else
+    minor = g_strdup ("insert");
+
+  if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_INT)
+    detail1 = g_value_get_int (&param_values[1]);
+
+  if (G_VALUE_TYPE (&param_values[2]) == G_TYPE_INT)
+    detail2 = g_value_get_int (&param_values[2]);
+
+  if (G_VALUE_TYPE (&param_values[3]) == G_TYPE_STRING)
+    text = g_value_get_string (&param_values[3]);
+  else
+    text = "";
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+              DBUS_TYPE_STRING_AS_STRING, text, append_basic);
+  g_free (minor);
+  return TRUE;
+}
+
+/*
+ * Handles the ATK signal 'Gtk:AtkText:text-remove' and
+ * converts it to the AT-SPI signal - 'object:text-changed'
+ *
+ */
+static gboolean
+text_remove_event_listener (GSignalInvocationHint *signal_hint,
+                            guint n_param_values,
+                            const GValue *param_values,
+                            gpointer data)
+{
+  AtkObject *accessible;
+  guint text_changed_signal_id;
+  GSignalQuery signal_query;
+  const gchar *name;
+  const gchar *minor_raw, *text;
+  gchar *minor;
+  gint detail1 = 0, detail2 = 0;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  /* Get signal name for 'Gtk:AtkText:text-changed' so
+   * we convert it to the AT-SPI signal - 'object:text-changed'
+   */
+  text_changed_signal_id = g_signal_lookup ("text-changed", G_OBJECT_TYPE (accessible));
+  g_signal_query (text_changed_signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  minor_raw = g_quark_to_string (signal_hint->detail);
+
+  /* Add the delete and keep any detail coming from atk */
+  if (minor_raw)
+    minor = g_strconcat ("delete:", minor_raw, NULL);
+  else
+    minor = g_strdup ("delete");
+
+  if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_INT)
+    detail1 = g_value_get_int (&param_values[1]);
+
+  if (G_VALUE_TYPE (&param_values[2]) == G_TYPE_INT)
+    detail2 = g_value_get_int (&param_values[2]);
+
+  if (G_VALUE_TYPE (&param_values[3]) == G_TYPE_STRING)
+    text = g_value_get_string (&param_values[3]);
+  else
+    text = "";
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+              DBUS_TYPE_STRING_AS_STRING, text, append_basic);
+  g_free (minor);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Handles the ATK signal 'Gtk:AtkText:text-selection-changed' and
+ * converts it to the AT-SPI signal - 'object:text-selection-changed'
+ *
+ */
+static gboolean
+text_selection_changed_event_listener (GSignalInvocationHint *signal_hint,
+                                       guint n_param_values,
+                                       const GValue *param_values,
+                                       gpointer data)
+{
+  AtkObject *accessible;
+  GSignalQuery signal_query;
+  const gchar *name, *minor;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  minor = g_quark_to_string (signal_hint->detail);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, minor, 0, 0,
+              DBUS_TYPE_STRING_AS_STRING, "", append_basic);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Children changed signal converter and forwarder.
+ *
+ * Klass (Interface) org.a11y.atspi.Event.Object
+ * Major is the signal name.
+ * Minor is 'add' or 'remove'
+ * detail1 is the index.
+ * detail2 is 0.
+ * any_data is the child reference.
+ */
+static gboolean
+children_changed_event_listener (GSignalInvocationHint *signal_hint,
+                                 guint n_param_values,
+                                 const GValue *param_values,
+                                 gpointer data)
+{
+  GSignalQuery signal_query;
+  const gchar *name, *minor;
+  gint detail1 = 0, detail2 = 0;
+
+  AtkObject *accessible, *ao = NULL;
+  gpointer child;
+  AtkStateSet *set;
+  gboolean ret;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  /* If the accessible is on STATE_MANAGES_DESCENDANTS state,
+     children-changed signal are not forwarded. */
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  set = atk_object_ref_state_set (accessible);
+  ret = atk_state_set_contains_state (set, ATK_STATE_MANAGES_DESCENDANTS);
+  g_object_unref (set);
+
+  if (ret)
+    return TRUE;
+
+  minor = g_quark_to_string (signal_hint->detail);
+
+  detail1 = g_value_get_uint (param_values + 1);
+  child = g_value_get_pointer (param_values + 2);
+
+  if (ATK_IS_OBJECT (child))
+    {
+      ao = ATK_OBJECT (child);
+      emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+                  "(so)", ao, append_object);
+    }
+  else if ((minor != NULL) && (strcmp (minor, "add") == 0))
+    {
+      ao = atk_object_ref_accessible_child (accessible,
+                                            detail1);
+      emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+                  "(so)", ao, append_object);
+      g_object_unref (ao);
+    }
+  else
+    {
+      emit_event (accessible, ITF_EVENT_OBJECT, name, minor, detail1, detail2,
+                  "(so)", ao, append_object);
+    }
+
+  return TRUE;
+}
+
+/*
+ * Handles the ATK signal 'Gtk:AtkObject:attribute-changed' and
+ * converts it to the AT-SPI signal - 'object:attributes-changed'
+ *
+ */
+static gboolean
+attribute_changed_event_listener (GSignalInvocationHint *signal_hint,
+                                  guint n_param_values,
+                                  const GValue *param_values,
+                                  gpointer data)
+{
+  AtkObject *accessible;
+  const gchar *key = NULL, *value = NULL;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_STRING)
+    key = g_value_get_string (&param_values[1]);
+  else
+    key = "";
+  if (G_VALUE_TYPE (&param_values[2]) == G_TYPE_STRING)
+    value = g_value_get_string (&param_values[2]);
+  else
+    value = "";
+
+  emit_event (accessible, ITF_EVENT_OBJECT, "attributes-changed", key, 0, 0,
+              DBUS_TYPE_STRING_AS_STRING, value, append_basic);
+  return TRUE;
+}
+
+/*
+ * Handles the ATK signal 'Gtk:AtkDocument:attribute-changed' and
+ * converts it to the AT-SPI signal - 'document:attributes-changed'
+ *
+ */
+static gboolean
+document_attribute_changed_event_listener (GSignalInvocationHint *signal_hint,
+                                           guint n_param_values,
+                                           const GValue *param_values,
+                                           gpointer data)
+{
+  AtkObject *accessible;
+  const gchar *key = NULL, *value = NULL;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+  if (G_VALUE_TYPE (&param_values[1]) == G_TYPE_STRING)
+    key = g_value_get_string (&param_values[1]);
+  else
+    key = "";
+  if (G_VALUE_TYPE (&param_values[2]) == G_TYPE_STRING)
+    value = g_value_get_string (&param_values[2]);
+  else
+    value = "";
+
+  emit_event (accessible, ITF_EVENT_DOCUMENT, "attributes-changed", key, 0, 0,
+              DBUS_TYPE_STRING_AS_STRING, value, append_basic);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Generic signal converter and forwarder.
+ *
+ * Klass (Interface) org.a11y.atspi.Event.Object
+ * Major is the signal name.
+ * Minor is NULL.
+ * detail1 is 0.
+ * detail2 is 0.
+ * any_data is NULL.
+ */
+static gboolean
+generic_event_listener (GSignalInvocationHint *signal_hint,
+                        guint n_param_values,
+                        const GValue *param_values,
+                        gpointer data)
+{
+  AtkObject *accessible;
+  GSignalQuery signal_query;
+  const gchar *name;
+  int detail1 = 0, detail2 = 0;
+
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+
+  accessible = ATK_OBJECT (g_value_get_object (&param_values[0]));
+
+  if (n_param_values > 1 && G_VALUE_TYPE (&param_values[1]) == G_TYPE_INT)
+    detail1 = g_value_get_int (&param_values[1]);
+
+  if (n_param_values > 2 && G_VALUE_TYPE (&param_values[2]) == G_TYPE_INT)
+    detail2 = g_value_get_int (&param_values[2]);
+
+  emit_event (accessible, ITF_EVENT_OBJECT, name, "", detail1, detail2,
+              DBUS_TYPE_INT32_AS_STRING, 0, append_basic);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Registers the provided function as a handler for the given signal name
+ * and stores the signal id returned so that the function may be
+ * de-registered later.
+ */
+static guint
+add_signal_listener (GSignalEmissionHook listener, const char *signal_name)
+{
+  guint id;
+
+  id = atk_add_global_event_listener (listener, signal_name);
+
+  if (id > 0) /* id == 0 is a failure */
+    g_array_append_val (listener_ids, id);
+
+  return id;
+}
+
+/*
+ * Initialization for the signal handlers.
+ *
+ * Registers all required signal handlers.
+ */
+void
+spi_atk_register_event_listeners (void)
+{
+  /*
+   * Kludge to make sure the Atk interface types are registered, otherwise
+   * the AtkText signal handlers below won't get registered
+   */
+  GObject *ao = g_object_new (ATK_TYPE_OBJECT, NULL);
+  AtkObject *bo = atk_no_op_object_new (ao);
+  guint id = 0;
+
+  g_object_unref (G_OBJECT (bo));
+  g_object_unref (ao);
+
+  if (listener_ids)
+    {
+      g_warning ("atk_bridge: spi_atk-register_event_listeners called multiple times");
+      return;
+    }
+
+  /* Register for focus event notifications, and register app with central registry  */
+  listener_ids = g_array_sized_new (FALSE, TRUE, sizeof (guint), 16);
+
+  atk_bridge_focus_tracker_id = atk_add_focus_tracker (focus_tracker);
+
+  add_signal_listener (property_event_listener,
+                       "Gtk:AtkObject:property-change");
+
+  /* window events: we tentative try to register using the old format */
+  id = add_signal_listener (window_event_listener, "window:create");
+
+  if (id != 0)
+    {
+      /* If we are able to register using the old format, we assume
+       * that the ATK implementor is managing window events without
+       * AtkWindow. We can't use the opposite test because after
+       * including AtkWindow on ATK you would be able to register to
+       * that event, although the ATK implementor could or not use it.
+       */
+
+      add_signal_listener (window_event_listener, "window:destroy");
+      add_signal_listener (window_event_listener, "window:minimize");
+      add_signal_listener (window_event_listener, "window:maximize");
+      add_signal_listener (window_event_listener, "window:restore");
+      add_signal_listener (window_event_listener, "window:activate");
+      add_signal_listener (window_event_listener, "window:deactivate");
+    }
+  else
+    {
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:create");
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:destroy");
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:minimize");
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:maximize");
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:restore");
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:activate");
+      add_signal_listener (window_event_listener, "Atk:AtkWindow:deactivate");
+    }
+
+  add_signal_listener (document_event_listener,
+                       "Gtk:AtkDocument:load-complete");
+  add_signal_listener (document_event_listener, "Gtk:AtkDocument:reload");
+  add_signal_listener (document_event_listener,
+                       "Gtk:AtkDocument:load-stopped");
+  add_signal_listener (document_event_listener,
+                       "Gtk:AtkDocument:page-changed");
+  add_signal_listener (document_attribute_changed_event_listener,
+                       "Gtk:AtkDocument:document-attribute-changed");
+  /* TODO Fake this event on the client side */
+  add_signal_listener (state_event_listener, "Gtk:AtkObject:state-change");
+  /* TODO */
+  add_signal_listener (active_descendant_event_listener,
+                       "Gtk:AtkObject:active-descendant-changed");
+  add_signal_listener (announcement_event_listener,
+                       "Gtk:AtkObject:announcement");
+  add_signal_listener (notification_event_listener,
+                       "Gtk:AtkObject:notification");
+  add_signal_listener (attribute_changed_event_listener,
+                       "Gtk:AtkObject:attribute-changed");
+  add_signal_listener (bounds_event_listener,
+                       "Gtk:AtkComponent:bounds-changed");
+  add_signal_listener (text_selection_changed_event_listener,
+                       "Gtk:AtkText:text-selection-changed");
+  add_signal_listener (text_changed_event_listener,
+                       "Gtk:AtkText:text-changed");
+  add_signal_listener (text_insert_event_listener,
+                       "Gtk:AtkText:text-insert");
+  add_signal_listener (text_remove_event_listener,
+                       "Gtk:AtkText:text-remove");
+  add_signal_listener (link_selected_event_listener,
+                       "Gtk:AtkHypertext:link-selected");
+  add_signal_listener (generic_event_listener,
+                       "Gtk:AtkObject:visible-data-changed");
+  add_signal_listener (generic_event_listener,
+                       "Gtk:AtkSelection:selection-changed");
+  add_signal_listener (generic_event_listener,
+                       "Gtk:AtkText:text-attributes-changed");
+  add_signal_listener (generic_event_listener,
+                       "Gtk:AtkText:text-caret-moved");
+  add_signal_listener (generic_event_listener, "Gtk:AtkTable:row-inserted");
+  add_signal_listener (generic_event_listener, "Gtk:AtkTable:row-reordered");
+  add_signal_listener (generic_event_listener, "Gtk:AtkTable:row-deleted");
+  add_signal_listener (generic_event_listener,
+                       "Gtk:AtkTable:column-inserted");
+  add_signal_listener (generic_event_listener,
+                       "Gtk:AtkTable:column-reordered");
+  add_signal_listener (generic_event_listener, "Gtk:AtkTable:column-deleted");
+  add_signal_listener (generic_event_listener, "Gtk:AtkTable:model-changed");
+  add_signal_listener (children_changed_event_listener, "Gtk:AtkObject:children-changed");
+
+#if 0
+  g_signal_connect (G_OBJECT (spi_global_app_data->root),
+                    "children-changed::add",
+                    (GCallback) toplevel_added_event_listener, NULL);
+
+  g_signal_connect (G_OBJECT (spi_global_app_data->root),
+                    "children-changed::remove",
+                    (GCallback) toplevel_removed_event_listener, NULL);
+#endif
+
+  /*
+   * May add the following listeners to implement preemptive key listening for GTK+
+   *
+   * atk_add_global_event_listener (spi_atk_bridge_widgetkey_listener, "Gtk:GtkWidget:key-press-event");
+   * atk_add_global_event_listener (spi_atk_bridge_widgetkey_listener, "Gtk:GtkWidget:key-release-event");
+   */
+  atk_bridge_key_event_listener_id =
+      atk_add_key_event_listener (spi_atk_bridge_key_listener, NULL);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * De-registers all ATK signal handlers.
+ */
+void
+spi_atk_deregister_event_listeners (void)
+{
+  gint i;
+  GArray *ids = listener_ids;
+  listener_ids = NULL;
+
+  if (atk_bridge_focus_tracker_id)
+    {
+      atk_remove_focus_tracker (atk_bridge_focus_tracker_id);
+      atk_bridge_focus_tracker_id = 0;
+    }
+
+  if (ids)
+    {
+      for (i = 0; i < ids->len; i++)
+        {
+          atk_remove_global_event_listener (g_array_index (ids, guint, i));
+        }
+      g_array_free (ids, TRUE);
+    }
+
+  if (atk_bridge_key_event_listener_id)
+    {
+      atk_remove_key_event_listener (atk_bridge_key_event_listener_id);
+      atk_bridge_key_event_listener_id = 0;
+    }
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * TODO This function seems out of place here.
+ *
+ * Emits fake deactivate signals on all top-level windows.
+ * Used when shutting down AT-SPI, ensuring that all
+ * windows have been removed on the client side.
+ */
+void
+spi_atk_tidy_windows (void)
+{
+  AtkObject *root;
+  gint n_children;
+  gint i;
+
+  root = atk_get_root ();
+  n_children = atk_object_get_n_accessible_children (root);
+  for (i = 0; i < n_children; i++)
+    {
+      AtkObject *child;
+      AtkStateSet *stateset;
+      const gchar *name;
+
+      child = atk_object_ref_accessible_child (root, i);
+      stateset = atk_object_ref_state_set (child);
+
+      name = atk_object_get_name (child);
+      if (atk_state_set_contains_state (stateset, ATK_STATE_ACTIVE))
+        {
+          emit_event (child, ITF_EVENT_WINDOW, "deactivate", NULL, 0, 0,
+                      DBUS_TYPE_STRING_AS_STRING, name, append_basic);
+        }
+      g_object_unref (stateset);
+
+      emit_event (child, ITF_EVENT_WINDOW, "destroy", NULL, 0, 0,
+                  DBUS_TYPE_STRING_AS_STRING, name, append_basic);
+      g_object_unref (child);
+    }
+}
+
+gboolean
+spi_event_is_subtype (gchar **needle, gchar **haystack)
+{
+  while (*haystack && **haystack)
+    {
+      if (g_strcmp0 (*needle, *haystack))
+        return FALSE;
+      needle++;
+      haystack++;
+    }
+  return TRUE;
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/event.h b/atk-adaptor/event.h
new file mode 100644 (file)
index 0000000..023f83e
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ * Copyright 2008, 2009 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 EVENT_H
+#define EVENT_H
+
+void spi_atk_register_event_listeners (void);
+void spi_atk_deregister_event_listeners (void);
+void spi_atk_tidy_windows (void);
+
+gboolean spi_event_is_subtype (gchar **needle, gchar **haystack);
+
+extern GMainContext *spi_context;
+guint spi_idle_add (GSourceFunc function, gpointer data);
+guint spi_timeout_add_seconds (gint interval, GSourceFunc function, gpointer data);
+guint spi_timeout_add_full (gint priority, guint interval, GSourceFunc function, gpointer data, GDestroyNotify notify);
+#endif /* EVENT_H */
diff --git a/atk-adaptor/gtk-2.0/module.c b/atk-adaptor/gtk-2.0/module.c
new file mode 100644 (file)
index 0000000..6ba965a
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008, 2009 Codethink Ltd.
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.,
+ * Copyright 2001, 2002, 2003 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#define _GNU_SOURCE
+#include "config.h"
+
+#include <atk-bridge.h>
+#include <gmodule.h>
+
+/*---------------------------------------------------------------------------*/
+
+int
+gtk_module_init (gint *argc, gchar **argv[])
+{
+  return atk_bridge_adaptor_init (argc, argv);
+}
+
+gchar *
+g_module_check_init (GModule *module)
+{
+  g_module_make_resident (module);
+
+  return NULL;
+}
+
+void
+gnome_accessibility_module_init (void)
+{
+  atk_bridge_adaptor_init (NULL, NULL);
+
+  if (g_getenv ("AT_SPI_DEBUG"))
+    {
+      g_print ("Atk Accessibility bridge initialized\n");
+    }
+}
+
+void
+gnome_accessibility_module_shutdown (void)
+{
+  atk_bridge_adaptor_cleanup ();
+}
diff --git a/atk-adaptor/meson.build b/atk-adaptor/meson.build
new file mode 100644 (file)
index 0000000..9175895
--- /dev/null
@@ -0,0 +1,64 @@
+subdir('adaptors')
+
+atk_bridge_sources = [
+  introspection_generated,
+  'accessible-leasing.c',
+  'accessible-cache.c',
+  'accessible-register.c',
+  'accessible-stateset.c',
+  'bridge.c',
+  'object.c',
+  'event.c',
+  'spi-dbus.c',
+]
+
+install_headers([ 'atk-bridge.h' ], subdir: join_paths('at-spi2-atk', '2.0'))
+
+libatk_bridge = library('atk-bridge-2.0', atk_bridge_sources,
+                        include_directories: root_inc,
+                        dependencies: [
+                          libatk_bridge_adaptors_dep,
+                          libdroute_dep,
+                          libdbus_dep,
+                          gmodule_dep,
+                          gobject_dep,
+                          libatk_dep,
+                          atspi_dep,
+                        ],
+                        c_args: p2p_cflags,
+                        version: atk_bridge_libversion,
+                        soversion: atk_bridge_soversion,
+                        install: true)
+
+libatk_bridge_dep = declare_dependency(link_with: libatk_bridge,
+                                       include_directories: [
+                                         root_inc,
+                                         include_directories('.')
+                                       ])
+
+if get_option('gtk2_atk_adaptor')
+  atk_bridge_module = shared_module('atk-bridge', 'gtk-2.0/module.c',
+                                    include_directories: root_inc,
+                                    dependencies: [
+                                      libatk_bridge_dep,
+                                      libdbus_dep,
+                                      libatk_dep,
+                                      atspi_dep,
+                                      gmodule_dep,
+                                    ],
+                                    c_args: p2p_cflags,
+                                    install: true,
+                                    install_dir: join_paths(get_option('libdir'), 'gtk-2.0', 'modules'))
+endif
+
+pkgconfig = import('pkgconfig')
+pkgconfig.generate(
+  name: 'atk-bridge-2.0',
+  description: 'ATK/D-Bus Bridge',
+  version: atk_bridge_version,
+  libraries: libatk_bridge,
+  requires_private: ['gobject-2.0', 'atspi-2'],
+  filebase: 'atk-bridge-2.0',
+  subdirs: 'at-spi2-atk/2.0',
+  install_dir: join_paths(get_option('libdir'), 'pkgconfig'),
+)
diff --git a/atk-adaptor/object.c b/atk-adaptor/object.c
new file mode 100644 (file)
index 0000000..43d26ac
--- /dev/null
@@ -0,0 +1,520 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008, 2009, 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * This module contains utility functions for exporting AT-SPI
+ * objects based upon an ATK object.
+ *
+ * It incudes functions for marshalling object references
+ * and supported interfaces to a D-Bus message.
+ */
+
+#include "atspi/atspi.h"
+#include "spi-dbus.h"
+#include <atk/atk.h>
+
+#include "accessible-cache.h"
+#include "accessible-leasing.h"
+#include "accessible-register.h"
+
+#include "bridge.h"
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * This is the all important function that decides whether an object should
+ * be leased or not.
+ *
+ * The choice of algorithm for this is somewhat vuage. We want ideally to lease
+ * all atk objects that are not owned by their parent.
+ *
+ * The 'cache' object attempts to cache all objects that are owned by their
+ * parent by traversing the tree of accessibles, ignoring the children of
+ * manages-descendants and transient objects.
+ *
+ * This function will simply look for all the accessibles that the cache object
+ * has not found and assume that they need to be leased.
+ */
+void
+spi_object_lease_if_needed (GObject *obj)
+{
+  if (!spi_cache_in (spi_global_cache, obj))
+    {
+      spi_leasing_take (spi_global_leasing, obj);
+    }
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * It is assumed that all of these functions are returning an accessible
+ * object to the client side.
+ *
+ * All of them will lease the AtkObject if it is deemed neccessary.
+ */
+
+void
+spi_object_append_null_reference (DBusMessageIter *iter)
+{
+  DBusMessageIter iter_struct;
+  const char *name;
+  const char *path = ATSPI_DBUS_PATH_NULL;
+
+  name = dbus_bus_get_unique_name (spi_global_app_data->bus);
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+}
+
+void
+spi_object_append_reference (DBusMessageIter *iter, AtkObject *obj)
+{
+  DBusMessageIter iter_struct;
+  const gchar *name;
+  gchar *path;
+
+  if (!obj)
+    {
+      spi_object_append_null_reference (iter);
+      return;
+    }
+
+  spi_object_lease_if_needed (G_OBJECT (obj));
+
+  name = dbus_bus_get_unique_name (spi_global_app_data->bus);
+  path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
+
+  if (!path)
+    path = g_strdup (SPI_DBUS_PATH_NULL);
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+
+  g_free (path);
+}
+
+/* TODO: Perhaps combine with spi_object_append_reference.  Leaving separate
+ * for now in case we want to use a different path for hyperlinks. */
+void
+spi_hyperlink_append_reference (DBusMessageIter *iter, AtkHyperlink *obj)
+{
+  DBusMessageIter iter_struct;
+  const gchar *name;
+  gchar *path;
+
+  if (!obj)
+    {
+      spi_object_append_null_reference (iter);
+      return;
+    }
+
+  spi_object_lease_if_needed (G_OBJECT (obj));
+
+  name = dbus_bus_get_unique_name (spi_global_app_data->bus);
+  path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));
+
+  if (!path)
+    path = g_strdup (SPI_DBUS_PATH_NULL);
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+
+  g_free (path);
+}
+
+void
+spi_object_append_v_reference (DBusMessageIter *iter, AtkObject *obj)
+{
+  DBusMessageIter iter_variant;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)",
+                                    &iter_variant);
+  spi_object_append_reference (&iter_variant, obj);
+  dbus_message_iter_close_container (iter, &iter_variant);
+}
+
+void
+spi_object_append_desktop_reference (DBusMessageIter *iter)
+{
+  DBusMessageIter iter_struct;
+  const char *name = spi_global_app_data->desktop_name;
+  const char *path = spi_global_app_data->desktop_path;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
+                                    &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+}
+
+DBusMessage *
+spi_object_return_reference (DBusMessage *msg, AtkObject *obj)
+{
+  DBusMessage *reply;
+
+  reply = dbus_message_new_method_return (msg);
+  if (reply)
+    {
+      DBusMessageIter iter;
+      dbus_message_iter_init_append (reply, &iter);
+      spi_object_append_reference (&iter, obj);
+    }
+
+  return reply;
+}
+
+DBusMessage *
+spi_hyperlink_return_reference (DBusMessage *msg, AtkHyperlink *obj)
+{
+  DBusMessage *reply;
+
+  reply = dbus_message_new_method_return (msg);
+  if (reply)
+    {
+      DBusMessageIter iter;
+      dbus_message_iter_init_append (reply, &iter);
+      spi_hyperlink_append_reference (&iter, obj);
+    }
+  if (obj)
+    g_object_unref (G_OBJECT (obj));
+
+  return reply;
+}
+
+/*---------------------------------------------------------------------------*/
+
+void
+spi_object_append_interfaces (DBusMessageIter *iter, AtkObject *obj)
+{
+  const gchar *itf;
+
+  itf = ATSPI_DBUS_INTERFACE_ACCESSIBLE;
+  dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+
+  if (ATK_IS_ACTION (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_ACTION;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (atk_object_get_role (obj) == ATK_ROLE_APPLICATION)
+    {
+      itf = ATSPI_DBUS_INTERFACE_APPLICATION;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_COMPONENT (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_COMPONENT;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_EDITABLE_TEXT (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_EDITABLE_TEXT;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_TEXT (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_TEXT;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_HYPERTEXT (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_HYPERTEXT;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_IMAGE (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_IMAGE;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_SELECTION (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_SELECTION;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_TABLE (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_TABLE;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_TABLE_CELL (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_TABLE_CELL;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_VALUE (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_VALUE;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+#if 0
+  if (ATK_IS_STREAMABLE_CONTENT (obj))
+    {
+      itf = "org.a11y.atspi.StreamableContent";
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+#endif
+
+  if (ATK_IS_OBJECT (obj))
+    {
+      itf = "org.a11y.atspi.Collection";
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_DOCUMENT (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_DOCUMENT;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+
+  if (ATK_IS_HYPERLINK_IMPL (obj))
+    {
+      itf = ATSPI_DBUS_INTERFACE_HYPERLINK;
+      dbus_message_iter_append_basic (iter, DBUS_TYPE_STRING, &itf);
+    }
+}
+
+/*---------------------------------------------------------------------------*/
+
+void
+spi_object_append_attribute_set (DBusMessageIter *iter, AtkAttributeSet *attr)
+{
+  DBusMessageIter dictIter;
+
+  dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY, "{ss}", &dictIter);
+  while (attr)
+    {
+      DBusMessageIter dictEntryIter;
+      AtkAttribute *attribute = (AtkAttribute *) attr->data;
+      const char *key = attribute->name;
+      const char *value = attribute->value;
+
+      if (key == NULL)
+        key = "";
+      if (value == NULL)
+        value = "";
+
+      dbus_message_iter_open_container (&dictIter, DBUS_TYPE_DICT_ENTRY, NULL,
+                                        &dictEntryIter);
+      dbus_message_iter_append_basic (&dictEntryIter, DBUS_TYPE_STRING,
+                                      &key);
+      dbus_message_iter_append_basic (&dictEntryIter, DBUS_TYPE_STRING,
+                                      &value);
+      dbus_message_iter_close_container (&dictIter, &dictEntryIter);
+      attr = g_slist_next (attr);
+    }
+  dbus_message_iter_close_container (iter, &dictIter);
+}
+
+/*---------------------------------------------------------------------------*/
+
+static gboolean
+init_role_lookup_table (AtspiRole *role_table)
+{
+  int i;
+  /* if it's not in the list below, dunno what it is */
+  for (i = 0; i < ATK_ROLE_LAST_DEFINED; ++i)
+    {
+      role_table[i] = ATSPI_ROLE_UNKNOWN;
+    }
+
+  role_table[ATK_ROLE_INVALID] = ATSPI_ROLE_INVALID;
+  role_table[ATK_ROLE_ACCEL_LABEL] = ATSPI_ROLE_ACCELERATOR_LABEL;
+  role_table[ATK_ROLE_ALERT] = ATSPI_ROLE_ALERT;
+  role_table[ATK_ROLE_ANIMATION] = ATSPI_ROLE_ANIMATION;
+  role_table[ATK_ROLE_ARROW] = ATSPI_ROLE_ARROW;
+  role_table[ATK_ROLE_CALENDAR] = ATSPI_ROLE_CALENDAR;
+  role_table[ATK_ROLE_CANVAS] = ATSPI_ROLE_CANVAS;
+  role_table[ATK_ROLE_CHECK_BOX] = ATSPI_ROLE_CHECK_BOX;
+  role_table[ATK_ROLE_CHECK_MENU_ITEM] = ATSPI_ROLE_CHECK_MENU_ITEM;
+  role_table[ATK_ROLE_COLOR_CHOOSER] = ATSPI_ROLE_COLOR_CHOOSER;
+  role_table[ATK_ROLE_COLUMN_HEADER] = ATSPI_ROLE_COLUMN_HEADER;
+  role_table[ATK_ROLE_COMBO_BOX] = ATSPI_ROLE_COMBO_BOX;
+  role_table[ATK_ROLE_DATE_EDITOR] = ATSPI_ROLE_DATE_EDITOR;
+  role_table[ATK_ROLE_DESKTOP_ICON] = ATSPI_ROLE_DESKTOP_ICON;
+  role_table[ATK_ROLE_DESKTOP_FRAME] = ATSPI_ROLE_DESKTOP_FRAME;
+  role_table[ATK_ROLE_DIAL] = ATSPI_ROLE_DIAL;
+  role_table[ATK_ROLE_DIALOG] = ATSPI_ROLE_DIALOG;
+  role_table[ATK_ROLE_DIRECTORY_PANE] = ATSPI_ROLE_DIRECTORY_PANE;
+  role_table[ATK_ROLE_DRAWING_AREA] = ATSPI_ROLE_DRAWING_AREA;
+  role_table[ATK_ROLE_FILE_CHOOSER] = ATSPI_ROLE_FILE_CHOOSER;
+  role_table[ATK_ROLE_FILLER] = ATSPI_ROLE_FILLER;
+  role_table[ATK_ROLE_FONT_CHOOSER] = ATSPI_ROLE_FONT_CHOOSER;
+  role_table[ATK_ROLE_FRAME] = ATSPI_ROLE_FRAME;
+  role_table[ATK_ROLE_GLASS_PANE] = ATSPI_ROLE_GLASS_PANE;
+  role_table[ATK_ROLE_HTML_CONTAINER] = ATSPI_ROLE_HTML_CONTAINER;
+  role_table[ATK_ROLE_ICON] = ATSPI_ROLE_ICON;
+  role_table[ATK_ROLE_IMAGE] = ATSPI_ROLE_IMAGE;
+  role_table[ATK_ROLE_INTERNAL_FRAME] = ATSPI_ROLE_INTERNAL_FRAME;
+  role_table[ATK_ROLE_LABEL] = ATSPI_ROLE_LABEL;
+  role_table[ATK_ROLE_LAYERED_PANE] = ATSPI_ROLE_LAYERED_PANE;
+  role_table[ATK_ROLE_LIST] = ATSPI_ROLE_LIST;
+  role_table[ATK_ROLE_LIST_ITEM] = ATSPI_ROLE_LIST_ITEM;
+  role_table[ATK_ROLE_MENU] = ATSPI_ROLE_MENU;
+  role_table[ATK_ROLE_MENU_BAR] = ATSPI_ROLE_MENU_BAR;
+  role_table[ATK_ROLE_MENU_ITEM] = ATSPI_ROLE_MENU_ITEM;
+  role_table[ATK_ROLE_OPTION_PANE] = ATSPI_ROLE_OPTION_PANE;
+  role_table[ATK_ROLE_PAGE_TAB] = ATSPI_ROLE_PAGE_TAB;
+  role_table[ATK_ROLE_PAGE_TAB_LIST] = ATSPI_ROLE_PAGE_TAB_LIST;
+  role_table[ATK_ROLE_PANEL] = ATSPI_ROLE_PANEL;
+  role_table[ATK_ROLE_PASSWORD_TEXT] = ATSPI_ROLE_PASSWORD_TEXT;
+  role_table[ATK_ROLE_POPUP_MENU] = ATSPI_ROLE_POPUP_MENU;
+  role_table[ATK_ROLE_PROGRESS_BAR] = ATSPI_ROLE_PROGRESS_BAR;
+  role_table[ATK_ROLE_PUSH_BUTTON] = ATSPI_ROLE_PUSH_BUTTON;
+  role_table[ATK_ROLE_RADIO_BUTTON] = ATSPI_ROLE_RADIO_BUTTON;
+  role_table[ATK_ROLE_RADIO_MENU_ITEM] = ATSPI_ROLE_RADIO_MENU_ITEM;
+  role_table[ATK_ROLE_ROOT_PANE] = ATSPI_ROLE_ROOT_PANE;
+  role_table[ATK_ROLE_ROW_HEADER] = ATSPI_ROLE_ROW_HEADER;
+  role_table[ATK_ROLE_SCROLL_BAR] = ATSPI_ROLE_SCROLL_BAR;
+  role_table[ATK_ROLE_SCROLL_PANE] = ATSPI_ROLE_SCROLL_PANE;
+  role_table[ATK_ROLE_SEPARATOR] = ATSPI_ROLE_SEPARATOR;
+  role_table[ATK_ROLE_SLIDER] = ATSPI_ROLE_SLIDER;
+  role_table[ATK_ROLE_SPIN_BUTTON] = ATSPI_ROLE_SPIN_BUTTON;
+  role_table[ATK_ROLE_SPLIT_PANE] = ATSPI_ROLE_SPLIT_PANE;
+  role_table[ATK_ROLE_STATUSBAR] = ATSPI_ROLE_STATUS_BAR;
+  role_table[ATK_ROLE_TABLE] = ATSPI_ROLE_TABLE;
+  role_table[ATK_ROLE_TABLE_CELL] = ATSPI_ROLE_TABLE_CELL;
+  role_table[ATK_ROLE_TABLE_COLUMN_HEADER] =
+      ATSPI_ROLE_TABLE_COLUMN_HEADER;
+  role_table[ATK_ROLE_TABLE_ROW_HEADER] = ATSPI_ROLE_TABLE_ROW_HEADER;
+  role_table[ATK_ROLE_TEAR_OFF_MENU_ITEM] =
+      ATSPI_ROLE_TEAROFF_MENU_ITEM;
+  role_table[ATK_ROLE_TERMINAL] = ATSPI_ROLE_TERMINAL;
+  role_table[ATK_ROLE_TEXT] = ATSPI_ROLE_TEXT;
+  role_table[ATK_ROLE_TOGGLE_BUTTON] = ATSPI_ROLE_TOGGLE_BUTTON;
+  role_table[ATK_ROLE_TOOL_BAR] = ATSPI_ROLE_TOOL_BAR;
+  role_table[ATK_ROLE_TOOL_TIP] = ATSPI_ROLE_TOOL_TIP;
+  role_table[ATK_ROLE_TREE] = ATSPI_ROLE_TREE;
+  role_table[ATK_ROLE_TREE_TABLE] = ATSPI_ROLE_TREE_TABLE;
+  role_table[ATK_ROLE_UNKNOWN] = ATSPI_ROLE_UNKNOWN;
+  role_table[ATK_ROLE_VIEWPORT] = ATSPI_ROLE_VIEWPORT;
+  role_table[ATK_ROLE_WINDOW] = ATSPI_ROLE_WINDOW;
+  role_table[ATK_ROLE_HEADER] = ATSPI_ROLE_HEADER;
+  role_table[ATK_ROLE_FOOTER] = ATSPI_ROLE_FOOTER;
+  role_table[ATK_ROLE_PARAGRAPH] = ATSPI_ROLE_PARAGRAPH;
+  role_table[ATK_ROLE_RULER] = ATSPI_ROLE_RULER;
+  role_table[ATK_ROLE_APPLICATION] = ATSPI_ROLE_APPLICATION;
+  role_table[ATK_ROLE_AUTOCOMPLETE] = ATSPI_ROLE_AUTOCOMPLETE;
+  role_table[ATK_ROLE_EDITBAR] = ATSPI_ROLE_EDITBAR;
+  role_table[ATK_ROLE_EMBEDDED] = ATSPI_ROLE_EMBEDDED;
+  role_table[ATK_ROLE_ENTRY] = ATSPI_ROLE_ENTRY;
+  role_table[ATK_ROLE_CHART] = ATSPI_ROLE_CHART;
+  role_table[ATK_ROLE_CAPTION] = ATSPI_ROLE_CAPTION;
+  role_table[ATK_ROLE_DOCUMENT_FRAME] = ATSPI_ROLE_DOCUMENT_FRAME;
+  role_table[ATK_ROLE_HEADING] = ATSPI_ROLE_HEADING;
+  role_table[ATK_ROLE_PAGE] = ATSPI_ROLE_PAGE;
+  role_table[ATK_ROLE_SECTION] = ATSPI_ROLE_SECTION;
+  role_table[ATK_ROLE_FORM] = ATSPI_ROLE_FORM;
+  role_table[ATK_ROLE_REDUNDANT_OBJECT] = ATSPI_ROLE_REDUNDANT_OBJECT;
+  role_table[ATK_ROLE_LINK] = ATSPI_ROLE_LINK;
+  role_table[ATK_ROLE_INPUT_METHOD_WINDOW] =
+      ATSPI_ROLE_INPUT_METHOD_WINDOW;
+  role_table[ATK_ROLE_TABLE_ROW] = ATSPI_ROLE_TABLE_ROW;
+  role_table[ATK_ROLE_TREE_ITEM] = ATSPI_ROLE_TREE_ITEM;
+  role_table[ATK_ROLE_DOCUMENT_SPREADSHEET] =
+      ATSPI_ROLE_DOCUMENT_SPREADSHEET;
+  role_table[ATK_ROLE_DOCUMENT_PRESENTATION] =
+      ATSPI_ROLE_DOCUMENT_PRESENTATION;
+  role_table[ATK_ROLE_DOCUMENT_TEXT] = ATSPI_ROLE_DOCUMENT_TEXT;
+  role_table[ATK_ROLE_DOCUMENT_WEB] = ATSPI_ROLE_DOCUMENT_WEB;
+  role_table[ATK_ROLE_DOCUMENT_EMAIL] = ATSPI_ROLE_DOCUMENT_EMAIL;
+  role_table[ATK_ROLE_COMMENT] = ATSPI_ROLE_COMMENT;
+  role_table[ATK_ROLE_LIST_BOX] = ATSPI_ROLE_LIST_BOX;
+  role_table[ATK_ROLE_GROUPING] = ATSPI_ROLE_GROUPING;
+  role_table[ATK_ROLE_IMAGE_MAP] = ATSPI_ROLE_IMAGE_MAP;
+  role_table[ATK_ROLE_NOTIFICATION] = ATSPI_ROLE_NOTIFICATION;
+  role_table[ATK_ROLE_INFO_BAR] = ATSPI_ROLE_INFO_BAR;
+  role_table[ATK_ROLE_LEVEL_BAR] = ATSPI_ROLE_LEVEL_BAR;
+  role_table[ATK_ROLE_TITLE_BAR] = ATSPI_ROLE_TITLE_BAR;
+  role_table[ATK_ROLE_BLOCK_QUOTE] = ATSPI_ROLE_BLOCK_QUOTE;
+  role_table[ATK_ROLE_AUDIO] = ATSPI_ROLE_AUDIO;
+  role_table[ATK_ROLE_VIDEO] = ATSPI_ROLE_VIDEO;
+  role_table[ATK_ROLE_DEFINITION] = ATSPI_ROLE_DEFINITION;
+  role_table[ATK_ROLE_ARTICLE] = ATSPI_ROLE_ARTICLE;
+  role_table[ATK_ROLE_LANDMARK] = ATSPI_ROLE_LANDMARK;
+  role_table[ATK_ROLE_LOG] = ATSPI_ROLE_LOG;
+  role_table[ATK_ROLE_MARQUEE] = ATSPI_ROLE_MARQUEE;
+  role_table[ATK_ROLE_MATH] = ATSPI_ROLE_MATH;
+  role_table[ATK_ROLE_RATING] = ATSPI_ROLE_RATING;
+  role_table[ATK_ROLE_TIMER] = ATSPI_ROLE_TIMER;
+  role_table[ATK_ROLE_STATIC] = ATSPI_ROLE_STATIC;
+  role_table[ATK_ROLE_MATH_FRACTION] = ATSPI_ROLE_MATH_FRACTION;
+  role_table[ATK_ROLE_MATH_ROOT] = ATSPI_ROLE_MATH_ROOT;
+  role_table[ATK_ROLE_SUBSCRIPT] = ATSPI_ROLE_SUBSCRIPT;
+  role_table[ATK_ROLE_SUPERSCRIPT] = ATSPI_ROLE_SUPERSCRIPT;
+  role_table[ATK_ROLE_DESCRIPTION_LIST] = ATSPI_ROLE_DESCRIPTION_LIST;
+  role_table[ATK_ROLE_DESCRIPTION_TERM] = ATSPI_ROLE_DESCRIPTION_TERM;
+  role_table[ATK_ROLE_DESCRIPTION_VALUE] = ATSPI_ROLE_DESCRIPTION_VALUE;
+  role_table[ATK_ROLE_FOOTNOTE] = ATSPI_ROLE_FOOTNOTE;
+  role_table[ATK_ROLE_CONTENT_DELETION] = ATSPI_ROLE_CONTENT_DELETION;
+  role_table[ATK_ROLE_CONTENT_INSERTION] = ATSPI_ROLE_CONTENT_INSERTION;
+  role_table[ATK_ROLE_MARK] = ATSPI_ROLE_MARK;
+  role_table[ATK_ROLE_SUGGESTION] = ATSPI_ROLE_SUGGESTION;
+  role_table[ATK_ROLE_PUSH_BUTTON_MENU] = ATSPI_ROLE_PUSH_BUTTON_MENU;
+
+  return TRUE;
+}
+
+AtspiRole
+spi_accessible_role_from_atk_role (AtkRole role)
+{
+  static gboolean is_initialized = FALSE;
+  static AtspiRole spi_role_table[ATK_ROLE_LAST_DEFINED];
+  AtspiRole spi_role;
+
+  if (!is_initialized)
+    {
+      is_initialized = init_role_lookup_table (spi_role_table);
+    }
+
+  if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
+    {
+      spi_role = spi_role_table[role];
+    }
+  else
+    {
+      spi_role = ATSPI_ROLE_EXTENDED;
+    }
+  return spi_role;
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/atk-adaptor/object.h b/atk-adaptor/object.h
new file mode 100644 (file)
index 0000000..b52d3ce
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008, 2009, 2010 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ACCESSIBLE_OBJECT_H
+#define ACCESSIBLE_OBJECT_H
+
+#include <atk/atk.h>
+#include <dbus/dbus.h>
+
+void
+spi_object_lease_if_needed (GObject *obj);
+
+void
+spi_object_append_reference (DBusMessageIter *iter, AtkObject *obj);
+
+void
+spi_hyperlink_append_reference (DBusMessageIter *iter, AtkObject *obj);
+
+void
+spi_object_append_v_reference (DBusMessageIter *iter, AtkObject *obj);
+
+void
+spi_object_append_desktop_reference (DBusMessageIter *iter);
+
+void
+spi_object_append_null_reference (DBusMessageIter *iter);
+
+DBusMessage *
+spi_object_return_reference (DBusMessage *msg, AtkObject *obj);
+
+DBusMessage *
+spi_hyperlink_return_reference (DBusMessage *msg, AtkHyperlink *obj);
+
+void
+spi_object_append_interfaces (DBusMessageIter *iter, AtkObject *obj);
+
+void
+spi_object_append_attribute_set (DBusMessageIter *iter, AtkAttributeSet *attr);
+
+AtspiRole
+spi_accessible_role_from_atk_role (AtkRole role);
+
+#endif /* ACCESSIBLE_OBJECT_H */
diff --git a/atk-adaptor/spi-dbus.c b/atk-adaptor/spi-dbus.c
new file mode 100644 (file)
index 0000000..0593de5
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <dbus/dbus.h>
+#include <glib-object.h>
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "accessible-register.h"
+#include <atspi/atspi.h>
+
+DBusMessage *
+spi_dbus_general_error (DBusMessage *message)
+{
+  return dbus_message_new_error (message,
+                                 "org.a11y.atspi.GeneralError",
+                                 "General error");
+}
+
+DBusMessage *
+spi_dbus_return_rect (DBusMessage *message, gint ix, gint iy, gint iwidth, gint iheight)
+{
+  DBusMessage *reply;
+  dbus_uint32_t x, y, width, height;
+
+  x = ix;
+  y = iy;
+  width = iwidth;
+  height = iheight;
+  reply = dbus_message_new_method_return (message);
+  if (reply)
+    {
+      DBusMessageIter iter, sub;
+      dbus_message_iter_init_append (reply, &iter);
+      if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &sub))
+        goto oom;
+      dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &x);
+      dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &y);
+      dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &width);
+      dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &height);
+      if (!dbus_message_iter_close_container (&iter, &sub))
+        goto oom;
+    }
+  return reply;
+oom:
+  /* todo: return an error */
+  return reply;
+}
+
+dbus_bool_t
+spi_dbus_message_iter_get_struct (DBusMessageIter *iter, ...)
+{
+  va_list args;
+  DBusMessageIter iter_struct;
+  int type;
+  void *ptr;
+
+  dbus_message_iter_recurse (iter, &iter_struct);
+  va_start (args, iter);
+  for (;;)
+    {
+      type = va_arg (args, int);
+      if (type == DBUS_TYPE_INVALID)
+        break;
+      if (type != dbus_message_iter_get_arg_type (&iter_struct))
+        {
+          va_end (args);
+          return FALSE;
+        }
+      ptr = va_arg (args, void *);
+      dbus_message_iter_get_basic (&iter_struct, ptr);
+      dbus_message_iter_next (&iter_struct);
+    }
+  dbus_message_iter_next (iter);
+  va_end (args);
+  return TRUE;
+}
+
+dbus_bool_t
+spi_dbus_message_iter_append_struct (DBusMessageIter *iter, ...)
+{
+  va_list args;
+  DBusMessageIter iter_struct;
+  int type;
+  void *ptr;
+
+  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL, &iter_struct))
+    return FALSE;
+  va_start (args, iter);
+  for (;;)
+    {
+      type = va_arg (args, int);
+      if (type == DBUS_TYPE_INVALID)
+        break;
+      ptr = va_arg (args, void *);
+      dbus_message_iter_append_basic (&iter_struct, type, ptr);
+    }
+  va_end (args);
+  if (!dbus_message_iter_close_container (iter, &iter_struct))
+    return FALSE;
+  return TRUE;
+}
+
+dbus_bool_t
+spi_dbus_marshal_deviceEvent (DBusMessage *message, const AtspiDeviceEvent *e)
+{
+  DBusMessageIter iter;
+
+  if (!message)
+    return FALSE;
+  dbus_message_iter_init_append (message, &iter);
+  return spi_dbus_message_iter_append_struct (&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}
+
+dbus_bool_t
+spi_dbus_demarshal_deviceEvent (DBusMessage *message, AtspiDeviceEvent *e)
+{
+  DBusMessageIter iter;
+
+  dbus_message_iter_init (message, &iter);
+  return spi_dbus_message_iter_get_struct (&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}
+
+/*
+ * This is a rather annoying function needed to replace
+ * NULL values of strings with the empty string. Null string
+ * values can be created by the atk_object_get_name or text selection
+ */
+static const void *
+provide_defaults (const gint type,
+                  const void *val)
+{
+  switch (type)
+    {
+    case DBUS_TYPE_STRING:
+    case DBUS_TYPE_OBJECT_PATH:
+      if (!val)
+        return "";
+      else
+        return val;
+    default:
+      return val;
+    }
+}
+
+/*
+ * Appends all the standard parameters to an AT-SPI event.
+ */
+void
+spi_dbus_signal_new (const char *path,
+                     const char *klass,
+                     const char *major,
+                     const char *minor,
+                     dbus_int32_t detail1,
+                     dbus_int32_t detail2)
+{
+  DBusMessage *sig;
+  DBusMessageIter iter;
+  gchar *cname, *t;
+
+  if (!klass)
+    klass = "";
+  if (!major)
+    major = "";
+  if (!minor)
+    minor = "";
+
+  /*
+   * This is very annoying, but as '-' isn't a legal signal
+   * name in D-Bus (Why not??!?) The names need converting
+   * on this side, and again on the client side.
+   */
+  cname = g_strdup (major);
+  while ((t = strchr (cname, '-')) != NULL)
+    *t = '_';
+
+  sig = dbus_message_new_signal (path, klass, cname);
+  g_free (cname);
+
+  dbus_message_iter_init_append (sig, &iter);
+
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &minor);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail1);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail2);
+}
+
+void
+spi_dbus_emit_signal (DBusConnection *bus, const char *path, const char *klass, const char *major, const char *minor, dbus_int32_t detail1, dbus_int32_t detail2, const char *type, const void *val)
+{
+  gchar *cname, *t;
+  DBusMessage *sig;
+  DBusMessageIter iter, sub;
+  if (!klass)
+    klass = "";
+  if (!major)
+    major = "";
+  if (!minor)
+    minor = "";
+  if (!type)
+    type = "u";
+
+  /*
+   * This is very annoying, but as '-' isn't a legal signal
+   * name in D-Bus (Why not??!?) The names need converting
+   * on this side, and again on the client side.
+   */
+  cname = g_strdup (major);
+  while ((t = strchr (cname, '-')) != NULL)
+    *t = '_';
+
+  sig = dbus_message_new_signal (path, klass, cname);
+  g_free (cname);
+
+  dbus_message_iter_init_append (sig, &iter);
+
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &minor);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail1);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &detail2);
+
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, type, &sub);
+  /*
+   * I need to convert the string signature to an integer type signature.
+   * DBUS_TYPE_INT32 is defined as 'i' whereas the string is "i".
+   * I should just be able to cast the first character of the string to an
+   * integer.
+   */
+  val = provide_defaults ((int) *type, val);
+  dbus_message_iter_append_basic (&sub, (int) *type, &val);
+  dbus_message_iter_close_container (&iter, &sub);
+
+  dbus_connection_send (bus, sig, NULL);
+  dbus_message_unref (sig);
+}
+
+/*
+dbus_bool_t spi_dbus_get_simple_property (DBusConnection *bus, const char *dest, const char *path, const char *interface, const char *prop, int *type, void *ptr, DBusError *error)
+{
+  DBusMessage *message, *reply;
+  DBusMessageIter iter, iter_variant;
+  int typ;
+
+  dbus_error_init (error);
+  message = dbus_message_new_method_call (dest, path, "org.freedesktop.DBus.Properties", "get");
+  if (!message) return FALSE;
+  if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &prop, DBUS_TYPE_INVALID))
+  {
+    return FALSE;
+  }
+  reply = dbus_connection_send_with_reply_and_block (bus, message, 1000, error);
+  dbus_message_unref (message);
+  if (!reply) return FALSE;
+  dbus_message_iter_init (reply, &iter);
+  dbus_message_iter_recurse (&iter, &iter_variant);
+  typ = dbus_message_iter_get_arg_type (&iter_variant);
+  if (type) *type = typ;
+  if (typ == DBUS_TYPE_INVALID || typ == DBUS_TYPE_STRUCT || typ == DBUS_TYPE_ARRAY)
+  {
+    return FALSE;
+  }
+  dbus_message_iter_get_basic (&iter_variant, ptr);
+  dbus_message_unref (reply);
+  return TRUE;
+}
+*/
+
+/* Returns an AtkObject from a DBusMessageIter and advances the iter.
+ * Expects the iter to point to a (so) structure representing an object. */
+GObject *
+spi_dbus_get_object_from_iter (DBusMessageIter *iter)
+{
+  DBusMessageIter iter_struct;
+  const char *bus_name, *path;
+
+  dbus_message_iter_recurse (iter, &iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &bus_name);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &path);
+  dbus_message_iter_next (iter);
+  /* TODO: verify bus name */
+  return spi_global_register_path_to_object (path);
+}
diff --git a/atk-adaptor/spi-dbus.h b/atk-adaptor/spi-dbus.h
new file mode 100644 (file)
index 0000000..467c11e
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 SPI_DBUS_H_
+#define SPI_DBUS_H_
+
+#include <atspi/atspi.h>
+#include <glib.h>
+
+#define DBG(a, b)  \
+  if (_dbg >= (a)) \
+  b
+
+extern int _dbg;
+
+#define SPI_DBUS_NAME_REGISTRY "org.a11y.atspi.Registry"
+#define SPI_DBUS_PATH_REGISTRY "/org/a11y/atspi/registry"
+#define SPI_DBUS_INTERFACE_REGISTRY "org.a11y.atspi.Registry"
+
+#define SPI_DBUS_PATH_NULL "/org/a11y/atspi/null"
+#define SPI_DBUS_PATH_ROOT "/org/a11y/atspi/accessible/root"
+
+DBusMessage *spi_dbus_general_error (DBusMessage *message);
+DBusMessage *spi_dbus_return_rect (DBusMessage *message, gint ix, gint iy, gint iwidth, gint iheight);
+
+dbus_bool_t spi_dbus_message_iter_get_struct (DBusMessageIter *iter, ...);
+dbus_bool_t spi_dbus_message_iter_append_struct (DBusMessageIter *iter, ...);
+dbus_bool_t spi_dbus_marshal_deviceEvent (DBusMessage *message, const AtspiDeviceEvent *e);
+dbus_bool_t spi_dbus_demarshal_deviceEvent (DBusMessage *message, AtspiDeviceEvent *e);
+dbus_bool_t spi_dbus_get_simple_property (DBusConnection *bus, const char *dest, const char *path, const char *interface, const char *prop, int *type, void *ptr, DBusError *error);
+void spi_dbus_emit_signal (DBusConnection *bus, const char *path, const char *klass, const char *major, const char *minor, dbus_int32_t detail1, dbus_int32_t detail2, const char *type, const void *val);
+GObject *spi_dbus_get_object_from_iter (DBusMessageIter *iter);
+/*
+void spi_dbus_add_disconnect_match (DBusConnection *bus, const char *name);
+void spi_dbus_remove_disconnect_match (DBusConnection *bus, const char *name);
+
+*/
+
+#endif /* SPI_DBUS_H_ */
diff --git a/atk/.gitignore b/atk/.gitignore
new file mode 100644 (file)
index 0000000..dfa38c6
--- /dev/null
@@ -0,0 +1,12 @@
+/.deps
+/.libs
+
+/atk-enum-types.c
+/atk-enum-types.h
+/atk.rc
+/atkmarshal.c
+/atkmarshal.h
+/s-enum-types-c
+/s-enum-types-h
+/stamp-atkmarshal.c
+/stamp-atkmarshal.h
diff --git a/atk/atk-autocleanups.h b/atk/atk-autocleanups.h
new file mode 100644 (file)
index 0000000..b8de1d5
--- /dev/null
@@ -0,0 +1,54 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2020 GNOME Foundation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#ifndef __GI_SCANNER__
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkAction, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkComponent, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkDocument, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkEditableText, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkGObjectAccessible, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkHyperlink, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkHyperlinkImpl, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkHypertext, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkImage, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkImplementor, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkMisc, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkNoOpObjectFactory, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkNoOpObject, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkObjectFactory, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkObject, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkPlug, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkRegistry, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkRelationSet, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkRelation, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkSelection, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkSocket, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkStateSet, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkStreamableContent, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkTableCell, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkTable, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkText, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkUtil, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkValue, g_object_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (AtkWindow, g_object_unref)
+
+#endif /* __GI_SCANNER__ */
diff --git a/atk/atk-enum-types.c.template b/atk/atk-enum-types.c.template
new file mode 100644 (file)
index 0000000..dc2cae9
--- /dev/null
@@ -0,0 +1,38 @@
+/*** BEGIN file-header ***/
+#include "config.h"
+
+#include <atk.h>
+
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+
+/* enumerations from "@basename@" */
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+
+GType
+@enum_name@_get_type (void)
+{
+  static gsize g_define_type_id__volatile;
+
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      static const G@Type@Value values[] = {
+/*** END value-header ***/
+
+/*** BEGIN value-production ***/
+        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+/*** END value-production ***/
+
+/*** BEGIN value-tail ***/
+        { 0, NULL, NULL }
+      };
+      GType g_define_type_id =
+        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+    }
+  return g_define_type_id__volatile;
+}
+/*** END value-tail ***/
diff --git a/atk/atk-enum-types.h.template b/atk/atk-enum-types.h.template
new file mode 100644 (file)
index 0000000..8321c24
--- /dev/null
@@ -0,0 +1,30 @@
+/*** BEGIN file-header ***/
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined (__ATK_H_INSIDE__) && !defined (ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#ifndef __ATK_ENUM_TYPES_H__
+#define __ATK_ENUM_TYPES_H__
+
+#include <atk/atkversion.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+/*** END file-header ***/
+
+/*** BEGIN file-production ***/
+
+/* enumerations from "@basename@" */
+/*** END file-production ***/
+
+/*** BEGIN value-header ***/
+ATK_AVAILABLE_IN_ALL
+GType @enum_name@_get_type (void);
+#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type())
+/*** END value-header ***/
+
+/*** BEGIN file-tail ***/
+G_END_DECLS
+
+#endif /* __ATK_ENUM_TYPES_H__ */
+/*** END file-tail ***/
diff --git a/atk/atk.h b/atk/atk.h
new file mode 100644 (file)
index 0000000..19be905
--- /dev/null
+++ b/atk/atk.h
@@ -0,0 +1,63 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_H__
+#define __ATK_H__
+
+#define __ATK_H_INSIDE__
+
+#include <atk/atk-enum-types.h>
+#include <atk/atkaction.h>
+#include <atk/atkcomponent.h>
+#include <atk/atkdocument.h>
+#include <atk/atkeditabletext.h>
+#include <atk/atkgobjectaccessible.h>
+#include <atk/atkhyperlink.h>
+#include <atk/atkhyperlinkimpl.h>
+#include <atk/atkhypertext.h>
+#include <atk/atkimage.h>
+#include <atk/atkmisc.h>
+#include <atk/atknoopobject.h>
+#include <atk/atknoopobjectfactory.h>
+#include <atk/atkobject.h>
+#include <atk/atkobjectfactory.h>
+#include <atk/atkplug.h>
+#include <atk/atkrange.h>
+#include <atk/atkregistry.h>
+#include <atk/atkrelation.h>
+#include <atk/atkrelationset.h>
+#include <atk/atkrelationtype.h>
+#include <atk/atkselection.h>
+#include <atk/atksocket.h>
+#include <atk/atkstate.h>
+#include <atk/atkstateset.h>
+#include <atk/atkstreamablecontent.h>
+#include <atk/atktable.h>
+#include <atk/atktablecell.h>
+#include <atk/atktext.h>
+#include <atk/atkutil.h>
+#include <atk/atkvalue.h>
+#include <atk/atkversion.h>
+#include <atk/atkwindow.h>
+
+#include <atk/atk-autocleanups.h>
+
+#undef __ATK_H_INSIDE__
+
+#endif /* __ATK_H__ */
diff --git a/atk/atk.rc.in b/atk/atk.rc.in
new file mode 100644 (file)
index 0000000..b572cca
--- /dev/null
@@ -0,0 +1,30 @@
+#include <winver.h>
+
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION @ATK_MAJOR_VERSION@,@ATK_MINOR_VERSION@,@ATK_MICRO_VERSION@,0
+  PRODUCTVERSION @ATK_MAJOR_VERSION@,@ATK_MINOR_VERSION@,@ATK_MICRO_VERSION@,0
+  FILEFLAGSMASK 0
+  FILEFLAGS 0
+  FILEOS VOS__WINDOWS32
+  FILETYPE VFT_DLL
+  FILESUBTYPE VFT2_UNKNOWN
+  BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+      BLOCK "040904B0"
+      BEGIN
+       VALUE "CompanyName", "Sun Microsystems Inc."
+       VALUE "FileDescription", "atk"
+       VALUE "FileVersion", "@ATK_VERSION@.0"
+       VALUE "InternalName", "libatk-1.0-@LT_CURRENT_MINUS_AGE@"
+       VALUE "LegalCopyright", "Copyright Sun Microsystems Inc."
+       VALUE "OriginalFilename", "libatk-1.0-@LT_CURRENT_MINUS_AGE@.dll"
+       VALUE "ProductName", "atk"
+       VALUE "ProductVersion", "@ATK_VERSION@"
+      END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+      VALUE "Translation", 0x409, 1200
+    END
+  END
diff --git a/atk/atkaction.c b/atk/atkaction.c
new file mode 100644 (file)
index 0000000..fa1d228
--- /dev/null
@@ -0,0 +1,286 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkaction.h"
+
+/**
+ * AtkAction:
+ *
+ * The ATK interface provided by UI components
+ * which the user can activate/interact with.
+ *
+ * #AtkAction should be implemented by instances of #AtkObject classes
+ * with which the user can interact directly, i.e. buttons,
+ * checkboxes, scrollbars, e.g. components which are not "passive"
+ * providers of UI information.
+ *
+ * Exceptions: when the user interaction is already covered by another
+ * appropriate interface such as #AtkEditableText (insert/delete text,
+ * etc.) or #AtkValue (set value) then these actions should not be
+ * exposed by #AtkAction as well.
+ *
+ * Though most UI interactions on components should be invocable via
+ * keyboard as well as mouse, there will generally be a close mapping
+ * between "mouse actions" that are possible on a component and the
+ * AtkActions.  Where mouse and keyboard actions are redundant in
+ * effect, #AtkAction should expose only one action rather than
+ * exposing redundant actions if possible.  By convention we have been
+ * using "mouse centric" terminology for #AtkAction names.
+ *
+ */
+
+GType
+atk_action_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkActionIface),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkAction", &tinfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ * atk_action_do_action:
+ * @action: a #GObject instance that implements AtkActionIface
+ * @i: the action index corresponding to the action to be performed
+ *
+ * Perform the specified action on the object.
+ *
+ * Returns: %TRUE if success, %FALSE otherwise
+ *
+ **/
+gboolean
+atk_action_do_action (AtkAction *obj,
+                      gint i)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), FALSE);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->do_action)
+    return (iface->do_action) (obj, i);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_action_get_n_actions:
+ * @action: a #GObject instance that implements AtkActionIface
+ *
+ * Gets the number of accessible actions available on the object.
+ * If there are more than one, the first one is considered the
+ * "default" action of the object.
+ *
+ * Returns: a the number of actions, or 0 if @action does not
+ * implement this interface.
+ **/
+gint
+atk_action_get_n_actions (AtkAction *obj)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), 0);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->get_n_actions)
+    return (iface->get_n_actions) (obj);
+  else
+    return 0;
+}
+
+/**
+ * atk_action_get_description:
+ * @action: a #GObject instance that implements AtkActionIface
+ * @i: the action index corresponding to the action to be performed
+ *
+ * Returns a description of the specified action of the object.
+ *
+ * Returns: (nullable): a description string, or %NULL if @action does
+ * not implement this interface.
+ **/
+const gchar *
+atk_action_get_description (AtkAction *obj,
+                            gint i)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), NULL);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->get_description)
+    return (iface->get_description) (obj, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_action_get_name:
+ * @action: a #GObject instance that implements AtkActionIface
+ * @i: the action index corresponding to the action to be performed
+ *
+ * Returns a non-localized string naming the specified action of the
+ * object. This name is generally not descriptive of the end result
+ * of the action, but instead names the 'interaction type' which the
+ * object supports. By convention, the above strings should be used to
+ * represent the actions which correspond to the common point-and-click
+ * interaction techniques of the same name: i.e.
+ * "click", "press", "release", "drag", "drop", "popup", etc.
+ * The "popup" action should be used to pop up a context menu for the
+ * object, if one exists.
+ *
+ * For technical reasons, some toolkits cannot guarantee that the
+ * reported action is actually 'bound' to a nontrivial user event;
+ * i.e. the result of some actions via atk_action_do_action() may be
+ * NIL.
+ *
+ * Returns: (nullable): a name string, or %NULL if @action does not
+ * implement this interface.
+ **/
+const gchar *
+atk_action_get_name (AtkAction *obj,
+                     gint i)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), NULL);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->get_name)
+    return (iface->get_name) (obj, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_action_get_localized_name:
+ * @action: a #GObject instance that implements AtkActionIface
+ * @i: the action index corresponding to the action to be performed
+ *
+ * Returns the localized name of the specified action of the object.
+ *
+ * Returns: (nullable): a name string, or %NULL if @action does not
+ * implement this interface.
+ **/
+const gchar *
+atk_action_get_localized_name (AtkAction *obj,
+                               gint i)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), NULL);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->get_localized_name)
+    return (iface->get_localized_name) (obj, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_action_get_keybinding:
+ * @action: a #GObject instance that implements AtkActionIface
+ * @i: the action index corresponding to the action to be performed
+ *
+ * Gets the keybinding which can be used to activate this action, if one
+ * exists. The string returned should contain localized, human-readable,
+ * key sequences as they would appear when displayed on screen. It must
+ * be in the format "mnemonic;sequence;shortcut".
+ *
+ * - The mnemonic key activates the object if it is presently enabled onscreen.
+ *   This typically corresponds to the underlined letter within the widget.
+ *   Example: "n" in a traditional "New..." menu item or the "a" in "Apply" for
+ *   a button.
+ * - The sequence is the full list of keys which invoke the action even if the
+ *   relevant element is not currently shown on screen. For instance, for a menu
+ *   item the sequence is the keybindings used to open the parent menus before
+ *   invoking. The sequence string is colon-delimited. Example: "Alt+F:N" in a
+ *   traditional "New..." menu item.
+ * - The shortcut, if it exists, will invoke the same action without showing
+ *   the component or its enclosing menus or dialogs. Example: "Ctrl+N" in a
+ *   traditional "New..." menu item.
+ *
+ * Example: For a traditional "New..." menu item, the expected return value
+ * would be: "N;Alt+F:N;Ctrl+N" for the English locale and "N;Alt+D:N;Strg+N"
+ * for the German locale. If, hypothetically, this menu item lacked a mnemonic,
+ * it would be represented by ";;Ctrl+N" and ";;Strg+N" respectively.
+ *
+ * Returns: (nullable): the keybinding which can be used to activate
+ * this action, or %NULL if there is no keybinding for this action.
+ *
+ **/
+const gchar *
+atk_action_get_keybinding (AtkAction *obj,
+                           gint i)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), NULL);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->get_keybinding)
+    return (iface->get_keybinding) (obj, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_action_set_description:
+ * @action: a #GObject instance that implements AtkActionIface
+ * @i: the action index corresponding to the action to be performed
+ * @desc: the description to be assigned to this action
+ *
+ * Sets a description of the specified action of the object.
+ *
+ * Returns: a gboolean representing if the description was successfully set;
+ **/
+gboolean
+atk_action_set_description (AtkAction *obj,
+                            gint i,
+                            const gchar *desc)
+{
+  AtkActionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_ACTION (obj), FALSE);
+
+  iface = ATK_ACTION_GET_IFACE (obj);
+
+  if (iface->set_description)
+    return (iface->set_description) (obj, i, desc);
+  else
+    return FALSE;
+}
diff --git a/atk/atkaction.h b/atk/atkaction.h
new file mode 100644 (file)
index 0000000..3ba0f6d
--- /dev/null
@@ -0,0 +1,129 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_ACTION_H__
+#define __ATK_ACTION_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+/*
+ */
+
+#define ATK_TYPE_ACTION (atk_action_get_type ())
+#define ATK_IS_ACTION(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_ACTION)
+#define ATK_ACTION(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_ACTION, AtkAction)
+#define ATK_ACTION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_ACTION, AtkActionIface))
+
+#ifndef _TYPEDEF_ATK_ACTION_
+#define _TYPEDEF_ATK_ACTION_
+typedef struct _AtkAction AtkAction;
+#endif
+typedef struct _AtkActionIface AtkActionIface;
+
+/**
+ * AtkActionIface:
+ * @do_action:
+ * @get_n_actions:
+ * @get_description:
+ * @get_name:
+ * @get_keybinding:
+ * @set_description:
+ * @get_localized_name:
+ *
+ * The #AtkAction interface should be supported by any object that can
+ * perform one or more actions. The interface provides the standard
+ * mechanism for an assistive technology to determine what those actions
+ * are as well as tell the object to perform them. Any object that can
+ * be manipulated should support this interface.
+ */
+struct _AtkActionIface
+{
+  /*< private >*/
+  GTypeInterface parent;
+
+  /*< public >*/
+  gboolean (*do_action) (AtkAction *action,
+                         gint i);
+  gint (*get_n_actions) (AtkAction *action);
+  const gchar *(*get_description) (AtkAction *action,
+                                   gint i);
+  const gchar *(*get_name) (AtkAction *action,
+                            gint i);
+  const gchar *(*get_keybinding) (AtkAction *action,
+                                  gint i);
+  gboolean (*set_description) (AtkAction *action,
+                               gint i,
+                               const gchar *desc);
+  const gchar *(*get_localized_name) (AtkAction *action,
+                                      gint i);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_action_get_type (void);
+
+/*
+ * These are the function which would be called by an application with
+ * the argument being a AtkObject object cast to (AtkAction).
+ *
+ * The function will just check that * the corresponding
+ * function pointer is not NULL and will call it.
+ *
+ * The "real" implementation of the function for accessible will be
+ * provided in a support library
+ */
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_action_do_action (AtkAction *action,
+                               gint i);
+ATK_AVAILABLE_IN_ALL
+gint atk_action_get_n_actions (AtkAction *action);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_action_get_description (AtkAction *action,
+                                         gint i);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_action_get_name (AtkAction *action,
+                                  gint i);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_action_get_keybinding (AtkAction *action,
+                                        gint i);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_action_set_description (AtkAction *action,
+                                     gint i,
+                                     const gchar *desc);
+
+/* NEW in ATK 1.1: */
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_action_get_localized_name (AtkAction *action,
+                                            gint i);
+
+/*
+ * Additional GObject properties exported by AtkAction:
+ *    "accessible_action"
+ *       (an accessible action, or the list of actions, has changed)
+ */
+
+G_END_DECLS
+
+#endif /* __ATK_ACTION_H__ */
diff --git a/atk/atkcomponent.c b/atk/atkcomponent.c
new file mode 100644 (file)
index 0000000..1e7f94c
--- /dev/null
@@ -0,0 +1,747 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkcomponent.h"
+
+/**
+ * AtkComponent:
+ *
+ * The ATK interface provided by UI components
+ * which occupy a physical area on the screen.
+ * which the user can activate/interact with.
+ *
+ * #AtkComponent should be implemented by most if not all UI elements
+ * with an actual on-screen presence, i.e. components which can be
+ * said to have a screen-coordinate bounding box.  Virtually all
+ * widgets will need to have #AtkComponent implementations provided
+ * for their corresponding #AtkObject class.  In short, only UI
+ * elements which are *not* GUI elements will omit this ATK interface.
+ *
+ * A possible exception might be textual information with a
+ * transparent background, in which case text glyph bounding box
+ * information is provided by #AtkText.
+ */
+
+enum
+{
+  BOUNDS_CHANGED,
+  LAST_SIGNAL
+};
+
+static void atk_component_base_init (AtkComponentIface *class);
+
+static gboolean atk_component_real_contains (AtkComponent *component,
+                                             gint x,
+                                             gint y,
+                                             AtkCoordType coord_type);
+
+static AtkObject *atk_component_real_ref_accessible_at_point (AtkComponent *component,
+                                                              gint x,
+                                                              gint y,
+                                                              AtkCoordType coord_type);
+
+static void atk_component_real_get_position (AtkComponent *component,
+                                             gint *x,
+                                             gint *y,
+                                             AtkCoordType coord_type);
+
+static void atk_component_real_get_size (AtkComponent *component,
+                                         gint *width,
+                                         gint *height);
+
+static guint atk_component_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_component_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkComponentIface),
+        (GBaseInitFunc) atk_component_base_init,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkComponent", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_component_base_init (AtkComponentIface *class)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
+    {
+      class->ref_accessible_at_point = atk_component_real_ref_accessible_at_point;
+      class->contains = atk_component_real_contains;
+      class->get_position = atk_component_real_get_position;
+      class->get_size = atk_component_real_get_size;
+
+      /**
+       * AtkComponent::bounds-changed:
+       * @atkcomponent: the object which received the signal.
+       * @arg1: The AtkRectangle giving the new position and size.
+       *
+       * The 'bounds-changed" signal is emitted when the position or
+       * size of the component changes.
+       */
+      atk_component_signals[BOUNDS_CHANGED] =
+          g_signal_new ("bounds_changed",
+                        ATK_TYPE_COMPONENT,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkComponentIface, bounds_changed),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__BOXED,
+                        G_TYPE_NONE, 1,
+                        ATK_TYPE_RECTANGLE | G_SIGNAL_TYPE_STATIC_SCOPE);
+
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_component_add_focus_handler: (skip)
+ * @component: The #AtkComponent to attach the @handler to
+ * @handler: The #AtkFocusHandler to be attached to @component
+ *
+ * Add the specified handler to the set of functions to be called
+ * when this object receives focus events (in or out). If the handler is
+ * already added it is not added again
+ *
+ * Deprecated: 2.9.4: If you need to track when an object gains or
+ * lose the focus, use the #AtkObject::state-change "focused" notification instead.
+ *
+ * Returns: a handler id which can be used in atk_component_remove_focus_handler()
+ * or zero if the handler was already added.
+ **/
+guint
+atk_component_add_focus_handler (AtkComponent *component,
+                                 AtkFocusHandler handler)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), 0);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->add_focus_handler)
+    return (iface->add_focus_handler) (component, handler);
+  else
+    return 0;
+}
+
+/**
+ * atk_component_remove_focus_handler:
+ * @component: the #AtkComponent to remove the focus handler from
+ * @handler_id: the handler id of the focus handler to be removed
+ * from @component
+ *
+ * Remove the handler specified by @handler_id from the list of
+ * functions to be executed when this object receives focus events
+ * (in or out).
+ *
+ * Deprecated: 2.9.4: If you need to track when an object gains or
+ * lose the focus, use the #AtkObject::state-change "focused" notification instead.
+ *
+ **/
+void
+atk_component_remove_focus_handler (AtkComponent *component,
+                                    guint handler_id)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_if_fail (ATK_IS_COMPONENT (component));
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->remove_focus_handler)
+    (iface->remove_focus_handler) (component, handler_id);
+}
+
+/**
+ * atk_component_contains:
+ * @component: the #AtkComponent
+ * @x: x coordinate
+ * @y: y coordinate
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the components top level window
+ *
+ * Checks whether the specified point is within the extent of the @component.
+ *
+ * Toolkit implementor note: ATK provides a default implementation for
+ * this virtual method. In general there are little reason to
+ * re-implement it.
+ *
+ * Returns: %TRUE or %FALSE indicating whether the specified point is within
+ * the extent of the @component or not
+ **/
+gboolean
+atk_component_contains (AtkComponent *component,
+                        gint x,
+                        gint y,
+                        AtkCoordType coord_type)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->contains)
+    return (iface->contains) (component, x, y, coord_type);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_component_ref_accessible_at_point:
+ * @component: the #AtkComponent
+ * @x: x coordinate
+ * @y: y coordinate
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the components top level window
+ *
+ * Gets a reference to the accessible child, if one exists, at the
+ * coordinate point specified by @x and @y.
+ *
+ * Returns: (nullable) (transfer full): a reference to the accessible
+ * child, if one exists
+ **/
+AtkObject *
+atk_component_ref_accessible_at_point (AtkComponent *component,
+                                       gint x,
+                                       gint y,
+                                       AtkCoordType coord_type)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), NULL);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->ref_accessible_at_point)
+    return (iface->ref_accessible_at_point) (component, x, y, coord_type);
+  else
+    return NULL;
+}
+
+/**
+ * atk_component_get_extents:
+ * @component: an #AtkComponent
+ * @x: (out) (optional): address of #gint to put x coordinate
+ * @y: (out) (optional): address of #gint to put y coordinate
+ * @width: (out) (optional): address of #gint to put width
+ * @height: (out) (optional): address of #gint to put height
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the components top level window
+ *
+ * Gets the rectangle which gives the extent of the @component.
+ *
+ * If the extent can not be obtained (e.g. a non-embedded plug or missing
+ * support), all of x, y, width, height are set to -1.
+ *
+ **/
+void
+atk_component_get_extents (AtkComponent *component,
+                           gint *x,
+                           gint *y,
+                           gint *width,
+                           gint *height,
+                           AtkCoordType coord_type)
+{
+  AtkComponentIface *iface = NULL;
+  gint local_x, local_y, local_width, local_height;
+  gint *real_x, *real_y, *real_width, *real_height;
+
+  g_return_if_fail (ATK_IS_COMPONENT (component));
+
+  if (x)
+    real_x = x;
+  else
+    real_x = &local_x;
+  if (y)
+    real_y = y;
+  else
+    real_y = &local_y;
+  if (width)
+    real_width = width;
+  else
+    real_width = &local_width;
+  if (height)
+    real_height = height;
+  else
+    real_height = &local_height;
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->get_extents)
+    (iface->get_extents) (component, real_x, real_y, real_width, real_height, coord_type);
+  else
+    {
+      *real_x = -1;
+      *real_y = -1;
+      *real_width = -1;
+      *real_height = -1;
+    }
+}
+
+/**
+ * atk_component_get_position:
+ * @component: an #AtkComponent
+ * @x: (out) (optional): address of #gint to put x coordinate position
+ * @y: (out) (optional): address of #gint to put y coordinate position
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the components top level window
+ *
+ * Gets the position of @component in the form of
+ * a point specifying @component's top-left corner.
+ *
+ * If the position can not be obtained (e.g. a non-embedded plug or missing
+ * support), x and y are set to -1.
+ *
+ * Deprecated: Since 2.12. Use atk_component_get_extents() instead.
+ **/
+void
+atk_component_get_position (AtkComponent *component,
+                            gint *x,
+                            gint *y,
+                            AtkCoordType coord_type)
+{
+  AtkComponentIface *iface = NULL;
+  gint local_x, local_y;
+  gint *real_x, *real_y;
+
+  g_return_if_fail (ATK_IS_COMPONENT (component));
+
+  if (x)
+    real_x = x;
+  else
+    real_x = &local_x;
+  if (y)
+    real_y = y;
+  else
+    real_y = &local_y;
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->get_position)
+    (iface->get_position) (component, real_x, real_y, coord_type);
+  else
+    {
+      *real_x = -1;
+      *real_y = -1;
+    }
+}
+
+/**
+ * atk_component_get_size:
+ * @component: an #AtkComponent
+ * @width: (out) (optional): address of #gint to put width of @component
+ * @height: (out) (optional): address of #gint to put height of @component
+ *
+ * Gets the size of the @component in terms of width and height.
+ *
+ * If the size can not be obtained (e.g. a non-embedded plug or missing
+ * support), width and height are set to -1.
+ *
+ * Deprecated: Since 2.12. Use atk_component_get_extents() instead.
+ **/
+void
+atk_component_get_size (AtkComponent *component,
+                        gint *width,
+                        gint *height)
+{
+  AtkComponentIface *iface = NULL;
+  gint local_width, local_height;
+  gint *real_width, *real_height;
+
+  g_return_if_fail (ATK_IS_COMPONENT (component));
+
+  if (width)
+    real_width = width;
+  else
+    real_width = &local_width;
+  if (height)
+    real_height = height;
+  else
+    real_height = &local_height;
+
+  g_return_if_fail (ATK_IS_COMPONENT (component));
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->get_size)
+    (iface->get_size) (component, real_width, real_height);
+  else
+    {
+      *real_width = -1;
+      *real_height = -1;
+    }
+}
+
+/**
+ * atk_component_get_layer:
+ * @component: an #AtkComponent
+ *
+ * Gets the layer of the component.
+ *
+ * Returns: an #AtkLayer which is the layer of the component
+ **/
+AtkLayer
+atk_component_get_layer (AtkComponent *component)
+{
+  AtkComponentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), ATK_LAYER_INVALID);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+  if (iface->get_layer)
+    return (iface->get_layer) (component);
+  else
+    return ATK_LAYER_WIDGET;
+}
+
+/**
+ * atk_component_get_mdi_zorder:
+ * @component: an #AtkComponent
+ *
+ * Gets the zorder of the component. The value G_MININT will be returned
+ * if the layer of the component is not ATK_LAYER_MDI or ATK_LAYER_WINDOW.
+ *
+ * Returns: a gint which is the zorder of the component, i.e. the depth at
+ * which the component is shown in relation to other components in the same
+ * container.
+ **/
+gint
+atk_component_get_mdi_zorder (AtkComponent *component)
+{
+  AtkComponentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), G_MININT);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+  if (iface->get_mdi_zorder)
+    return (iface->get_mdi_zorder) (component);
+  else
+    return G_MININT;
+}
+
+/**
+ * atk_component_get_alpha:
+ * @component: an #AtkComponent
+ *
+ * Returns the alpha value (i.e. the opacity) for this
+ * @component, on a scale from 0 (fully transparent) to 1.0
+ * (fully opaque).
+ *
+ * Returns: An alpha value from 0 to 1.0, inclusive.
+ * Since: 1.12
+ **/
+gdouble
+atk_component_get_alpha (AtkComponent *component)
+{
+  AtkComponentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), G_MININT);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+  if (iface->get_alpha)
+    return (iface->get_alpha) (component);
+  else
+    return (gdouble) 1.0;
+}
+
+/**
+ * atk_component_grab_focus:
+ * @component: an #AtkComponent
+ *
+ * Grabs focus for this @component.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ **/
+gboolean
+atk_component_grab_focus (AtkComponent *component)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->grab_focus)
+    return (iface->grab_focus) (component);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_component_set_extents:
+ * @component: an #AtkComponent
+ * @x: x coordinate
+ * @y: y coordinate
+ * @width: width to set for @component
+ * @height: height to set for @component
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the components top level window
+ *
+ * Sets the extents of @component.
+ *
+ * Returns: %TRUE or %FALSE whether the extents were set or not
+ **/
+gboolean
+atk_component_set_extents (AtkComponent *component,
+                           gint x,
+                           gint y,
+                           gint width,
+                           gint height,
+                           AtkCoordType coord_type)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->set_extents)
+    return (iface->set_extents) (component, x, y, width, height, coord_type);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_component_set_position:
+ * @component: an #AtkComponent
+ * @x: x coordinate
+ * @y: y coordinate
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the component's top level window
+ *
+ * Sets the position of @component.
+ *
+ * Contrary to atk_component_scroll_to, this does not trigger any scrolling,
+ * this just moves @component in its parent.
+ *
+ * Returns: %TRUE or %FALSE whether or not the position was set or not
+ **/
+gboolean
+atk_component_set_position (AtkComponent *component,
+                            gint x,
+                            gint y,
+                            AtkCoordType coord_type)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->set_position)
+    return (iface->set_position) (component, x, y, coord_type);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_component_set_size:
+ * @component: an #AtkComponent
+ * @width: width to set for @component
+ * @height: height to set for @component
+ *
+ * Set the size of the @component in terms of width and height.
+ *
+ * Returns: %TRUE or %FALSE whether the size was set or not
+ **/
+gboolean
+atk_component_set_size (AtkComponent *component,
+                        gint x,
+                        gint y)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->set_size)
+    return (iface->set_size) (component, x, y);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_component_scroll_to:
+ * @component: an #AtkComponent
+ * @type: specify where the object should be made visible.
+ *
+ * Makes @component visible on the screen by scrolling all necessary parents.
+ *
+ * Contrary to atk_component_set_position, this does not actually move
+ * @component in its parent, this only makes the parents scroll so that the
+ * object shows up on the screen, given its current position within the parents.
+ *
+ * Returns: whether scrolling was successful.
+ *
+ * Since: 2.30
+ */
+gboolean
+atk_component_scroll_to (AtkComponent *component,
+                         AtkScrollType type)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->scroll_to)
+    return (iface->scroll_to) (component, type);
+
+  return FALSE;
+}
+
+/**
+ * atk_component_scroll_to_point:
+ * @component: an #AtkComponent
+ * @coords: specify whether coordinates are relative to the screen or to the
+ * parent object.
+ * @x: x-position where to scroll to
+ * @y: y-position where to scroll to
+ *
+ * Move the top-left of @component to a given position of the screen by
+ * scrolling all necessary parents.
+ *
+ * Returns: whether scrolling was successful.
+ *
+ * Since: 2.30
+ */
+gboolean
+atk_component_scroll_to_point (AtkComponent *component,
+                               AtkCoordType coords,
+                               gint x,
+                               gint y)
+{
+  AtkComponentIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_COMPONENT (component), FALSE);
+
+  iface = ATK_COMPONENT_GET_IFACE (component);
+
+  if (iface->scroll_to_point)
+    return (iface->scroll_to_point) (component, coords, x, y);
+
+  return FALSE;
+}
+
+static gboolean
+atk_component_real_contains (AtkComponent *component,
+                             gint x,
+                             gint y,
+                             AtkCoordType coord_type)
+{
+  gint real_x, real_y, width, height;
+
+  real_x = real_y = width = height = 0;
+
+  atk_component_get_extents (component, &real_x, &real_y, &width, &height, coord_type);
+
+  if ((x >= real_x) &&
+      (x < real_x + width) &&
+      (y >= real_y) &&
+      (y < real_y + height))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+static AtkObject *
+atk_component_real_ref_accessible_at_point (AtkComponent *component,
+                                            gint x,
+                                            gint y,
+                                            AtkCoordType coord_type)
+{
+  gint count, i;
+
+  count = atk_object_get_n_accessible_children (ATK_OBJECT (component));
+
+  for (i = 0; i < count; i++)
+    {
+      AtkObject *obj;
+
+      obj = atk_object_ref_accessible_child (ATK_OBJECT (component), i);
+
+      if (obj != NULL)
+        {
+          if (atk_component_contains (ATK_COMPONENT (obj), x, y, coord_type))
+            {
+              return obj;
+            }
+          else
+            {
+              g_object_unref (obj);
+            }
+        }
+    }
+  return NULL;
+}
+
+static void
+atk_component_real_get_position (AtkComponent *component,
+                                 gint *x,
+                                 gint *y,
+                                 AtkCoordType coord_type)
+{
+  gint width, height;
+
+  atk_component_get_extents (component, x, y, &width, &height, coord_type);
+}
+
+static void
+atk_component_real_get_size (AtkComponent *component,
+                             gint *width,
+                             gint *height)
+{
+  gint x, y;
+  AtkCoordType coord_type;
+
+  /*
+   * Pick one coordinate type; it does not matter for size
+   */
+  coord_type = ATK_XY_WINDOW;
+
+  atk_component_get_extents (component, &x, &y, width, height, coord_type);
+}
+
+static AtkRectangle *
+atk_rectangle_copy (const AtkRectangle *rectangle)
+{
+  AtkRectangle *result = g_new (AtkRectangle, 1);
+  *result = *rectangle;
+
+  return result;
+}
+
+GType
+atk_rectangle_get_type (void)
+{
+  static GType our_type = 0;
+
+  if (our_type == 0)
+    our_type = g_boxed_type_register_static ("AtkRectangle",
+                                             (GBoxedCopyFunc) atk_rectangle_copy,
+                                             (GBoxedFreeFunc) g_free);
+  return our_type;
+}
diff --git a/atk/atkcomponent.h b/atk/atkcomponent.h
new file mode 100644 (file)
index 0000000..5901834
--- /dev/null
@@ -0,0 +1,298 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_COMPONENT_H__
+#define __ATK_COMPONENT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <atk/atkutil.h>
+
+G_BEGIN_DECLS
+
+/**
+ * AtkScrollType:
+ * @ATK_SCROLL_TOP_LEFT: Scroll the object vertically and horizontally to bring
+ *   its top left corner to the top left corner of the window.
+ * @ATK_SCROLL_BOTTOM_RIGHT: Scroll the object vertically and horizontally to
+ *   bring its bottom right corner to the bottom right corner of the window.
+ * @ATK_SCROLL_TOP_EDGE: Scroll the object vertically to bring its top edge to
+ *   the top edge of the window.
+ * @ATK_SCROLL_BOTTOM_EDGE: Scroll the object vertically to bring its bottom
+ *   edge to the bottom edge of the window.
+ * @ATK_SCROLL_LEFT_EDGE: Scroll the object vertically and horizontally to bring
+ *   its left edge to the left edge of the window.
+ * @ATK_SCROLL_RIGHT_EDGE: Scroll the object vertically and horizontally to
+ *   bring its right edge to the right edge of the window.
+ * @ATK_SCROLL_ANYWHERE: Scroll the object vertically and horizontally so that
+ *   as much as possible of the object becomes visible. The exact placement is
+ *   determined by the application.
+ *
+ * Specifies where an object should be placed on the screen when using scroll_to.
+ *
+ * Since: 2.30
+ */
+typedef enum
+{
+  ATK_SCROLL_TOP_LEFT,
+  ATK_SCROLL_BOTTOM_RIGHT,
+  ATK_SCROLL_TOP_EDGE,
+  ATK_SCROLL_BOTTOM_EDGE,
+  ATK_SCROLL_LEFT_EDGE,
+  ATK_SCROLL_RIGHT_EDGE,
+  ATK_SCROLL_ANYWHERE
+} AtkScrollType;
+
+#define ATK_TYPE_COMPONENT (atk_component_get_type ())
+#define ATK_IS_COMPONENT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_COMPONENT)
+#define ATK_COMPONENT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_COMPONENT, AtkComponent)
+#define ATK_COMPONENT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_COMPONENT, AtkComponentIface))
+
+#ifndef _TYPEDEF_ATK_COMPONENT_
+#define _TYPEDEF_ATK_COMPONENT_
+typedef struct _AtkComponent AtkComponent;
+#endif
+typedef struct _AtkComponentIface AtkComponentIface;
+
+/**
+ * AtkFocusHandler:
+ * @object: the #AtkObject that receives/lose the focus
+ * @focus_in: TRUE if the object receives the focus
+ *
+ * The type of callback function used for
+ * atk_component_add_focus_handler() and
+ * atk_component_remove_focus_handler()
+ *
+ * Deprecated: 2.9.4: Deprecated with atk_component_add_focus_handler()
+ * and atk_component_remove_focus_handler(). See those
+ * methods for more information.
+ */
+typedef void (*AtkFocusHandler) (AtkObject *object, gboolean focus_in);
+
+typedef struct _AtkRectangle AtkRectangle;
+
+/**
+ * AtkRectangle:
+ * @x: X coordinate of the left side of the rectangle.
+ * @y: Y coordinate of the top side of the rectangle.
+ * @width: width of the rectangle.
+ * @height: height of the rectangle.
+ *
+ * A data structure for holding a rectangle. Those coordinates are
+ * relative to the component top-level parent.
+ */
+struct _AtkRectangle
+{
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_rectangle_get_type (void);
+
+#define ATK_TYPE_RECTANGLE (atk_rectangle_get_type ())
+
+/**
+ * AtkComponentIface:
+ * @add_focus_handler: This virtual function is deprecated since 2.9.4
+ *   and it should not be overriden. See atk_component_add_focus_handler()
+ *   for more information.
+ * @get_position: This virtual function is deprecated since 2.12 and
+ *   it should not be overriden. Use @AtkComponentIface.get_extents instead.
+ * @get_size: This virtual function is deprecated since 2.12 and it
+ *   should not be overriden. Use @AtkComponentIface.get_extents instead.
+ * @remove_focus_handler: This virtual function is deprecated since
+ *   2.9.4 and it should not be overriden. See atk_component_remove_focus_handler()
+ *   for more information.
+ * @contains:
+ * @ref_accessible_at_point:
+ * @get_extents:
+ * @grab_focus:
+ * @set_extents:
+ * @set_position:
+ * @set_size:
+ * @get_layer:
+ * @get_mdi_zorder:
+ * @bounds_changed:
+ * @get_alpha:
+ * @scroll_to:
+ * @scroll_to_point:
+ *
+ * The AtkComponent interface should be supported by any object that is
+ * rendered on the screen. The interface provides the standard mechanism
+ * for an assistive technology to determine and set the graphical
+ * representation of an object.
+ */
+struct _AtkComponentIface
+{
+  /*< private >*/
+  GTypeInterface parent;
+
+  /*< public >*/
+  guint (*add_focus_handler) (AtkComponent *component,
+                              AtkFocusHandler handler);
+
+  gboolean (*contains) (AtkComponent *component,
+                        gint x,
+                        gint y,
+                        AtkCoordType coord_type);
+
+  AtkObject *(*ref_accessible_at_point) (AtkComponent *component,
+                                         gint x,
+                                         gint y,
+                                         AtkCoordType coord_type);
+  void (*get_extents) (AtkComponent *component,
+                       gint *x,
+                       gint *y,
+                       gint *width,
+                       gint *height,
+                       AtkCoordType coord_type);
+  void (*get_position) (AtkComponent *component,
+                        gint *x,
+                        gint *y,
+                        AtkCoordType coord_type);
+  void (*get_size) (AtkComponent *component,
+                    gint *width,
+                    gint *height);
+  gboolean (*grab_focus) (AtkComponent *component);
+  void (*remove_focus_handler) (AtkComponent *component,
+                                guint handler_id);
+  gboolean (*set_extents) (AtkComponent *component,
+                           gint x,
+                           gint y,
+                           gint width,
+                           gint height,
+                           AtkCoordType coord_type);
+  gboolean (*set_position) (AtkComponent *component,
+                            gint x,
+                            gint y,
+                            AtkCoordType coord_type);
+  gboolean (*set_size) (AtkComponent *component,
+                        gint width,
+                        gint height);
+
+  AtkLayer (*get_layer) (AtkComponent *component);
+  gint (*get_mdi_zorder) (AtkComponent *component);
+
+  /*
+   * signal handlers
+   */
+  void (*bounds_changed) (AtkComponent *component,
+                          AtkRectangle *bounds);
+  gdouble (*get_alpha) (AtkComponent *component);
+
+  /*
+   * Scrolls this object so it becomes visible on the screen.
+   *
+   * scroll_to lets the implementation compute an appropriate target
+   * position on the screen, with type used as a positioning hint.
+   *
+   * scroll_to_point lets the client specify a precise target position
+   * on the screen for the top-left of the object.
+   *
+   * Since ATK 2.30
+   */
+  gboolean (*scroll_to) (AtkComponent *component,
+                         AtkScrollType type);
+
+  gboolean (*scroll_to_point) (AtkComponent *component,
+                               AtkCoordType coords,
+                               gint x,
+                               gint y);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_component_get_type (void);
+
+/* convenience functions */
+ATK_DEPRECATED_IN_2_10
+guint atk_component_add_focus_handler (AtkComponent *component,
+                                       AtkFocusHandler handler);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_component_contains (AtkComponent *component,
+                                 gint x,
+                                 gint y,
+                                 AtkCoordType coord_type);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_component_ref_accessible_at_point (AtkComponent *component,
+                                                  gint x,
+                                                  gint y,
+                                                  AtkCoordType coord_type);
+ATK_AVAILABLE_IN_ALL
+void atk_component_get_extents (AtkComponent *component,
+                                gint *x,
+                                gint *y,
+                                gint *width,
+                                gint *height,
+                                AtkCoordType coord_type);
+ATK_DEPRECATED_IN_2_12_FOR (atk_component_get_extents)
+void atk_component_get_position (AtkComponent *component,
+                                 gint *x,
+                                 gint *y,
+                                 AtkCoordType coord_type);
+ATK_DEPRECATED_IN_2_12_FOR (atk_component_get_extents)
+void atk_component_get_size (AtkComponent *component,
+                             gint *width,
+                             gint *height);
+ATK_AVAILABLE_IN_ALL
+AtkLayer atk_component_get_layer (AtkComponent *component);
+ATK_AVAILABLE_IN_ALL
+gint atk_component_get_mdi_zorder (AtkComponent *component);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_component_grab_focus (AtkComponent *component);
+ATK_DEPRECATED_IN_2_10
+void atk_component_remove_focus_handler (AtkComponent *component,
+                                         guint handler_id);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_component_set_extents (AtkComponent *component,
+                                    gint x,
+                                    gint y,
+                                    gint width,
+                                    gint height,
+                                    AtkCoordType coord_type);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_component_set_position (AtkComponent *component,
+                                     gint x,
+                                     gint y,
+                                     AtkCoordType coord_type);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_component_set_size (AtkComponent *component,
+                                 gint width,
+                                 gint height);
+ATK_AVAILABLE_IN_ALL
+gdouble atk_component_get_alpha (AtkComponent *component);
+
+ATK_AVAILABLE_IN_2_30
+gboolean atk_component_scroll_to (AtkComponent *component,
+                                  AtkScrollType type);
+
+ATK_AVAILABLE_IN_2_30
+gboolean atk_component_scroll_to_point (AtkComponent *component,
+                                        AtkCoordType coords,
+                                        gint x,
+                                        gint y);
+
+G_END_DECLS
+
+#endif /* __ATK_COMPONENT_H__ */
diff --git a/atk/atkdocument.c b/atk/atkdocument.c
new file mode 100644 (file)
index 0000000..d8db57c
--- /dev/null
@@ -0,0 +1,501 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkdocument.h"
+#include "atkmarshal.h"
+
+/**
+ * AtkDocument:
+ *
+ * The ATK interface which represents the toplevel
+ *  container for document content.
+ *
+ * The AtkDocument interface should be supported by any object whose
+ * content is a representation or view of a document.  The AtkDocument
+ * interface should appear on the toplevel container for the document
+ * content; however AtkDocument instances may be nested (i.e. an
+ * AtkDocument may be a descendant of another AtkDocument) in those
+ * cases where one document contains "embedded content" which can
+ * reasonably be considered a document in its own right.
+ *
+ */
+
+enum
+{
+  LOAD_COMPLETE,
+  RELOAD,
+  LOAD_STOPPED,
+  PAGE_CHANGED,
+  DOCUMENT_ATTRIBUTE_CHANGED,
+  LAST_SIGNAL
+};
+
+static void atk_document_base_init (AtkDocumentIface *class);
+
+static guint atk_document_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_document_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkDocumentIface),
+        (GBaseInitFunc) atk_document_base_init,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkDocument", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_document_base_init (AtkDocumentIface *class)
+{
+  static gboolean initialized = FALSE;
+  if (!initialized)
+    {
+      /**
+       * AtkDocument::load-complete:
+       * @atkdocument: the object which received the signal.
+       *
+       * The 'load-complete' signal is emitted when a pending load of
+       * a static document has completed.  This signal is to be
+       * expected by ATK clients if and when AtkDocument implementors
+       * expose ATK_STATE_BUSY.  If the state of an AtkObject which
+       * implements AtkDocument does not include ATK_STATE_BUSY, it
+       * should be safe for clients to assume that the AtkDocument's
+       * static contents are fully loaded into the container.
+       * (Dynamic document contents should be exposed via other
+       * signals.)
+       */
+      atk_document_signals[LOAD_COMPLETE] =
+          g_signal_new ("load_complete",
+                        ATK_TYPE_DOCUMENT,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+      /**
+       * AtkDocument::reload:
+       * @atkdocument: the object which received the signal.
+       *
+       * The 'reload' signal is emitted when the contents of a
+       * document is refreshed from its source.  Once 'reload' has
+       * been emitted, a matching 'load-complete' or 'load-stopped'
+       * signal should follow, which clients may await before
+       * interrogating ATK for the latest document content.
+       */
+      atk_document_signals[RELOAD] =
+          g_signal_new ("reload",
+                        ATK_TYPE_DOCUMENT,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+
+      /**
+       * AtkDocument::load-stopped:
+       * @atkdocument: the object which received the signal.
+       *
+       * The 'load-stopped' signal is emitted when a pending load of
+       * document contents is cancelled, paused, or otherwise
+       * interrupted by the user or application logic.  It should not
+       * however be emitted while waiting for a resource (for instance
+       * while blocking on a file or network read) unless a
+       * user-significant timeout has occurred.
+       */
+      atk_document_signals[LOAD_STOPPED] =
+          g_signal_new ("load_stopped",
+                        ATK_TYPE_DOCUMENT,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+
+      /**
+       * AtkDocument::page-changed:
+       * @atkdocument: the object on which the signal was emitted
+       * @page_number: the new page number. If this value is unknown
+       * or not applicable, -1 should be provided.
+       *
+       * The 'page-changed' signal is emitted when the current page of
+       * a document changes, e.g. pressing page up/down in a document
+       * viewer.
+       *
+       * Since: 2.12
+       */
+      atk_document_signals[PAGE_CHANGED] =
+          g_signal_new ("page_changed",
+                        ATK_TYPE_DOCUMENT,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__INT,
+                        G_TYPE_NONE, 1, G_TYPE_INT);
+
+      /**
+       * AtkDocument::document-attribute-changed
+       * @atkdocument: the object which received the signal.
+       * @arg1: the name of the attribute being modified, or %NULL if not
+       *          available.
+       * @arg2: the attribute's new value, or %null if not available.
+       *
+       * The "document-attribute-changed" signal should be emitted when there is a
+       * change to one of the document attributes returned by
+       * atk_document_get_attributes.
+       *
+       * Since: 2.52
+       */
+      atk_document_signals[DOCUMENT_ATTRIBUTE_CHANGED] =
+          g_signal_new ("document-attribute-changed",
+                        ATK_TYPE_DOCUMENT,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        NULL, NULL,
+                        atk_marshal_VOID__STRING_STRING,
+                        G_TYPE_NONE,
+                        2, G_TYPE_STRING, G_TYPE_STRING);
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_document_get_document_type: (virtual get_document_type)
+ * @document: a #GObject instance that implements AtkDocumentIface
+ *
+ * Gets a string indicating the document type.
+ *
+ * Deprecated: Since 2.12. Please use atk_document_get_attributes() to
+ * ask for the document type if it applies.
+ *
+ * Returns: a string indicating the document type
+ **/
+const gchar *
+atk_document_get_document_type (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), NULL);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_document_type)
+    {
+      return (iface->get_document_type) (document);
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+/**
+ * atk_document_get_document: (virtual get_document)
+ * @document: a #GObject instance that implements AtkDocumentIface
+ *
+ * Gets a %gpointer that points to an instance of the DOM.  It is
+ * up to the caller to check atk_document_get_type to determine
+ * how to cast this pointer.
+ *
+ * Deprecated: Since 2.12. @document is already a representation of
+ * the document. Use it directly, or one of its children, as an
+ * instance of the DOM.
+ *
+ * Returns: (transfer none): a %gpointer that points to an instance of the DOM.
+ **/
+gpointer
+atk_document_get_document (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), NULL);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_document)
+    {
+      return (iface->get_document) (document);
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+/**
+ * atk_document_get_locale: (virtual get_document_locale)
+ * @document: a #GObject instance that implements AtkDocumentIface
+ *
+ * Gets a UTF-8 string indicating the POSIX-style LC_MESSAGES locale
+ *          of the content of this document instance.  Individual
+ *          text substrings or images within this document may have
+ *          a different locale, see atk_text_get_attributes and
+ *          atk_image_get_image_locale.
+ *
+ * Deprecated: 2.7.90: Please use atk_object_get_object_locale() instead.
+ *
+ * Returns: a UTF-8 string indicating the POSIX-style LC_MESSAGES
+ *          locale of the document content as a whole, or NULL if
+ *          the document content does not specify a locale.
+ **/
+const gchar *
+atk_document_get_locale (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), NULL);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_document_locale)
+    {
+      return (iface->get_document_locale) (document);
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+/**
+ * atk_document_get_attributes: (virtual get_document_attributes)
+ * @document: a #GObject instance that implements AtkDocumentIface
+ *
+ * Gets an AtkAttributeSet which describes document-wide
+ *          attributes as name-value pairs.
+ *
+ * Since: 1.12
+ *
+ * Returns: (transfer none): An AtkAttributeSet containing the explicitly
+ *          set name-value-pair attributes associated with this document
+ *          as a whole.
+ **/
+AtkAttributeSet *
+atk_document_get_attributes (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), NULL);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_document_attributes)
+    {
+      return (iface->get_document_attributes) (document);
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+/**
+ * atk_document_get_attribute_value: (virtual get_document_attribute_value)
+ * @document: a #GObject instance that implements AtkDocumentIface
+ * @attribute_name: a character string representing the name of the attribute
+ *   whose value is being queried.
+ *
+ * Retrieves the value of the given @attribute_name inside @document.
+ *
+ * Returns: (nullable): a string value associated with the named
+ *    attribute for this document, or %NULL if a value for
+ *    @attribute_name has not been specified for this document.
+ *
+ * Since: 1.12
+ */
+const gchar *
+atk_document_get_attribute_value (AtkDocument *document,
+                                  const gchar *attribute_name)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), NULL);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_document_attribute_value)
+    {
+      return (iface->get_document_attribute_value) (document, attribute_name);
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+/**
+ * atk_document_set_attribute_value: (virtual set_document_attribute)
+ * @document: a #GObject instance that implements #AtkDocumentIface
+ * @attribute_name: a character string representing the name of the attribute
+ *   whose value is being set.
+ * @attribute_value: a string value to be associated with @attribute_name.
+ *
+ * Sets the value for the given @attribute_name inside @document.
+ *
+ * Since: 1.12
+ *
+ * Returns: %TRUE if @attribute_value is successfully associated
+ *   with @attribute_name for this @document, and %FALSE if if the
+ *   document does not allow the attribute to be modified
+ */
+gboolean
+atk_document_set_attribute_value (AtkDocument *document,
+                                  const gchar *attribute_name,
+                                  const gchar *attribute_value)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), FALSE);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->set_document_attribute)
+    {
+      return (iface->set_document_attribute) (document, attribute_name, attribute_value);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+/**
+ * atk_document_get_current_page_number:
+ * @document: the #AtkDocument
+ *
+ * Retrieves the current page number inside @document.
+ *
+ * Returns: the current page number inside @document, or -1 if
+ *   not implemented, not know by the implementor, or irrelevant.
+ *
+ * Since: 2.12
+ */
+gint
+atk_document_get_current_page_number (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), FALSE);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_current_page_number)
+    {
+      return (iface->get_current_page_number) (document);
+    }
+  else
+    {
+      return -1;
+    }
+}
+
+/**
+ * atk_document_get_page_count:
+ * @document: the #AtkDocument
+ *
+ * Retrieves the total number of pages inside @document.
+ *
+ * Returns: total page count of @document, or -1 if not implemented,
+ *   not know by the implementor or irrelevant.
+ *
+ * Since: 2.12
+ */
+gint
+atk_document_get_page_count (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), FALSE);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_page_count)
+    {
+      return (iface->get_page_count) (document);
+    }
+  else
+    {
+      return -1;
+    }
+}
+
+/**
+ * atk_document_get_text_selections:
+ * @document: an #AtkDocument
+ *
+ * Returns an array of AtkTextSelections within this document.
+ *
+ * Returns: (element-type AtkTextSelection) (transfer full): a GArray of
+ * AtkTextSelection structures representing the selection.
+ */
+GArray *
+atk_document_get_text_selections (AtkDocument *document)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), NULL);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->get_text_selections)
+    return (*(iface->get_text_selections)) (document);
+  else
+    return NULL;
+}
+
+/**
+ * atk_document_set_text_selections:
+ * @document: an #AtkDocument.
+ * @selections: (element-type AtkTextSelection): a GArray of AtkTextSelections
+ *              to be selected.
+ *
+ * Makes 1 or more selections within this document denoted by the given
+ * array of AtkTextSelections. Any existing physical selection (inside or
+ * outside this document) is replaced by the new selections. All objects within
+ * the given selection ranges must be descendants of this document. Otherwise
+ * FALSE will be returned.
+ *
+ * Returns TRUE if the selection was made successfully; FALSE otherwise.
+ */
+gboolean
+atk_document_set_text_selections (AtkDocument *document,
+                                  GArray *selections)
+{
+  AtkDocumentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_DOCUMENT (document), FALSE);
+
+  iface = ATK_DOCUMENT_GET_IFACE (document);
+
+  if (iface->set_text_selections)
+    return (*(iface->set_text_selections)) (document, selections);
+  else
+    return FALSE;
+}
diff --git a/atk/atkdocument.h b/atk/atkdocument.h
new file mode 100644 (file)
index 0000000..94e8cf7
--- /dev/null
@@ -0,0 +1,160 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_DOCUMENT_H__
+#define __ATK_DOCUMENT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <atk/atkutil.h>
+
+G_BEGIN_DECLS
+
+/*
+ * The AtkDocument interface should be supported by any object that is a container
+ * for 'document content' as opposed to a collection of user interface elements.
+ *
+ */
+
+#define ATK_TYPE_DOCUMENT (atk_document_get_type ())
+#define ATK_IS_DOCUMENT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_DOCUMENT)
+#define ATK_DOCUMENT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_DOCUMENT, AtkDocument)
+#define ATK_DOCUMENT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_DOCUMENT, AtkDocumentIface))
+
+/**
+ * AtkTextSelection:
+ * @start_object: the AtkText containing the start of the selection.
+ * @start_offset: the text offset of the beginning of the selection within
+ *                @start_object.
+ * @end_object: the AtkText containing the end of the selection.
+ * @end_offset: the text offset of the end of the selection within @end_object.
+ * @start_is_active: a gboolean indicating whether the start of the selection
+ *                  is the active point.
+ *
+ * This structure represents a single  text selection within a document. This
+ * selection is defined by two points in the content, where each one is defined
+ * by an AtkObject supporting the AtkText interface and a character offset
+ * relative to it.
+ *
+ * The end object must appear after the start object in the accessibility tree,
+ * i.e. the end object must be reachable from the start object by navigating
+ * forward (next, first child etc).
+ *
+ * This struct also contains a @start_is_active boolean, to communicate if the
+ * start of the selection is the active point or not.
+ *
+ * The active point corresponds to the user's focus or point of interest. The
+ * user moves the active point to expand or collapse the range. The anchor
+ * point is the other point of the range and typically remains constant. In
+ * most cases, anchor is the start of the range and active is the end. However,
+ * when selecting backwards (e.g. pressing shift+left arrow in a text field),
+ * the start of the range is the active point, as the user moves this to
+ * manipulate the selection.
+ */
+typedef struct _AtkTextSelection AtkTextSelection;
+struct _AtkTextSelection
+{
+  AtkObject *start_object;
+  gint start_offset;
+  AtkObject *end_object;
+  gint end_offset;
+  gboolean start_is_active;
+};
+
+#ifndef _TYPEDEF_ATK_DOCUMENT_
+#define _TYPEDEF_ATK_DOCUMENT_
+typedef struct _AtkDocument AtkDocument;
+#endif
+typedef struct _AtkDocumentIface AtkDocumentIface;
+
+/**
+ * AtkDocumentIface:
+ * @get_document_type: gets a string indicating the document
+ *   type. This virtual function is deprecated since 2.12 and it
+ *   should not be overriden.
+ * @get_document: a #GObject instance that implements
+ *   AtkDocumentIface. This virtual method is deprecated since 2.12
+ *   and it should not be overriden.
+ * @get_document_locale: gets locale. This virtual function is
+ *   deprecated since 2.7.90 and it should not be overriden.
+ * @get_document_attributes: gets an AtkAttributeSet which describes
+ *   document-wide attributes as name-value pairs.
+ * @get_document_attribute_value: returns a string value assocciated
+ *   with the named attribute for this document, or NULL
+ * @set_document_attribute: sets the value of an attribute. Returns
+ *   TRUE on success, FALSE otherwise
+ * @get_current_page_number: gets the current page number. Since 2.12
+ * @get_page_count: gets the page count of the document. Since 2.12
+ */
+struct _AtkDocumentIface
+{
+  GTypeInterface parent;
+  const gchar *(*get_document_type) (AtkDocument *document);
+  gpointer (*get_document) (AtkDocument *document);
+
+  const gchar *(*get_document_locale) (AtkDocument *document);
+  AtkAttributeSet *(*get_document_attributes) (AtkDocument *document);
+  const gchar *(*get_document_attribute_value) (AtkDocument *document,
+                                                const gchar *attribute_name);
+  gboolean (*set_document_attribute) (AtkDocument *document,
+                                      const gchar *attribute_name,
+                                      const gchar *attribute_value);
+  gint (*get_current_page_number) (AtkDocument *document);
+  gint (*get_page_count) (AtkDocument *document);
+  GArray *(*get_text_selections) (AtkDocument *document);
+  gboolean (*set_text_selections) (AtkDocument *document, GArray *selections);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_document_get_type (void);
+
+ATK_DEPRECATED_IN_2_12
+const gchar *atk_document_get_document_type (AtkDocument *document);
+
+ATK_DEPRECATED_IN_2_12
+gpointer atk_document_get_document (AtkDocument *document);
+
+ATK_DEPRECATED_IN_2_8_FOR (atk_object_get_object_locale)
+const gchar *atk_document_get_locale (AtkDocument *document);
+
+ATK_AVAILABLE_IN_ALL
+AtkAttributeSet *atk_document_get_attributes (AtkDocument *document);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_document_get_attribute_value (AtkDocument *document,
+                                               const gchar *attribute_name);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_document_set_attribute_value (AtkDocument *document,
+                                           const gchar *attribute_name,
+                                           const gchar *attribute_value);
+ATK_AVAILABLE_IN_2_12
+gint atk_document_get_current_page_number (AtkDocument *document);
+ATK_AVAILABLE_IN_2_12
+gint atk_document_get_page_count (AtkDocument *document);
+
+G_END_DECLS
+
+ATK_AVAILABLE_IN_2_52
+GArray *atk_document_get_text_selections (AtkDocument *document);
+
+ATK_AVAILABLE_IN_2_52
+gboolean atk_document_set_text_selections (AtkDocument *document, GArray *selections);
+#endif /* __ATK_DOCUMENT_H__ */
diff --git a/atk/atkeditabletext.c b/atk/atkeditabletext.c
new file mode 100644 (file)
index 0000000..f074a28
--- /dev/null
@@ -0,0 +1,235 @@
+/* ATK - The Accessibility Toolkit for GTK+
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkeditabletext.h"
+
+/**
+ * AtkEditableText:
+ *
+ * The ATK interface implemented by components containing user-editable text content.
+ *
+ * #AtkEditableText should be implemented by UI components which
+ * contain text which the user can edit, via the #AtkObject
+ * corresponding to that component (see #AtkObject).
+ *
+ * #AtkEditableText is a subclass of #AtkText, and as such, an object
+ * which implements #AtkEditableText is by definition an #AtkText
+ * implementor as well.
+ *
+ * See [iface@AtkText]
+ */
+
+GType
+atk_editable_text_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkEditableTextIface),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkEditableText", &tinfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ *atk_editable_text_set_run_attributes:
+ *@text: an #AtkEditableText
+ *@attrib_set: an #AtkAttributeSet
+ *@start_offset: start of range in which to set attributes
+ *@end_offset: end of range in which to set attributes
+ *
+ *Sets the attributes for a specified range. See the ATK_ATTRIBUTE
+ *macros (such as #ATK_ATTRIBUTE_LEFT_MARGIN) for examples of attributes
+ *that can be set. Note that other attributes that do not have corresponding
+ *ATK_ATTRIBUTE macros may also be set for certain text widgets.
+ *
+ *Returns: %TRUE if attributes successfully set for the specified
+ *range, otherwise %FALSE
+ **/
+gboolean
+atk_editable_text_set_run_attributes (AtkEditableText *text,
+                                      AtkAttributeSet *attrib_set,
+                                      gint start_offset,
+                                      gint end_offset)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_EDITABLE_TEXT (text), FALSE);
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->set_run_attributes)
+    {
+      return (*(iface->set_run_attributes)) (text, attrib_set, start_offset, end_offset);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+/**
+ * atk_editable_text_set_text_contents:
+ * @text: an #AtkEditableText
+ * @string: string to set for text contents of @text
+ *
+ * Set text contents of @text.
+ **/
+void
+atk_editable_text_set_text_contents (AtkEditableText *text,
+                                     const gchar *string)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_if_fail (ATK_IS_EDITABLE_TEXT (text));
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->set_text_contents)
+    (*(iface->set_text_contents)) (text, string);
+}
+
+/**
+ * atk_editable_text_insert_text:
+ * @text: an #AtkEditableText
+ * @string: the text to insert
+ * @length: the length of text to insert, in bytes
+ * @position: The caller initializes this to
+ * the position at which to insert the text. After the call it
+ * points at the position after the newly inserted text.
+ *
+ * Insert text at a given position.
+ **/
+void
+atk_editable_text_insert_text (AtkEditableText *text,
+                               const gchar *string,
+                               gint length,
+                               gint *position)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_if_fail (ATK_IS_EDITABLE_TEXT (text));
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->insert_text)
+    (*(iface->insert_text)) (text, string, length, position);
+}
+
+/**
+ * atk_editable_text_copy_text:
+ * @text: an #AtkEditableText
+ * @start_pos: start position
+ * @end_pos: end position
+ *
+ * Copy text from @start_pos up to, but not including @end_pos
+ * to the clipboard.
+ **/
+void
+atk_editable_text_copy_text (AtkEditableText *text,
+                             gint start_pos,
+                             gint end_pos)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_if_fail (ATK_IS_EDITABLE_TEXT (text));
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->copy_text)
+    (*(iface->copy_text)) (text, start_pos, end_pos);
+}
+
+/**
+ * atk_editable_text_cut_text:
+ * @text: an #AtkEditableText
+ * @start_pos: start position
+ * @end_pos: end position
+ *
+ * Copy text from @start_pos up to, but not including @end_pos
+ * to the clipboard and then delete from the widget.
+ **/
+void
+atk_editable_text_cut_text (AtkEditableText *text,
+                            gint start_pos,
+                            gint end_pos)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_if_fail (ATK_IS_EDITABLE_TEXT (text));
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->cut_text)
+    (*(iface->cut_text)) (text, start_pos, end_pos);
+}
+
+/**
+ * atk_editable_text_delete_text:
+ * @text: an #AtkEditableText
+ * @start_pos: start position
+ * @end_pos: end position
+ *
+ * Delete text @start_pos up to, but not including @end_pos.
+ **/
+void
+atk_editable_text_delete_text (AtkEditableText *text,
+                               gint start_pos,
+                               gint end_pos)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_if_fail (ATK_IS_EDITABLE_TEXT (text));
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->delete_text)
+    (*(iface->delete_text)) (text, start_pos, end_pos);
+}
+
+/**
+ * atk_editable_text_paste_text:
+ * @text: an #AtkEditableText
+ * @position: position to paste
+ *
+ * Paste text from clipboard to specified @position.
+ **/
+void
+atk_editable_text_paste_text (AtkEditableText *text,
+                              gint position)
+{
+  AtkEditableTextIface *iface;
+
+  g_return_if_fail (ATK_IS_EDITABLE_TEXT (text));
+
+  iface = ATK_EDITABLE_TEXT_GET_IFACE (text);
+
+  if (iface->paste_text)
+    (*(iface->paste_text)) (text, position);
+}
diff --git a/atk/atkeditabletext.h b/atk/atkeditabletext.h
new file mode 100644 (file)
index 0000000..8e37365
--- /dev/null
@@ -0,0 +1,108 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_EDITABLE_TEXT_H__
+#define __ATK_EDITABLE_TEXT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <atk/atktext.h>
+
+G_BEGIN_DECLS
+
+/*
+ * AtkEditableText is used to support access in an "accessibility" context
+ * to editing features of editable text widgets.
+ */
+
+#define ATK_TYPE_EDITABLE_TEXT (atk_editable_text_get_type ())
+#define ATK_IS_EDITABLE_TEXT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_EDITABLE_TEXT)
+#define ATK_EDITABLE_TEXT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_EDITABLE_TEXT, AtkEditableText)
+#define ATK_EDITABLE_TEXT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_EDITABLE_TEXT, AtkEditableTextIface))
+
+#ifndef _TYPEDEF_ATK_EDITABLE_TEXT_
+#define _TYPEDEF_ATK_EDITABLE_TEXT_
+typedef struct _AtkEditableText AtkEditableText;
+#endif
+typedef struct _AtkEditableTextIface AtkEditableTextIface;
+
+struct _AtkEditableTextIface
+{
+  GTypeInterface parent_interface;
+
+  gboolean (*set_run_attributes) (AtkEditableText *text,
+                                  AtkAttributeSet *attrib_set,
+                                  gint start_offset,
+                                  gint end_offset);
+  void (*set_text_contents) (AtkEditableText *text,
+                             const gchar *string);
+  void (*insert_text) (AtkEditableText *text,
+                       const gchar *string,
+                       gint length,
+                       gint *position);
+  void (*copy_text) (AtkEditableText *text,
+                     gint start_pos,
+                     gint end_pos);
+  void (*cut_text) (AtkEditableText *text,
+                    gint start_pos,
+                    gint end_pos);
+  void (*delete_text) (AtkEditableText *text,
+                       gint start_pos,
+                       gint end_pos);
+  void (*paste_text) (AtkEditableText *text,
+                      gint position);
+};
+ATK_AVAILABLE_IN_ALL
+GType atk_editable_text_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_editable_text_set_run_attributes (AtkEditableText *text,
+                                               AtkAttributeSet *attrib_set,
+                                               gint start_offset,
+                                               gint end_offset);
+ATK_AVAILABLE_IN_ALL
+void atk_editable_text_set_text_contents (AtkEditableText *text,
+                                          const gchar *string);
+ATK_AVAILABLE_IN_ALL
+void atk_editable_text_insert_text (AtkEditableText *text,
+                                    const gchar *string,
+                                    gint length,
+                                    gint *position);
+ATK_AVAILABLE_IN_ALL
+void atk_editable_text_copy_text (AtkEditableText *text,
+                                  gint start_pos,
+                                  gint end_pos);
+ATK_AVAILABLE_IN_ALL
+void atk_editable_text_cut_text (AtkEditableText *text,
+                                 gint start_pos,
+                                 gint end_pos);
+ATK_AVAILABLE_IN_ALL
+void atk_editable_text_delete_text (AtkEditableText *text,
+                                    gint start_pos,
+                                    gint end_pos);
+ATK_AVAILABLE_IN_ALL
+void atk_editable_text_paste_text (AtkEditableText *text,
+                                   gint position);
+
+G_END_DECLS
+
+#endif /* __ATK_EDITABLE_TEXT_H__ */
diff --git a/atk/atkgobjectaccessible.c b/atk/atkgobjectaccessible.c
new file mode 100644 (file)
index 0000000..74eaecf
--- /dev/null
@@ -0,0 +1,205 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <atk/atkgobjectaccessible.h>
+#include <atk/atkregistry.h>
+#include <atk/atkutil.h>
+
+/**
+ * AtkGObjectAccessible:
+ *
+ * This object class is derived from AtkObject and can be used as a basis implementing accessible objects.
+ *
+ * This object class is derived from AtkObject. It can be used as a
+ * basis for implementing accessible objects for GObjects which are
+ * not derived from GtkWidget. One example of its use is in providing
+ * an accessible object for GnomeCanvasItem in the GAIL library.
+ */
+static void atk_gobject_accessible_class_init (AtkGObjectAccessibleClass *klass);
+static void atk_real_gobject_accessible_initialize (AtkObject *atk_obj,
+                                                    gpointer data);
+static void atk_gobject_accessible_object_gone_cb (gpointer data);
+
+static GQuark quark_accessible_object = 0;
+static GQuark quark_object = 0;
+static gpointer parent_class = NULL;
+
+GType
+atk_gobject_accessible_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkGObjectAccessibleClass),
+        (GBaseInitFunc) NULL,     /* base init */
+        (GBaseFinalizeFunc) NULL, /* base finalize */
+        (GClassInitFunc) atk_gobject_accessible_class_init,
+        (GClassFinalizeFunc) NULL, /* class finalize */
+        NULL,                      /* class data */
+        sizeof (AtkGObjectAccessible),
+        0,                        /* nb preallocs */
+        (GInstanceInitFunc) NULL, /* instance init */
+        NULL                      /* value table */
+      };
+
+      type = g_type_register_static (ATK_TYPE_OBJECT,
+                                     "AtkGObjectAccessible", &tinfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ * atk_gobject_accessible_for_object:
+ * @obj: a #GObject
+ *
+ * Gets the accessible object for the specified @obj.
+ *
+ * Returns: (transfer none): a #AtkObject which is the accessible object for
+ * the @obj
+ **/
+AtkObject *
+atk_gobject_accessible_for_object (GObject *obj)
+{
+  AtkObject *accessible;
+
+  g_return_val_if_fail (G_IS_OBJECT (obj), NULL);
+  /* See if we have a cached accessible for this object */
+
+  accessible = quark_accessible_object ? g_object_get_qdata (obj, quark_accessible_object) : NULL;
+
+  if (!accessible)
+    {
+      AtkObjectFactory *factory;
+      AtkRegistry *default_registry;
+
+      default_registry = atk_get_default_registry ();
+      factory = atk_registry_get_factory (default_registry,
+                                          G_OBJECT_TYPE (obj));
+      accessible = atk_object_factory_create_accessible (factory,
+                                                         obj);
+      if (!ATK_IS_GOBJECT_ACCESSIBLE (accessible))
+        {
+          /*
+           * The AtkObject which was created was not a AtkGObjectAccessible
+           */
+          g_object_weak_ref (obj,
+                             (GWeakNotify) g_object_unref,
+                             accessible);
+          if (!quark_accessible_object)
+            quark_accessible_object = g_quark_from_static_string ("accessible-object");
+        }
+      g_object_set_qdata (obj, quark_accessible_object, accessible);
+    }
+  return accessible;
+}
+
+/**
+ * atk_gobject_accessible_get_object:
+ * @obj: a #AtkGObjectAccessible
+ *
+ * Gets the GObject for which @obj is the accessible object.
+ *
+ * Returns: (transfer none): a #GObject which is the object for which @obj is
+ * the accessible object
+ **/
+GObject *
+atk_gobject_accessible_get_object (AtkGObjectAccessible *obj)
+{
+  g_return_val_if_fail (ATK_IS_GOBJECT_ACCESSIBLE (obj), NULL);
+
+  return g_object_get_qdata (G_OBJECT (obj), quark_object);
+}
+
+static void
+atk_real_gobject_accessible_initialize (AtkObject *atk_obj,
+                                        gpointer data)
+{
+  AtkGObjectAccessible *atk_gobj;
+
+  atk_gobj = ATK_GOBJECT_ACCESSIBLE (atk_obj);
+
+  g_object_set_qdata (G_OBJECT (atk_gobj), quark_object, data);
+  atk_obj->layer = ATK_LAYER_WIDGET;
+
+  g_object_weak_ref (data,
+                     (GWeakNotify) atk_gobject_accessible_object_gone_cb,
+                     atk_gobj);
+}
+
+static void
+atk_gobject_accessible_object_gone_cb (gpointer data)
+{
+  GObject *object;
+
+  g_return_if_fail (ATK_IS_GOBJECT_ACCESSIBLE (data));
+
+  object = atk_gobject_accessible_get_object (data);
+  if (object)
+    g_object_set_qdata (object, quark_accessible_object, NULL);
+
+  g_object_set_qdata (G_OBJECT (data), quark_object, NULL);
+  atk_object_notify_state_change (ATK_OBJECT (data), ATK_STATE_DEFUNCT,
+                                  TRUE);
+  g_object_unref (data);
+}
+
+static void
+atk_gobject_accessible_dispose (GObject *atk_obj)
+{
+  GObject *obj = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (atk_obj));
+
+  if (obj)
+    {
+      g_object_set_qdata (obj, quark_accessible_object, NULL);
+      g_object_weak_unref (obj,
+                           (GWeakNotify) atk_gobject_accessible_object_gone_cb,
+                           atk_obj);
+
+      g_object_set_qdata (atk_obj, quark_object, NULL);
+      atk_object_notify_state_change (ATK_OBJECT (atk_obj), ATK_STATE_DEFUNCT,
+                                      TRUE);
+    }
+
+  G_OBJECT_CLASS (parent_class)->dispose (atk_obj);
+}
+
+static void
+atk_gobject_accessible_class_init (AtkGObjectAccessibleClass *klass)
+{
+  AtkObjectClass *class;
+  GObjectClass *object_class;
+
+  class = ATK_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  class->initialize = atk_real_gobject_accessible_initialize;
+
+  object_class = G_OBJECT_CLASS (klass);
+  object_class->dispose = atk_gobject_accessible_dispose;
+
+  if (!quark_accessible_object)
+    quark_accessible_object = g_quark_from_static_string ("accessible-object");
+  quark_object = g_quark_from_static_string ("object-for-accessible");
+}
diff --git a/atk/atkgobjectaccessible.h b/atk/atkgobjectaccessible.h
new file mode 100644 (file)
index 0000000..50c69da
--- /dev/null
@@ -0,0 +1,68 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_GOBJECT_ACCESSIBLE_H__
+#define __ATK_GOBJECT_ACCESSIBLE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+/*
+ * The AtkGObjectAccessible class is provided as a basis for implementing
+ * accessibility support for objects which are not GTK+ widgets
+ */
+#define ATK_TYPE_GOBJECT_ACCESSIBLE (atk_gobject_accessible_get_type ())
+#define ATK_GOBJECT_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_GOBJECT_ACCESSIBLE, AtkGObjectAccessible))
+#define ATK_GOBJECT_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_GOBJECT_ACCESSIBLE, AtkGObjectAccessibleClass))
+#define ATK_IS_GOBJECT_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_GOBJECT_ACCESSIBLE))
+#define ATK_IS_GOBJECT_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_GOBJECT_ACCESSIBLE))
+#define ATK_GOBJECT_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_GOBJECT_ACCESSIBLE, AtkGObjectAccessibleClass))
+
+typedef struct _AtkGObjectAccessible AtkGObjectAccessible;
+typedef struct _AtkGObjectAccessibleClass AtkGObjectAccessibleClass;
+
+struct _AtkGObjectAccessible
+{
+  AtkObject parent;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_gobject_accessible_get_type (void);
+
+struct _AtkGObjectAccessibleClass
+{
+  AtkObjectClass parent_class;
+
+  AtkFunction pad1;
+  AtkFunction pad2;
+};
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_gobject_accessible_for_object (GObject *obj);
+ATK_AVAILABLE_IN_ALL
+GObject *atk_gobject_accessible_get_object (AtkGObjectAccessible *obj);
+
+G_END_DECLS
+
+#endif /* __ATK_GOBJECT_ACCESSIBLE_H__ */
diff --git a/atk/atkhyperlink.c b/atk/atkhyperlink.c
new file mode 100644 (file)
index 0000000..ea5d04b
--- /dev/null
@@ -0,0 +1,421 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+
+#include "atkhyperlink.h"
+
+/**
+ * AtkHyperlink:
+ *
+ * An ATK object which encapsulates a link or set of links in a hypertext document.
+ *
+ * An ATK object which encapsulates a link or set of links (for
+ * instance in the case of client-side image maps) in a hypertext
+ * document.  It may implement the AtkAction interface.  AtkHyperlink
+ * may also be used to refer to inline embedded content, since it
+ * allows specification of a start and end offset within the host
+ * AtkHypertext object.
+ */
+
+enum
+{
+  LINK_ACTIVATED,
+
+  LAST_SIGNAL
+};
+
+enum
+{
+  PROP_0, /* gobject convention */
+
+  PROP_SELECTED_LINK,
+  PROP_NUMBER_ANCHORS,
+  PROP_END_INDEX,
+  PROP_START_INDEX,
+  PROP_LAST
+};
+
+static void atk_hyperlink_class_init (AtkHyperlinkClass *klass);
+static void atk_hyperlink_init (AtkHyperlink *link,
+                                AtkHyperlinkClass *klass);
+
+static void atk_hyperlink_real_get_property (GObject *object,
+                                             guint prop_id,
+                                             GValue *value,
+                                             GParamSpec *pspec);
+
+static void atk_hyperlink_action_iface_init (AtkActionIface *iface);
+
+static guint atk_hyperlink_signals[LAST_SIGNAL] = {
+  0,
+};
+
+static gpointer parent_class = NULL;
+
+GType
+atk_hyperlink_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkHyperlinkClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_hyperlink_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkHyperlink),
+        0,
+        (GInstanceInitFunc) atk_hyperlink_init,
+      };
+
+      static const GInterfaceInfo action_info = {
+        (GInterfaceInitFunc) atk_hyperlink_action_iface_init,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkHyperlink", &typeInfo, 0);
+      g_type_add_interface_static (type, ATK_TYPE_ACTION, &action_info);
+    }
+  return type;
+}
+
+static void
+atk_hyperlink_class_init (AtkHyperlinkClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class->get_property = atk_hyperlink_real_get_property;
+
+  klass->link_activated = NULL;
+
+  /**
+   * AtkHyperlink:selected-link:
+   *
+   * Selected link
+   *
+   * Deprecated: 1.8: Please use ATK_STATE_FOCUSABLE for all links, and
+   * ATK_STATE_FOCUSED for focused links.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_SELECTED_LINK,
+                                   g_param_spec_boolean ("selected-link",
+                                                         _ ("Selected Link"),
+                                                         _ ("Specifies whether the AtkHyperlink object is selected"),
+                                                         FALSE,
+                                                         G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_NUMBER_ANCHORS,
+                                   g_param_spec_int ("number-of-anchors",
+                                                     _ ("Number of Anchors"),
+                                                     _ ("The number of anchors associated with the AtkHyperlink object"),
+                                                     0,
+                                                     G_MAXINT,
+                                                     0,
+                                                     G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_END_INDEX,
+                                   g_param_spec_int ("end-index",
+                                                     _ ("End index"),
+                                                     _ ("The end index of the AtkHyperlink object"),
+                                                     0,
+                                                     G_MAXINT,
+                                                     0,
+                                                     G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_START_INDEX,
+                                   g_param_spec_int ("start-index",
+                                                     _ ("Start index"),
+                                                     _ ("The start index of the AtkHyperlink object"),
+                                                     0,
+                                                     G_MAXINT,
+                                                     0,
+                                                     G_PARAM_READABLE));
+
+  /**
+   * AtkHyperlink::link-activated:
+   * @atkhyperlink: the object which received the signal.
+   *
+   * The signal link-activated is emitted when a link is activated.
+   */
+  atk_hyperlink_signals[LINK_ACTIVATED] =
+      g_signal_new ("link_activated",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    G_STRUCT_OFFSET (AtkHyperlinkClass, link_activated),
+                    NULL, NULL,
+                    g_cclosure_marshal_VOID__VOID,
+                    G_TYPE_NONE,
+                    0);
+}
+
+static void
+atk_hyperlink_init (AtkHyperlink *link,
+                    AtkHyperlinkClass *klass)
+{
+}
+
+static void
+atk_hyperlink_real_get_property (GObject *object,
+                                 guint prop_id,
+                                 GValue *value,
+                                 GParamSpec *pspec)
+{
+  AtkHyperlink *link;
+
+  link = ATK_HYPERLINK (object);
+
+  switch (prop_id)
+    {
+    case PROP_SELECTED_LINK:
+      // This property is deprecated, also the method to get the value
+      g_value_set_boolean (value, FALSE);
+      break;
+    case PROP_NUMBER_ANCHORS:
+      g_value_set_int (value, atk_hyperlink_get_n_anchors (link));
+      break;
+    case PROP_END_INDEX:
+      g_value_set_int (value, atk_hyperlink_get_end_index (link));
+      break;
+    case PROP_START_INDEX:
+      g_value_set_int (value, atk_hyperlink_get_start_index (link));
+      break;
+    default:
+      break;
+    }
+}
+
+/**
+ * atk_hyperlink_get_uri:
+ * @link_: an #AtkHyperlink
+ * @i: a (zero-index) integer specifying the desired anchor
+ *
+ * Get a the URI associated with the anchor specified
+ * by @i of @link_.
+ *
+ * Multiple anchors are primarily used by client-side image maps.
+ *
+ * Returns: a string specifying the URI
+ **/
+gchar *
+atk_hyperlink_get_uri (AtkHyperlink *link,
+                       gint i)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), NULL);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->get_uri)
+    return (klass->get_uri) (link, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_hyperlink_get_object:
+ * @link_: an #AtkHyperlink
+ * @i: a (zero-index) integer specifying the desired anchor
+ *
+ * Returns the item associated with this hyperlinks nth anchor.
+ * For instance, the returned #AtkObject will implement #AtkText
+ * if @link_ is a text hyperlink, #AtkImage if @link_ is an image
+ * hyperlink etc.
+ *
+ * Multiple anchors are primarily used by client-side image maps.
+ *
+ * Returns: (transfer none): an #AtkObject associated with this hyperlinks
+ * i-th anchor
+ **/
+AtkObject *
+atk_hyperlink_get_object (AtkHyperlink *link,
+                          gint i)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), NULL);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->get_object)
+    return (klass->get_object) (link, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_hyperlink_get_end_index:
+ * @link_: an #AtkHyperlink
+ *
+ * Gets the index with the hypertext document at which this link ends.
+ *
+ * Returns: the index with the hypertext document at which this link ends
+ **/
+gint
+atk_hyperlink_get_end_index (AtkHyperlink *link)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), 0);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->get_end_index)
+    return (klass->get_end_index) (link);
+  else
+    return 0;
+}
+
+/**
+ * atk_hyperlink_get_start_index:
+ * @link_: an #AtkHyperlink
+ *
+ * Gets the index with the hypertext document at which this link begins.
+ *
+ * Returns: the index with the hypertext document at which this link begins
+ **/
+gint
+atk_hyperlink_get_start_index (AtkHyperlink *link)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), 0);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->get_start_index)
+    return (klass->get_start_index) (link);
+  else
+    return 0;
+}
+
+/**
+ * atk_hyperlink_is_valid:
+ * @link_: an #AtkHyperlink
+ *
+ * Since the document that a link is associated with may have changed
+ * this method returns %TRUE if the link is still valid (with
+ * respect to the document it references) and %FALSE otherwise.
+ *
+ * Returns: whether or not this link is still valid
+ **/
+gboolean
+atk_hyperlink_is_valid (AtkHyperlink *link)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), FALSE);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->is_valid)
+    return (klass->is_valid) (link);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_hyperlink_is_inline:
+ * @link_: an #AtkHyperlink
+ *
+ * Indicates whether the link currently displays some or all of its
+ *           content inline.  Ordinary HTML links will usually return
+ *           %FALSE, but an inline &lt;src&gt; HTML element will return
+ *           %TRUE.
+ *
+ * Returns: whether or not this link displays its content inline.
+ *
+ **/
+gboolean
+atk_hyperlink_is_inline (AtkHyperlink *link)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), FALSE);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->link_state)
+    return (klass->link_state (link) & ATK_HYPERLINK_IS_INLINE);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_hyperlink_get_n_anchors:
+ * @link_: an #AtkHyperlink
+ *
+ * Gets the number of anchors associated with this hyperlink.
+ *
+ * Returns: the number of anchors associated with this hyperlink
+ **/
+gint
+atk_hyperlink_get_n_anchors (AtkHyperlink *link)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), 0);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->get_n_anchors)
+    return (klass->get_n_anchors) (link);
+  else
+    return 0;
+}
+
+/**
+ * atk_hyperlink_is_selected_link:
+ * @link_: an #AtkHyperlink
+ *
+ * Determines whether this AtkHyperlink is selected
+ *
+ * Since: 1.4
+ *
+ * Deprecated: 1.8: Please use ATK_STATE_FOCUSABLE for all links,
+ * and ATK_STATE_FOCUSED for focused links.
+ *
+ * Returns: True if the AtkHyperlink is selected, False otherwise
+ **/
+gboolean
+atk_hyperlink_is_selected_link (AtkHyperlink *link)
+{
+  AtkHyperlinkClass *klass;
+
+  g_return_val_if_fail (ATK_IS_HYPERLINK (link), FALSE);
+
+  klass = ATK_HYPERLINK_GET_CLASS (link);
+  if (klass->is_selected_link)
+    return (klass->is_selected_link) (link);
+  else
+    return FALSE;
+}
+
+static void
+atk_hyperlink_action_iface_init (AtkActionIface *iface)
+{
+  /*
+   * We do nothing here
+   *
+   * When we come to derive a class from AtkHyperlink we will provide an
+   * implementation of the AtkAction interface.
+   */
+}
diff --git a/atk/atkhyperlink.h b/atk/atkhyperlink.h
new file mode 100644 (file)
index 0000000..f19de29
--- /dev/null
@@ -0,0 +1,114 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_HYPERLINK_H__
+#define __ATK_HYPERLINK_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkaction.h>
+
+G_BEGIN_DECLS
+
+/*
+ * AtkHyperlink encapsulates a link or set of links in a hypertext document.
+ *
+ * It implements the AtkAction interface.
+ */
+
+/**
+ *AtkHyperlinkStateFlags:
+ *@ATK_HYPERLINK_IS_INLINE: Link is inline
+ *
+ *Describes the type of link
+ **/
+typedef enum
+{
+  ATK_HYPERLINK_IS_INLINE = 1 << 0
+} AtkHyperlinkStateFlags;
+
+#define ATK_TYPE_HYPERLINK (atk_hyperlink_get_type ())
+#define ATK_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_HYPERLINK, AtkHyperlink))
+#define ATK_HYPERLINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_HYPERLINK, AtkHyperlinkClass))
+#define ATK_IS_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_HYPERLINK))
+#define ATK_IS_HYPERLINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_HYPERLINK))
+#define ATK_HYPERLINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_HYPERLINK, AtkHyperlinkClass))
+
+typedef struct _AtkHyperlink AtkHyperlink;
+typedef struct _AtkHyperlinkClass AtkHyperlinkClass;
+
+struct _AtkHyperlink
+{
+  GObject parent;
+};
+
+struct _AtkHyperlinkClass
+{
+  GObjectClass parent;
+
+  gchar *(*get_uri) (AtkHyperlink *link_,
+                     gint i);
+  AtkObject *(*get_object) (AtkHyperlink *link_,
+                            gint i);
+  gint (*get_end_index) (AtkHyperlink *link_);
+  gint (*get_start_index) (AtkHyperlink *link_);
+  gboolean (*is_valid) (AtkHyperlink *link_);
+  gint (*get_n_anchors) (AtkHyperlink *link_);
+  guint (*link_state) (AtkHyperlink *link_);
+  gboolean (*is_selected_link) (AtkHyperlink *link_);
+
+  /* Signals */
+  void (*link_activated) (AtkHyperlink *link_);
+  AtkFunction pad1;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_hyperlink_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+gchar *atk_hyperlink_get_uri (AtkHyperlink *link_,
+                              gint i);
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_hyperlink_get_object (AtkHyperlink *link_,
+                                     gint i);
+
+ATK_AVAILABLE_IN_ALL
+gint atk_hyperlink_get_end_index (AtkHyperlink *link_);
+
+ATK_AVAILABLE_IN_ALL
+gint atk_hyperlink_get_start_index (AtkHyperlink *link_);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_hyperlink_is_valid (AtkHyperlink *link_);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_hyperlink_is_inline (AtkHyperlink *link_);
+
+ATK_AVAILABLE_IN_ALL
+gint atk_hyperlink_get_n_anchors (AtkHyperlink *link_);
+
+ATK_DEPRECATED
+gboolean atk_hyperlink_is_selected_link (AtkHyperlink *link_);
+
+G_END_DECLS
+
+#endif /* __ATK_HYPERLINK_H__ */
diff --git a/atk/atkhyperlinkimpl.c b/atk/atkhyperlinkimpl.c
new file mode 100644 (file)
index 0000000..e4ec413
--- /dev/null
@@ -0,0 +1,107 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2006 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkhyperlinkimpl.h"
+#include <string.h>
+
+/**
+ * AtkHyperlinImpl:
+ *
+ * An interface from which the AtkHyperlink
+ *  associated with an AtkObject may be obtained.
+ *
+ * AtkHyperlinkImpl allows AtkObjects to refer to their associated
+ * AtkHyperlink instance, if one exists.  AtkHyperlinkImpl differs
+ * from AtkHyperlink in that AtkHyperlinkImpl is an interface, whereas
+ * AtkHyperlink is a object type.  The AtkHyperlinkImpl interface
+ * allows a client to query an AtkObject for the availability of an
+ * associated AtkHyperlink instance, and obtain that instance.  It is
+ * thus particularly useful in cases where embedded content or inline
+ * content within a text object is present, since the embedding text
+ * object implements AtkHypertext and the inline/embedded objects are
+ * exposed as children which implement AtkHyperlinkImpl, in addition
+ * to their being obtainable via AtkHypertext:getLink followed by
+ * AtkHyperlink:getObject.
+ *
+ * The AtkHyperlinkImpl interface should be supported by objects
+ * exposed within the hierarchy as children of an AtkHypertext
+ * container which correspond to "links" or embedded content within
+ * the text.  HTML anchors are not, for instance, normally exposed
+ * this way, but embedded images and components which appear inline in
+ * the content of a text object are. The AtkHyperlinkIface interface
+ * allows a means of determining which children are hyperlinks in this
+ * sense of the word, and for obtaining their corresponding
+ * AtkHyperlink object, from which the embedding range, URI, etc. can
+ * be obtained.
+ *
+ * To some extent this interface exists because, for historical
+ * reasons, AtkHyperlink was defined as an object type, not an
+ * interface.  Thus, in order to interact with AtkObjects via
+ * AtkHyperlink semantics, a new interface was required.
+ */
+
+GType
+atk_hyperlink_impl_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkHyperlinkImplIface),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkHyperlinkImpl", &tinfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ * atk_hyperlink_impl_get_hyperlink:
+ * @impl: a #GObject instance that implements AtkHyperlinkImplIface
+ *
+ * Gets the hyperlink associated with this object.
+ *
+ * Returns: (transfer full):  an AtkHyperlink object which points to this
+ * implementing AtkObject.
+ *
+ * Since: 1.12
+ **/
+AtkHyperlink *
+atk_hyperlink_impl_get_hyperlink (AtkHyperlinkImpl *impl)
+{
+  AtkHyperlinkImplIface *iface;
+
+  g_return_val_if_fail (impl != NULL, NULL);
+  g_return_val_if_fail (ATK_IS_HYPERLINK_IMPL (impl), NULL);
+
+  iface = ATK_HYPERLINK_IMPL_GET_IFACE (impl);
+
+  if (iface->get_hyperlink)
+    {
+      return (iface->get_hyperlink) (impl);
+    }
+  return NULL;
+}
diff --git a/atk/atkhyperlinkimpl.h b/atk/atkhyperlinkimpl.h
new file mode 100644 (file)
index 0000000..8b95bc8
--- /dev/null
@@ -0,0 +1,68 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_HYPERLINK_IMPL_H__
+#define __ATK_HYPERLINK_IMPL_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkhyperlink.h>
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_HYPERLINK_IMPL (atk_hyperlink_impl_get_type ())
+#define ATK_IS_HYPERLINK_IMPL(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_HYPERLINK_IMPL)
+#define ATK_HYPERLINK_IMPL(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_HYPERLINK_IMPL, AtkHyperlinkImpl)
+#define ATK_HYPERLINK_IMPL_GET_IFACE(obj) G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_HYPERLINK_IMPL, AtkHyperlinkImplIface)
+
+#ifndef _TYPEDEF_ATK_HYPERLINK_IMPL_
+#define _TYPEDEF_ATK_HYPERLINK_IMPL__
+
+/**
+ * AtkHyperlinkImpl:
+ *
+ * A queryable interface which allows AtkHyperlink instances
+ * associated with an AtkObject to be obtained.  AtkHyperlinkImpl
+ * corresponds to AT-SPI's Hyperlink interface, and differs from
+ * AtkHyperlink in that AtkHyperlink is an object type, rather than an
+ * interface, and thus cannot be directly queried. FTW
+ */
+typedef struct _AtkHyperlinkImpl AtkHyperlinkImpl;
+#endif
+typedef struct _AtkHyperlinkImplIface AtkHyperlinkImplIface;
+
+struct _AtkHyperlinkImplIface
+{
+  GTypeInterface parent;
+
+  AtkHyperlink *(*get_hyperlink) (AtkHyperlinkImpl *impl);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_hyperlink_impl_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkHyperlink *atk_hyperlink_impl_get_hyperlink (AtkHyperlinkImpl *impl);
+
+G_END_DECLS
+
+#endif /* __ATK_HYPERLINK_IMPL_H__ */
diff --git a/atk/atkhypertext.c b/atk/atkhypertext.c
new file mode 100644 (file)
index 0000000..010a2a8
--- /dev/null
@@ -0,0 +1,180 @@
+/* ATK - The Accessibility Toolkit for GTK+
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkhypertext.h"
+
+/**
+ * AtkHypertext:
+ *
+ * The ATK interface which provides standard mechanism for manipulating hyperlinks.
+ *
+ * An interface used for objects which implement linking between
+ * multiple resource or content locations, or multiple 'markers'
+ * within a single document.  A Hypertext instance is associated with
+ * one or more Hyperlinks, which are associated with particular
+ * offsets within the Hypertext's included content.  While this
+ * interface is derived from Text, there is no requirement that
+ * Hypertext instances have textual content; they may implement Image
+ * as well, and Hyperlinks need not have non-zero text offsets.
+ */
+
+enum
+{
+  LINK_SELECTED,
+  LAST_SIGNAL
+};
+
+static void atk_hypertext_base_init (AtkHypertextIface *class);
+
+static guint atk_hypertext_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_hypertext_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkHypertextIface),
+        (GBaseInitFunc) atk_hypertext_base_init,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkHypertext", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_hypertext_base_init (AtkHypertextIface *class)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
+    {
+      /**
+       * AtkHypertext::link-selected:
+       * @atkhypertext: the object which received the signal.
+       * @arg1: the index of the hyperlink which is selected
+       *
+       * The "link-selected" signal is emitted by an AtkHyperText
+       * object when one of the hyperlinks associated with the object
+       * is selected.
+       */
+      atk_hypertext_signals[LINK_SELECTED] =
+          g_signal_new ("link_selected",
+                        ATK_TYPE_HYPERTEXT,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkHypertextIface, link_selected),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__INT,
+                        G_TYPE_NONE,
+                        1, G_TYPE_INT);
+
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_hypertext_get_link:
+ * @hypertext: an #AtkHypertext
+ * @link_index: an integer specifying the desired link
+ *
+ * Gets the link in this hypertext document at index
+ * @link_index
+ *
+ * Returns: (transfer none): the link in this hypertext document at
+ * index @link_index
+ **/
+AtkHyperlink *
+atk_hypertext_get_link (AtkHypertext *hypertext,
+                        gint link_index)
+{
+  AtkHypertextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_HYPERTEXT (hypertext), NULL);
+
+  if (link_index < 0)
+    return NULL;
+
+  iface = ATK_HYPERTEXT_GET_IFACE (hypertext);
+
+  if (iface->get_link)
+    return (*(iface->get_link)) (hypertext, link_index);
+  else
+    return NULL;
+}
+
+/**
+ * atk_hypertext_get_n_links:
+ * @hypertext: an #AtkHypertext
+ *
+ * Gets the number of links within this hypertext document.
+ *
+ * Returns: the number of links within this hypertext document
+ **/
+gint
+atk_hypertext_get_n_links (AtkHypertext *hypertext)
+{
+  AtkHypertextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_HYPERTEXT (hypertext), 0);
+
+  iface = ATK_HYPERTEXT_GET_IFACE (hypertext);
+
+  if (iface->get_n_links)
+    return (*(iface->get_n_links)) (hypertext);
+  else
+    return 0;
+}
+
+/**
+ * atk_hypertext_get_link_index:
+ * @hypertext: an #AtkHypertext
+ * @char_index: a character index
+ *
+ * Gets the index into the array of hyperlinks that is associated with
+ * the character specified by @char_index.
+ *
+ * Returns: an index into the array of hyperlinks in @hypertext,
+ * or -1 if there is no hyperlink associated with this character.
+ **/
+gint
+atk_hypertext_get_link_index (AtkHypertext *hypertext,
+                              gint char_index)
+{
+  AtkHypertextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_HYPERTEXT (hypertext), -1);
+
+  if (char_index < 0)
+    return -1;
+
+  iface = ATK_HYPERTEXT_GET_IFACE (hypertext);
+
+  if (iface->get_link_index)
+    return (*(iface->get_link_index)) (hypertext, char_index);
+  else
+    return -1;
+}
diff --git a/atk/atkhypertext.h b/atk/atkhypertext.h
new file mode 100644 (file)
index 0000000..44d0f11
--- /dev/null
@@ -0,0 +1,78 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_HYPERTEXT_H__
+#define __ATK_HYPERTEXT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkhyperlink.h>
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+/*
+ * The AtkHypertext interface provides standard  mechanisms for manipulating
+ * hyperlinks.
+ */
+
+#define ATK_TYPE_HYPERTEXT (atk_hypertext_get_type ())
+#define ATK_IS_HYPERTEXT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_HYPERTEXT)
+#define ATK_HYPERTEXT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_HYPERTEXT, AtkHypertext)
+#define ATK_HYPERTEXT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_HYPERTEXT, AtkHypertextIface))
+
+#ifndef _TYPEDEF_ATK_HYPERTEXT_
+#define _TYPEDEF_ATK_HYPERTEXT_
+typedef struct _AtkHypertext AtkHypertext;
+#endif
+typedef struct _AtkHypertextIface AtkHypertextIface;
+
+struct _AtkHypertextIface
+{
+  GTypeInterface parent;
+
+  AtkHyperlink *(*get_link) (AtkHypertext *hypertext,
+                             gint link_index);
+  gint (*get_n_links) (AtkHypertext *hypertext);
+  gint (*get_link_index) (AtkHypertext *hypertext,
+                          gint char_index);
+
+  /*
+   * signal handlers
+   */
+  void (*link_selected) (AtkHypertext *hypertext,
+                         gint link_index);
+};
+ATK_AVAILABLE_IN_ALL
+GType atk_hypertext_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkHyperlink *atk_hypertext_get_link (AtkHypertext *hypertext,
+                                      gint link_index);
+ATK_AVAILABLE_IN_ALL
+gint atk_hypertext_get_n_links (AtkHypertext *hypertext);
+ATK_AVAILABLE_IN_ALL
+gint atk_hypertext_get_link_index (AtkHypertext *hypertext,
+                                   gint char_index);
+
+G_END_DECLS
+
+#endif /* __ATK_HYPERTEXT_H__ */
diff --git a/atk/atkimage.c b/atk/atkimage.c
new file mode 100644 (file)
index 0000000..baf90f7
--- /dev/null
@@ -0,0 +1,246 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkimage.h"
+
+/**
+ * AtkImage:
+ *
+ * The ATK Interface implemented by components
+ *  which expose image or pixmap content on-screen.
+ *
+ * #AtkImage should be implemented by #AtkObject subtypes on behalf of
+ * components which display image/pixmap information onscreen, and
+ * which provide information (other than just widget borders, etc.)
+ * via that image content.  For instance, icons, buttons with icons,
+ * toolbar elements, and image viewing panes typically should
+ * implement #AtkImage.
+ *
+ * #AtkImage primarily provides two types of information: coordinate
+ * information (useful for screen review mode of screenreaders, and
+ * for use by onscreen magnifiers), and descriptive information.  The
+ * descriptive information is provided for alternative, text-only
+ * presentation of the most significant information present in the
+ * image.
+ */
+
+GType
+atk_image_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkImageIface),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkImage", &tinfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ * atk_image_get_image_description:
+ * @image: a #GObject instance that implements AtkImageIface
+ *
+ * Get a textual description of this image.
+ *
+ * Returns: a string representing the image description
+ **/
+const gchar *
+atk_image_get_image_description (AtkImage *image)
+{
+  AtkImageIface *iface;
+
+  g_return_val_if_fail (ATK_IS_IMAGE (image), NULL);
+
+  iface = ATK_IMAGE_GET_IFACE (image);
+
+  if (iface->get_image_description)
+    {
+      return (iface->get_image_description) (image);
+    }
+  else
+    {
+      return NULL;
+    }
+}
+
+/**
+ * atk_image_get_image_size:
+ * @image: a #GObject instance that implements AtkImageIface
+ * @width: (out) (optional): filled with the image width, or -1 if the value cannot be obtained.
+ * @height: (out) (optional): filled with the image height, or -1 if the value cannot be obtained.
+ *
+ * Get the width and height in pixels for the specified image.
+ * The values of @width and @height are returned as -1 if the
+ * values cannot be obtained (for instance, if the object is not onscreen).
+ *
+ * If the size can not be obtained (e.g. missing support), x and y are set
+ * to -1.
+ **/
+void
+atk_image_get_image_size (AtkImage *image,
+                          int *width,
+                          int *height)
+{
+  AtkImageIface *iface;
+  gint local_width, local_height;
+  gint *real_width, *real_height;
+
+  g_return_if_fail (ATK_IS_IMAGE (image));
+
+  if (width)
+    real_width = width;
+  else
+    real_width = &local_width;
+  if (height)
+    real_height = height;
+  else
+    real_height = &local_height;
+
+  iface = ATK_IMAGE_GET_IFACE (image);
+
+  if (iface->get_image_size)
+    {
+      iface->get_image_size (image, real_width, real_height);
+    }
+  else
+    {
+      *real_width = -1;
+      *real_height = -1;
+    }
+}
+
+/**
+ * atk_image_set_image_description:
+ * @image: a #GObject instance that implements AtkImageIface
+ * @description: a string description to set for @image
+ *
+ * Sets the textual description for this image.
+ *
+ * Returns: boolean TRUE, or FALSE if operation could
+ * not be completed.
+ **/
+gboolean
+atk_image_set_image_description (AtkImage *image,
+                                 const gchar *description)
+{
+  AtkImageIface *iface;
+
+  g_return_val_if_fail (ATK_IS_IMAGE (image), FALSE);
+
+  iface = ATK_IMAGE_GET_IFACE (image);
+
+  if (iface->set_image_description)
+    {
+      return (iface->set_image_description) (image, description);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+/**
+ * atk_image_get_image_position:
+ * @image: a #GObject instance that implements AtkImageIface
+ * @x: (out) (optional): address of #gint to put x coordinate position; otherwise, -1 if value cannot be obtained.
+ * @y: (out) (optional): address of #gint to put y coordinate position; otherwise, -1 if value cannot be obtained.
+ * @coord_type: specifies whether the coordinates are relative to the screen
+ * or to the components top level window
+ *
+ * Gets the position of the image in the form of a point specifying the
+ * images top-left corner.
+ *
+ * If the position can not be obtained (e.g. missing support), x and y are set
+ * to -1.
+ **/
+void
+atk_image_get_image_position (AtkImage *image,
+                              gint *x,
+                              gint *y,
+                              AtkCoordType coord_type)
+{
+  AtkImageIface *iface;
+  gint local_x, local_y;
+  gint *real_x, *real_y;
+
+  g_return_if_fail (ATK_IS_IMAGE (image));
+
+  if (x)
+    real_x = x;
+  else
+    real_x = &local_x;
+  if (y)
+    real_y = y;
+  else
+    real_y = &local_y;
+
+  iface = ATK_IMAGE_GET_IFACE (image);
+
+  if (iface->get_image_position)
+    {
+      (iface->get_image_position) (image, real_x, real_y, coord_type);
+    }
+  else
+    {
+      *real_x = -1;
+      *real_y = -1;
+    }
+}
+
+/**
+ * atk_image_get_image_locale:
+ * @image: An #AtkImage
+ *
+ * Retrieves the locale identifier associated to the #AtkImage.
+ *
+ * Since: 1.12
+ *
+ * Returns: (nullable): a string corresponding to the POSIX
+ *   `LC_MESSAGES` locale used by the image description, or
+ *   %NULL if the image does not specify a locale.
+ *
+ */
+const gchar *
+atk_image_get_image_locale (AtkImage *image)
+{
+
+  AtkImageIface *iface;
+
+  g_return_val_if_fail (ATK_IS_IMAGE (image), NULL);
+
+  iface = ATK_IMAGE_GET_IFACE (image);
+
+  if (iface->get_image_locale)
+    {
+      return (iface->get_image_locale) (image);
+    }
+  else
+    {
+      return NULL;
+    }
+}
diff --git a/atk/atkimage.h b/atk/atkimage.h
new file mode 100644 (file)
index 0000000..bc09e09
--- /dev/null
@@ -0,0 +1,90 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_IMAGE_H__
+#define __ATK_IMAGE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <atk/atkutil.h>
+
+G_BEGIN_DECLS
+
+/*
+ * The AtkImage interface should be supported by any object that has an
+ * associated image. This interface provides the standard mechanism for
+ * an assistive technology to get descriptive information about images.
+ */
+
+#define ATK_TYPE_IMAGE (atk_image_get_type ())
+#define ATK_IS_IMAGE(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_IMAGE)
+#define ATK_IMAGE(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_IMAGE, AtkImage)
+#define ATK_IMAGE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_IMAGE, AtkImageIface))
+
+#ifndef _TYPEDEF_ATK_IMAGE_
+#define _TYPEDEF_ATK_IMAGE_
+typedef struct _AtkImage AtkImage;
+#endif
+typedef struct _AtkImageIface AtkImageIface;
+
+struct _AtkImageIface
+{
+  GTypeInterface parent;
+  void (*get_image_position) (AtkImage *image,
+                              gint *x,
+                              gint *y,
+                              AtkCoordType coord_type);
+  const gchar *(*get_image_description) (AtkImage *image);
+  void (*get_image_size) (AtkImage *image,
+                          gint *width,
+                          gint *height);
+  gboolean (*set_image_description) (AtkImage *image,
+                                     const gchar *description);
+  const gchar *(*get_image_locale) (AtkImage *image);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_image_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_image_get_image_description (AtkImage *image);
+
+ATK_AVAILABLE_IN_ALL
+void atk_image_get_image_size (AtkImage *image,
+                               gint *width,
+                               gint *height);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_image_set_image_description (AtkImage *image,
+                                          const gchar *description);
+ATK_AVAILABLE_IN_ALL
+void atk_image_get_image_position (AtkImage *image,
+                                   gint *x,
+                                   gint *y,
+                                   AtkCoordType coord_type);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_image_get_image_locale (AtkImage *image);
+
+G_END_DECLS
+
+#endif /* __ATK_IMAGE_H__ */
diff --git a/atk/atkmarshal.list b/atk/atkmarshal.list
new file mode 100644 (file)
index 0000000..f453186
--- /dev/null
@@ -0,0 +1,31 @@
+# see glib-genmarshal(1) for a detailed description of the file format,
+# possible parameter types are:
+#   VOID       indicates   no   return   type,  or  no  extra
+#              parameters. if VOID is used as  the  parameter
+#              list, no additional parameters may be present.
+#   BOOLEAN    for boolean types (gboolean)
+#   CHAR       for signed char types (gchar)
+#   UCHAR      for unsigned char types (guchar)
+#   INT                for signed integer types (gint)
+#   UINT       for unsigned integer types (guint)
+#   LONG       for signed long integer types (glong)
+#   ULONG      for unsigned long integer types (gulong)
+#   ENUM       for enumeration types (gint)
+#   FLAGS      for flag enumeration types (guint)
+#   FLOAT      for single-precision float types (gfloat)
+#   DOUBLE     for double-precision float types (gdouble)
+#   STRING     for string types (gchar*)
+#   PARAM      for GParamSpec or derived types  (GParamSpec*)
+#   BOXED      for boxed (anonymous but reference counted) types (GBoxed*)
+#   POINTER    for anonymous pointer types (gpointer)
+#   OBJECT     for GObject or derived types (GObject*)
+#   NONE       deprecated alias for VOID
+#   BOOL       deprecated alias for BOOLEAN
+
+VOID:INT,INT
+VOID:INT,INT,STRING
+VOID:INT,INT,INT,STRING
+VOID:STRING,BOOLEAN
+VOID:DOUBLE,STRING
+VOID:STRING,INT
+VOID:STRING,STRING
diff --git a/atk/atkmisc.c b/atk/atkmisc.c
new file mode 100644 (file)
index 0000000..f2f3a3b
--- /dev/null
@@ -0,0 +1,148 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2007 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkmisc.h"
+
+/**
+ * AtkMisc:
+ *
+ * A set of ATK utility functions for thread locking
+ *
+ * A set of utility functions for thread locking. This interface and
+ * all his related methods are deprecated since 2.12.
+ */
+
+static void atk_misc_class_init (AtkMiscClass *klass);
+
+GType
+atk_misc_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkMiscClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_misc_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkMisc),
+        0,
+        (GInstanceInitFunc) NULL,
+      };
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkMisc", &typeInfo, 0);
+    }
+  return type;
+}
+
+static void
+atk_misc_class_init (AtkMiscClass *klass)
+{
+  klass->threads_enter = NULL;
+  klass->threads_leave = NULL;
+}
+
+/**
+ * atk_misc_threads_enter:
+ * @misc: an AtkMisc instance for this application.
+ *
+ * Take the thread mutex for the GUI toolkit,
+ * if one exists.
+ * (This method is implemented by the toolkit ATK implementation layer;
+ *  for instance, for GTK+, GAIL implements this via GDK_THREADS_ENTER).
+ *
+ * Deprecated: Since 2.12.
+ *
+ * Since: 1.13
+ *
+ **/
+void
+atk_misc_threads_enter (AtkMisc *misc)
+{
+  AtkMiscClass *klass;
+
+  if (misc == NULL)
+    return;
+
+  klass = ATK_MISC_GET_CLASS (misc);
+
+  if (klass->threads_enter)
+    {
+      klass->threads_enter (misc);
+    }
+}
+
+/**
+ * atk_misc_threads_leave:
+ * @misc: an AtkMisc instance for this application.
+ *
+ * Release the thread mutex for the GUI toolkit,
+ * if one exists. This method, and atk_misc_threads_enter,
+ * are needed in some situations by threaded application code which
+ * services ATK requests, since fulfilling ATK requests often
+ * requires calling into the GUI toolkit.  If a long-running or
+ * potentially blocking call takes place inside such a block, it should
+ * be bracketed by atk_misc_threads_leave/atk_misc_threads_enter calls.
+ * (This method is implemented by the toolkit ATK implementation layer;
+ *  for instance, for GTK+, GAIL implements this via GDK_THREADS_LEAVE).
+ *
+ * Deprecated: Since 2.12.
+ *
+ * Since: 1.13
+ *
+ **/
+void
+atk_misc_threads_leave (AtkMisc *misc)
+{
+  AtkMiscClass *klass;
+
+  if (misc == NULL)
+    return;
+
+  klass = ATK_MISC_GET_CLASS (misc);
+
+  if (klass->threads_leave)
+    {
+      klass->threads_leave (misc);
+    }
+}
+
+AtkMisc *atk_misc_instance = NULL;
+
+/**
+ * atk_misc_get_instance:
+ *
+ * Obtain the singleton instance of AtkMisc for this application.
+ *
+ * Since: 1.13
+ *
+ * Deprecated: Since 2.12.
+ *
+ * Returns: The singleton instance of AtkMisc for this application.
+ *
+ **/
+const AtkMisc *
+atk_misc_get_instance (void)
+{
+  return atk_misc_instance;
+}
diff --git a/atk/atkmisc.h b/atk/atkmisc.h
new file mode 100644 (file)
index 0000000..2455439
--- /dev/null
@@ -0,0 +1,111 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2007 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_MISC_H__
+#define __ATK_MISC_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkversion.h>
+#include <glib-object.h>
+
+/* We prefix variable declarations so they can
+ * properly get exported in Windows DLLs.
+ */
+#ifndef ATK_VAR
+#ifdef G_PLATFORM_WIN32
+#ifdef ATK_STATIC_COMPILATION
+#define ATK_VAR extern
+#else /* !ATK_STATIC_COMPILATION */
+#ifdef ATK_COMPILATION
+#ifdef DLL_EXPORT
+#define ATK_VAR _ATK_EXTERN
+#else /* !DLL_EXPORT */
+#define ATK_VAR extern
+#endif /* !DLL_EXPORT */
+#else  /* !ATK_COMPILATION */
+#define ATK_VAR extern __declspec(dllimport)
+#endif /* !ATK_COMPILATION */
+#endif /* !ATK_STATIC_COMPILATION */
+#else  /* !G_PLATFORM_WIN32 */
+#define ATK_VAR _ATK_EXTERN
+#endif /* !G_PLATFORM_WIN32 */
+#endif /* ATK_VAR */
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_MISC (atk_misc_get_type ())
+#define ATK_IS_MISC(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_MISC)
+#define ATK_MISC(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_MISC, AtkMisc)
+#define ATK_MISC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_MISC, AtkMiscClass))
+#define ATK_IS_MISC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_MISC))
+#define ATK_MISC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_MISC, AtkMiscClass))
+
+#ifndef _TYPEDEF_ATK_MISC_
+#define _TYPEDEF_ATK_MISC_
+typedef struct _AtkMisc AtkMisc;
+typedef struct _AtkMiscClass AtkMiscClass;
+#endif
+
+struct _AtkMisc
+{
+  GObject parent;
+};
+
+/*
+ * Singleton instance - only the ATK implementation layer for
+ * a given GUI toolkit/application instance should touch this
+ * symbol directly.
+ *
+ * Deprecated: Since 2.12.
+ */
+ATK_VAR AtkMisc *atk_misc_instance;
+
+/**
+ * AtkMiscClass:
+ * @threads_enter: This virtual function is deprecated since 2.12 and
+ *   it should not be overriden.
+ * @threads_leave: This virtual function is deprecated sice 2.12 and
+ *   it should not be overriden.
+ *
+ * Usage of AtkMisc is deprecated since 2.12 and heavily discouraged.
+ */
+struct _AtkMiscClass
+{
+  GObjectClass parent;
+  void (*threads_enter) (AtkMisc *misc);
+  void (*threads_leave) (AtkMisc *misc);
+  gpointer vfuncs[32]; /* future bincompat */
+};
+
+ATK_DEPRECATED_IN_2_12
+GType atk_misc_get_type (void);
+
+ATK_DEPRECATED_IN_2_12
+void atk_misc_threads_enter (AtkMisc *misc);
+ATK_DEPRECATED_IN_2_12
+void atk_misc_threads_leave (AtkMisc *misc);
+ATK_DEPRECATED_IN_2_12
+const AtkMisc *atk_misc_get_instance (void);
+
+G_END_DECLS
+
+#endif /* __ATK_MISC_H__ */
diff --git a/atk/atknoopobject.c b/atk/atknoopobject.c
new file mode 100644 (file)
index 0000000..4152173
--- /dev/null
@@ -0,0 +1,192 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+#include "atknoopobject.h"
+
+/**
+ * AtkNoOpObject:
+ *
+ * An AtkObject which purports to implement all ATK interfaces.
+ *
+ * An AtkNoOpObject is an AtkObject which purports to implement all
+ * ATK interfaces. It is the type of AtkObject which is created if an
+ * accessible object is requested for an object type for which no
+ * factory type is specified.
+ *
+ */
+
+static void atk_no_op_object_class_init (AtkNoOpObjectClass *klass);
+
+static gpointer parent_class = NULL;
+
+GType
+atk_no_op_object_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkObjectClass),
+        (GBaseInitFunc) NULL,                         /* base init */
+        (GBaseFinalizeFunc) NULL,                     /* base finalize */
+        (GClassInitFunc) atk_no_op_object_class_init, /* class init */
+        (GClassFinalizeFunc) NULL,                    /* class finalize */
+        NULL,                                         /* class data */
+        sizeof (AtkNoOpObject),                       /* instance size */
+        0,                                            /* nb preallocs */
+        (GInstanceInitFunc) NULL,                     /* instance init */
+        NULL                                          /* value table */
+      };
+
+      static const GInterfaceInfo atk_component_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_action_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_editable_text_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_image_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_selection_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_table_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_table_cell_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_text_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_hypertext_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_value_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_document_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      static const GInterfaceInfo atk_window_info = {
+        (GInterfaceInitFunc) NULL,
+        (GInterfaceFinalizeFunc) NULL,
+        NULL
+      };
+
+      type = g_type_register_static (ATK_TYPE_OBJECT,
+                                     "AtkNoOpObject", &tinfo, 0);
+      g_type_add_interface_static (type, ATK_TYPE_COMPONENT,
+                                   &atk_component_info);
+      g_type_add_interface_static (type, ATK_TYPE_ACTION,
+                                   &atk_action_info);
+      g_type_add_interface_static (type, ATK_TYPE_EDITABLE_TEXT,
+                                   &atk_editable_text_info);
+      g_type_add_interface_static (type, ATK_TYPE_IMAGE,
+                                   &atk_image_info);
+      g_type_add_interface_static (type, ATK_TYPE_SELECTION,
+                                   &atk_selection_info);
+      g_type_add_interface_static (type, ATK_TYPE_TABLE,
+                                   &atk_table_info);
+      g_type_add_interface_static (type, ATK_TYPE_TABLE_CELL,
+                                   &atk_table_cell_info);
+      g_type_add_interface_static (type, ATK_TYPE_TEXT,
+                                   &atk_text_info);
+      g_type_add_interface_static (type, ATK_TYPE_HYPERTEXT,
+                                   &atk_hypertext_info);
+      g_type_add_interface_static (type, ATK_TYPE_VALUE,
+                                   &atk_value_info);
+      g_type_add_interface_static (type, ATK_TYPE_DOCUMENT,
+                                   &atk_document_info);
+      g_type_add_interface_static (type, ATK_TYPE_WINDOW,
+                                   &atk_window_info);
+    }
+  return type;
+}
+
+static void
+atk_no_op_object_class_init (AtkNoOpObjectClass *klass)
+{
+  parent_class = g_type_class_peek_parent (klass);
+}
+
+/**
+ * atk_no_op_object_new:
+ * @obj: a #GObject
+ *
+ * Provides a default (non-functioning stub) #AtkObject.
+ * Application maintainers should not use this method.
+ *
+ * Returns: a default (non-functioning stub) #AtkObject
+ **/
+AtkObject *
+atk_no_op_object_new (GObject *obj)
+{
+  AtkObject *accessible;
+
+  g_return_val_if_fail (obj != NULL, NULL);
+
+  accessible = g_object_new (ATK_TYPE_NO_OP_OBJECT, NULL);
+  g_return_val_if_fail (accessible != NULL, NULL);
+
+  accessible->role = ATK_ROLE_INVALID;
+  accessible->layer = ATK_LAYER_INVALID;
+
+  return accessible;
+}
diff --git a/atk/atknoopobject.h b/atk/atknoopobject.h
new file mode 100644 (file)
index 0000000..3ccac0d
--- /dev/null
@@ -0,0 +1,59 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkversion.h>
+
+#ifndef __ATK_NO_OP_OBJECT_H__
+#define __ATK_NO_OP_OBJECT_H__
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_NO_OP_OBJECT (atk_no_op_object_get_type ())
+#define ATK_NO_OP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_NO_OP_OBJECT, AtkNoOpObject))
+#define ATK_NO_OP_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_NO_OP_OBJECT, AtkNoOpObjectClass))
+#define ATK_IS_NO_OP_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_NO_OP_OBJECT))
+#define ATK_IS_NO_OP_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_NO_OP_OBJECT))
+#define ATK_NO_OP_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_NO_OP_OBJECT, AtkNoOpObjectClass))
+
+typedef struct _AtkNoOpObject AtkNoOpObject;
+typedef struct _AtkNoOpObjectClass AtkNoOpObjectClass;
+
+struct _AtkNoOpObject
+{
+  AtkObject parent;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_no_op_object_get_type (void);
+
+struct _AtkNoOpObjectClass
+{
+  AtkObjectClass parent_class;
+};
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_no_op_object_new (GObject *obj);
+
+G_END_DECLS
+
+#endif /* __ATK_NO_OP_OBJECT_H__ */
diff --git a/atk/atknoopobjectfactory.c b/atk/atknoopobjectfactory.c
new file mode 100644 (file)
index 0000000..b7c10e0
--- /dev/null
@@ -0,0 +1,116 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkobject.h"
+
+#include "atknoopobject.h"
+#include "atknoopobjectfactory.h"
+
+/**
+ * AtkNoOpObjectFactory:
+ *
+ * The AtkObjectFactory which creates an AtkNoOpObject.
+ *
+ * The AtkObjectFactory which creates an AtkNoOpObject. An instance of
+ * this is created by an AtkRegistry if no factory type has not been
+ * specified to create an accessible object of a particular type.
+ */
+static void atk_no_op_object_factory_class_init (
+    AtkNoOpObjectFactoryClass *klass);
+
+static AtkObject *atk_no_op_object_factory_create_accessible (
+    GObject *obj);
+static GType atk_no_op_object_factory_get_accessible_type (void);
+
+static gpointer parent_class = NULL;
+
+GType
+atk_no_op_object_factory_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkNoOpObjectFactoryClass),
+        (GBaseInitFunc) NULL,                                 /* base init */
+        (GBaseFinalizeFunc) NULL,                             /* base finalize */
+        (GClassInitFunc) atk_no_op_object_factory_class_init, /* class init */
+        (GClassFinalizeFunc) NULL,                            /* class finalize */
+        NULL,                                                 /* class data */
+        sizeof (AtkNoOpObjectFactory),                        /* instance size */
+        0,                                                    /* nb preallocs */
+        (GInstanceInitFunc) NULL,                             /* instance init */
+        NULL                                                  /* value table */
+      };
+      type = g_type_register_static (
+          ATK_TYPE_OBJECT_FACTORY,
+          "AtkNoOpObjectFactory", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_no_op_object_factory_class_init (AtkNoOpObjectFactoryClass *klass)
+{
+  AtkObjectFactoryClass *class = ATK_OBJECT_FACTORY_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  class->create_accessible = atk_no_op_object_factory_create_accessible;
+  class->get_accessible_type = atk_no_op_object_factory_get_accessible_type;
+}
+
+/**
+ * atk_no_op_object_factory_new:
+ *
+ * Creates an instance of an #AtkObjectFactory which generates primitive
+ * (non-functioning) #AtkObjects.
+ *
+ * Returns: an instance of an #AtkObjectFactory
+ **/
+AtkObjectFactory *
+atk_no_op_object_factory_new (void)
+{
+  GObject *factory;
+
+  factory = g_object_new (ATK_TYPE_NO_OP_OBJECT_FACTORY, NULL);
+
+  g_return_val_if_fail (factory != NULL, NULL);
+  return ATK_OBJECT_FACTORY (factory);
+}
+
+static AtkObject *
+atk_no_op_object_factory_create_accessible (GObject *obj)
+{
+  AtkObject *accessible;
+
+  accessible = atk_no_op_object_new (obj);
+
+  return accessible;
+}
+
+static GType
+atk_no_op_object_factory_get_accessible_type (void)
+{
+  return ATK_TYPE_NO_OP_OBJECT;
+}
diff --git a/atk/atknoopobjectfactory.h b/atk/atknoopobjectfactory.h
new file mode 100644 (file)
index 0000000..f2da342
--- /dev/null
@@ -0,0 +1,59 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_NO_OP_OBJECT_FACTORY_H__
+#define __ATK_NO_OP_OBJECT_FACTORY_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobjectfactory.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_NO_OP_OBJECT_FACTORY (atk_no_op_object_factory_get_type ())
+#define ATK_NO_OP_OBJECT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_NO_OP_OBJECT_FACTORY, AtkNoOpObjectFactory))
+#define ATK_NO_OP_OBJECT_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_NO_OP_OBJECT_FACTORY, AtkNoOpObjectFactoryClass))
+#define ATK_IS_NO_OP_OBJECT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_NO_OP_OBJECT_FACTORY))
+#define ATK_IS_NO_OP_OBJECT_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_NO_OP_OBJECT_FACTORY))
+#define ATK_NO_OP_OBJECT_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_NO_OP_OBJECT_FACTORY, AtkNoOpObjectFactoryClass))
+
+typedef struct _AtkNoOpObjectFactory AtkNoOpObjectFactory;
+typedef struct _AtkNoOpObjectFactoryClass AtkNoOpObjectFactoryClass;
+
+struct _AtkNoOpObjectFactory
+{
+  AtkObjectFactory parent;
+};
+
+struct _AtkNoOpObjectFactoryClass
+{
+  AtkObjectFactoryClass parent_class;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_no_op_object_factory_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkObjectFactory *atk_no_op_object_factory_new (void);
+
+G_END_DECLS
+
+#endif /* __ATK_NO_OP_OBJECT_FACTORY_H__ */
diff --git a/atk/atkobject.c b/atk/atkobject.c
new file mode 100644 (file)
index 0000000..b6911c1
--- /dev/null
@@ -0,0 +1,1799 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include <glib-object.h>
+#include <glib/gi18n-lib.h>
+
+#include "atk.h"
+#include "atkmarshal.h"
+#include "atkprivate.h"
+
+/**
+ * AtkObject:
+ *
+ * The base object class for the Accessibility Toolkit API.
+ *
+ * This class is the primary class for accessibility support via the
+ * Accessibility ToolKit (ATK).  Objects which are instances of
+ * #AtkObject (or instances of AtkObject-derived types) are queried
+ * for properties which relate basic (and generic) properties of a UI
+ * component such as name and description.  Instances of #AtkObject
+ * may also be queried as to whether they implement other ATK
+ * interfaces (e.g. #AtkAction, #AtkComponent, etc.), as appropriate
+ * to the role which a given UI component plays in a user interface.
+ *
+ * All UI components in an application which provide useful
+ * information or services to the user must provide corresponding
+ * #AtkObject instances on request (in GTK+, for instance, usually on
+ * a call to #gtk_widget_get_accessible ()), either via ATK support
+ * built into the toolkit for the widget class or ancestor class, or
+ * in the case of custom widgets, if the inherited #AtkObject
+ * implementation is insufficient, via instances of a new #AtkObject
+ * subclass.
+ *
+ * See [class@AtkObjectFactory], [class@AtkRegistry].  (GTK+ users see also
+ * #GtkAccessible).
+ *
+ */
+
+static GPtrArray *role_names = NULL;
+
+enum
+{
+  PROP_0, /* gobject convention */
+
+  PROP_NAME,
+  PROP_DESCRIPTION,
+  PROP_PARENT, /* ancestry has changed */
+  PROP_VALUE,
+  PROP_ROLE,
+  PROP_LAYER,
+  PROP_MDI_ZORDER,
+  PROP_TABLE_CAPTION,
+  PROP_TABLE_COLUMN_DESCRIPTION,
+  PROP_TABLE_COLUMN_HEADER,
+  PROP_TABLE_ROW_DESCRIPTION,
+  PROP_TABLE_ROW_HEADER,
+  PROP_TABLE_SUMMARY,
+  PROP_TABLE_CAPTION_OBJECT,
+  PROP_HYPERTEXT_NUM_LINKS,
+  PROP_ACCESSIBLE_ID,
+  PROP_HELP_TEXT,
+  PROP_LAST /* gobject convention */
+};
+
+enum
+{
+  CHILDREN_CHANGED,
+  FOCUS_EVENT,
+  PROPERTY_CHANGE,
+  STATE_CHANGE,
+  VISIBLE_DATA_CHANGED,
+  ACTIVE_DESCENDANT_CHANGED,
+  ANNOUNCEMENT,
+  NOTIFICATION,
+  ATTRIBUTE_CHANGED,
+
+  LAST_SIGNAL
+};
+
+typedef struct
+{
+  gchar *accessible_id;
+  gchar *help_text;
+} AtkObjectPrivate;
+
+static gint AtkObject_private_offset;
+
+static void atk_object_class_init (AtkObjectClass *klass);
+static void atk_object_init (AtkObject *accessible,
+                             AtkObjectClass *klass);
+static AtkRelationSet *atk_object_real_ref_relation_set (AtkObject *accessible);
+static void atk_object_real_initialize (AtkObject *accessible,
+                                        gpointer data);
+static void atk_object_real_set_property (GObject *object,
+                                          guint prop_id,
+                                          const GValue *value,
+                                          GParamSpec *pspec);
+static void atk_object_real_get_property (GObject *object,
+                                          guint prop_id,
+                                          GValue *value,
+                                          GParamSpec *pspec);
+static void atk_object_finalize (GObject *object);
+static const gchar *atk_object_real_get_name (AtkObject *object);
+static const gchar *atk_object_real_get_description (AtkObject *object);
+static AtkObject *atk_object_real_get_parent (AtkObject *object);
+static AtkRole atk_object_real_get_role (AtkObject *object);
+static AtkLayer atk_object_real_get_layer (AtkObject *object);
+static AtkStateSet *atk_object_real_ref_state_set (AtkObject *object);
+static void atk_object_real_set_name (AtkObject *object,
+                                      const gchar *name);
+static void atk_object_real_set_description (AtkObject *object,
+                                             const gchar *description);
+static void atk_object_real_set_parent (AtkObject *object,
+                                        AtkObject *parent);
+static void atk_object_real_set_role (AtkObject *object,
+                                      AtkRole role);
+static void atk_object_notify (GObject *obj,
+                               GParamSpec *pspec);
+static const gchar *atk_object_real_get_object_locale (AtkObject *object);
+
+static guint atk_object_signals[LAST_SIGNAL] = {
+  0,
+};
+
+static gpointer parent_class = NULL;
+
+static const gchar *const atk_object_name_property_name = "accessible-name";
+static const gchar *const atk_object_name_property_description = "accessible-description";
+static const gchar *const atk_object_name_property_parent = "accessible-parent";
+static const gchar *const atk_object_name_property_value = "accessible-value";
+static const gchar *const atk_object_name_property_role = "accessible-role";
+static const gchar *const atk_object_name_property_component_layer = "accessible-component-layer";
+static const gchar *const atk_object_name_property_component_mdi_zorder = "accessible-component-mdi-zorder";
+static const gchar *const atk_object_name_property_table_caption = "accessible-table-caption";
+static const gchar *const atk_object_name_property_table_column_description = "accessible-table-column-description";
+static const gchar *const atk_object_name_property_table_column_header = "accessible-table-column-header";
+static const gchar *const atk_object_name_property_table_row_description = "accessible-table-row-description";
+static const gchar *const atk_object_name_property_table_row_header = "accessible-table-row-header";
+static const gchar *const atk_object_name_property_table_summary = "accessible-table-summary";
+static const gchar *const atk_object_name_property_table_caption_object = "accessible-table-caption-object";
+static const gchar *const atk_object_name_property_hypertext_num_links = "accessible-hypertext-nlinks";
+static const gchar *const atk_object_name_property_accessible_id = "accessible-id";
+static const gchar *const atk_object_name_property_help_text = "accessible-help-text";
+
+static void
+initialize_role_names ()
+{
+  GTypeClass *enum_class;
+  GEnumValue *enum_value;
+  int i;
+  gchar *role_name = NULL;
+
+  if (role_names)
+    return;
+
+  role_names = g_ptr_array_new ();
+  enum_class = g_type_class_ref (ATK_TYPE_ROLE);
+  if (!G_IS_ENUM_CLASS (enum_class))
+    return;
+
+  for (i = 0; i < ATK_ROLE_LAST_DEFINED; i++)
+    {
+      enum_value = g_enum_get_value (G_ENUM_CLASS (enum_class), i);
+      role_name = g_strdup (enum_value->value_nick);
+      // We want the role names to be in the format "check button" and not "check-button"
+      _compact_name (role_name);
+      g_ptr_array_add (role_names, role_name);
+    }
+
+  g_type_class_unref (enum_class);
+}
+
+GType
+atk_object_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkObjectClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_object_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkObject),
+        0,
+        (GInstanceInitFunc) atk_object_init,
+      };
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkObject", &typeInfo, 0);
+
+      AtkObject_private_offset =
+          g_type_add_instance_private (type, sizeof (AtkObjectPrivate));
+    }
+  return type;
+}
+
+static inline gpointer
+atk_object_get_instance_private (AtkObject *self)
+{
+  return (G_STRUCT_MEMBER_P (self, AtkObject_private_offset));
+}
+
+static void
+atk_object_class_init (AtkObjectClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  if (AtkObject_private_offset != 0)
+    g_type_class_adjust_private_offset (klass, &AtkObject_private_offset);
+
+  gobject_class->set_property = atk_object_real_set_property;
+  gobject_class->get_property = atk_object_real_get_property;
+  gobject_class->finalize = atk_object_finalize;
+  gobject_class->notify = atk_object_notify;
+
+  klass->get_name = atk_object_real_get_name;
+  klass->get_description = atk_object_real_get_description;
+  klass->get_parent = atk_object_real_get_parent;
+  klass->get_n_children = NULL;
+  klass->ref_child = NULL;
+  klass->get_index_in_parent = NULL;
+  klass->ref_relation_set = atk_object_real_ref_relation_set;
+  klass->get_role = atk_object_real_get_role;
+  klass->get_layer = atk_object_real_get_layer;
+  klass->get_mdi_zorder = NULL;
+  klass->initialize = atk_object_real_initialize;
+  klass->ref_state_set = atk_object_real_ref_state_set;
+  klass->set_name = atk_object_real_set_name;
+  klass->set_description = atk_object_real_set_description;
+  klass->set_parent = atk_object_real_set_parent;
+  klass->set_role = atk_object_real_set_role;
+  klass->get_object_locale = atk_object_real_get_object_locale;
+
+  /*
+   * We do not define default signal handlers here
+   */
+  klass->children_changed = NULL;
+  klass->focus_event = NULL;
+  klass->property_change = NULL;
+  klass->visible_data_changed = NULL;
+  klass->active_descendant_changed = NULL;
+
+  _gettext_initialization ();
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_NAME,
+                                   g_param_spec_string (atk_object_name_property_name,
+                                                        _ ("Accessible Name"),
+                                                        _ ("Object instance’s name formatted for assistive technology access"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_DESCRIPTION,
+                                   g_param_spec_string (atk_object_name_property_description,
+                                                        _ ("Accessible Description"),
+                                                        _ ("Description of an object, formatted for assistive technology access"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_PARENT,
+                                   g_param_spec_object (atk_object_name_property_parent,
+                                                        _ ("Accessible Parent"),
+                                                        _ ("Parent of the current accessible as returned by atk_object_get_parent()"),
+                                                        ATK_TYPE_OBJECT,
+                                                        G_PARAM_READWRITE));
+
+  /**
+   * AtkObject:accessible-value:
+   *
+   * Numeric value of this object, in case being and AtkValue.
+   *
+   * Deprecated: Since 2.12. Use atk_value_get_value_and_text() to get
+   * the value, and value-changed signal to be notified on their value
+   * changes.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_VALUE,
+                                   g_param_spec_double (atk_object_name_property_value,
+                                                        _ ("Accessible Value"),
+                                                        _ ("Is used to notify that the value has changed"),
+                                                        0.0,
+                                                        G_MAXDOUBLE,
+                                                        0.0,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_ROLE,
+                                   g_param_spec_enum (atk_object_name_property_role,
+                                                      _ ("Accessible Role"),
+                                                      _ ("The accessible role of this object"),
+                                                      ATK_TYPE_ROLE,
+                                                      ATK_ROLE_UNKNOWN,
+                                                      G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_LAYER,
+                                   g_param_spec_int (atk_object_name_property_component_layer,
+                                                     _ ("Accessible Layer"),
+                                                     _ ("The accessible layer of this object"),
+                                                     0,
+                                                     G_MAXINT,
+                                                     0,
+                                                     G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_MDI_ZORDER,
+                                   g_param_spec_int (atk_object_name_property_component_mdi_zorder,
+                                                     _ ("Accessible MDI Value"),
+                                                     _ ("The accessible MDI value of this object"),
+                                                     G_MININT,
+                                                     G_MAXINT,
+                                                     G_MININT,
+                                                     G_PARAM_READABLE));
+
+  /**
+   * AtkObject:accessible-table-caption:
+   *
+   * Table caption.
+   *
+   * Deprecated: Since 1.3. Use table-caption-object instead.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_CAPTION,
+                                   g_param_spec_string (atk_object_name_property_table_caption,
+                                                        _ ("Accessible Table Caption"),
+                                                        _ ("Is used to notify that the table caption has changed; this property should not be used. accessible-table-caption-object should be used instead"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+  /**
+   * AtkObject:accessible-table-column-header:
+   *
+   * Accessible table column header.
+   *
+   * Deprecated: Since 2.12. Use atk_table_get_column_header() and
+   * atk_table_set_column_header() instead.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_COLUMN_HEADER,
+                                   g_param_spec_object (atk_object_name_property_table_column_header,
+                                                        _ ("Accessible Table Column Header"),
+                                                        _ ("Is used to notify that the table column header has changed"),
+                                                        ATK_TYPE_OBJECT,
+                                                        G_PARAM_READWRITE));
+
+  /**
+   * AtkObject:accessible-table-column-description:
+   *
+   * Accessible table column description.
+   *
+   * Deprecated: Since 2.12. Use atk_table_get_column_description()
+   * and atk_table_set_column_description() instead.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_COLUMN_DESCRIPTION,
+                                   g_param_spec_string (atk_object_name_property_table_column_description,
+                                                        _ ("Accessible Table Column Description"),
+                                                        _ ("Is used to notify that the table column description has changed"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+
+  /**
+   * AtkObject:accessible-table-row-header:
+   *
+   * Accessible table row header.
+   *
+   * Deprecated: Since 2.12. Use atk_table_get_row_header() and
+   * atk_table_set_row_header() instead.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_ROW_HEADER,
+                                   g_param_spec_object (atk_object_name_property_table_row_header,
+                                                        _ ("Accessible Table Row Header"),
+                                                        _ ("Is used to notify that the table row header has changed"),
+                                                        ATK_TYPE_OBJECT,
+                                                        G_PARAM_READWRITE));
+  /**
+   * AtkObject:accessible-table-row-description:
+   *
+   * Accessible table row description.
+   *
+   * Deprecated: Since 2.12. Use atk_table_get_row_description() and
+   * atk_table_set_row_description() instead.
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_ROW_DESCRIPTION,
+                                   g_param_spec_string (atk_object_name_property_table_row_description,
+                                                        _ ("Accessible Table Row Description"),
+                                                        _ ("Is used to notify that the table row description has changed"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_SUMMARY,
+                                   g_param_spec_object (atk_object_name_property_table_summary,
+                                                        _ ("Accessible Table Summary"),
+                                                        _ ("Is used to notify that the table summary has changed"),
+                                                        ATK_TYPE_OBJECT,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_TABLE_CAPTION_OBJECT,
+                                   g_param_spec_object (atk_object_name_property_table_caption_object,
+                                                        _ ("Accessible Table Caption Object"),
+                                                        _ ("Is used to notify that the table caption has changed"),
+                                                        ATK_TYPE_OBJECT,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_HYPERTEXT_NUM_LINKS,
+                                   g_param_spec_int (atk_object_name_property_hypertext_num_links,
+                                                     _ ("Number of Accessible Hypertext Links"),
+                                                     _ ("The number of links which the current AtkHypertext has"),
+                                                     0,
+                                                     G_MAXINT,
+                                                     0,
+                                                     G_PARAM_READABLE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_ACCESSIBLE_ID,
+                                   g_param_spec_string (atk_object_name_property_accessible_id,
+                                                        _ ("Accessible ID"),
+                                                        _ ("ID for the accessible; useful for automated testing"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_HELP_TEXT,
+                                   g_param_spec_string (atk_object_name_property_help_text,
+                                                        _ ("Help text"),
+                                                        _ ("Help text associated with the accessible"),
+                                                        NULL,
+                                                        G_PARAM_READWRITE));
+  /**
+   * AtkObject::children-changed:
+   * @atkobject: the object which received the signal.
+   * @arg1: The index of the added or removed child. The value can be
+   * -1. This is used if the value is not known by the implementor
+   * when the child is added/removed or irrelevant.
+   * @arg2: (type AtkObject): A gpointer to the child AtkObject which was added or
+   * removed. If the child was removed, it is possible that it is not
+   * available for the implementor. In that case this pointer can be
+   * NULL.
+   *
+   * The signal "children-changed" is emitted when a child is added or
+   * removed from an object. It supports two details: "add" and
+   * "remove"
+   */
+  atk_object_signals[CHILDREN_CHANGED] =
+      g_signal_new ("children_changed",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                    G_STRUCT_OFFSET (AtkObjectClass, children_changed),
+                    NULL, NULL,
+                    g_cclosure_marshal_VOID__UINT_POINTER,
+                    G_TYPE_NONE,
+                    2, G_TYPE_UINT, G_TYPE_POINTER);
+
+  /**
+   * AtkObject::focus-event:
+   * @atkobject: the object which received the signal
+   * @arg1: a boolean value which indicates whether the object gained
+   * or lost focus.
+   *
+   * The signal "focus-event" is emitted when an object gained or lost
+   * focus.
+   *
+   * Deprecated: 2.9.4: Use the #AtkObject::state-change signal instead.
+   */
+  atk_object_signals[FOCUS_EVENT] =
+      g_signal_new ("focus_event",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    G_STRUCT_OFFSET (AtkObjectClass, focus_event),
+                    NULL, NULL,
+                    g_cclosure_marshal_VOID__BOOLEAN,
+                    G_TYPE_NONE,
+                    1, G_TYPE_BOOLEAN);
+  /**
+   * AtkObject::property-change:
+   * @atkobject: the object which received the signal.
+   * @arg1: (type AtkPropertyValues): an #AtkPropertyValues containing the new
+   * value of the property which changed.
+   *
+   * The signal "property-change" is emitted when an object's property
+   * value changes. @arg1 contains an #AtkPropertyValues with the name
+   * and the new value of the property whose value has changed. Note
+   * that, as with GObject notify, getting this signal does not
+   * guarantee that the value of the property has actually changed; it
+   * may also be emitted when the setter of the property is called to
+   * reinstate the previous value.
+   *
+   * Toolkit implementor note: ATK implementors should use
+   * g_object_notify() to emit property-changed
+   * notifications. #AtkObject::property-changed is needed by the
+   * implementation of atk_add_global_event_listener() because GObject
+   * notify doesn't support emission hooks.
+   */
+  atk_object_signals[PROPERTY_CHANGE] =
+      g_signal_new ("property_change",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                    G_STRUCT_OFFSET (AtkObjectClass, property_change),
+                    (GSignalAccumulator) NULL, NULL,
+                    g_cclosure_marshal_VOID__POINTER,
+                    G_TYPE_NONE, 1,
+                    G_TYPE_POINTER);
+
+  /**
+   * AtkObject::state-change:
+   * @atkobject: the object which received the signal.
+   * @arg1: The name of the state which has changed
+   * @arg2: A boolean which indicates whether the state has been set or unset.
+   *
+   * The "state-change" signal is emitted when an object's state
+   * changes.  The detail value identifies the state type which has
+   * changed.
+   */
+  atk_object_signals[STATE_CHANGE] =
+      g_signal_new ("state_change",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                    G_STRUCT_OFFSET (AtkObjectClass, state_change),
+                    (GSignalAccumulator) NULL, NULL,
+                    atk_marshal_VOID__STRING_BOOLEAN,
+                    G_TYPE_NONE, 2,
+                    G_TYPE_STRING,
+                    G_TYPE_BOOLEAN);
+
+  /**
+   * AtkObject::visible-data-changed:
+   * @atkobject: the object which received the signal.
+   *
+   * The "visible-data-changed" signal is emitted when the visual
+   * appearance of the object changed.
+   */
+  atk_object_signals[VISIBLE_DATA_CHANGED] =
+      g_signal_new ("visible_data_changed",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    G_STRUCT_OFFSET (AtkObjectClass, visible_data_changed),
+                    (GSignalAccumulator) NULL, NULL,
+                    g_cclosure_marshal_VOID__VOID,
+                    G_TYPE_NONE, 0);
+
+  /**
+   * AtkObject::active-descendant-changed:
+   * @atkobject: the object which received the signal.
+   * @arg1: (type AtkObject): the newly focused object.
+   *
+   * The "active-descendant-changed" signal is emitted by an object
+   * which has the state ATK_STATE_MANAGES_DESCENDANTS when the focus
+   * object in the object changes. For instance, a table will emit the
+   * signal when the cell in the table which has focus changes.
+   */
+  atk_object_signals[ACTIVE_DESCENDANT_CHANGED] =
+      g_signal_new ("active_descendant_changed",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                    G_STRUCT_OFFSET (AtkObjectClass, active_descendant_changed),
+                    NULL, NULL,
+                    g_cclosure_marshal_VOID__POINTER,
+                    G_TYPE_NONE,
+                    1, G_TYPE_POINTER);
+
+  /**
+   * AtkObject::announcement
+   * @atkobject: the object which received the signal.
+   * @arg1: the text to be announced.
+   *
+   * The "announcement" signal can be emitted to pass an announcement on to
+   * be read by a screen reader.
+   *
+   * Depcrecated (2.50): Use AtkObject::notification instead.
+   *
+   * Since: 2.46
+   */
+  atk_object_signals[ANNOUNCEMENT] =
+      g_signal_new ("announcement",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    0, /* no class handler in order to avoid breaking ABI */
+                    NULL, NULL,
+                    g_cclosure_marshal_VOID__STRING,
+                    G_TYPE_NONE,
+                    1, G_TYPE_STRING);
+
+  /**
+   * AtkObject::notification
+   * @atkobject: the object which received the signal.
+   * @arg1: the text to be announced.
+   * @arg2: an #AtkLive specifying the politeness of the notification.
+   * Should be either ATK_LIVE_POLITE or ATK_LIVE_ASSERTIVE.
+   *
+   * The "notification" signal can be emitted to pass an announcement on to
+   * be read by a screen reader.
+   *
+   * Since: 2.50
+   */
+  atk_object_signals[NOTIFICATION] =
+      g_signal_new ("notification",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    0, /* no class handler in order to avoid breaking ABI */
+                    NULL, NULL,
+                    atk_marshal_VOID__STRING_INT,
+                    G_TYPE_NONE,
+                    2, G_TYPE_STRING, G_TYPE_INT);
+
+  /**
+   * AtkObject::attribute-changed
+   * @atkobject: the object which received the signal.
+   * @arg1: the name of the attribute being modified, or %NULL if not
+   *          available.
+   * @arg2: the attribute's new value, or %null if not available.
+   *
+   * The "attribute-changed" signal should be emitted when one of an object's
+   * attributes changes.
+   *
+   * Since: 2.52
+   */
+  atk_object_signals[ATTRIBUTE_CHANGED] =
+      g_signal_new ("attribute-changed",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    0, /* no class handler in order to avoid breaking ABI */
+                    NULL, NULL,
+                    atk_marshal_VOID__STRING_STRING,
+                    G_TYPE_NONE,
+                    2, G_TYPE_STRING, G_TYPE_STRING);
+}
+
+static void
+atk_object_init (AtkObject *accessible,
+                 AtkObjectClass *klass)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+
+  accessible->name = NULL;
+  accessible->description = NULL;
+  accessible->accessible_parent = NULL;
+  accessible->relation_set = atk_relation_set_new ();
+  accessible->role = ATK_ROLE_UNKNOWN;
+  private->accessible_id = NULL;
+  private
+    ->help_text = NULL;
+}
+
+GType
+atk_implementor_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkImplementorIface),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkImplementorIface", &typeInfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ * atk_object_get_name:
+ * @accessible: an #AtkObject
+ *
+ * Gets the accessible name of the accessible.
+ *
+ * Returns: a character string representing the accessible name of the object.
+ **/
+const gchar *
+atk_object_get_name (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_name)
+    return (klass->get_name) (accessible);
+  else
+    return NULL;
+}
+
+/**
+ * atk_object_get_description:
+ * @accessible: an #AtkObject
+ *
+ * Gets the accessible description of the accessible.
+ *
+ * Returns: a character string representing the accessible description
+ * of the accessible.
+ *
+ **/
+const gchar *
+atk_object_get_description (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_description)
+    return (klass->get_description) (accessible);
+  else
+    return NULL;
+}
+
+/**
+ * atk_object_get_parent:
+ * @accessible: an #AtkObject
+ *
+ * Gets the accessible parent of the accessible. By default this is
+ * the one assigned with atk_object_set_parent(), but it is assumed
+ * that ATK implementors have ways to get the parent of the object
+ * without the need of assigning it manually with
+ * atk_object_set_parent(), and will return it with this method.
+ *
+ * If you are only interested on the parent assigned with
+ * atk_object_set_parent(), use atk_object_peek_parent().
+ *
+ * Returns: (transfer none): an #AtkObject representing the accessible
+ * parent of the accessible
+ **/
+AtkObject *
+atk_object_get_parent (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_parent)
+    return (klass->get_parent) (accessible);
+  else
+    return NULL;
+}
+
+/**
+ * atk_object_peek_parent:
+ * @accessible: an #AtkObject
+ *
+ * Gets the accessible parent of the accessible, if it has been
+ * manually assigned with atk_object_set_parent. Otherwise, this
+ * function returns %NULL.
+ *
+ * This method is intended as an utility for ATK implementors, and not
+ * to be exposed to accessible tools. See atk_object_get_parent() for
+ * further reference.
+ *
+ * Returns: (transfer none): an #AtkObject representing the accessible
+ * parent of the accessible if assigned
+ **/
+AtkObject *
+atk_object_peek_parent (AtkObject *accessible)
+{
+  return accessible->accessible_parent;
+}
+
+/**
+ * atk_object_get_n_accessible_children:
+ * @accessible: an #AtkObject
+ *
+ * Gets the number of accessible children of the accessible.
+ *
+ * Returns: an integer representing the number of accessible children
+ * of the accessible.
+ **/
+gint
+atk_object_get_n_accessible_children (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_n_children)
+    return (klass->get_n_children) (accessible);
+  else
+    return 0;
+}
+
+/**
+ * atk_object_ref_accessible_child:
+ * @accessible: an #AtkObject
+ * @i: a gint representing the position of the child, starting from 0
+ *
+ * Gets a reference to the specified accessible child of the object.
+ * The accessible children are 0-based so the first accessible child is
+ * at index 0, the second at index 1 and so on.
+ *
+ * Returns: (transfer full): an #AtkObject representing the specified
+ * accessible child of the accessible.
+ **/
+AtkObject *
+atk_object_ref_accessible_child (AtkObject *accessible,
+                                 gint i)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->ref_child)
+    return (klass->ref_child) (accessible, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_object_ref_relation_set:
+ * @accessible: an #AtkObject
+ *
+ * Gets the #AtkRelationSet associated with the object.
+ *
+ * Returns: (transfer full): an #AtkRelationSet representing the relation set
+ * of the object.
+ **/
+AtkRelationSet *
+atk_object_ref_relation_set (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->ref_relation_set)
+    return (klass->ref_relation_set) (accessible);
+  else
+    return NULL;
+}
+
+/**
+ * atk_role_register:
+ * @name: a character string describing the new role.
+ *
+ * Registers the role specified by @name. @name must be a meaningful
+ * name. So it should not be empty, or consisting on whitespaces.
+ *
+ * Deprecated: Since 2.12. If your application/toolkit doesn't find a
+ * suitable role for a specific object defined at #AtkRole, please
+ * submit a bug in order to add a new role to the specification.
+ *
+ * Returns: an #AtkRole for the new role if added
+ * properly. ATK_ROLE_INVALID in case of error.
+ **/
+AtkRole
+atk_role_register (const gchar *name)
+{
+  gboolean valid = FALSE;
+  gint i = 0;
+  glong length = g_utf8_strlen (name, -1);
+
+  for (i = 0; i < length; i++)
+    {
+      if (name[i] != ' ')
+        {
+          valid = TRUE;
+          break;
+        }
+    }
+
+  if (!valid)
+    return ATK_ROLE_INVALID;
+
+  if (!role_names)
+    initialize_role_names ();
+
+  g_ptr_array_add (role_names, g_strdup (name));
+  return role_names->len - 1;
+}
+
+/**
+ * atk_object_get_role:
+ * @accessible: an #AtkObject
+ *
+ * Gets the role of the accessible.
+ *
+ * Returns: an #AtkRole which is the role of the accessible
+ **/
+AtkRole
+atk_object_get_role (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_ROLE_UNKNOWN);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_role)
+    return (klass->get_role) (accessible);
+  else
+    return ATK_ROLE_UNKNOWN;
+}
+
+/**
+ * atk_object_get_layer:
+ * @accessible: an #AtkObject
+ *
+ * Gets the layer of the accessible.
+ *
+ * Deprecated: Use atk_component_get_layer instead.
+ *
+ * Returns: an #AtkLayer which is the layer of the accessible
+ **/
+AtkLayer
+atk_object_get_layer (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), ATK_LAYER_INVALID);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_layer)
+    return (klass->get_layer) (accessible);
+  else
+    return ATK_LAYER_INVALID;
+}
+
+/**
+ * atk_object_get_mdi_zorder:
+ * @accessible: an #AtkObject
+ *
+ * Gets the zorder of the accessible. The value G_MININT will be returned
+ * if the layer of the accessible is not ATK_LAYER_MDI.
+ *
+ * Deprecated: Use atk_component_get_mdi_zorder instead.
+ *
+ * Returns: a gint which is the zorder of the accessible, i.e. the depth at
+ * which the component is shown in relation to other components in the same
+ * container.
+ *
+ **/
+gint
+atk_object_get_mdi_zorder (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), G_MININT);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_mdi_zorder)
+    return (klass->get_mdi_zorder) (accessible);
+  else
+    return G_MININT;
+}
+
+/**
+ * atk_object_ref_state_set:
+ * @accessible: an #AtkObject
+ *
+ * Gets a reference to the state set of the accessible; the caller must
+ * unreference it when it is no longer needed.
+ *
+ * Returns: (transfer full): a reference to an #AtkStateSet which is the state
+ * set of the accessible
+ **/
+AtkStateSet *
+atk_object_ref_state_set (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->ref_state_set)
+    return (klass->ref_state_set) (accessible);
+  else
+    return NULL;
+}
+
+/**
+ * atk_object_get_index_in_parent:
+ * @accessible: an #AtkObject
+ *
+ * Gets the 0-based index of this accessible in its parent; returns -1 if the
+ * accessible does not have an accessible parent.
+ *
+ * Returns: an integer which is the index of the accessible in its parent
+ **/
+gint
+atk_object_get_index_in_parent (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_OBJECT (accessible), -1);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_index_in_parent)
+    return (klass->get_index_in_parent) (accessible);
+  else
+    return -1;
+}
+
+/**
+ * atk_object_set_name:
+ * @accessible: an #AtkObject
+ * @name: a character string to be set as the accessible name
+ *
+ * Sets the accessible name of the accessible. You can't set the name
+ * to NULL. This is reserved for the initial value. In this aspect
+ * NULL is similar to ATK_ROLE_UNKNOWN. If you want to set the name to
+ * a empty value you can use "".
+ **/
+void
+atk_object_set_name (AtkObject *accessible,
+                     const gchar *name)
+{
+  AtkObjectClass *klass;
+  gboolean notify = FALSE;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+  g_return_if_fail (name != NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->set_name)
+    {
+      /* Do not notify for initial name setting. See bug 665870 */
+      notify = (accessible->name != NULL);
+
+      (klass->set_name) (accessible, name);
+      if (notify)
+        g_object_notify (G_OBJECT (accessible), atk_object_name_property_name);
+    }
+}
+
+/**
+ * atk_object_set_description:
+ * @accessible: an #AtkObject
+ * @description: a character string to be set as the accessible description
+ *
+ * Sets the accessible description of the accessible. You can't set
+ * the description to NULL. This is reserved for the initial value. In
+ * this aspect NULL is similar to ATK_ROLE_UNKNOWN. If you want to set
+ * the name to a empty value you can use "".
+ **/
+void
+atk_object_set_description (AtkObject *accessible,
+                            const gchar *description)
+{
+  AtkObjectClass *klass;
+  gboolean notify = FALSE;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+  g_return_if_fail (description != NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->set_description)
+    {
+      /* Do not notify for initial name setting. See bug 665870 */
+      notify = (accessible->description != NULL);
+
+      (klass->set_description) (accessible, description);
+      if (notify)
+        g_object_notify (G_OBJECT (accessible),
+                         atk_object_name_property_description);
+    }
+}
+
+/**
+ * atk_object_set_parent:
+ * @accessible: an #AtkObject
+ * @parent: an #AtkObject to be set as the accessible parent
+ *
+ * Sets the accessible parent of the accessible. @parent can be NULL.
+ **/
+void
+atk_object_set_parent (AtkObject *accessible,
+                       AtkObject *parent)
+{
+  AtkObjectClass *klass;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->set_parent)
+    {
+      (klass->set_parent) (accessible, parent);
+      g_object_notify (G_OBJECT (accessible), atk_object_name_property_parent);
+    }
+}
+
+/**
+ * atk_object_set_role:
+ * @accessible: an #AtkObject
+ * @role: an #AtkRole to be set as the role
+ *
+ * Sets the role of the accessible.
+ **/
+void
+atk_object_set_role (AtkObject *accessible,
+                     AtkRole role)
+{
+  AtkObjectClass *klass;
+  AtkRole old_role;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->set_role)
+    {
+      old_role = atk_object_get_role (accessible);
+      if (old_role != role)
+        {
+          (klass->set_role) (accessible, role);
+          if (old_role != ATK_ROLE_UNKNOWN)
+            /* Do not notify for initial role setting */
+            g_object_notify (G_OBJECT (accessible), atk_object_name_property_role);
+        }
+    }
+}
+
+/**
+ * atk_object_connect_property_change_handler: (skip)
+ * @accessible: an #AtkObject
+ * @handler: a function to be called when a property changes its value
+ *
+ * Calls @handler on property changes.
+ *
+ * Returns: a #guint which is the handler id used in
+ *   atk_object_remove_property_change_handler()
+ *
+ * Deprecated: 2.12: Connect directly to #AtkObject::property-change or
+ *   the relevant #GObject::notify signal for each desired property.
+ */
+guint
+atk_object_connect_property_change_handler (AtkObject *accessible,
+                                            AtkPropertyChangeHandler *handler)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), 0);
+  g_return_val_if_fail ((handler != NULL), 0);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->connect_property_change_handler)
+    return (klass->connect_property_change_handler) (accessible, handler);
+  else
+    return 0;
+}
+
+/**
+ * atk_object_remove_property_change_handler:
+ * @accessible: an #AtkObject
+ * @handler_id: a guint which identifies the handler to be removed.
+ *
+ * Removes a property change handler.
+ *
+ * Deprecated: 2.12: See atk_object_connect_property_change_handler()
+ */
+void
+atk_object_remove_property_change_handler (AtkObject *accessible,
+                                           guint handler_id)
+{
+  AtkObjectClass *klass;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->remove_property_change_handler)
+    (klass->remove_property_change_handler) (accessible, handler_id);
+}
+
+/**
+ * atk_object_notify_state_change:
+ * @accessible: an #AtkObject
+ * @state: an #AtkState whose state is changed
+ * @value: a gboolean which indicates whether the state is being set on or off
+ *
+ * Emits a state-change signal for the specified state.
+ *
+ * Note that as a general rule when the state of an existing object changes,
+ * emitting a notification is expected.
+ **/
+void
+atk_object_notify_state_change (AtkObject *accessible,
+                                AtkState state,
+                                gboolean value)
+{
+  const gchar *name;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  name = atk_state_type_get_name (state);
+  g_signal_emit (accessible, atk_object_signals[STATE_CHANGE],
+                 g_quark_from_string (name),
+                 name, value, NULL);
+}
+
+/**
+ * atk_implementor_ref_accessible:
+ * @implementor: The #GObject instance which should implement #AtkImplementorIface
+ * if a non-null return value is required.
+ *
+ * Gets a reference to an object's #AtkObject implementation, if
+ * the object implements #AtkObjectIface
+ *
+ * Returns: (transfer full): a reference to an object's #AtkObject
+ * implementation
+ */
+AtkObject *
+atk_implementor_ref_accessible (AtkImplementor *implementor)
+{
+  AtkImplementorIface *iface;
+  AtkObject *accessible = NULL;
+
+  g_return_val_if_fail (ATK_IS_IMPLEMENTOR (implementor), NULL);
+
+  iface = ATK_IMPLEMENTOR_GET_IFACE (implementor);
+
+  if (iface != NULL)
+    accessible = iface->ref_accessible (implementor);
+
+  g_return_val_if_fail ((accessible != NULL), NULL);
+
+  return accessible;
+}
+
+/**
+ * atk_object_get_attributes:
+ * @accessible: An #AtkObject.
+ *
+ * Get a list of properties applied to this object as a whole, as an #AtkAttributeSet consisting of
+ * name-value pairs. As such these attributes may be considered weakly-typed properties or annotations,
+ * as distinct from strongly-typed object data available via other get/set methods.
+ * Not all objects have explicit "name-value pair" #AtkAttributeSet properties.
+ *
+ * Since: 1.12
+ *
+ * Returns: (transfer full): an #AtkAttributeSet consisting of all
+ * explicit properties/annotations applied to the object, or an empty
+ * set if the object has no name-value pair attributes assigned to
+ * it. This #atkattributeset should be freed by a call to
+ * atk_attribute_set_free().
+ */
+AtkAttributeSet *
+atk_object_get_attributes (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_attributes)
+    return (klass->get_attributes) (accessible);
+  else
+    return NULL;
+}
+
+static AtkRelationSet *
+atk_object_real_ref_relation_set (AtkObject *accessible)
+{
+  g_return_val_if_fail (accessible->relation_set, NULL);
+  g_object_ref (accessible->relation_set);
+
+  return accessible->relation_set;
+}
+
+static void
+atk_object_real_set_property (GObject *object,
+                              guint prop_id,
+                              const GValue *value,
+                              GParamSpec *pspec)
+{
+  AtkObject *accessible;
+
+  accessible = ATK_OBJECT (object);
+
+  switch (prop_id)
+    {
+    case PROP_NAME:
+      atk_object_set_name (accessible, g_value_get_string (value));
+      break;
+    case PROP_DESCRIPTION:
+      atk_object_set_description (accessible, g_value_get_string (value));
+      break;
+    case PROP_ROLE:
+      atk_object_set_role (accessible, g_value_get_enum (value));
+      break;
+    case PROP_PARENT:
+      atk_object_set_parent (accessible, g_value_get_object (value));
+      break;
+    case PROP_VALUE:
+      if (ATK_IS_VALUE (accessible))
+        atk_value_set_current_value (ATK_VALUE (accessible), value);
+      break;
+    case PROP_TABLE_SUMMARY:
+      if (ATK_IS_TABLE (accessible))
+        atk_table_set_summary (ATK_TABLE (accessible), g_value_get_object (value));
+      break;
+    case PROP_TABLE_CAPTION_OBJECT:
+      if (ATK_IS_TABLE (accessible))
+        atk_table_set_caption (ATK_TABLE (accessible), g_value_get_object (value));
+      break;
+    case PROP_ACCESSIBLE_ID:
+      atk_object_set_accessible_id (accessible, g_value_get_string (value));
+      break;
+    case PROP_HELP_TEXT:
+      atk_object_set_help_text (accessible, g_value_get_string (value));
+      break;
+    default:
+      break;
+    }
+}
+
+static void
+atk_object_real_get_property (GObject *object,
+                              guint prop_id,
+                              GValue *value,
+                              GParamSpec *pspec)
+{
+  AtkObject *accessible;
+
+  accessible = ATK_OBJECT (object);
+
+  switch (prop_id)
+    {
+    case PROP_NAME:
+      g_value_set_string (value, atk_object_get_name (accessible));
+      break;
+    case PROP_DESCRIPTION:
+      g_value_set_string (value, atk_object_get_description (accessible));
+      break;
+    case PROP_ROLE:
+      g_value_set_enum (value, atk_object_get_role (accessible));
+      break;
+    case PROP_LAYER:
+      if (ATK_IS_COMPONENT (accessible))
+        g_value_set_int (value, atk_component_get_layer (ATK_COMPONENT (accessible)));
+      break;
+    case PROP_MDI_ZORDER:
+      if (ATK_IS_COMPONENT (accessible))
+        g_value_set_int (value, atk_component_get_mdi_zorder (ATK_COMPONENT (accessible)));
+      break;
+    case PROP_PARENT:
+      g_value_set_object (value, atk_object_get_parent (accessible));
+      break;
+    case PROP_VALUE:
+      if (ATK_IS_VALUE (accessible))
+        atk_value_get_current_value (ATK_VALUE (accessible), value);
+      break;
+    case PROP_TABLE_SUMMARY:
+      if (ATK_IS_TABLE (accessible))
+        g_value_set_object (value, atk_table_get_summary (ATK_TABLE (accessible)));
+      break;
+    case PROP_TABLE_CAPTION_OBJECT:
+      if (ATK_IS_TABLE (accessible))
+        g_value_set_object (value, atk_table_get_caption (ATK_TABLE (accessible)));
+      break;
+    case PROP_HYPERTEXT_NUM_LINKS:
+      if (ATK_IS_HYPERTEXT (accessible))
+        g_value_set_int (value, atk_hypertext_get_n_links (ATK_HYPERTEXT (accessible)));
+      break;
+    case PROP_ACCESSIBLE_ID:
+      g_value_set_string (value, atk_object_get_accessible_id (accessible));
+      break;
+    case PROP_HELP_TEXT:
+      g_value_set_string (value, atk_object_get_help_text (accessible));
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+atk_object_finalize (GObject *object)
+{
+  AtkObject *accessible;
+  AtkObjectPrivate *private;
+
+  g_return_if_fail (ATK_IS_OBJECT (object));
+
+  accessible = ATK_OBJECT (object);
+  private = atk_object_get_instance_private (accessible);
+
+  g_free (accessible->name);
+  g_free (accessible->description);
+
+  /*
+   * Free memory allocated for relation set if it have been allocated.
+   */
+  if (accessible->relation_set)
+    g_object_unref (accessible->relation_set);
+
+  if (accessible->accessible_parent)
+    g_object_unref (accessible->accessible_parent);
+
+  g_free (private->accessible_id);
+  g_free (private->help_text);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static const gchar *
+atk_object_real_get_name (AtkObject *object)
+{
+  return object->name;
+}
+
+static const gchar *
+atk_object_real_get_description (AtkObject *object)
+{
+  return object->description;
+}
+
+static AtkObject *
+atk_object_real_get_parent (AtkObject *object)
+{
+  return atk_object_peek_parent (object);
+}
+
+static AtkRole
+atk_object_real_get_role (AtkObject *object)
+{
+  return object->role;
+}
+
+static AtkLayer
+atk_object_real_get_layer (AtkObject *object)
+{
+  return object->layer;
+}
+
+static AtkStateSet *
+atk_object_real_ref_state_set (AtkObject *accessible)
+{
+  AtkStateSet *state_set;
+  AtkObject *focus_object;
+
+  state_set = atk_state_set_new ();
+
+  focus_object = atk_get_focus_object ();
+  if (focus_object == accessible)
+    atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
+
+  return state_set;
+}
+
+static void
+atk_object_real_set_name (AtkObject *object,
+                          const gchar *name)
+{
+  g_free (object->name);
+  object->name = g_strdup (name);
+}
+
+static void
+atk_object_real_set_description (AtkObject *object,
+                                 const gchar *description)
+{
+  g_free (object->description);
+  object->description = g_strdup (description);
+}
+
+static void
+atk_object_real_set_parent (AtkObject *object,
+                            AtkObject *parent)
+{
+  if (object->accessible_parent)
+    g_object_unref (object->accessible_parent);
+
+  object->accessible_parent = parent;
+  if (object->accessible_parent)
+    g_object_ref (object->accessible_parent);
+}
+
+static void
+atk_object_real_set_role (AtkObject *object,
+                          AtkRole role)
+{
+  object->role = role;
+}
+
+/**
+ * atk_object_initialize:
+ * @accessible: a #AtkObject
+ * @data: a #gpointer which identifies the object for which the AtkObject was created.
+ *
+ * This function is called when implementing subclasses of #AtkObject.
+ * It does initialization required for the new object. It is intended
+ * that this function should called only in the ..._new() functions used
+ * to create an instance of a subclass of #AtkObject
+ **/
+void
+atk_object_initialize (AtkObject *accessible,
+                       gpointer data)
+{
+  AtkObjectClass *klass;
+
+  g_return_if_fail (ATK_IS_OBJECT (accessible));
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->initialize)
+    klass->initialize (accessible, data);
+}
+
+/*
+ * This function is a signal handler for notify signal which gets emitted
+ * when a property changes value.
+ *
+ * It constructs an AtkPropertyValues structure and emits a "property_changed"
+ * signal which causes the user specified AtkPropertyChangeHandler
+ * to be called.
+ */
+static void
+atk_object_notify (GObject *obj,
+                   GParamSpec *pspec)
+{
+  AtkPropertyValues values = {
+    NULL,
+  };
+
+  g_value_init (&values.new_value, pspec->value_type);
+  g_object_get_property (obj, pspec->name, &values.new_value);
+  values.property_name = pspec->name;
+  g_signal_emit (obj, atk_object_signals[PROPERTY_CHANGE],
+                 g_quark_from_string (pspec->name),
+                 &values, NULL);
+  g_value_unset (&values.new_value);
+}
+
+/**
+ * atk_role_get_name:
+ * @role: The #AtkRole whose name is required
+ *
+ * Gets the description string describing the #AtkRole @role.
+ *
+ * Returns: the string describing the AtkRole
+ */
+const gchar *
+atk_role_get_name (AtkRole role)
+{
+  g_return_val_if_fail (role >= 0, NULL);
+
+  if (!role_names)
+    initialize_role_names ();
+
+  if (role < role_names->len)
+    return g_ptr_array_index (role_names, role);
+
+  return NULL;
+}
+
+/**
+ * atk_role_get_localized_name:
+ * @role: The #AtkRole whose localized name is required
+ *
+ * Gets the localized description string describing the #AtkRole @role.
+ *
+ * Returns: the localized string describing the AtkRole
+ **/
+const gchar *
+atk_role_get_localized_name (AtkRole role)
+{
+  _gettext_initialization ();
+
+  return dgettext (GETTEXT_PACKAGE, atk_role_get_name (role));
+}
+
+static const gchar *
+atk_object_real_get_object_locale (AtkObject *object)
+{
+  return setlocale (LC_MESSAGES, NULL);
+}
+
+/**
+ * atk_object_get_object_locale:
+ * @accessible: an #AtkObject
+ *
+ * Gets a UTF-8 string indicating the POSIX-style LC_MESSAGES locale
+ * of @accessible.
+ *
+ * Since: 2.8
+ *
+ * Returns: a UTF-8 string indicating the POSIX-style LC_MESSAGES
+ *          locale of @accessible.
+ **/
+const gchar *
+atk_object_get_object_locale (AtkObject *accessible)
+{
+  AtkObjectClass *klass;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (accessible), NULL);
+
+  klass = ATK_OBJECT_GET_CLASS (accessible);
+  if (klass->get_object_locale)
+    return (klass->get_object_locale) (accessible);
+  else
+    return NULL;
+}
+
+/**
+ * atk_role_for_name:
+ * @name: a string which is the (non-localized) name of an ATK role.
+ *
+ * Get the #AtkRole type corresponding to a rolew name.
+ *
+ * Returns: the #AtkRole enumerated type corresponding to the specified name,
+ *          or #ATK_ROLE_INVALID if no matching role is found.
+ **/
+AtkRole
+atk_role_for_name (const gchar *name)
+{
+  AtkRole role = ATK_ROLE_INVALID;
+  gint i;
+
+  g_return_val_if_fail (name, ATK_ROLE_INVALID);
+
+  if (!role_names)
+    initialize_role_names ();
+
+  for (i = 0; i < role_names->len; i++)
+    {
+      gchar *role_name = (gchar *) g_ptr_array_index (role_names, i);
+
+      g_return_val_if_fail (role_name, ATK_ROLE_INVALID);
+
+      if (strcmp (name, role_name) == 0)
+        {
+          role = i;
+          break;
+        }
+    }
+
+  return role;
+}
+
+/**
+ * atk_object_add_relationship:
+ * @object: The #AtkObject to which an AtkRelation is to be added.
+ * @relationship: The #AtkRelationType of the relation
+ * @target: The #AtkObject which is to be the target of the relation.
+ *
+ * Adds a relationship of the specified type with the specified target.
+ *
+ * Returns: TRUE if the relationship is added.
+ **/
+gboolean
+atk_object_add_relationship (AtkObject *object,
+                             AtkRelationType relationship,
+                             AtkObject *target)
+{
+  AtkObject *array[1];
+  AtkRelation *relation;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (object), FALSE);
+  g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
+
+  if (atk_relation_set_contains_target (object->relation_set,
+                                        relationship, target))
+    return FALSE;
+
+  array[0] = target;
+  relation = atk_relation_new (array, 1, relationship);
+  atk_relation_set_add (object->relation_set, relation);
+  g_object_unref (relation);
+
+  return TRUE;
+}
+
+/**
+ * atk_object_remove_relationship:
+ * @object: The #AtkObject from which an AtkRelation is to be removed.
+ * @relationship: The #AtkRelationType of the relation
+ * @target: The #AtkObject which is the target of the relation to be removed.
+ *
+ * Removes a relationship of the specified type with the specified target.
+ *
+ * Returns: TRUE if the relationship is removed.
+ **/
+gboolean
+atk_object_remove_relationship (AtkObject *object,
+                                AtkRelationType relationship,
+                                AtkObject *target)
+{
+  gboolean ret = FALSE;
+  AtkRelation *relation;
+  GPtrArray *array;
+
+  g_return_val_if_fail (ATK_IS_OBJECT (object), FALSE);
+  g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
+
+  relation = atk_relation_set_get_relation_by_type (object->relation_set, relationship);
+
+  if (relation)
+    {
+      ret = atk_relation_remove_target (relation, target);
+      array = atk_relation_get_target (relation);
+      if (!array || array->len == 0)
+        atk_relation_set_remove (object->relation_set, relation);
+    }
+  return ret;
+}
+
+/**
+ * atk_object_get_accessible_id:
+ * @accessible: an #AtkObject
+ *
+ * Gets the accessible id of the accessible.
+ *
+ * Since: 2.34
+ *
+ * Returns: a character string representing the accessible id of the object, or
+ * NULL if no such string was set.
+ **/
+const gchar *
+atk_object_get_accessible_id (AtkObject *accessible)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+  return private->accessible_id;
+}
+
+/**
+ * atk_object_set_accessible_id:
+ * @accessible: an #AtkObject
+ * @id: a character string to be set as the accessible id
+ *
+ * Sets the accessible ID of the accessible.  This is not meant to be presented
+ * to the user, but to be an ID which is stable over application development.
+ * Typically, this is the gtkbuilder ID. Such an ID will be available for
+ * instance to identify a given well-known accessible object for tailored screen
+ * reading, or for automatic regression testing.
+ *
+ * Since: 2.34
+ **/
+void
+atk_object_set_accessible_id (AtkObject *accessible, const gchar *id)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+  g_free (private->accessible_id);
+  private->accessible_id = g_strdup (id);
+}
+
+/**
+ * atk_object_get_help_text:
+ * @accessible: an #AtkObject
+ *
+ * Gets the help text associated with the accessible.
+ *
+ * Since: 2.52
+ *
+ * Returns: a character string representing the help text or the object, or
+ * NULL if no such string was set.
+ **/
+const gchar *
+atk_object_get_help_text (AtkObject *accessible)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+  return private->help_text;
+}
+
+/**
+ * atk_object_set_help_text:
+ * @accessible: an #AtkObject
+ * @help_text: a character string to be set as the accessible's help text
+ *
+ * Sets the help text associated with the accessible. This can be used to
+ * expose context-sensitive information to help a user understand how to
+ * interact with the object.
+ *
+ * Since: 2.52
+ **/
+void
+atk_object_set_help_text (AtkObject *accessible, const gchar *help_text)
+{
+  AtkObjectPrivate *private = atk_object_get_instance_private (accessible);
+  g_free (private->help_text);
+private
+  ->help_text = g_strdup (help_text);
+}
+
+static void
+atk_object_real_initialize (AtkObject *accessible,
+                            gpointer data)
+{
+  return;
+}
diff --git a/atk/atkobject.h b/atk/atkobject.h
new file mode 100644 (file)
index 0000000..8cb61ab
--- /dev/null
@@ -0,0 +1,824 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_OBJECT_H__
+#define __ATK_OBJECT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <glib-object.h>
+
+#include <atk/atkrelationtype.h>
+#include <atk/atkstate.h>
+#include <atk/atkversion.h>
+
+G_BEGIN_DECLS
+
+/**
+ *AtkRole:
+ *@ATK_ROLE_INVALID: Invalid role
+ *@ATK_ROLE_ACCEL_LABEL: A label which represents an accelerator
+ *@ATK_ROLE_ALERT: An object which is an alert to the user. Assistive Technologies typically respond to ATK_ROLE_ALERT by reading the entire onscreen contents of containers advertising this role.  Should be used for warning dialogs, etc.
+ *@ATK_ROLE_ANIMATION: An object which is an animated image
+ *@ATK_ROLE_ARROW: An arrow in one of the four cardinal directions
+ *@ATK_ROLE_CALENDAR:  An object that displays a calendar and allows the user to select a date
+ *@ATK_ROLE_CANVAS: An object that can be drawn into and is used to trap events
+ *@ATK_ROLE_CHECK_BOX: A choice that can be checked or unchecked and provides a separate indicator for the current state
+ *@ATK_ROLE_CHECK_MENU_ITEM: A menu item with a check box
+ *@ATK_ROLE_COLOR_CHOOSER: A specialized dialog that lets the user choose a color
+ *@ATK_ROLE_COLUMN_HEADER: The header for a column of data
+ *@ATK_ROLE_COMBO_BOX: A collapsible list of choices the user can select from
+ *@ATK_ROLE_DATE_EDITOR: An object whose purpose is to allow a user to edit a date
+ *@ATK_ROLE_DESKTOP_ICON: An inconifed internal frame within a DESKTOP_PANE
+ *@ATK_ROLE_DESKTOP_FRAME: A pane that supports internal frames and iconified versions of those internal frames
+ *@ATK_ROLE_DIAL: An object whose purpose is to allow a user to set a value
+ *@ATK_ROLE_DIALOG: A top level window with title bar and a border
+ *@ATK_ROLE_DIRECTORY_PANE: A pane that allows the user to navigate through and select the contents of a directory
+ *@ATK_ROLE_DRAWING_AREA: An object used for drawing custom user interface elements
+ *@ATK_ROLE_FILE_CHOOSER: A specialized dialog that lets the user choose a file
+ *@ATK_ROLE_FILLER: A object that fills up space in a user interface
+ *@ATK_ROLE_FONT_CHOOSER: A specialized dialog that lets the user choose a font
+ *@ATK_ROLE_FRAME: A top level window with a title bar, border, menubar, etc.
+ *@ATK_ROLE_GLASS_PANE: A pane that is guaranteed to be painted on top of all panes beneath it
+ *@ATK_ROLE_HTML_CONTAINER: A document container for HTML, whose children represent the document content
+ *@ATK_ROLE_ICON: A small fixed size picture, typically used to decorate components
+ *@ATK_ROLE_IMAGE: An object whose primary purpose is to display an image
+ *@ATK_ROLE_INTERNAL_FRAME: A frame-like object that is clipped by a desktop pane
+ *@ATK_ROLE_LABEL: An object used to present an icon or short string in an interface
+ *@ATK_ROLE_LAYERED_PANE: A specialized pane that allows its children to be drawn in layers, providing a form of stacking order
+ *@ATK_ROLE_LIST: An object that presents a list of objects to the user and allows the user to select one or more of them
+ *@ATK_ROLE_LIST_ITEM: An object that represents an element of a list
+ *@ATK_ROLE_MENU: An object usually found inside a menu bar that contains a list of actions the user can choose from
+ *@ATK_ROLE_MENU_BAR: An object usually drawn at the top of the primary dialog box of an application that contains a list of menus the user can choose from
+ *@ATK_ROLE_MENU_ITEM: An object usually contained in a menu that presents an action the user can choose
+ *@ATK_ROLE_OPTION_PANE: A specialized pane whose primary use is inside a DIALOG
+ *@ATK_ROLE_PAGE_TAB: An object that is a child of a page tab list
+ *@ATK_ROLE_PAGE_TAB_LIST: An object that presents a series of panels (or page tabs), one at a time, through some mechanism provided by the object
+ *@ATK_ROLE_PANEL: A generic container that is often used to group objects
+ *@ATK_ROLE_PASSWORD_TEXT: A text object uses for passwords, or other places where the text content is not shown visibly to the user
+ *@ATK_ROLE_POPUP_MENU: A temporary window that is usually used to offer the user a list of choices, and then hides when the user selects one of those choices
+ *@ATK_ROLE_PROGRESS_BAR: An object used to indicate how much of a task has been completed
+ *@ATK_ROLE_PUSH_BUTTON: An object the user can manipulate to tell the application to do something
+ *@ATK_ROLE_RADIO_BUTTON: A specialized check box that will cause other radio buttons in the same group to become unchecked when this one is checked
+ *@ATK_ROLE_RADIO_MENU_ITEM: A check menu item which belongs to a group. At each instant exactly one of the radio menu items from a group is selected
+ *@ATK_ROLE_ROOT_PANE: A specialized pane that has a glass pane and a layered pane as its children
+ *@ATK_ROLE_ROW_HEADER: The header for a row of data
+ *@ATK_ROLE_SCROLL_BAR: An object usually used to allow a user to incrementally view a large amount of data.
+ *@ATK_ROLE_SCROLL_PANE: An object that allows a user to incrementally view a large amount of information
+ *@ATK_ROLE_SEPARATOR: An object usually contained in a menu to provide a visible and logical separation of the contents in a menu
+ *@ATK_ROLE_SLIDER: An object that allows the user to select from a bounded range
+ *@ATK_ROLE_SPLIT_PANE: A specialized panel that presents two other panels at the same time
+ *@ATK_ROLE_SPIN_BUTTON: An object used to get an integer or floating point number from the user
+ *@ATK_ROLE_STATUSBAR: An object which reports messages of minor importance to the user
+ *@ATK_ROLE_TABLE: An object used to represent information in terms of rows and columns
+ *@ATK_ROLE_TABLE_CELL: A cell in a table
+ *@ATK_ROLE_TABLE_COLUMN_HEADER: The header for a column of a table
+ *@ATK_ROLE_TABLE_ROW_HEADER: The header for a row of a table
+ *@ATK_ROLE_TEAR_OFF_MENU_ITEM: A menu item used to tear off and reattach its menu
+ *@ATK_ROLE_TERMINAL: An object that represents an accessible terminal.  (Since: 0.6)
+ *@ATK_ROLE_TEXT: An interactive widget that supports multiple lines of text and
+ * optionally accepts user input, but whose purpose is not to solicit user input.
+ * Thus ATK_ROLE_TEXT is appropriate for the text view in a plain text editor
+ * but inappropriate for an input field in a dialog box or web form. For widgets
+ * whose purpose is to solicit input from the user, see ATK_ROLE_ENTRY and
+ * ATK_ROLE_PASSWORD_TEXT. For generic objects which display a brief amount of
+ * textual information, see ATK_ROLE_STATIC.
+ *@ATK_ROLE_TOGGLE_BUTTON: A specialized push button that can be checked or unchecked, but does not provide a separate indicator for the current state
+ *@ATK_ROLE_TOOL_BAR: A bar or palette usually composed of push buttons or toggle buttons
+ *@ATK_ROLE_TOOL_TIP: An object that provides information about another object
+ *@ATK_ROLE_TREE: An object used to represent hierarchical information to the user
+ *@ATK_ROLE_TREE_TABLE: An object capable of expanding and collapsing rows as well as showing multiple columns of data.   (Since: 0.7)
+ *@ATK_ROLE_UNKNOWN: The object contains some Accessible information, but its role is not known
+ *@ATK_ROLE_VIEWPORT: An object usually used in a scroll pane
+ *@ATK_ROLE_WINDOW: A top level window with no title or border.
+ *@ATK_ROLE_HEADER: An object that serves as a document header. (Since: 1.1.1)
+ *@ATK_ROLE_FOOTER: An object that serves as a document footer.  (Since: 1.1.1)
+ *@ATK_ROLE_PARAGRAPH: An object which is contains a paragraph of text content.   (Since: 1.1.1)
+ *@ATK_ROLE_RULER: An object which describes margins and tab stops, etc. for text objects which it controls (should have CONTROLLER_FOR relation to such).   (Since: 1.1.1)
+ *@ATK_ROLE_APPLICATION: The object is an application object, which may contain @ATK_ROLE_FRAME objects or other types of accessibles.  The root accessible of any application's ATK hierarchy should have ATK_ROLE_APPLICATION.   (Since: 1.1.4)
+ *@ATK_ROLE_AUTOCOMPLETE: The object is a dialog or list containing items for insertion into an entry widget, for instance a list of words for completion of a text entry.   (Since: 1.3)
+ *@ATK_ROLE_EDITBAR: The object is an editable text object in a toolbar.  (Since: 1.5)
+ *@ATK_ROLE_EMBEDDED: The object is an embedded container within a document or panel.  This role is a grouping "hint" indicating that the contained objects share a context.  (Since: 1.7.2)
+ *@ATK_ROLE_ENTRY: The object is a component whose textual content may be entered or modified by the user, provided @ATK_STATE_EDITABLE is present.   (Since: 1.11)
+ *@ATK_ROLE_CHART: The object is a graphical depiction of quantitative data. It may contain multiple subelements whose attributes and/or description may be queried to obtain both the quantitative data and information about how the data is being presented. The LABELLED_BY relation is particularly important in interpreting objects of this type, as is the accessible-description property.  (Since: 1.11)
+ *@ATK_ROLE_CAPTION: The object contains descriptive information, usually textual, about another user interface element such as a table, chart, or image.  (Since: 1.11)
+ *@ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.  (Since: 1.11)
+ *@ATK_ROLE_HEADING: The object serves as a heading for content which follows it in a document. The 'heading level' of the heading, if availabe, may be obtained by querying the object's attributes.
+ *@ATK_ROLE_PAGE: The object is a containing instance which encapsulates a page of information. @ATK_ROLE_PAGE is used in documents and content which support a paginated navigation model.  (Since: 1.11)
+ *@ATK_ROLE_SECTION: The object is a containing instance of document content which constitutes a particular 'logical' section of the document. The type of content within a section, and the nature of the section division itself, may be obtained by querying the object's attributes. Sections may be nested. (Since: 1.11)
+ *@ATK_ROLE_REDUNDANT_OBJECT: The object is redundant with another object in the hierarchy, and is exposed for purely technical reasons.  Objects of this role should normally be ignored by clients. (Since: 1.11)
+ *@ATK_ROLE_FORM: The object is a container for form controls, for instance as part of a
+ * web form or user-input form within a document.  This role is primarily a tag/convenience for
+ * clients when navigating complex documents, it is not expected that ordinary GUI containers will
+ * always have ATK_ROLE_FORM. (Since: 1.12.0)
+ *@ATK_ROLE_LINK: The object is a hypertext anchor, i.e. a "link" in a
+ * hypertext document.  Such objects are distinct from 'inline'
+ * content which may also use the Hypertext/Hyperlink interfaces
+ * to indicate the range/location within a text object where
+ * an inline or embedded object lies.  (Since: 1.12.1)
+ *@ATK_ROLE_INPUT_METHOD_WINDOW: The object is a window or similar viewport
+ * which is used to allow composition or input of a 'complex character',
+ * in other words it is an "input method window." (Since: 1.12.1)
+ *@ATK_ROLE_TABLE_ROW: A row in a table.  (Since: 2.1.0)
+ *@ATK_ROLE_TREE_ITEM: An object that represents an element of a tree.  (Since: 2.1.0)
+ *@ATK_ROLE_DOCUMENT_SPREADSHEET: A document frame which contains a spreadsheet.  (Since: 2.1.0)
+ *@ATK_ROLE_DOCUMENT_PRESENTATION: A document frame which contains a presentation or slide content.  (Since: 2.1.0)
+ *@ATK_ROLE_DOCUMENT_TEXT: A document frame which contains textual content, such as found in a word processing application.  (Since: 2.1.0)
+ *@ATK_ROLE_DOCUMENT_WEB: A document frame which contains HTML or other markup suitable for display in a web browser.  (Since: 2.1.0)
+ *@ATK_ROLE_DOCUMENT_EMAIL: A document frame which contains email content to be displayed or composed either in plain text or HTML.  (Since: 2.1.0)
+ *@ATK_ROLE_COMMENT: An object found within a document and designed to present a comment, note, or other annotation. In some cases, this object might not be visible until activated.  (Since: 2.1.0)
+ *@ATK_ROLE_LIST_BOX: A non-collapsible list of choices the user can select from. (Since: 2.1.0)
+ *@ATK_ROLE_GROUPING: A group of related widgets. This group typically has a label. (Since: 2.1.0)
+ *@ATK_ROLE_IMAGE_MAP: An image map object. Usually a graphic with multiple hotspots, where each hotspot can be activated resulting in the loading of another document or section of a document. (Since: 2.1.0)
+ *@ATK_ROLE_NOTIFICATION: A transitory object designed to present a message to the user, typically at the desktop level rather than inside a particular application.  (Since: 2.1.0)
+ *@ATK_ROLE_INFO_BAR: An object designed to present a message to the user within an existing window. (Since: 2.1.0)
+ *@ATK_ROLE_LEVEL_BAR: A bar that serves as a level indicator to, for instance, show the strength of a password or the state of a battery.  (Since: 2.7.3)
+ *@ATK_ROLE_TITLE_BAR: A bar that serves as the title of a window or a
+ * dialog. (Since: 2.12)
+ *@ATK_ROLE_BLOCK_QUOTE: An object which contains a text section
+ * that is quoted from another source. (Since: 2.12)
+ *@ATK_ROLE_AUDIO: An object which represents an audio element. (Since: 2.12)
+ *@ATK_ROLE_VIDEO: An object which represents a video element. (Since: 2.12)
+ *@ATK_ROLE_DEFINITION: A definition of a term or concept. (Since: 2.12)
+ *@ATK_ROLE_ARTICLE: A section of a page that consists of a
+ * composition that forms an independent part of a document, page, or
+ * site. Examples: A blog entry, a news story, a forum post. (Since: 2.12)
+ *@ATK_ROLE_LANDMARK: A region of a web page intended as a
+ * navigational landmark. This is designed to allow Assistive
+ * Technologies to provide quick navigation among key regions within a
+ * document. (Since: 2.12)
+ *@ATK_ROLE_LOG: A text widget or container holding log content, such
+ * as chat history and error logs. In this role there is a
+ * relationship between the arrival of new items in the log and the
+ * reading order. The log contains a meaningful sequence and new
+ * information is added only to the end of the log, not at arbitrary
+ * points. (Since: 2.12)
+ *@ATK_ROLE_MARQUEE: A container where non-essential information
+ * changes frequently. Common usages of marquee include stock tickers
+ * and ad banners. The primary difference between a marquee and a log
+ * is that logs usually have a meaningful order or sequence of
+ * important content changes. (Since: 2.12)
+ *@ATK_ROLE_MATH: A text widget or container that holds a mathematical
+ * expression. (Since: 2.12)
+ *@ATK_ROLE_RATING: A widget whose purpose is to display a rating,
+ * such as the number of stars associated with a song in a media
+ * player. Objects of this role should also implement
+ * AtkValue. (Since: 2.12)
+ *@ATK_ROLE_TIMER: An object containing a numerical counter which
+ * indicates an amount of elapsed time from a start point, or the time
+ * remaining until an end point. (Since: 2.12)
+ *@ATK_ROLE_DESCRIPTION_LIST: An object that represents a list of
+ * term-value groups. A term-value group represents a individual
+ * description and consist of one or more names
+ * (ATK_ROLE_DESCRIPTION_TERM) followed by one or more values
+ * (ATK_ROLE_DESCRIPTION_VALUE). For each list, there should not be
+ * more than one group with the same term name. (Since: 2.12)
+ *@ATK_ROLE_DESCRIPTION_TERM: An object that represents a term or phrase
+ * with a corresponding definition. (Since: 2.12)
+ *@ATK_ROLE_DESCRIPTION_VALUE: An object that represents the
+ * description, definition or value of a term. (Since: 2.12)
+ *@ATK_ROLE_STATIC: A generic non-container object whose purpose is to display a
+ * brief amount of information to the user and whose role is known by the
+ * implementor but lacks semantic value for the user. Examples in which
+ * %ATK_ROLE_STATIC is appropriate include the message displayed in a message box
+ * and an image used as an alternative means to display text. %ATK_ROLE_STATIC
+ * should not be applied to widgets which are traditionally interactive, objects
+ * which display a significant amount of content, or any object which has an
+ * accessible relation pointing to another object. Implementors should expose the
+ * displayed information through the accessible name of the object. If doing so seems
+ * inappropriate, it may indicate that a different role should be used. For
+ * labels which describe another widget, see %ATK_ROLE_LABEL. For text views, see
+ * %ATK_ROLE_TEXT. For generic containers, see %ATK_ROLE_PANEL. For objects whose
+ * role is not known by the implementor, see %ATK_ROLE_UNKNOWN. (Since: 2.16)
+ *@ATK_ROLE_MATH_FRACTION: An object that represents a mathematical fraction.
+ * (Since: 2.16)
+ *@ATK_ROLE_MATH_ROOT: An object that represents a mathematical expression
+ * displayed with a radical. (Since: 2.16)
+ *@ATK_ROLE_SUBSCRIPT: An object that contains text that is displayed as a
+ * subscript. (Since: 2.16)
+ *@ATK_ROLE_SUPERSCRIPT: An object that contains text that is displayed as a
+ * superscript. (Since: 2.16)
+ *@ATK_ROLE_FOOTNOTE: An object that contains the text of a footnote. (Since: 2.26)
+ *@ATK_ROLE_CONTENT_DELETION: Content previously deleted or proposed to be
+ * deleted, e.g. in revision history or a content view providing suggestions
+ * from reviewers. (Since: 2.34)
+ *@ATK_ROLE_CONTENT_INSERTION: Content previously inserted or proposed to be
+ * inserted, e.g. in revision history or a content view providing suggestions
+ * from reviewers. (Since: 2.34)
+ *@ATK_ROLE_MARK: A run of content that is marked or highlighted, such as for
+ * reference purposes, or to call it out as having a special purpose. If the
+ * marked content has an associated section in the document elaborating on the
+ * reason for the mark, then %ATK_RELATION_DETAILS should be used on the mark
+ * to point to that associated section. In addition, the reciprocal relation
+ * %ATK_RELATION_DETAILS_FOR should be used on the associated content section
+ * to point back to the mark. (Since: 2.36)
+ *@ATK_ROLE_SUGGESTION: A container for content that is called out as a proposed
+ * change from the current version of the document, such as by a reviewer of the
+ * content. This role should include either %ATK_ROLE_CONTENT_DELETION and/or
+ * %ATK_ROLE_CONTENT_INSERTION children, in any order, to indicate what the
+ * actual change is. (Since: 2.36)
+ *@ATK_ROLE_PUSH_BUTTON_MENU: A specialized push button to open a menu.
+ * (Since: 2.46)
+ *@ATK_ROLE_LAST_DEFINED: not a valid role, used for finding end of the enumeration
+ *
+ * Describes the role of an object
+ *
+ * These are the built-in enumerated roles that UI components can have
+ * in ATK.  Other roles may be added at runtime, so an AtkRole >=
+ * %ATK_ROLE_LAST_DEFINED is not necessarily an error.
+ */
+typedef enum
+{
+  ATK_ROLE_INVALID = 0,
+  ATK_ROLE_ACCEL_LABEL, /*<nick=accelerator-label>*/
+  ATK_ROLE_ALERT,
+  ATK_ROLE_ANIMATION,
+  ATK_ROLE_ARROW,
+  ATK_ROLE_CALENDAR,
+  ATK_ROLE_CANVAS,
+  ATK_ROLE_CHECK_BOX,
+  ATK_ROLE_CHECK_MENU_ITEM,
+  ATK_ROLE_COLOR_CHOOSER,
+  ATK_ROLE_COLUMN_HEADER,
+  ATK_ROLE_COMBO_BOX,
+  ATK_ROLE_DATE_EDITOR,
+  ATK_ROLE_DESKTOP_ICON,
+  ATK_ROLE_DESKTOP_FRAME,
+  ATK_ROLE_DIAL,
+  ATK_ROLE_DIALOG,
+  ATK_ROLE_DIRECTORY_PANE,
+  ATK_ROLE_DRAWING_AREA,
+  ATK_ROLE_FILE_CHOOSER,
+  ATK_ROLE_FILLER,
+  ATK_ROLE_FONT_CHOOSER,
+  ATK_ROLE_FRAME,
+  ATK_ROLE_GLASS_PANE,
+  ATK_ROLE_HTML_CONTAINER,
+  ATK_ROLE_ICON,
+  ATK_ROLE_IMAGE,
+  ATK_ROLE_INTERNAL_FRAME,
+  ATK_ROLE_LABEL,
+  ATK_ROLE_LAYERED_PANE,
+  ATK_ROLE_LIST,
+  ATK_ROLE_LIST_ITEM,
+  ATK_ROLE_MENU,
+  ATK_ROLE_MENU_BAR,
+  ATK_ROLE_MENU_ITEM,
+  ATK_ROLE_OPTION_PANE,
+  ATK_ROLE_PAGE_TAB,
+  ATK_ROLE_PAGE_TAB_LIST,
+  ATK_ROLE_PANEL,
+  ATK_ROLE_PASSWORD_TEXT,
+  ATK_ROLE_POPUP_MENU,
+  ATK_ROLE_PROGRESS_BAR,
+  ATK_ROLE_PUSH_BUTTON,
+  ATK_ROLE_RADIO_BUTTON,
+  ATK_ROLE_RADIO_MENU_ITEM,
+  ATK_ROLE_ROOT_PANE,
+  ATK_ROLE_ROW_HEADER,
+  ATK_ROLE_SCROLL_BAR,
+  ATK_ROLE_SCROLL_PANE,
+  ATK_ROLE_SEPARATOR,
+  ATK_ROLE_SLIDER,
+  ATK_ROLE_SPLIT_PANE,
+  ATK_ROLE_SPIN_BUTTON,
+  ATK_ROLE_STATUSBAR,
+  ATK_ROLE_TABLE,
+  ATK_ROLE_TABLE_CELL,
+  ATK_ROLE_TABLE_COLUMN_HEADER,
+  ATK_ROLE_TABLE_ROW_HEADER,
+  ATK_ROLE_TEAR_OFF_MENU_ITEM,
+  ATK_ROLE_TERMINAL,
+  ATK_ROLE_TEXT,
+  ATK_ROLE_TOGGLE_BUTTON,
+  ATK_ROLE_TOOL_BAR,
+  ATK_ROLE_TOOL_TIP,
+  ATK_ROLE_TREE,
+  ATK_ROLE_TREE_TABLE,
+  ATK_ROLE_UNKNOWN,
+  ATK_ROLE_VIEWPORT,
+  ATK_ROLE_WINDOW,
+  ATK_ROLE_HEADER,
+  ATK_ROLE_FOOTER,
+  ATK_ROLE_PARAGRAPH,
+  ATK_ROLE_RULER,
+  ATK_ROLE_APPLICATION,
+  ATK_ROLE_AUTOCOMPLETE,
+  ATK_ROLE_EDITBAR, /*<nick=edit-bar>*/
+  ATK_ROLE_EMBEDDED,
+  ATK_ROLE_ENTRY,
+  ATK_ROLE_CHART,
+  ATK_ROLE_CAPTION,
+  ATK_ROLE_DOCUMENT_FRAME,
+  ATK_ROLE_HEADING,
+  ATK_ROLE_PAGE,
+  ATK_ROLE_SECTION,
+  ATK_ROLE_REDUNDANT_OBJECT,
+  ATK_ROLE_FORM,
+  ATK_ROLE_LINK,
+  ATK_ROLE_INPUT_METHOD_WINDOW,
+  ATK_ROLE_TABLE_ROW,
+  ATK_ROLE_TREE_ITEM,
+  ATK_ROLE_DOCUMENT_SPREADSHEET,
+  ATK_ROLE_DOCUMENT_PRESENTATION,
+  ATK_ROLE_DOCUMENT_TEXT,
+  ATK_ROLE_DOCUMENT_WEB,
+  ATK_ROLE_DOCUMENT_EMAIL,
+  ATK_ROLE_COMMENT,
+  ATK_ROLE_LIST_BOX,
+  ATK_ROLE_GROUPING,
+  ATK_ROLE_IMAGE_MAP,
+  ATK_ROLE_NOTIFICATION,
+  ATK_ROLE_INFO_BAR,
+  ATK_ROLE_LEVEL_BAR,
+  ATK_ROLE_TITLE_BAR,
+  ATK_ROLE_BLOCK_QUOTE,
+  ATK_ROLE_AUDIO,
+  ATK_ROLE_VIDEO,
+  ATK_ROLE_DEFINITION,
+  ATK_ROLE_ARTICLE,
+  ATK_ROLE_LANDMARK,
+  ATK_ROLE_LOG,
+  ATK_ROLE_MARQUEE,
+  ATK_ROLE_MATH,
+  ATK_ROLE_RATING,
+  ATK_ROLE_TIMER,
+  ATK_ROLE_DESCRIPTION_LIST,
+  ATK_ROLE_DESCRIPTION_TERM,
+  ATK_ROLE_DESCRIPTION_VALUE,
+  ATK_ROLE_STATIC,
+  ATK_ROLE_MATH_FRACTION,
+  ATK_ROLE_MATH_ROOT,
+  ATK_ROLE_SUBSCRIPT,
+  ATK_ROLE_SUPERSCRIPT,
+  ATK_ROLE_FOOTNOTE,
+  ATK_ROLE_CONTENT_DELETION,
+  ATK_ROLE_CONTENT_INSERTION,
+  ATK_ROLE_MARK,
+  ATK_ROLE_SUGGESTION,
+  ATK_ROLE_PUSH_BUTTON_MENU,
+  ATK_ROLE_LAST_DEFINED
+} AtkRole;
+
+/**
+ *AtkLayer:
+ *@ATK_LAYER_INVALID: The object does not have a layer
+ *@ATK_LAYER_BACKGROUND: This layer is reserved for the desktop background
+ *@ATK_LAYER_CANVAS: This layer is used for Canvas components
+ *@ATK_LAYER_WIDGET: This layer is normally used for components
+ *@ATK_LAYER_MDI: This layer is used for layered components
+ *@ATK_LAYER_POPUP: This layer is used for popup components, such as menus
+ *@ATK_LAYER_OVERLAY: This layer is reserved for future use.
+ *@ATK_LAYER_WINDOW: This layer is used for toplevel windows.
+ *
+ * Describes the layer of a component
+ *
+ * These enumerated "layer values" are used when determining which UI
+ * rendering layer a component is drawn into, which can help in making
+ * determinations of when components occlude one another.
+ **/
+typedef enum
+{
+  ATK_LAYER_INVALID,
+  ATK_LAYER_BACKGROUND,
+  ATK_LAYER_CANVAS,
+  ATK_LAYER_WIDGET,
+  ATK_LAYER_MDI,
+  ATK_LAYER_POPUP,
+  ATK_LAYER_OVERLAY,
+  ATK_LAYER_WINDOW
+} AtkLayer;
+
+/**
+ * AtkLive:
+ * @ATK_LIVE_NONE: No live region.
+ * @ATK_LIVE_POLITE: This live region should be considered polite.
+ * @ATK_LIVE_ASSERTIVE: This live region should be considered assertive.
+ *
+ * Enumeration used to indicate a type of live region and how assertive it
+ * should be in terms of speaking notifications. Currently, this is only used
+ * for "notification" events, but it may be used for additional purposes
+ * in the future.
+ *
+ * Since: 2.50
+ */
+typedef enum
+{
+  ATK_LIVE_NONE,
+  ATK_LIVE_POLITE,
+  ATK_LIVE_ASSERTIVE
+} AtkLive;
+
+/**
+ * AtkAttributeSet:
+ *
+ * This is a singly-linked list (a #GSList) of #AtkAttribute. It is
+ * used by atk_text_get_run_attributes(),
+ * atk_text_get_default_attributes(),
+ * atk_editable_text_set_run_attributes(),
+ * atk_document_get_attributes() and atk_object_get_attributes()
+ **/
+typedef GSList AtkAttributeSet;
+
+/**
+ * AtkAttribute:
+ * @name: The attribute name.
+ * @value: the value of the attribute, represented as a string.
+ *
+ * AtkAttribute is a string name/value pair representing a generic
+ * attribute. This can be used to expose additional information from
+ * an accessible object as a whole (see atk_object_get_attributes())
+ * or an document (see atk_document_get_attributes()). In the case of
+ * text attributes (see atk_text_get_default_attributes()),
+ * #AtkTextAttribute enum defines all the possible text attribute
+ * names. You can use atk_text_attribute_get_name() to get the string
+ * name from the enum value. See also atk_text_attribute_for_name()
+ * and atk_text_attribute_get_value() for more information.
+ *
+ * A string name/value pair representing a generic attribute.
+ **/
+typedef struct _AtkAttribute AtkAttribute;
+
+struct _AtkAttribute
+{
+  gchar *name;
+  gchar *value;
+};
+
+#define ATK_TYPE_OBJECT (atk_object_get_type ())
+#define ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_OBJECT, AtkObject))
+#define ATK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_OBJECT, AtkObjectClass))
+#define ATK_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_OBJECT))
+#define ATK_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_OBJECT))
+#define ATK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_OBJECT, AtkObjectClass))
+
+#define ATK_TYPE_IMPLEMENTOR (atk_implementor_get_type ())
+#define ATK_IS_IMPLEMENTOR(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_IMPLEMENTOR)
+#define ATK_IMPLEMENTOR(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_IMPLEMENTOR, AtkImplementor)
+#define ATK_IMPLEMENTOR_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_IMPLEMENTOR, AtkImplementorIface))
+
+typedef struct _AtkImplementor AtkImplementor; /* dummy typedef */
+typedef struct _AtkImplementorIface AtkImplementorIface;
+
+typedef struct _AtkObject AtkObject;
+typedef struct _AtkObjectClass AtkObjectClass;
+typedef struct _AtkRelationSet AtkRelationSet;
+typedef struct _AtkStateSet AtkStateSet;
+
+/**
+ * AtkPropertyValues:
+ * @property_name: The name of the ATK property which has changed.
+ * @old_value: NULL. This field is not used anymore.
+ * @new_value: The new value of the named property.
+ *
+ * Note: @old_value field of #AtkPropertyValues will not contain a
+ * valid value. This is a field defined with the purpose of contain
+ * the previous value of the property, but is not used anymore.
+ *
+ **/
+struct _AtkPropertyValues
+{
+  const gchar *property_name;
+  GValue old_value;
+  GValue new_value;
+};
+
+typedef struct _AtkPropertyValues AtkPropertyValues;
+
+/**
+ * AtkFunction:
+ * @user_data: custom data defined by the user
+ *
+ * An AtkFunction is a function definition used for padding which has
+ * been added to class and interface structures to allow for expansion
+ * in the future.
+ *
+ * Returns: not used
+ */
+typedef gboolean (*AtkFunction) (gpointer user_data);
+/*
+ * For most properties the old_value field of AtkPropertyValues will
+ * not contain a valid value.
+ *
+ * Currently, the only property for which old_value is used is
+ * accessible-state; for instance if there is a focus state the
+ * property change handler will be called for the object which lost the focus
+ * with the old_value containing an AtkState value corresponding to focused
+ * and the property change handler will be called for the object which
+ * received the focus with the new_value containing an AtkState value
+ * corresponding to focused.
+ */
+
+/**
+ * AtkPropertyChangeHandler:
+ * @obj: atkobject which property changes
+ * @vals: values changed
+ *
+ * An AtkPropertyChangeHandler is a function which is executed when an
+ * AtkObject's property changes value. It is specified in a call to
+ * atk_object_connect_property_change_handler().
+ *
+ * Deprecated: Since 2.12.
+ */
+typedef void (*AtkPropertyChangeHandler) (AtkObject *obj, AtkPropertyValues *vals);
+
+struct _AtkObject
+{
+  GObject parent;
+
+  gchar *description;
+  gchar *name;
+  AtkObject *accessible_parent;
+  AtkRole role;
+  AtkRelationSet *relation_set;
+  AtkLayer layer;
+};
+
+/**
+ * AtkObjectClass:
+ * @connect_property_change_handler: specifies a function to be called
+ *   when a property changes value. This virtual function is
+ *   deprecated since 2.12 and it should not be overriden. Connect
+ *   directly to property-change or notify signal instead.
+ * @remove_property_change_handler: removes a property changed handler
+ *   as returned by @connect_property_change_handler. This virtual
+ *   function is deprecated sice 2.12 and it should not be overriden.
+ * @focus_event: The signal handler which is executed when there is a
+ *   focus event for an object. This virtual function is deprecated
+ *   since 2.9.4 and it should not be overriden. Use
+ *   the #AtkObject::state-change "focused" signal instead.
+ */
+struct _AtkObjectClass
+{
+  GObjectClass parent;
+
+  /*
+   * Gets the accessible name of the object
+   */
+  const gchar *(*get_name) (AtkObject *accessible);
+  /*
+   * Gets the accessible description of the object
+   */
+  const gchar *(*get_description) (AtkObject *accessible);
+  /*
+   * Gets the accessible parent of the object
+   */
+  AtkObject *(*get_parent) (AtkObject *accessible);
+
+  /*
+   * Gets the number of accessible children of the object
+   */
+  gint (*get_n_children) (AtkObject *accessible);
+  /*
+   * Returns a reference to the specified accessible child of the object.
+   * The accessible children are 0-based so the first accessible child is
+   * at index 0, the second at index 1 and so on.
+   */
+  AtkObject *(*ref_child) (AtkObject *accessible,
+                           gint i);
+  /*
+   * Gets the 0-based index of this object in its parent; returns -1 if the
+   * object does not have an accessible parent.
+   */
+  gint (*get_index_in_parent) (AtkObject *accessible);
+  /*
+   * Gets the RelationSet associated with the object
+   */
+  AtkRelationSet *(*ref_relation_set) (AtkObject *accessible);
+  /*
+   * Gets the role of the object
+   */
+  AtkRole (*get_role) (AtkObject *accessible);
+  AtkLayer (*get_layer) (AtkObject *accessible);
+  gint (*get_mdi_zorder) (AtkObject *accessible);
+  /*
+   * Gets the state set of the object
+   */
+  AtkStateSet *(*ref_state_set) (AtkObject *accessible);
+  /*
+   * Sets the accessible name of the object
+   */
+  void (*set_name) (AtkObject *accessible,
+                    const gchar *name);
+  /*
+   * Sets the accessible description of the object
+   */
+  void (*set_description) (AtkObject *accessible,
+                           const gchar *description);
+  /*
+   * Sets the accessible parent of the object
+   */
+  void (*set_parent) (AtkObject *accessible,
+                      AtkObject *parent);
+  /*
+   * Sets the accessible role of the object
+   */
+  void (*set_role) (AtkObject *accessible,
+                    AtkRole role);
+  /*
+   * Specifies a function to be called when a property changes value
+   */
+  guint (*connect_property_change_handler) (AtkObject
+                                                *accessible,
+                                            AtkPropertyChangeHandler *handler);
+  /*
+   * Removes a property change handler which was specified using
+   * connect_property_change_handler
+   */
+  void (*remove_property_change_handler) (AtkObject
+                                              *accessible,
+                                          guint
+                                              handler_id);
+  void (*initialize) (AtkObject *accessible,
+                      gpointer data);
+  /*
+   * The signal handler which is executed when there is a change in the
+   * children of the object
+   */
+  void (*children_changed) (AtkObject *accessible,
+                            guint change_index,
+                            gpointer changed_child);
+  /*
+   * The signal handler which is executed  when there is a focus event
+   * for an object.
+   */
+  void (*focus_event) (AtkObject *accessible,
+                       gboolean focus_in);
+  /*
+   * The signal handler which is executed  when there is a property_change
+   * signal for an object.
+   */
+  void (*property_change) (AtkObject *accessible,
+                           AtkPropertyValues *values);
+  /*
+   * The signal handler which is executed  when there is a state_change
+   * signal for an object.
+   */
+  void (*state_change) (AtkObject *accessible,
+                        const gchar *name,
+                        gboolean state_set);
+  /*
+   * The signal handler which is executed when there is a change in the
+   * visible data for an object
+   */
+  void (*visible_data_changed) (AtkObject *accessible);
+
+  /*
+   * The signal handler which is executed when there is a change in the
+   * 'active' child or children of the object, for instance when
+   * interior focus changes in a table or list.  This signal should be emitted
+   * by objects whose state includes ATK_STATE_MANAGES_DESCENDANTS.
+   */
+  void (*active_descendant_changed) (AtkObject *accessible,
+                                     gpointer *child);
+
+  /*
+   * Gets a list of properties applied to this object as a whole, as an #AtkAttributeSet consisting of name-value pairs.
+   * Since ATK 1.12
+   */
+  AtkAttributeSet *(*get_attributes) (AtkObject *accessible);
+
+  const gchar *(*get_object_locale) (AtkObject *accessible);
+
+  AtkFunction pad1;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_object_get_type (void);
+
+/**
+ * AtkImplementorIface:
+ *
+ * The AtkImplementor interface is implemented by objects for which
+ * AtkObject peers may be obtained via calls to
+ * iface->(ref_accessible)(implementor);
+ */
+struct _AtkImplementorIface
+{
+  GTypeInterface parent;
+
+  AtkObject *(*ref_accessible) (AtkImplementor *implementor);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_implementor_get_type (void);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_implementor_ref_accessible (AtkImplementor *implementor);
+
+/*
+ * Properties directly supported by AtkObject
+ */
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_object_get_name (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_object_get_description (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_object_get_parent (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_object_peek_parent (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+gint atk_object_get_n_accessible_children (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_object_ref_accessible_child (AtkObject *accessible,
+                                            gint i);
+ATK_AVAILABLE_IN_ALL
+AtkRelationSet *atk_object_ref_relation_set (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+AtkRole atk_object_get_role (AtkObject *accessible);
+
+ATK_DEPRECATED_FOR (atk_component_get_layer)
+AtkLayer atk_object_get_layer (AtkObject *accessible);
+ATK_DEPRECATED_FOR (atk_component_get_mdi_zorder)
+gint atk_object_get_mdi_zorder (AtkObject *accessible);
+
+ATK_AVAILABLE_IN_ALL
+AtkAttributeSet *atk_object_get_attributes (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+AtkStateSet *atk_object_ref_state_set (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+gint atk_object_get_index_in_parent (AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+void atk_object_set_name (AtkObject *accessible,
+                          const gchar *name);
+ATK_AVAILABLE_IN_ALL
+void atk_object_set_description (AtkObject *accessible,
+                                 const gchar *description);
+ATK_AVAILABLE_IN_ALL
+void atk_object_set_parent (AtkObject *accessible,
+                            AtkObject *parent);
+ATK_AVAILABLE_IN_ALL
+void atk_object_set_role (AtkObject *accessible,
+                          AtkRole role);
+
+ATK_DEPRECATED_IN_2_12
+guint atk_object_connect_property_change_handler (AtkObject *accessible,
+                                                  AtkPropertyChangeHandler *handler);
+ATK_DEPRECATED_IN_2_12
+void atk_object_remove_property_change_handler (AtkObject *accessible,
+                                                guint handler_id);
+
+ATK_AVAILABLE_IN_ALL
+void atk_object_notify_state_change (AtkObject *accessible,
+                                     AtkState state,
+                                     gboolean value);
+ATK_AVAILABLE_IN_ALL
+void atk_object_initialize (AtkObject *accessible,
+                            gpointer data);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_role_get_name (AtkRole role);
+ATK_AVAILABLE_IN_ALL
+AtkRole atk_role_for_name (const gchar *name);
+
+/* NEW in 1.1: convenience API */
+ATK_AVAILABLE_IN_ALL
+gboolean atk_object_add_relationship (AtkObject *object,
+                                      AtkRelationType relationship,
+                                      AtkObject *target);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_object_remove_relationship (AtkObject *object,
+                                         AtkRelationType relationship,
+                                         AtkObject *target);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_role_get_localized_name (AtkRole role);
+ATK_DEPRECATED_IN_2_12
+AtkRole atk_role_register (const gchar *name);
+ATK_AVAILABLE_IN_2_8
+const gchar *atk_object_get_object_locale (AtkObject *accessible);
+
+ATK_AVAILABLE_IN_2_36
+const gchar *atk_object_get_accessible_id (AtkObject *accessible);
+
+ATK_AVAILABLE_IN_2_36
+void atk_object_set_accessible_id (AtkObject *accessible,
+                                   const gchar *id);
+
+ATK_AVAILABLE_IN_2_52
+const gchar *atk_object_get_help_text (AtkObject *accessible);
+
+ATK_AVAILABLE_IN_2_52
+void atk_object_set_help_text (AtkObject *accessible,
+                               const gchar *help_text);
+
+G_END_DECLS
+
+#endif /* __ATK_OBJECT_H__ */
diff --git a/atk/atkobjectfactory.c b/atk/atkobjectfactory.c
new file mode 100644 (file)
index 0000000..017b70c
--- /dev/null
@@ -0,0 +1,146 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atknoopobjectfactory.h"
+#include "atkobjectfactory.h"
+
+/**
+ * AtkObjectFactory:
+ *
+ * The base object class for a factory used to
+ *  create accessible objects for objects of a specific GType.
+ *
+ * This class is the base object class for a factory used to create an
+ * accessible object for a specific GType. The function
+ * atk_registry_set_factory_type() is normally called to store in the
+ * registry the factory type to be used to create an accessible of a
+ * particular GType.
+ */
+
+static void atk_object_factory_class_init (AtkObjectFactoryClass *klass);
+
+static gpointer parent_class = NULL;
+
+GType
+atk_object_factory_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkObjectFactoryClass),
+        (GBaseInitFunc) NULL,                           /* base init */
+        (GBaseFinalizeFunc) NULL,                       /* base finalize */
+        (GClassInitFunc) atk_object_factory_class_init, /* class init */
+        (GClassFinalizeFunc) NULL,                      /* class finalize */
+        NULL,                                           /* class data */
+        sizeof (AtkObjectFactory),                      /* instance size */
+        0,                                              /* nb preallocs */
+        (GInstanceInitFunc) NULL,                       /* instance init */
+        NULL                                            /* value table */
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkObjectFactory", &tinfo, 0);
+    }
+  return type;
+}
+
+static void
+atk_object_factory_class_init (AtkObjectFactoryClass *klass)
+{
+  parent_class = g_type_class_peek_parent (klass);
+}
+
+/**
+ * atk_object_factory_create_accessible:
+ * @factory: The #AtkObjectFactory associated with @obj's
+ * object type
+ * @obj: a #GObject
+ *
+ * Provides an #AtkObject that implements an accessibility interface
+ * on behalf of @obj
+ *
+ * Returns: (transfer full): an #AtkObject that implements an accessibility
+ * interface on behalf of @obj
+ **/
+AtkObject *
+atk_object_factory_create_accessible (AtkObjectFactory *factory,
+                                      GObject *obj)
+{
+  AtkObjectFactoryClass *klass;
+  AtkObject *accessible = NULL;
+
+  g_return_val_if_fail (ATK_IS_OBJECT_FACTORY (factory), NULL);
+  g_return_val_if_fail (G_IS_OBJECT (obj), NULL);
+
+  klass = ATK_OBJECT_FACTORY_GET_CLASS (factory);
+
+  if (klass->create_accessible)
+    {
+      accessible = klass->create_accessible (obj);
+    }
+  return accessible;
+}
+
+/**
+ * atk_object_factory_invalidate:
+ * @factory: an #AtkObjectFactory to invalidate
+ *
+ * Inform @factory that it is no longer being used to create
+ * accessibles. When called, @factory may need to inform
+ * #AtkObjects which it has created that they need to be re-instantiated.
+ * Note: primarily used for runtime replacement of #AtkObjectFactorys
+ * in object registries.
+ **/
+void
+atk_object_factory_invalidate (AtkObjectFactory *factory)
+{
+  AtkObjectFactoryClass *klass;
+
+  g_return_if_fail (ATK_OBJECT_FACTORY (factory));
+
+  klass = ATK_OBJECT_FACTORY_GET_CLASS (factory);
+  if (klass->invalidate)
+    (klass->invalidate) (factory);
+}
+
+/**
+ * atk_object_factory_get_accessible_type:
+ * @factory: an #AtkObjectFactory
+ *
+ * Gets the GType of the accessible which is created by the factory.
+ * Returns: the type of the accessible which is created by the @factory.
+ * The value G_TYPE_INVALID is returned if no type if found.
+ **/
+GType
+atk_object_factory_get_accessible_type (AtkObjectFactory *factory)
+{
+  AtkObjectFactoryClass *klass;
+
+  g_return_val_if_fail (ATK_OBJECT_FACTORY (factory), G_TYPE_INVALID);
+
+  klass = ATK_OBJECT_FACTORY_GET_CLASS (factory);
+  if (klass->get_accessible_type)
+    return (klass->get_accessible_type) ();
+  else
+    return G_TYPE_INVALID;
+}
diff --git a/atk/atkobjectfactory.h b/atk/atkobjectfactory.h
new file mode 100644 (file)
index 0000000..8d5188a
--- /dev/null
@@ -0,0 +1,71 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_OBJECT_FACTORY_H__
+#define __ATK_OBJECT_FACTORY_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_OBJECT_FACTORY (atk_object_factory_get_type ())
+#define ATK_OBJECT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_OBJECT_FACTORY, AtkObjectFactory))
+#define ATK_OBJECT_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_OBJECT_FACTORY, AtkObjectFactoryClass))
+#define ATK_IS_OBJECT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_OBJECT_FACTORY))
+#define ATK_IS_OBJECT_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_OBJECT_FACTORY))
+#define ATK_OBJECT_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_OBJECT_FACTORY, AtkObjectFactoryClass))
+
+typedef struct _AtkObjectFactory AtkObjectFactory;
+typedef struct _AtkObjectFactoryClass AtkObjectFactoryClass;
+
+struct _AtkObjectFactory
+{
+  GObject parent;
+};
+
+struct _AtkObjectFactoryClass
+{
+  GObjectClass parent_class;
+
+  AtkObject *(*create_accessible) (GObject *obj);
+  void (*invalidate) (AtkObjectFactory *factory);
+  GType (*get_accessible_type) (void);
+
+  AtkFunction pad1;
+  AtkFunction pad2;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_object_factory_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_object_factory_create_accessible (AtkObjectFactory *factory, GObject *obj);
+ATK_AVAILABLE_IN_ALL
+void atk_object_factory_invalidate (AtkObjectFactory *factory);
+ATK_AVAILABLE_IN_ALL
+GType atk_object_factory_get_accessible_type (AtkObjectFactory *factory);
+
+G_END_DECLS
+
+#endif /* __GTK_OBJECT_FACTORY_H__ */
diff --git a/atk/atkplug.c b/atk/atkplug.c
new file mode 100644 (file)
index 0000000..0c5097c
--- /dev/null
@@ -0,0 +1,191 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright (C) 2009 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+#include "atkplug.h"
+
+/**
+ * AtkPlug:
+ *
+ * Toplevel for embedding into other processes
+ *
+ * See [class@AtkSocket]
+ */
+
+static void atk_component_interface_init (AtkComponentIface *iface);
+
+typedef struct
+{
+  AtkObject *child;
+} AtkPlugPrivate;
+
+static gint AtkPlug_private_offset;
+
+G_DEFINE_TYPE_WITH_CODE (AtkPlug, atk_plug, ATK_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init) G_ADD_PRIVATE (AtkPlug))
+
+static AtkObject *
+atk_plug_ref_child (AtkObject *obj, int i)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (ATK_PLUG (obj));
+  AtkObject *child;
+
+  if (i != 0)
+    return NULL;
+
+  child = private->child;
+
+  if (child == NULL)
+    return NULL;
+
+  return g_object_ref (child);
+}
+
+static int
+atk_plug_get_n_children (AtkObject *obj)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (ATK_PLUG (obj));
+
+  if (private->child == NULL)
+    return 0;
+
+  return 1;
+}
+
+static AtkStateSet *
+atk_plug_ref_state_set (AtkObject *obj)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (ATK_PLUG (obj));
+  AtkObject *child;
+
+  child = private->child;
+
+  if (child == NULL)
+    return NULL;
+
+  return atk_object_ref_state_set (child);
+}
+
+static void
+atk_plug_init (AtkPlug *obj)
+{
+  AtkObject *accessible = ATK_OBJECT (obj);
+
+  accessible->role = ATK_ROLE_FILLER;
+  accessible->layer = ATK_LAYER_WIDGET;
+}
+
+static void
+atk_plug_class_init (AtkPlugClass *klass)
+{
+  AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
+
+  if (AtkPlug_private_offset != 0)
+    g_type_class_adjust_private_offset (klass, &AtkPlug_private_offset);
+
+  klass->get_object_id = NULL;
+
+  class->get_n_children = atk_plug_get_n_children;
+  class->ref_child = atk_plug_ref_child;
+  class->ref_state_set = atk_plug_ref_state_set;
+}
+
+static void
+atk_component_interface_init (AtkComponentIface *iface)
+{
+}
+
+/**
+ * atk_plug_new:
+ *
+ * Creates a new #AtkPlug instance.
+ *
+ * Returns: (transfer full): the newly created #AtkPlug
+ *
+ * Since: 1.30
+ */
+AtkObject *
+atk_plug_new (void)
+{
+  return g_object_new (ATK_TYPE_PLUG, NULL);
+}
+
+/**
+ * atk_plug_set_child:
+ * @plug: an #AtkPlug to be set as accessible parent of @child.
+ * @child: an #AtkObject to be set as accessible child of @plug.
+ *
+ * Sets @child as accessible child of @plug and @plug as accessible parent of
+ * @child. @child can be NULL.
+ *
+ * In some cases, one can not use the AtkPlug type directly as accessible
+ * object for the toplevel widget of the application. For instance in the gtk
+ * case, GtkPlugAccessible can not inherit both from GtkWindowAccessible and
+ * from AtkPlug. In such a case, one can create, in addition to the standard
+ * accessible object for the toplevel widget, an AtkPlug object, and make the
+ * former the child of the latter by calling atk_plug_set_child().
+ *
+ * Since: 2.35.0
+ */
+void
+atk_plug_set_child (AtkPlug *plug, AtkObject *child)
+{
+  AtkPlugPrivate *private = atk_plug_get_instance_private (plug);
+
+  if (private->child)
+    atk_object_set_parent (private->child, NULL);
+
+  private->child = child;
+
+  if (child)
+    atk_object_set_parent (child, ATK_OBJECT (plug));
+}
+
+/**
+ * atk_plug_get_id:
+ * @plug: an #AtkPlug
+ *
+ * Gets the unique ID of an #AtkPlug object, which can be used to
+ * embed inside of an #AtkSocket using atk_socket_embed().
+ *
+ * Internally, this calls a class function that should be registered
+ * by the IPC layer (usually at-spi2-atk). The implementor of an
+ * #AtkPlug object should call this function (after atk-bridge is
+ * loaded) and pass the value to the process implementing the
+ * #AtkSocket, so it could embed the plug.
+ *
+ * Returns: the unique ID for the plug
+ *
+ * Since: 1.30
+ **/
+gchar *
+atk_plug_get_id (AtkPlug *plug)
+{
+  AtkPlugClass *klass;
+
+  g_return_val_if_fail (ATK_IS_PLUG (plug), NULL);
+
+  klass = g_type_class_peek (ATK_TYPE_PLUG);
+
+  if (klass && klass->get_object_id)
+    return (klass->get_object_id) (plug);
+  else
+    return NULL;
+}
diff --git a/atk/atkplug.h b/atk/atkplug.h
new file mode 100644 (file)
index 0000000..f54d571
--- /dev/null
@@ -0,0 +1,68 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2009 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_PLUG_H__
+#define __ATK_PLUG_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkversion.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_PLUG (atk_plug_get_type ())
+#define ATK_PLUG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_PLUG, AtkPlug))
+#define ATK_IS_PLUG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_PLUG))
+#define ATK_PLUG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_PLUG, AtkPlugClass))
+#define ATK_IS_PLUG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_PLUG))
+#define ATK_PLUG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_PLUG, AtkPlugClass))
+
+typedef struct _AtkPlug AtkPlug;
+typedef struct _AtkPlugClass AtkPlugClass;
+
+struct _AtkPlug
+{
+  AtkObject parent;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_plug_get_type (void);
+
+struct _AtkPlugClass
+{
+  AtkObjectClass parent_class;
+
+  /* to be subscribed to by atk-bridge */
+
+  /*< protected >*/
+  gchar *(*get_object_id) (AtkPlug *obj);
+};
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_plug_new (void);
+ATK_AVAILABLE_IN_2_36
+void atk_plug_set_child (AtkPlug *plug, AtkObject *child);
+ATK_AVAILABLE_IN_ALL
+gchar *atk_plug_get_id (AtkPlug *plug);
+
+G_END_DECLS
+
+#endif /* __ATK_PLUG_H__ */
diff --git a/atk/atkprivate.c b/atk/atkprivate.c
new file mode 100644 (file)
index 0000000..be41c47
--- /dev/null
@@ -0,0 +1,131 @@
+/* ATK -  Accessibility Toolkit
+ *
+ * Copyright (C) 2014 Igalia, S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <locale.h>
+#include <string.h>
+
+#include <glib-object.h>
+#include <glib/gi18n-lib.h>
+
+#include "atkprivate.h"
+
+#ifdef G_OS_WIN32
+
+#define STRICT
+#include <windows.h>
+#undef STRICT
+
+static HMODULE atk_dll;
+
+BOOL WINAPI
+DllMain (HINSTANCE hinstDLL,
+         DWORD fdwReason,
+         LPVOID lpvReserved)
+{
+  switch (fdwReason)
+    {
+    case DLL_PROCESS_ATTACH:
+      atk_dll = (HMODULE) hinstDLL;
+      break;
+    }
+
+  return TRUE;
+}
+
+static const char *
+get_atk_locale_dir (void)
+{
+  static gchar *atk_localedir = NULL;
+
+  if (!atk_localedir)
+    {
+      const gchar *p;
+      gchar *root, *temp;
+
+      /* ATSPI_LOCALEDIR might end in either /lib/locale or
+       * /share/locale. Scan for that slash.
+       */
+      p = ATSPI_LOCALEDIR + strlen (ATSPI_LOCALEDIR);
+      while (*--p != '/')
+        ;
+      while (*--p != '/')
+        ;
+
+      root = g_win32_get_package_installation_directory_of_module (atk_dll);
+      temp = g_build_filename (root, p, NULL);
+      g_free (root);
+
+      /* atk_localedir is passed to bindtextdomain() which isn't
+       * UTF-8-aware.
+       */
+      atk_localedir = g_win32_locale_filename_from_utf8 (temp);
+      g_free (temp);
+    }
+  return atk_localedir;
+}
+
+#undef ATSPI_LOCALEDIR
+
+#define ATSPI_LOCALEDIR get_atk_locale_dir ()
+
+#endif
+
+void
+_gettext_initialization (void)
+{
+#ifdef ENABLE_NLS
+  static gboolean gettext_initialized = FALSE;
+
+  if (!gettext_initialized)
+    {
+      const char *dir = g_getenv ("ATK_ALT_LOCALEDIR");
+
+      gettext_initialized = TRUE;
+      if (dir == NULL)
+        dir = ATSPI_LOCALEDIR;
+
+      bindtextdomain (GETTEXT_PACKAGE, dir);
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET
+      bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+#endif
+    }
+#endif
+}
+
+/*
+ * Compacts a name. For example: to get "accelerator label" instead of
+ * "accelerator-label"
+ */
+void
+_compact_name (gchar *name)
+{
+  gchar *p = name;
+
+  while (*p)
+    {
+      if (*p == '-')
+        *p = ' ';
+      p++;
+    }
+}
diff --git a/atk/atkprivate.h b/atk/atkprivate.h
new file mode 100644 (file)
index 0000000..de310c5
--- /dev/null
@@ -0,0 +1,36 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright (C) 2014 Igalia, S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_PRIVATE_H__
+#define __ATK_PRIVATE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+G_BEGIN_DECLS
+
+void _gettext_initialization (void);
+void _compact_name (gchar *name);
+
+G_END_DECLS
+
+#endif /* __ATK_PRIVATE_H__ */
diff --git a/atk/atkrange.c b/atk/atkrange.c
new file mode 100644 (file)
index 0000000..ad8ceed
--- /dev/null
@@ -0,0 +1,168 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2014 Igalia S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkvalue.h"
+
+/**
+ * AtkRange:
+ *
+ * A given range or subrange, to be used with #AtkValue
+ *
+ * #AtkRange are used on #AtkValue, in order to represent the full
+ * range of a given component (for example an slider or a range
+ * control), or to define each individual subrange this full range is
+ * splitted if available. See #AtkValue documentation for further
+ * details.
+ */
+
+struct _AtkRange
+{
+  gdouble lower;
+  gdouble upper;
+  gchar *description;
+};
+
+/**
+ * atk_range_copy:
+ * @src: #AtkRange to copy
+ *
+ * Returns a new #AtkRange that is a exact copy of @src
+ *
+ * Since: 2.12
+ *
+ * Returns: (transfer full): a new #AtkRange copy of @src
+ */
+AtkRange *
+atk_range_copy (AtkRange *src)
+{
+  g_return_val_if_fail (src != NULL, NULL);
+
+  return atk_range_new (src->lower,
+                        src->upper,
+                        src->description);
+}
+
+/**
+ * atk_range_free:
+ * @range: #AtkRange to free
+ *
+ * Free @range
+ *
+ * Since: 2.12
+ */
+void
+atk_range_free (AtkRange *range)
+{
+  g_return_if_fail (range != NULL);
+
+  if (range->description)
+    g_free (range->description);
+
+  g_slice_free (AtkRange, range);
+}
+
+G_DEFINE_BOXED_TYPE (AtkRange, atk_range, atk_range_copy, atk_range_free)
+
+/**
+ * atk_range_new:
+ * @lower_limit: inferior limit for this range
+ * @upper_limit: superior limit for this range
+ * @description: human readable description of this range.
+ *
+ * Creates a new #AtkRange.
+ *
+ * Since: 2.12
+ *
+ * Returns: (transfer full): a new #AtkRange
+ *
+ */
+AtkRange *
+atk_range_new (gdouble lower_limit,
+               gdouble upper_limit,
+               const gchar *description)
+{
+  AtkRange *range;
+
+  range = g_slice_new0 (AtkRange);
+
+  range->lower = lower_limit;
+  range->upper = upper_limit;
+  if (description != NULL)
+    range->description = g_strdup (description);
+
+  return range;
+}
+
+/**
+ * atk_range_get_lower_limit:
+ * @range: an #AtkRange
+ *
+ * Returns the lower limit of @range
+ *
+ * Since: 2.12
+ *
+ * Returns: the lower limit of @range
+ */
+gdouble
+atk_range_get_lower_limit (AtkRange *range)
+{
+  g_return_val_if_fail (range != NULL, 0);
+
+  return range->lower;
+}
+
+/**
+ * atk_range_get_upper_limit:
+ * @range: an #AtkRange
+ *
+ * Returns the upper limit of @range
+ *
+ * Since: 2.12
+ *
+ * Returns: the upper limit of @range
+ */
+gdouble
+atk_range_get_upper_limit (AtkRange *range)
+{
+  g_return_val_if_fail (range != NULL, 0);
+
+  return range->upper;
+}
+
+/**
+ * atk_range_get_description:
+ * @range: an #AtkRange
+ *
+ * Returns the human readable description of @range
+ *
+ * Since: 2.12
+ *
+ * Returns: the human-readable description of @range
+ */
+const gchar *
+atk_range_get_description (AtkRange *range)
+{
+  g_return_val_if_fail (range != NULL, NULL);
+
+  return range->description;
+}
diff --git a/atk/atkrange.h b/atk/atkrange.h
new file mode 100644 (file)
index 0000000..3a8a4cf
--- /dev/null
@@ -0,0 +1,59 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2014 Igalia S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef __ATK_RANGE_H__
+#define __ATK_RANGE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkversion.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_RANGE (atk_range_get_type ())
+
+typedef struct _AtkRange AtkRange;
+
+/* AtkRange methods */
+ATK_AVAILABLE_IN_2_12
+GType atk_range_get_type (void);
+
+ATK_AVAILABLE_IN_2_12
+AtkRange *atk_range_copy (AtkRange *src);
+ATK_AVAILABLE_IN_2_12
+void atk_range_free (AtkRange *range);
+
+ATK_AVAILABLE_IN_2_12
+gdouble atk_range_get_lower_limit (AtkRange *range);
+ATK_AVAILABLE_IN_2_12
+gdouble atk_range_get_upper_limit (AtkRange *range);
+ATK_AVAILABLE_IN_2_12
+const gchar *atk_range_get_description (AtkRange *range);
+ATK_AVAILABLE_IN_2_12
+AtkRange *atk_range_new (gdouble lower_limit,
+                         gdouble upper_limit,
+                         const gchar *description);
+
+G_END_DECLS
+
+#endif /* __ATK_RANGE_H__ */
diff --git a/atk/atkregistry.c b/atk/atkregistry.c
new file mode 100644 (file)
index 0000000..59bf2bb
--- /dev/null
@@ -0,0 +1,275 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atknoopobjectfactory.h"
+#include "atkregistry.h"
+
+/**
+ * AtkRegistry:
+ *
+ * An object used to store the GType of the
+ * factories used to create an accessible object for an object of a
+ * particular GType.
+ *
+ * The AtkRegistry is normally used to create appropriate ATK "peers"
+ * for user interface components.  Application developers usually need
+ * only interact with the AtkRegistry by associating appropriate ATK
+ * implementation classes with GObject classes via the
+ * atk_registry_set_factory_type call, passing the appropriate GType
+ * for application custom widget classes.
+ */
+
+static AtkRegistry *default_registry = NULL;
+
+static void atk_registry_init (AtkRegistry *instance,
+                               AtkRegistryClass *klass);
+static void atk_registry_finalize (GObject *instance);
+static void atk_registry_class_init (AtkRegistryClass *klass);
+static AtkRegistry *atk_registry_new (void);
+
+static gpointer parent_class = NULL;
+
+GType
+atk_registry_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo info = {
+        sizeof (AtkRegistryClass),
+        (GBaseInitFunc) NULL,                     /* base_init */
+        (GBaseFinalizeFunc) NULL,                 /* base_finalize */
+        (GClassInitFunc) atk_registry_class_init, /* class_init */
+        (GClassFinalizeFunc) NULL,                /* class_finalize */
+        NULL,                                     /* class_data */
+        sizeof (AtkRegistry),                     /* instance size */
+        0,                                        /* n_preallocs */
+        (GInstanceInitFunc) atk_registry_init,    /* instance init */
+        NULL                                      /* value table */
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkRegistry", &info, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_registry_class_init (AtkRegistryClass *klass)
+{
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  object_class->finalize = atk_registry_finalize;
+}
+
+static void
+atk_registry_init (AtkRegistry *instance, AtkRegistryClass *klass)
+{
+  instance->factory_type_registry = g_hash_table_new ((GHashFunc) NULL,
+                                                      (GEqualFunc) NULL);
+  instance->factory_singleton_cache = g_hash_table_new ((GHashFunc) NULL,
+                                                        (GEqualFunc) NULL);
+}
+
+static AtkRegistry *
+atk_registry_new (void)
+{
+  GObject *object;
+
+  object = g_object_new (ATK_TYPE_REGISTRY, NULL);
+
+  g_return_val_if_fail (ATK_IS_REGISTRY (object), NULL);
+
+  return (AtkRegistry *) object;
+}
+
+static void
+atk_registry_finalize (GObject *object)
+{
+  AtkRegistry *registry = ATK_REGISTRY (object);
+
+  g_hash_table_destroy (registry->factory_type_registry);
+  g_hash_table_destroy (registry->factory_singleton_cache);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * atk_registry_set_factory_type:
+ * @registry: the #AtkRegistry in which to register the type association
+ * @type: an #AtkObject type
+ * @factory_type: an #AtkObjectFactory type to associate with @type.  Must
+ * implement AtkObject appropriate for @type.
+ *
+ * Associate an #AtkObjectFactory subclass with a #GType. Note:
+ * The associated @factory_type will thereafter be responsible for
+ * the creation of new #AtkObject implementations for instances
+ * appropriate for @type.
+ **/
+void
+atk_registry_set_factory_type (AtkRegistry *registry,
+                               GType type,
+                               GType factory_type)
+{
+  GType old_type;
+  gpointer value;
+  AtkObjectFactory *old_factory;
+
+  g_return_if_fail (ATK_IS_REGISTRY (registry));
+
+  value = g_hash_table_lookup (registry->factory_type_registry,
+                               (gpointer) type);
+  old_type = (GType) value;
+  if (old_type && old_type != factory_type)
+    {
+      g_hash_table_remove (registry->factory_type_registry,
+                           (gpointer) type);
+      /*
+       * If the old factory was created, notify it that it has
+       * been replaced, then free it.
+       */
+      old_factory = g_hash_table_lookup (registry->factory_singleton_cache,
+                                         (gpointer) old_type);
+      if (old_factory)
+        {
+          atk_object_factory_invalidate (old_factory);
+          g_type_free_instance ((GTypeInstance *) old_factory);
+        }
+    }
+  g_hash_table_insert (registry->factory_type_registry,
+                       (gpointer) type,
+                       (gpointer) factory_type);
+}
+
+/**
+ * atk_registry_get_factory_type:
+ * @registry: an #AtkRegistry
+ * @type: a #GType with which to look up the associated #AtkObjectFactory
+ * subclass
+ *
+ * Provides a #GType indicating the #AtkObjectFactory subclass
+ * associated with @type.
+ *
+ * Returns: a #GType associated with type @type
+ **/
+GType
+atk_registry_get_factory_type (AtkRegistry *registry,
+                               GType type)
+{
+  GType factory_type;
+  gpointer value;
+
+  /*
+   * look up factory type in first hash;
+   * if there isn't an explicitly registered factory type,
+   * try inheriting one...
+   */
+  do
+    {
+      value =
+          g_hash_table_lookup (registry->factory_type_registry,
+                               (gpointer) type);
+      type = g_type_parent (type);
+      if (type == G_TYPE_INVALID)
+        {
+          break;
+        }
+    }
+  while (value == NULL);
+
+  factory_type = (GType) value;
+  return factory_type;
+}
+
+/**
+ * atk_registry_get_factory:
+ * @registry: an #AtkRegistry
+ * @type: a #GType with which to look up the associated #AtkObjectFactory
+ *
+ * Gets an #AtkObjectFactory appropriate for creating #AtkObjects
+ * appropriate for @type.
+ *
+ * Returns: (transfer none): an #AtkObjectFactory appropriate for creating
+ * #AtkObjects appropriate for @type.
+ **/
+AtkObjectFactory *
+atk_registry_get_factory (AtkRegistry *registry,
+                          GType type)
+{
+  gpointer factory_pointer = NULL;
+  GType factory_type;
+
+  factory_type = atk_registry_get_factory_type (registry, type);
+
+  if (factory_type == G_TYPE_INVALID)
+    {
+      /* Factory type has not been specified for this object type */
+      static AtkObjectFactory *default_factory = NULL;
+
+      if (!default_factory)
+        default_factory = atk_no_op_object_factory_new ();
+
+      return default_factory;
+    }
+
+  /* ask second hashtable for instance of factory type */
+  factory_pointer =
+      g_hash_table_lookup (registry->factory_singleton_cache,
+                           (gpointer) factory_type);
+
+  /* if there isn't one already, create one and save it */
+  if (factory_pointer == NULL)
+    {
+      factory_pointer = g_type_create_instance (factory_type);
+      g_hash_table_insert (registry->factory_singleton_cache,
+                           (gpointer) factory_type,
+                           factory_pointer);
+    }
+
+  return ATK_OBJECT_FACTORY (factory_pointer);
+}
+
+/**
+ * atk_get_default_registry:
+ *
+ * Gets a default implementation of the #AtkObjectFactory/type
+ * registry.
+ * Note: For most toolkit maintainers, this will be the correct
+ * registry for registering new #AtkObject factories. Following
+ * a call to this function, maintainers may call atk_registry_set_factory_type()
+ * to associate an #AtkObjectFactory subclass with the GType of objects
+ * for whom accessibility information will be provided.
+ *
+ * Returns: (transfer full): a default implementation of the
+ * #AtkObjectFactory/type registry
+ **/
+AtkRegistry *
+atk_get_default_registry (void)
+{
+  if (!default_registry)
+    {
+      default_registry = atk_registry_new ();
+    }
+  return default_registry;
+}
diff --git a/atk/atkregistry.h b/atk/atkregistry.h
new file mode 100644 (file)
index 0000000..865ac66
--- /dev/null
@@ -0,0 +1,72 @@
+/* ATK - Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_REGISTRY_H__
+#define __ATK_REGISTRY_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include "atkobjectfactory.h"
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_REGISTRY (atk_registry_get_type ())
+#define ATK_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_REGISTRY, AtkRegistry))
+#define ATK_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_REGISTRY, AtkRegistryClass))
+#define ATK_IS_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_REGISTRY))
+#define ATK_IS_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_REGISTRY))
+#define ATK_REGISTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_REGISTRY, AtkRegistryClass))
+
+struct _AtkRegistry
+{
+  GObject parent;
+  GHashTable *factory_type_registry;
+  GHashTable *factory_singleton_cache;
+};
+
+struct _AtkRegistryClass
+{
+  GObjectClass parent_class;
+};
+
+typedef struct _AtkRegistry AtkRegistry;
+typedef struct _AtkRegistryClass AtkRegistryClass;
+
+ATK_AVAILABLE_IN_ALL
+GType atk_registry_get_type (void);
+ATK_AVAILABLE_IN_ALL
+void atk_registry_set_factory_type (AtkRegistry *registry,
+                                    GType type,
+                                    GType factory_type);
+ATK_AVAILABLE_IN_ALL
+GType atk_registry_get_factory_type (AtkRegistry *registry,
+                                     GType type);
+ATK_AVAILABLE_IN_ALL
+AtkObjectFactory *atk_registry_get_factory (AtkRegistry *registry,
+                                            GType type);
+
+ATK_AVAILABLE_IN_ALL
+AtkRegistry *atk_get_default_registry (void);
+
+G_END_DECLS
+
+#endif /* __ATK_REGISTRY_H__ */
diff --git a/atk/atkrelation.c b/atk/atkrelation.c
new file mode 100644 (file)
index 0000000..f490cfe
--- /dev/null
@@ -0,0 +1,500 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+#include <glib-object.h>
+#include <string.h>
+
+/**
+ * AtkRelation:
+ *
+ * An object used to describe a relation between a
+ *  object and one or more other objects.
+ *
+ * An AtkRelation describes a relation between an object and one or
+ * more other objects. The actual relations that an object has with
+ * other objects are defined as an AtkRelationSet, which is a set of
+ * AtkRelations.
+ */
+enum
+{
+  PROP_0,
+
+  PROP_RELATION_TYPE,
+  PROP_TARGET,
+  PROP_LAST
+};
+
+static GPtrArray *extra_names = NULL;
+
+static gpointer parent_class = NULL;
+
+static void atk_relation_class_init (AtkRelationClass *klass);
+static void atk_relation_finalize (GObject *object);
+static void atk_relation_set_property (GObject *object,
+                                       guint prop_id,
+                                       const GValue *value,
+                                       GParamSpec *pspec);
+static void atk_relation_get_property (GObject *object,
+                                       guint prop_id,
+                                       GValue *value,
+                                       GParamSpec *pspec);
+
+static GPtrArray *atk_relation_get_ptr_array_from_value_array (GValueArray *array);
+static GValueArray *atk_relation_get_value_array_from_ptr_array (GPtrArray *array);
+
+GType
+atk_relation_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkRelationClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_relation_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkRelation),
+        0,
+        (GInstanceInitFunc) NULL,
+      };
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkRelation", &typeInfo, 0);
+    }
+  return type;
+}
+
+static void
+atk_relation_class_init (AtkRelationClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class->finalize = atk_relation_finalize;
+  gobject_class->set_property = atk_relation_set_property;
+  gobject_class->get_property = atk_relation_get_property;
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_RELATION_TYPE,
+                                   g_param_spec_enum ("relation_type",
+                                                      "Relation Type",
+                                                      "The type of the relation",
+                                                      ATK_TYPE_RELATION_TYPE,
+                                                      ATK_RELATION_NULL,
+                                                      G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                                   PROP_TARGET,
+                                   g_param_spec_value_array ("target",
+                                                             "Target",
+                                                             "An array of the targets for the relation",
+                                                             NULL,
+
+                                                             G_PARAM_READWRITE));
+}
+
+/**
+ * atk_relation_type_register:
+ * @name: a name string
+ *
+ * Associate @name with a new #AtkRelationType
+
+ * Returns: an #AtkRelationType associated with @name
+ **/
+AtkRelationType
+atk_relation_type_register (const gchar *name)
+{
+  g_return_val_if_fail (name, ATK_RELATION_NULL);
+
+  if (!extra_names)
+    extra_names = g_ptr_array_new ();
+
+  g_ptr_array_add (extra_names, g_strdup (name));
+  return extra_names->len + ATK_RELATION_LAST_DEFINED;
+}
+
+/**
+ * atk_relation_type_get_name:
+ * @type: The #AtkRelationType whose name is required
+ *
+ * Gets the description string describing the #AtkRelationType @type.
+ *
+ * Returns: the string describing the AtkRelationType
+ */
+const gchar *
+atk_relation_type_get_name (AtkRelationType type)
+{
+  GTypeClass *type_class;
+  GEnumValue *value;
+  const gchar *name = NULL;
+
+  type_class = g_type_class_ref (ATK_TYPE_RELATION_TYPE);
+  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
+
+  value = g_enum_get_value (G_ENUM_CLASS (type_class), type);
+
+  if (value)
+    {
+      name = value->value_nick;
+    }
+  else
+    {
+      if (extra_names)
+        {
+          gint n = type;
+
+          n -= ATK_RELATION_LAST_DEFINED + 1;
+
+          if (n < extra_names->len)
+            name = g_ptr_array_index (extra_names, n);
+        }
+    }
+  g_type_class_unref (type_class);
+  return name;
+}
+
+/**
+ * atk_relation_type_for_name:
+ * @name: a string which is the (non-localized) name of an ATK relation type.
+ *
+ * Get the #AtkRelationType type corresponding to a relation name.
+ *
+ * Returns: the #AtkRelationType enumerated type corresponding to the specified name,
+ *          or #ATK_RELATION_NULL if no matching relation type is found.
+ **/
+AtkRelationType
+atk_relation_type_for_name (const gchar *name)
+{
+  GTypeClass *type_class;
+  GEnumValue *value;
+  AtkRelationType type = ATK_RELATION_NULL;
+
+  g_return_val_if_fail (name, ATK_RELATION_NULL);
+
+  type_class = g_type_class_ref (ATK_TYPE_RELATION_TYPE);
+  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), ATK_RELATION_NULL);
+
+  value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name);
+
+  if (value)
+    {
+      type = value->value;
+    }
+  else
+    {
+      gint i;
+
+      if (extra_names)
+        {
+          for (i = 0; i < extra_names->len; i++)
+            {
+              gchar *extra_name = (gchar *) g_ptr_array_index (extra_names, i);
+
+              g_return_val_if_fail (extra_name, ATK_RELATION_NULL);
+
+              if (strcmp (name, extra_name) == 0)
+                {
+                  type = i + 1 + ATK_RELATION_LAST_DEFINED;
+                  break;
+                }
+            }
+        }
+    }
+  g_type_class_unref (type_class);
+
+  return type;
+}
+
+/**
+ * atk_relation_new:
+ * @targets: (array length=n_targets): an array of pointers to
+ *  #AtkObjects
+ * @n_targets: number of #AtkObjects pointed to by @targets
+ * @relationship: an #AtkRelationType with which to create the new
+ *  #AtkRelation
+ *
+ * Create a new relation for the specified key and the specified list
+ * of targets.  See also atk_object_add_relationship().
+ *
+ * Returns: a pointer to a new #AtkRelation
+ **/
+AtkRelation *
+atk_relation_new (AtkObject **targets,
+                  gint n_targets,
+                  AtkRelationType relationship)
+{
+  AtkRelation *relation;
+  int i;
+  GValueArray *array;
+  GValue *value;
+
+  g_return_val_if_fail (targets != NULL, NULL);
+
+  array = g_value_array_new (n_targets);
+  for (i = 0; i < n_targets; i++)
+    {
+      value = g_new0 (GValue, 1);
+      g_value_init (value, ATK_TYPE_OBJECT);
+      g_value_set_object (value, targets[i]);
+      array = g_value_array_append (array, value);
+      g_value_unset (value);
+      g_free (value);
+    }
+
+  relation = g_object_new (ATK_TYPE_RELATION,
+                           "relation_type", relationship,
+                           "target", array,
+                           NULL);
+
+  g_value_array_free (array);
+
+  return relation;
+}
+
+/**
+ * atk_relation_get_relation_type:
+ * @relation: an #AtkRelation
+ *
+ * Gets the type of @relation
+ *
+ * Returns: the type of @relation
+ **/
+AtkRelationType
+atk_relation_get_relation_type (AtkRelation *relation)
+{
+  g_return_val_if_fail (ATK_IS_RELATION (relation), 0);
+
+  return relation->relationship;
+}
+
+/**
+ * atk_relation_get_target:
+ * @relation: an #AtkRelation
+ *
+ * Gets the target list of @relation
+ *
+ * Returns: (transfer none) (element-type Atk.Object): the target list of @relation
+ **/
+GPtrArray *
+atk_relation_get_target (AtkRelation *relation)
+{
+  g_return_val_if_fail (ATK_IS_RELATION (relation), NULL);
+
+  return relation->target;
+}
+
+static void
+delete_object_while_in_relation (gpointer callback_data,
+                                 GObject *where_the_object_was)
+{
+  GPtrArray *array;
+
+  g_assert (callback_data != NULL);
+
+  array = callback_data;
+  g_ptr_array_remove (array, where_the_object_was);
+}
+
+/**
+ * atk_relation_add_target:
+ * @relation: an #AtkRelation
+ * @target: an #AtkObject
+ *
+ * Adds the specified AtkObject to the target for the relation, if it is
+ * not already present.  See also atk_object_add_relationship().
+ *
+ *
+ * Since: 1.9
+ **/
+void
+atk_relation_add_target (AtkRelation *relation,
+                         AtkObject *target)
+{
+  guint i;
+
+  g_return_if_fail (ATK_IS_RELATION (relation));
+  g_return_if_fail (ATK_IS_OBJECT (target));
+
+  /* first check if target occurs in array ... */
+  for (i = 0; i < relation->target->len; i++)
+    if (g_ptr_array_index (relation->target, i) == target)
+      return;
+
+  g_ptr_array_add (relation->target, target);
+  g_object_weak_ref (G_OBJECT (target), (GWeakNotify) delete_object_while_in_relation, relation->target);
+}
+
+/**
+ * atk_relation_remove_target:
+ * @relation: an #AtkRelation
+ * @target: an #AtkObject
+ *
+ * Remove the specified AtkObject from the target for the relation.
+ *
+ * Returns: TRUE if the removal is successful.
+ **/
+
+gboolean
+atk_relation_remove_target (AtkRelation *relation,
+                            AtkObject *target)
+{
+  gboolean ret = FALSE;
+  GPtrArray *array;
+
+  array = atk_relation_get_target (relation);
+
+  if (array && g_ptr_array_remove (array, target))
+    {
+      g_object_weak_unref (G_OBJECT (target),
+                           (GWeakNotify) delete_object_while_in_relation,
+                           relation->target);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static void
+atk_relation_finalize (GObject *object)
+{
+  AtkRelation *relation;
+
+  g_return_if_fail (ATK_IS_RELATION (object));
+
+  relation = ATK_RELATION (object);
+
+  if (relation->target)
+    {
+      gint i;
+
+      for (i = 0; i < relation->target->len; i++)
+        {
+          g_object_weak_unref (G_OBJECT (g_ptr_array_index (relation->target, i)),
+                               (GWeakNotify) delete_object_while_in_relation,
+                               relation->target);
+        }
+      g_ptr_array_free (relation->target, TRUE);
+    }
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+atk_relation_set_property (GObject *object,
+                           guint prop_id,
+                           const GValue *value,
+                           GParamSpec *pspec)
+{
+  AtkRelation *relation;
+  gpointer boxed;
+
+  relation = ATK_RELATION (object);
+
+  switch (prop_id)
+    {
+    case PROP_RELATION_TYPE:
+      relation->relationship = g_value_get_enum (value);
+      break;
+    case PROP_TARGET:
+      if (relation->target)
+        {
+          gint i;
+
+          for (i = 0; i < relation->target->len; i++)
+            {
+              g_object_weak_unref (G_OBJECT (g_ptr_array_index (relation->target, i)),
+                                   (GWeakNotify) delete_object_while_in_relation,
+                                   relation->target);
+            }
+          g_ptr_array_free (relation->target, TRUE);
+        }
+      boxed = g_value_get_boxed (value);
+      relation->target = atk_relation_get_ptr_array_from_value_array ((GValueArray *) boxed);
+      break;
+    default:
+      break;
+    }
+}
+
+static void
+atk_relation_get_property (GObject *object,
+                           guint prop_id,
+                           GValue *value,
+                           GParamSpec *pspec)
+{
+  AtkRelation *relation;
+  GValueArray *array;
+
+  relation = ATK_RELATION (object);
+
+  switch (prop_id)
+    {
+    case PROP_RELATION_TYPE:
+      g_value_set_enum (value, relation->relationship);
+      break;
+    case PROP_TARGET:
+      array = atk_relation_get_value_array_from_ptr_array (relation->target);
+      g_value_set_boxed (value, array);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static GPtrArray *
+atk_relation_get_ptr_array_from_value_array (GValueArray *array)
+{
+  gint i;
+  GPtrArray *return_array;
+  GValue *value;
+  GObject *obj;
+
+  return_array = g_ptr_array_sized_new (array->n_values);
+  for (i = 0; i < array->n_values; i++)
+    {
+      value = g_value_array_get_nth (array, i);
+      obj = g_value_get_object (value);
+      g_ptr_array_add (return_array, obj);
+      g_object_weak_ref (obj, (GWeakNotify) delete_object_while_in_relation, return_array);
+    }
+
+  return return_array;
+}
+
+static GValueArray *
+atk_relation_get_value_array_from_ptr_array (GPtrArray *array)
+{
+  int i;
+  GValueArray *return_array;
+  GValue *value;
+
+  return_array = g_value_array_new (array->len);
+  for (i = 0; i < array->len; i++)
+    {
+      value = g_new0 (GValue, 1);
+      g_value_init (value, ATK_TYPE_OBJECT);
+      g_value_set_object (value, g_ptr_array_index (array, i));
+      return_array = g_value_array_append (return_array, value);
+    }
+  return return_array;
+}
diff --git a/atk/atkrelation.h b/atk/atkrelation.h
new file mode 100644 (file)
index 0000000..3c082ca
--- /dev/null
@@ -0,0 +1,99 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_RELATION_H__
+#define __ATK_RELATION_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+G_BEGIN_DECLS
+
+#include <atk/atkrelationtype.h>
+#include <atk/atkversion.h>
+#include <glib-object.h>
+
+/*
+ * An AtkRelation describes a relation between the object and one or more
+ * other objects. The actual relations that an object has with other objects
+ * are defined as an AtkRelationSet, which is a set of AtkRelations.
+ */
+
+#define ATK_TYPE_RELATION (atk_relation_get_type ())
+#define ATK_RELATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_RELATION, AtkRelation))
+#define ATK_RELATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_RELATION, AtkRelationClass))
+#define ATK_IS_RELATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_RELATION))
+#define ATK_IS_RELATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_RELATION))
+#define ATK_RELATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_RELATION, AtkRelationClass))
+
+typedef struct _AtkRelation AtkRelation;
+typedef struct _AtkRelationClass AtkRelationClass;
+
+struct _AtkRelation
+{
+  GObject parent;
+
+  GPtrArray *target;
+  AtkRelationType relationship;
+};
+
+struct _AtkRelationClass
+{
+  GObjectClass parent;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_relation_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkRelationType atk_relation_type_register (const gchar *name);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_relation_type_get_name (AtkRelationType type);
+ATK_AVAILABLE_IN_ALL
+AtkRelationType atk_relation_type_for_name (const gchar *name);
+
+/*
+ * Create a new relation for the specified key and the specified list
+ * of targets.
+ */
+ATK_AVAILABLE_IN_ALL
+AtkRelation *atk_relation_new (AtkObject **targets,
+                               gint n_targets,
+                               AtkRelationType relationship);
+/*
+ * Returns the type of a relation.
+ */
+ATK_AVAILABLE_IN_ALL
+AtkRelationType atk_relation_get_relation_type (AtkRelation *relation);
+/*
+ * Returns the target list of a relation.
+ */
+ATK_AVAILABLE_IN_ALL
+GPtrArray *atk_relation_get_target (AtkRelation *relation);
+ATK_AVAILABLE_IN_ALL
+void atk_relation_add_target (AtkRelation *relation,
+                              AtkObject *target);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_relation_remove_target (AtkRelation *relation,
+                                     AtkObject *target);
+
+G_END_DECLS
+
+#endif /* __ATK_RELATION_H__ */
diff --git a/atk/atkrelationset.c b/atk/atkrelationset.c
new file mode 100644 (file)
index 0000000..66ef090
--- /dev/null
@@ -0,0 +1,408 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "atk.h"
+
+/**
+ * AtkRelationSet:
+ *
+ * A set of AtkRelations, normally the set of
+ *  AtkRelations which an AtkObject has.
+ *
+ * The AtkRelationSet held by an object establishes its relationships
+ * with objects beyond the normal "parent/child" hierarchical
+ * relationships that all user interface objects have.
+ * AtkRelationSets establish whether objects are labelled or
+ * controlled by other components, share group membership with other
+ * components (for instance within a radio-button group), or share
+ * content which "flows" between them, among other types of possible
+ * relationships.
+ */
+
+static gpointer parent_class = NULL;
+
+static void atk_relation_set_class_init (AtkRelationSetClass *klass);
+static void atk_relation_set_finalize (GObject *object);
+
+GType
+atk_relation_set_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkRelationSetClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_relation_set_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkRelationSet),
+        0,
+        (GInstanceInitFunc) NULL,
+      };
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkRelationSet", &typeInfo, 0);
+    }
+  return type;
+}
+
+static void
+atk_relation_set_class_init (AtkRelationSetClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class->finalize = atk_relation_set_finalize;
+}
+
+/**
+ * atk_relation_set_new:
+ *
+ * Creates a new empty relation set.
+ *
+ * Returns: a new #AtkRelationSet
+ **/
+AtkRelationSet *
+atk_relation_set_new (void)
+{
+  AtkRelationSet *relation_set;
+
+  relation_set = g_object_new (ATK_TYPE_RELATION_SET, NULL);
+  return relation_set;
+}
+
+/**
+ * atk_relation_set_contains:
+ * @set: an #AtkRelationSet
+ * @relationship: an #AtkRelationType
+ *
+ * Determines whether the relation set contains a relation that matches the
+ * specified type.
+ *
+ * Returns: %TRUE if @relationship is the relationship type of a relation
+ * in @set, %FALSE otherwise
+ **/
+gboolean
+atk_relation_set_contains (AtkRelationSet *set,
+                           AtkRelationType relationship)
+{
+  GPtrArray *array_item;
+  AtkRelation *item;
+  gint i;
+
+  g_return_val_if_fail (ATK_IS_RELATION_SET (set), FALSE);
+
+  array_item = set->relations;
+  if (array_item == NULL)
+    return FALSE;
+  for (i = 0; i < array_item->len; i++)
+    {
+      item = g_ptr_array_index (array_item, i);
+      if (item->relationship == relationship)
+        return TRUE;
+    }
+  return FALSE;
+}
+
+/**
+ * atk_relation_set_remove:
+ * @set: an #AtkRelationSet
+ * @relation: an #AtkRelation
+ *
+ * Removes a relation from the relation set.
+ * This function unref's the #AtkRelation so it will be deleted unless there
+ * is another reference to it.
+ **/
+void
+atk_relation_set_remove (AtkRelationSet *set,
+                         AtkRelation *relation)
+{
+  GPtrArray *array_item;
+  AtkRelationType relationship;
+
+  g_return_if_fail (ATK_IS_RELATION_SET (set));
+
+  array_item = set->relations;
+  if (array_item == NULL)
+    return;
+
+  if (g_ptr_array_remove (array_item, relation))
+    {
+      g_object_unref (relation);
+    }
+  else
+    {
+      relationship = atk_relation_get_relation_type (relation);
+      if (atk_relation_set_contains (set, relationship))
+        {
+          AtkRelation *exist_relation;
+          gint i;
+          exist_relation = atk_relation_set_get_relation_by_type (set, relationship);
+          for (i = 0; i < relation->target->len; i++)
+            {
+              AtkObject *target = g_ptr_array_index (relation->target, i);
+              atk_relation_remove_target (exist_relation, target);
+            }
+        }
+    }
+}
+
+/**
+ * atk_relation_set_add:
+ * @set: an #AtkRelationSet
+ * @relation: an #AtkRelation
+ *
+ * Add a new relation to the current relation set if it is not already
+ * present.
+ * This function ref's the AtkRelation so the caller of this function
+ * should unref it to ensure that it will be destroyed when the AtkRelationSet
+ * is destroyed.
+ **/
+void
+atk_relation_set_add (AtkRelationSet *set,
+                      AtkRelation *relation)
+{
+  AtkRelationType relationship;
+
+  g_return_if_fail (ATK_IS_RELATION_SET (set));
+  g_return_if_fail (relation != NULL);
+
+  if (set->relations == NULL)
+    {
+      set->relations = g_ptr_array_new ();
+    }
+
+  relationship = atk_relation_get_relation_type (relation);
+  if (!atk_relation_set_contains (set, relationship))
+    {
+      g_ptr_array_add (set->relations, relation);
+      g_object_ref (relation);
+    }
+  else
+    {
+      AtkRelation *exist_relation;
+      gint i;
+      exist_relation = atk_relation_set_get_relation_by_type (set, relationship);
+      for (i = 0; i < relation->target->len; i++)
+        {
+          AtkObject *target = g_ptr_array_index (relation->target, i);
+          atk_relation_add_target (exist_relation, target);
+        }
+    }
+}
+
+/**
+ * atk_relation_set_get_n_relations:
+ * @set: an #AtkRelationSet
+ *
+ * Determines the number of relations in a relation set.
+ *
+ * Returns: an integer representing the number of relations in the set.
+ **/
+gint
+atk_relation_set_get_n_relations (AtkRelationSet *set)
+{
+  g_return_val_if_fail (ATK_IS_RELATION_SET (set), 0);
+
+  if (set->relations == NULL)
+    return 0;
+
+  return set->relations->len;
+}
+
+/**
+ * atk_relation_set_get_relation:
+ * @set: an #AtkRelationSet
+ * @i: a gint representing a position in the set, starting from 0.
+ *
+ * Determines the relation at the specified position in the relation set.
+ *
+ * Returns: (transfer none): a #AtkRelation, which is the relation at
+ * position i in the set.
+ **/
+AtkRelation *
+atk_relation_set_get_relation (AtkRelationSet *set,
+                               gint i)
+{
+  GPtrArray *array_item;
+  AtkRelation *item;
+
+  g_return_val_if_fail (ATK_IS_RELATION_SET (set), NULL);
+  g_return_val_if_fail (i >= 0, NULL);
+
+  array_item = set->relations;
+  if (array_item == NULL)
+    return NULL;
+  item = g_ptr_array_index (array_item, i);
+  if (item == NULL)
+    return NULL;
+
+  return item;
+}
+
+/**
+ * atk_relation_set_get_relation_by_type:
+ * @set: an #AtkRelationSet
+ * @relationship: an #AtkRelationType
+ *
+ * Finds a relation that matches the specified type.
+ *
+ * Returns: (transfer none): an #AtkRelation, which is a relation matching the
+ * specified type.
+ **/
+AtkRelation *
+atk_relation_set_get_relation_by_type (AtkRelationSet *set,
+                                       AtkRelationType relationship)
+{
+  GPtrArray *array_item;
+  AtkRelation *item;
+  gint i;
+
+  g_return_val_if_fail (ATK_IS_RELATION_SET (set), NULL);
+
+  array_item = set->relations;
+  if (array_item == NULL)
+    return NULL;
+  for (i = 0; i < array_item->len; i++)
+    {
+      item = g_ptr_array_index (array_item, i);
+      if (item->relationship == relationship)
+        return item;
+    }
+  return NULL;
+}
+
+static void
+atk_relation_set_finalize (GObject *object)
+{
+  AtkRelationSet *relation_set;
+  GPtrArray *array;
+  gint i;
+
+  g_return_if_fail (ATK_IS_RELATION_SET (object));
+
+  relation_set = ATK_RELATION_SET (object);
+  array = relation_set->relations;
+
+  if (array)
+    {
+      for (i = 0; i < array->len; i++)
+        {
+          g_object_unref (g_ptr_array_index (array, i));
+        }
+      g_ptr_array_free (array, TRUE);
+    }
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * atk_relation_set_add_relation_by_type:
+ * @set: an #AtkRelationSet
+ * @relationship: an #AtkRelationType
+ * @target: an #AtkObject
+ *
+ * Add a new relation of the specified type with the specified target to
+ * the current relation set if the relation set does not contain a relation
+ * of that type. If it is does contain a relation of that typea the target
+ * is added to the relation.
+ *
+ * Since: 1.9
+ **/
+void
+atk_relation_set_add_relation_by_type (AtkRelationSet *set,
+                                       AtkRelationType relationship,
+                                       AtkObject *target)
+{
+  AtkRelation *relation;
+
+  g_return_if_fail (ATK_IS_RELATION_SET (set));
+  g_return_if_fail (ATK_IS_OBJECT (target));
+
+  relation = atk_relation_set_get_relation_by_type (set,
+                                                    relationship);
+  if (relation)
+    {
+      atk_relation_add_target (relation, target);
+    }
+  else
+    {
+      /* the relation hasn't been created yet ... */
+      relation = atk_relation_new (&target, 1, relationship);
+      atk_relation_set_add (set, relation);
+      g_object_unref (relation);
+    }
+}
+
+/**
+ * atk_relation_set_contains_target:
+ * @set: an #AtkRelationSet
+ * @relationship: an #AtkRelationType
+ * @target: an #AtkObject
+ *
+ * Determines whether the relation set contains a relation that
+ * matches the specified pair formed by type @relationship and object
+ * @target.
+ *
+ * Returns: %TRUE if @set contains a relation with the relationship
+ * type @relationship with an object @target, %FALSE otherwise
+ **/
+
+gboolean
+atk_relation_set_contains_target (AtkRelationSet *set,
+                                  AtkRelationType relationship,
+                                  AtkObject *target)
+{
+  GPtrArray *array_relations;
+  GPtrArray *array_target;
+  AtkObject *current_target;
+  AtkRelation *relation;
+  gint i;
+  gint c;
+
+  g_return_val_if_fail (ATK_IS_RELATION_SET (set), FALSE);
+  g_return_val_if_fail (ATK_IS_OBJECT (target), FALSE);
+
+  array_relations = set->relations;
+  if (array_relations == NULL)
+    return FALSE;
+
+  for (i = 0; i < array_relations->len; i++)
+    {
+      relation = g_ptr_array_index (array_relations, i);
+      if (relation->relationship == relationship)
+        {
+          array_target = atk_relation_get_target (relation);
+          for (c = 0; c < array_target->len; c++)
+            {
+              current_target = g_ptr_array_index (array_target, c);
+              if (target == current_target)
+                return TRUE;
+            }
+        }
+    }
+
+  return FALSE;
+}
diff --git a/atk/atkrelationset.h b/atk/atkrelationset.h
new file mode 100644 (file)
index 0000000..7853a6e
--- /dev/null
@@ -0,0 +1,90 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_RELATION_SET_H__
+#define __ATK_RELATION_SET_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+G_BEGIN_DECLS
+
+#include <atk/atkobject.h>
+#include <atk/atkrelation.h>
+#include <glib-object.h>
+
+#define ATK_TYPE_RELATION_SET (atk_relation_set_get_type ())
+#define ATK_RELATION_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_RELATION_SET, AtkRelationSet))
+#define ATK_RELATION_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_RELATION_SET, AtkRelationSetClass))
+#define ATK_IS_RELATION_SET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_RELATION_SET))
+#define ATK_IS_RELATION_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_RELATION_SET))
+#define ATK_RELATION_SET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_RELATION_SET, AtkRelationSetClass))
+
+typedef struct _AtkRelationSetClass AtkRelationSetClass;
+
+struct _AtkRelationSet
+{
+  GObject parent;
+
+  GPtrArray *relations;
+};
+
+struct _AtkRelationSetClass
+{
+  GObjectClass parent;
+
+  AtkFunction pad1;
+  AtkFunction pad2;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_relation_set_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkRelationSet *atk_relation_set_new (void);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_relation_set_contains (AtkRelationSet *set,
+                                    AtkRelationType relationship);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_relation_set_contains_target (AtkRelationSet *set,
+                                           AtkRelationType relationship,
+                                           AtkObject *target);
+ATK_AVAILABLE_IN_ALL
+void atk_relation_set_remove (AtkRelationSet *set,
+                              AtkRelation *relation);
+ATK_AVAILABLE_IN_ALL
+void atk_relation_set_add (AtkRelationSet *set,
+                           AtkRelation *relation);
+ATK_AVAILABLE_IN_ALL
+gint atk_relation_set_get_n_relations (AtkRelationSet *set);
+ATK_AVAILABLE_IN_ALL
+AtkRelation *atk_relation_set_get_relation (AtkRelationSet *set,
+                                            gint i);
+ATK_AVAILABLE_IN_ALL
+AtkRelation *atk_relation_set_get_relation_by_type (AtkRelationSet *set,
+                                                    AtkRelationType relationship);
+ATK_AVAILABLE_IN_ALL
+void atk_relation_set_add_relation_by_type (AtkRelationSet *set,
+                                            AtkRelationType relationship,
+                                            AtkObject *target);
+
+G_END_DECLS
+
+#endif /* __ATK_RELATION_SET_H__ */
diff --git a/atk/atkrelationtype.h b/atk/atkrelationtype.h
new file mode 100644 (file)
index 0000000..558fdc7
--- /dev/null
@@ -0,0 +1,115 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_RELATION_TYPE_H__
+#define __ATK_RELATION_TYPE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ *AtkRelationType:
+ *@ATK_RELATION_NULL: Not used, represens "no relationship" or an error condition.
+ *@ATK_RELATION_CONTROLLED_BY: Indicates an object controlled by one or more target objects.
+ *@ATK_RELATION_CONTROLLER_FOR: Indicates an object is an controller for one or more target objects.
+ *@ATK_RELATION_LABEL_FOR: Indicates an object is a label for one or more target objects.
+ *@ATK_RELATION_LABELLED_BY: Indicates an object is labelled by one or more target objects.
+ *@ATK_RELATION_MEMBER_OF: Indicates an object is a member of a group of one or more target objects.
+ *@ATK_RELATION_NODE_CHILD_OF: Indicates an object is a cell in a treetable which is displayed because a cell in the same column is expanded and identifies that cell.
+ *@ATK_RELATION_FLOWS_TO: Indicates that the object has content that flows logically to another
+ *  AtkObject in a sequential way, (for instance text-flow).
+ *@ATK_RELATION_FLOWS_FROM: Indicates that the object has content that flows logically from
+ *  another AtkObject in a sequential way, (for instance text-flow).
+ *@ATK_RELATION_SUBWINDOW_OF: Indicates a subwindow attached to a component but otherwise has no connection in  the UI heirarchy to that component.
+ *@ATK_RELATION_EMBEDS: Indicates that the object visually embeds
+ *  another object's content, i.e. this object's content flows around
+ *  another's content.
+ *@ATK_RELATION_EMBEDDED_BY: Reciprocal of %ATK_RELATION_EMBEDS, indicates that
+ *  this object's content is visualy embedded in another object.
+ *@ATK_RELATION_POPUP_FOR: Indicates that an object is a popup for another object.
+ *@ATK_RELATION_PARENT_WINDOW_OF: Indicates that an object is a parent window of another object.
+ *@ATK_RELATION_DESCRIBED_BY: Reciprocal of %ATK_RELATION_DESCRIPTION_FOR. Indicates that one
+ * or more target objects provide descriptive information about this object. This relation
+ * type is most appropriate for information that is not essential as its presentation may
+ * be user-configurable and/or limited to an on-demand mechanism such as an assistive
+ * technology command. For brief, essential information such as can be found in a widget's
+ * on-screen label, use %ATK_RELATION_LABELLED_BY. For an on-screen error message, use
+ * %ATK_RELATION_ERROR_MESSAGE. For lengthy extended descriptive information contained in
+ * an on-screen object, consider using %ATK_RELATION_DETAILS as assistive technologies may
+ * provide a means for the user to navigate to objects containing detailed descriptions so
+ * that their content can be more closely reviewed.
+ *@ATK_RELATION_DESCRIPTION_FOR: Reciprocal of %ATK_RELATION_DESCRIBED_BY. Indicates that this
+ * object provides descriptive information about the target object(s). See also
+ * %ATK_RELATION_DETAILS_FOR and %ATK_RELATION_ERROR_FOR.
+ *@ATK_RELATION_NODE_PARENT_OF: Indicates an object is a cell in a treetable and is expanded to display other cells in the same column.
+ *@ATK_RELATION_DETAILS: Reciprocal of %ATK_RELATION_DETAILS_FOR. Indicates that this object
+ * has a detailed or extended description, the contents of which can be found in the target
+ * object(s). This relation type is most appropriate for information that is sufficiently
+ * lengthy as to make navigation to the container of that information desirable. For less
+ * verbose information suitable for announcement only, see %ATK_RELATION_DESCRIBED_BY. If
+ * the detailed information describes an error condition, %ATK_RELATION_ERROR_FOR should be
+ * used instead. @Since: ATK-2.26.
+ *@ATK_RELATION_DETAILS_FOR: Reciprocal of %ATK_RELATION_DETAILS. Indicates that this object
+ * provides a detailed or extended description about the target object(s). See also
+ * %ATK_RELATION_DESCRIPTION_FOR and %ATK_RELATION_ERROR_FOR. @Since: ATK-2.26.
+ *@ATK_RELATION_ERROR_MESSAGE: Reciprocal of %ATK_RELATION_ERROR_FOR. Indicates that this object
+ * has one or more errors, the nature of which is described in the contents of the target
+ * object(s). Objects that have this relation type should also contain %ATK_STATE_INVALID_ENTRY
+ * in their #AtkStateSet. @Since: ATK-2.26.
+ *@ATK_RELATION_ERROR_FOR: Reciprocal of %ATK_RELATION_ERROR_MESSAGE. Indicates that this object
+ * contains an error message describing an invalid condition in the target object(s). @Since:
+ * ATK_2.26.
+ *@ATK_RELATION_LAST_DEFINED: Not used, this value indicates the end of the enumeration.
+ *
+ *Describes the type of the relation
+ **/
+typedef enum
+{
+  ATK_RELATION_NULL = 0,
+  ATK_RELATION_CONTROLLED_BY,
+  ATK_RELATION_CONTROLLER_FOR,
+  ATK_RELATION_LABEL_FOR,
+  ATK_RELATION_LABELLED_BY,
+  ATK_RELATION_MEMBER_OF,
+  ATK_RELATION_NODE_CHILD_OF,
+  ATK_RELATION_FLOWS_TO,
+  ATK_RELATION_FLOWS_FROM,
+  ATK_RELATION_SUBWINDOW_OF,
+  ATK_RELATION_EMBEDS,
+  ATK_RELATION_EMBEDDED_BY,
+  ATK_RELATION_POPUP_FOR,
+  ATK_RELATION_PARENT_WINDOW_OF,
+  ATK_RELATION_DESCRIBED_BY,
+  ATK_RELATION_DESCRIPTION_FOR,
+  ATK_RELATION_NODE_PARENT_OF,
+  ATK_RELATION_DETAILS,
+  ATK_RELATION_DETAILS_FOR,
+  ATK_RELATION_ERROR_MESSAGE,
+  ATK_RELATION_ERROR_FOR,
+  ATK_RELATION_LAST_DEFINED
+} AtkRelationType;
+
+G_END_DECLS
+
+#endif /* __ATK_RELATION_TYPE_H__ */
diff --git a/atk/atkselection.c b/atk/atkselection.c
new file mode 100644 (file)
index 0000000..8f8d96e
--- /dev/null
@@ -0,0 +1,287 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkselection.h"
+
+/**
+ * AtkSelection:
+ *
+ * The ATK interface implemented by container objects whose #AtkObject children can be selected.
+ *
+ * #AtkSelection should be implemented by UI components with children
+ * which are exposed by #atk_object_ref_child and
+ * #atk_object_get_n_children, if the use of the parent UI component
+ * ordinarily involves selection of one or more of the objects
+ * corresponding to those #AtkObject children - for example,
+ * selectable lists.
+ *
+ * Note that other types of "selection" (for instance text selection)
+ * are accomplished a other ATK interfaces - #AtkSelection is limited
+ * to the selection/deselection of children.
+ */
+
+enum
+{
+  SELECTION_CHANGED,
+  LAST_SIGNAL
+};
+
+static void atk_selection_base_init (gpointer *g_class);
+
+static guint atk_selection_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_selection_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkSelectionIface),
+        (GBaseInitFunc) atk_selection_base_init,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkSelection", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_selection_base_init (gpointer *g_class)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
+    {
+      /**
+       * AtkSelection::selection-changed:
+       * @atkselection: the object which received the signal.
+       *
+       * The "selection-changed" signal is emitted by an object which
+       * implements AtkSelection interface when the selection changes.
+       */
+      atk_selection_signals[SELECTION_CHANGED] =
+          g_signal_new ("selection_changed",
+                        ATK_TYPE_SELECTION,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkSelectionIface, selection_changed),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_selection_add_selection:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ * @i: a #gint specifying the child index.
+ *
+ * Adds the specified accessible child of the object to the
+ * object's selection.
+ *
+ * Returns: TRUE if success, FALSE otherwise.
+ **/
+gboolean
+atk_selection_add_selection (AtkSelection *obj,
+                             gint i)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), FALSE);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->add_selection)
+    return (iface->add_selection) (obj, i);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_selection_clear_selection:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ *
+ * Clears the selection in the object so that no children in the object
+ * are selected.
+ *
+ * Returns: TRUE if success, FALSE otherwise.
+ **/
+gboolean
+atk_selection_clear_selection (AtkSelection *obj)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), FALSE);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->clear_selection)
+    return (iface->clear_selection) (obj);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_selection_ref_selection:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ * @i: a #gint specifying the index in the selection set.  (e.g. the
+ * ith selection as opposed to the ith child).
+ *
+ * Gets a reference to the accessible object representing the specified
+ * selected child of the object.
+ * Note: callers should not rely on %NULL or on a zero value for
+ * indication of whether AtkSelectionIface is implemented, they should
+ * use type checking/interface checking macros or the
+ * atk_get_accessible_value() convenience method.
+ *
+ * Returns: (nullable) (transfer full): an #AtkObject representing the
+ * selected accessible, or %NULL if @selection does not implement this
+ * interface.
+ **/
+AtkObject *
+atk_selection_ref_selection (AtkSelection *obj,
+                             gint i)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), NULL);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->ref_selection)
+    return (iface->ref_selection) (obj, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_selection_get_selection_count:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ *
+ * Gets the number of accessible children currently selected.
+ * Note: callers should not rely on %NULL or on a zero value for
+ * indication of whether AtkSelectionIface is implemented, they should
+ * use type checking/interface checking macros or the
+ * atk_get_accessible_value() convenience method.
+ *
+ * Returns: a gint representing the number of items selected, or 0
+ * if @selection does not implement this interface.
+ **/
+gint
+atk_selection_get_selection_count (AtkSelection *obj)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), 0);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->get_selection_count)
+    return (iface->get_selection_count) (obj);
+  else
+    return 0;
+}
+
+/**
+ * atk_selection_is_child_selected:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ * @i: a #gint specifying the child index.
+ *
+ * Determines if the current child of this object is selected
+ * Note: callers should not rely on %NULL or on a zero value for
+ * indication of whether AtkSelectionIface is implemented, they should
+ * use type checking/interface checking macros or the
+ * atk_get_accessible_value() convenience method.
+ *
+ * Returns: a gboolean representing the specified child is selected, or 0
+ * if @selection does not implement this interface.
+ **/
+gboolean
+atk_selection_is_child_selected (AtkSelection *obj,
+                                 gint i)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), FALSE);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->is_child_selected)
+    return (iface->is_child_selected) (obj, i);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_selection_remove_selection:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ * @i: a #gint specifying the index in the selection set.  (e.g. the
+ * ith selection as opposed to the ith child).
+ *
+ * Removes the specified child of the object from the object's selection.
+ *
+ * Returns: TRUE if success, FALSE otherwise.
+ **/
+gboolean
+atk_selection_remove_selection (AtkSelection *obj,
+                                gint i)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), FALSE);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->remove_selection)
+    return (iface->remove_selection) (obj, i);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_selection_select_all_selection:
+ * @selection: a #GObject instance that implements AtkSelectionIface
+ *
+ * Causes every child of the object to be selected if the object
+ * supports multiple selections.
+ *
+ * Returns: TRUE if success, FALSE otherwise.
+ **/
+gboolean
+atk_selection_select_all_selection (AtkSelection *obj)
+{
+  AtkSelectionIface *iface;
+
+  g_return_val_if_fail (ATK_IS_SELECTION (obj), FALSE);
+
+  iface = ATK_SELECTION_GET_IFACE (obj);
+
+  if (iface->select_all_selection)
+    return (iface->select_all_selection) (obj);
+  else
+    return FALSE;
+}
diff --git a/atk/atkselection.h b/atk/atkselection.h
new file mode 100644 (file)
index 0000000..69630fc
--- /dev/null
@@ -0,0 +1,100 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_SELECTION_H__
+#define __ATK_SELECTION_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+/*
+ * This AtkSelection interface provides the standard mechanism for an
+ * assistive technology to determine what the current selected children are,
+ * as well as modify the selection set. Any object that has children that
+ * can be selected should support the AtkSelection interface.
+ */
+
+#define ATK_TYPE_SELECTION (atk_selection_get_type ())
+#define ATK_IS_SELECTION(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_SELECTION)
+#define ATK_SELECTION(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_SELECTION, AtkSelection)
+#define ATK_SELECTION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_SELECTION, AtkSelectionIface))
+
+#ifndef _TYPEDEF_ATK_SELECTION_
+#define _TYPEDEF_ATK_SELECTION_
+typedef struct _AtkSelection AtkSelection;
+#endif
+typedef struct _AtkSelectionIface AtkSelectionIface;
+
+struct _AtkSelectionIface
+{
+  GTypeInterface parent;
+
+  gboolean (*add_selection) (AtkSelection *selection,
+                             gint i);
+  gboolean (*clear_selection) (AtkSelection *selection);
+  AtkObject *(*ref_selection) (AtkSelection *selection,
+                               gint i);
+  gint (*get_selection_count) (AtkSelection *selection);
+  gboolean (*is_child_selected) (AtkSelection *selection,
+                                 gint i);
+  gboolean (*remove_selection) (AtkSelection *selection,
+                                gint i);
+  gboolean (*select_all_selection) (AtkSelection *selection);
+
+  /* signal handlers */
+
+  void (*selection_changed) (AtkSelection *selection);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_selection_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_selection_add_selection (AtkSelection *selection,
+                                      gint i);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_selection_clear_selection (AtkSelection *selection);
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_selection_ref_selection (AtkSelection *selection,
+                                        gint i);
+
+ATK_AVAILABLE_IN_ALL
+gint atk_selection_get_selection_count (AtkSelection *selection);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_selection_is_child_selected (AtkSelection *selection,
+                                          gint i);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_selection_remove_selection (AtkSelection *selection,
+                                         gint i);
+
+ATK_AVAILABLE_IN_ALL
+gboolean atk_selection_select_all_selection (AtkSelection *selection);
+
+G_END_DECLS
+
+#endif /* __ATK_SELECTION_H__ */
diff --git a/atk/atksocket.c b/atk/atksocket.c
new file mode 100644 (file)
index 0000000..80dc8d3
--- /dev/null
@@ -0,0 +1,199 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright (C) 2009 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+#include "atksocket.h"
+
+/**
+ * AtkSocket:
+ *
+ * Container for AtkPlug objects from other processes
+ *
+ * Together with #AtkPlug, #AtkSocket provides the ability to embed
+ * accessibles from one process into another in a fashion that is
+ * transparent to assistive technologies. #AtkSocket works as the
+ * container of #AtkPlug, embedding it using the method
+ * atk_socket_embed(). Any accessible contained in the #AtkPlug will
+ * appear to the assistive technologies as being inside the
+ * application that created the #AtkSocket.
+ *
+ * The communication between a #AtkSocket and a #AtkPlug is done by
+ * the IPC layer of the accessibility framework, normally implemented
+ * by the D-Bus based implementation of AT-SPI (at-spi2). If that is
+ * the case, at-spi-atk2 is the responsible to implement the abstract
+ * methods atk_plug_get_id() and atk_socket_embed(), so an ATK
+ * implementor shouldn't reimplement them. The process that contains
+ * the #AtkPlug is responsible to send the ID returned by
+ * atk_plug_id() to the process that contains the #AtkSocket, so it
+ * could call the method atk_socket_embed() in order to embed it.
+ *
+ * For the same reasons, an implementor doesn't need to implement
+ * atk_object_get_n_accessible_children() and
+ * atk_object_ref_accessible_child(). All the logic related to those
+ * functions will be implemented by the IPC layer.
+ *
+ * See [class@AtkPlug]
+ */
+
+static void atk_socket_finalize (GObject *obj);
+
+static void atk_component_interface_init (AtkComponentIface *iface);
+
+static void atk_socket_component_real_get_extents (AtkComponent *component,
+                                                   gint *x,
+                                                   gint *y,
+                                                   gint *width,
+                                                   gint *height,
+                                                   AtkCoordType coord_type);
+
+G_DEFINE_TYPE_WITH_CODE (AtkSocket, atk_socket, ATK_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
+
+static void
+atk_socket_init (AtkSocket *obj)
+{
+  AtkObject *accessible = ATK_OBJECT (obj);
+
+  obj->embedded_plug_id = NULL;
+
+  accessible->role = ATK_ROLE_FILLER;
+  accessible->layer = ATK_LAYER_WIDGET;
+}
+
+static void
+atk_socket_class_init (AtkSocketClass *klass)
+{
+  GObjectClass *obj_class = G_OBJECT_CLASS (klass);
+
+  obj_class->finalize = atk_socket_finalize;
+
+  klass->embed = NULL;
+}
+
+static void
+atk_socket_finalize (GObject *_obj)
+{
+  AtkSocket *obj = ATK_SOCKET (_obj);
+
+  g_free (obj->embedded_plug_id);
+  obj->embedded_plug_id = NULL;
+
+  G_OBJECT_CLASS (atk_socket_parent_class)->finalize (_obj);
+}
+
+static void
+atk_component_interface_init (AtkComponentIface *iface)
+{
+  iface->get_extents = atk_socket_component_real_get_extents;
+}
+
+/**
+ * atk_socket_new:
+ *
+ * Creates a new #AtkSocket.
+ *
+ * Returns: (transfer full): the newly created #AtkSocket instance
+ */
+AtkObject *
+atk_socket_new (void)
+{
+  return g_object_new (ATK_TYPE_SOCKET, NULL);
+}
+
+/**
+ * atk_socket_embed:
+ * @obj: an #AtkSocket
+ * @plug_id: the ID of an #AtkPlug
+ *
+ * Embeds the children of an #AtkPlug as the children of the
+ * #AtkSocket. The plug may be in the same process or in a different
+ * process.
+ *
+ * The class item used by this function should be filled in by the IPC
+ * layer (usually at-spi2-atk). The implementor of the AtkSocket
+ * should call this function and pass the id for the plug as returned
+ * by atk_plug_get_id().  It is the responsibility of the application
+ * to pass the plug id on to the process implementing the #AtkSocket
+ * as needed.
+ *
+ * Since: 1.30
+ **/
+void
+atk_socket_embed (AtkSocket *obj, const gchar *plug_id)
+{
+  AtkSocketClass *klass;
+
+  g_return_if_fail (plug_id != NULL);
+  g_return_if_fail (ATK_IS_SOCKET (obj));
+
+  klass = g_type_class_peek (ATK_TYPE_SOCKET);
+  if (klass && klass->embed)
+    {
+      if (obj->embedded_plug_id)
+        g_free (obj->embedded_plug_id);
+      obj->embedded_plug_id = g_strdup (plug_id);
+      (klass->embed) (obj, plug_id);
+    }
+}
+
+/**
+ * atk_socket_is_occupied:
+ * @obj: an #AtkSocket
+ *
+ * Determines whether or not the socket has an embedded plug.
+ *
+ * Returns: TRUE if a plug is embedded in the socket
+ *
+ * Since: 1.30
+ **/
+gboolean
+atk_socket_is_occupied (AtkSocket *obj)
+{
+  g_return_val_if_fail (ATK_IS_SOCKET (obj), FALSE);
+
+  return (obj->embedded_plug_id != NULL);
+}
+
+static void
+atk_socket_component_real_get_extents (AtkComponent *component,
+                                       gint *x,
+                                       gint *y,
+                                       gint *width,
+                                       gint *height,
+                                       AtkCoordType coord_type)
+{
+  AtkObject *parent = atk_object_get_parent (ATK_OBJECT (component));
+
+  if (parent == NULL || !ATK_IS_COMPONENT (parent))
+    {
+      if (x)
+        *x = -1;
+      if (y)
+        *y = -1;
+      if (width)
+        *width = -1;
+      if (height)
+        *height = -1;
+
+      return;
+    }
+
+  atk_component_get_extents (ATK_COMPONENT (parent), x, y, width, height, coord_type);
+}
diff --git a/atk/atksocket.h b/atk/atksocket.h
new file mode 100644 (file)
index 0000000..3498a4f
--- /dev/null
@@ -0,0 +1,71 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2009 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_SOCKET_H__
+#define __ATK_SOCKET_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkversion.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_SOCKET (atk_socket_get_type ())
+#define ATK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_SOCKET, AtkSocket))
+#define ATK_IS_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_SOCKET))
+#define ATK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_SOCKET, AtkSocketClass))
+#define ATK_IS_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_SOCKET))
+#define ATK_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_SOCKET, AtkSocketClass))
+
+typedef struct _AtkSocket AtkSocket;
+typedef struct _AtkSocketClass AtkSocketClass;
+
+struct _AtkSocket
+{
+  AtkObject parent;
+
+  /*< private >*/
+  gchar *embedded_plug_id;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_socket_get_type (void);
+
+struct _AtkSocketClass
+{
+  AtkObjectClass parent_class;
+
+  /* to be subscribed to by atk-bridge */
+
+  /*< protected >*/
+  void (*embed) (AtkSocket *obj, const gchar *plug_id);
+};
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_socket_new (void);
+ATK_AVAILABLE_IN_ALL
+void atk_socket_embed (AtkSocket *obj, const gchar *plug_id);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_socket_is_occupied (AtkSocket *obj);
+
+G_END_DECLS
+
+#endif /* __ATK_SOCKET_H__ */
diff --git a/atk/atkstate.c b/atk/atkstate.c
new file mode 100644 (file)
index 0000000..bcdce0b
--- /dev/null
@@ -0,0 +1,144 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+
+#include <string.h>
+
+/**
+ * AtkState:
+ *
+ * An AtkState describes a single state of an object.
+ *
+ * An AtkState describes a single state of an object. The full set of states
+ * that apply to an object at a given time are contained in its #AtkStateSet.
+ *
+ * See [id@atk_object_ref_state_set] and [id@atk_object_notify_state_change]
+ */
+
+static guint last_type = ATK_STATE_LAST_DEFINED;
+
+#define NUM_POSSIBLE_STATES (sizeof (AtkState) * 8)
+
+static gchar *state_names[NUM_POSSIBLE_STATES];
+
+/**
+ * atk_state_type_register:
+ * @name: a character string describing the new state.
+ *
+ * Register a new object state.
+ *
+ * Returns: an #AtkState value for the new state.
+ **/
+AtkStateType
+atk_state_type_register (const gchar *name)
+{
+  g_return_val_if_fail (name, ATK_STATE_INVALID);
+
+  if (last_type < NUM_POSSIBLE_STATES - 1)
+    {
+      state_names[++last_type] = g_strdup (name);
+      return (last_type);
+    }
+  return ATK_STATE_INVALID; /* caller needs to check */
+}
+
+/**
+ * atk_state_type_get_name:
+ * @type: The #AtkStateType whose name is required
+ *
+ * Gets the description string describing the #AtkStateType @type.
+ *
+ * Returns: the string describing the AtkStateType
+ */
+const gchar *
+atk_state_type_get_name (AtkStateType type)
+{
+  GTypeClass *type_class;
+  GEnumValue *value;
+  const gchar *name = NULL;
+
+  type_class = g_type_class_ref (ATK_TYPE_STATE_TYPE);
+  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
+
+  value = g_enum_get_value (G_ENUM_CLASS (type_class), type);
+
+  if (value)
+    {
+      name = value->value_nick;
+    }
+  else
+    {
+      if (type <= last_type)
+        {
+          if (type >= 0)
+            name = state_names[type];
+        }
+    }
+
+  g_type_class_unref (type_class);
+
+  return name;
+}
+
+/**
+ * atk_state_type_for_name:
+ * @name: a character string state name
+ *
+ * Gets the #AtkStateType corresponding to the description string @name.
+ *
+ * Returns: an #AtkStateType corresponding to @name
+ */
+AtkStateType
+atk_state_type_for_name (const gchar *name)
+{
+  GTypeClass *type_class;
+  GEnumValue *value;
+  AtkStateType type = ATK_STATE_INVALID;
+
+  g_return_val_if_fail (name, ATK_STATE_INVALID);
+
+  type_class = g_type_class_ref (ATK_TYPE_STATE_TYPE);
+  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), ATK_STATE_INVALID);
+
+  value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name);
+
+  if (value)
+    {
+      type = value->value;
+    }
+  else
+    {
+      gint i;
+
+      for (i = ATK_STATE_LAST_DEFINED + 1; i <= last_type; i++)
+        {
+          if (state_names[i] == NULL)
+            continue;
+          if (!strcmp (name, state_names[i]))
+            {
+              type = i;
+              break;
+            }
+        }
+    }
+  return type;
+}
diff --git a/atk/atkstate.h b/atk/atkstate.h
new file mode 100644 (file)
index 0000000..88f42e9
--- /dev/null
@@ -0,0 +1,210 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_STATE_H__
+#define __ATK_STATE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkversion.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/**
+ *AtkStateType:
+ *@ATK_STATE_INVALID: Indicates an invalid state - probably an error condition.
+ *@ATK_STATE_ACTIVE: Indicates a window is currently the active window, or an object is the active subelement within a container or table. ATK_STATE_ACTIVE should not be used for objects which have ATK_STATE_FOCUSABLE or ATK_STATE_SELECTABLE: Those objects should use ATK_STATE_FOCUSED and ATK_STATE_SELECTED respectively. ATK_STATE_ACTIVE is a means to indicate that an object which is not focusable and not selectable is the currently-active item within its parent container.
+ *@ATK_STATE_ARMED: Indicates that the object is 'armed', i.e. will be activated by if a pointer button-release event occurs within its bounds.  Buttons often enter this state when a pointer click occurs within their bounds, as a precursor to activation. ATK_STATE_ARMED has been deprecated since ATK-2.16 and should not be used in newly-written code.
+ *@ATK_STATE_BUSY:  Indicates the current object is busy, i.e. onscreen representation is in the process of changing, or the object is temporarily unavailable for interaction due to activity already in progress.  This state may be used by implementors of Document to indicate that content loading is underway.  It also may indicate other 'pending' conditions; clients may wish to interrogate this object when the ATK_STATE_BUSY flag is removed.
+ *@ATK_STATE_CHECKED: Indicates this object is currently checked, for instance a checkbox is 'non-empty'.
+ *@ATK_STATE_DEFUNCT: Indicates that this object no longer has a valid backing widget (for instance, if its peer object has been destroyed)
+ *@ATK_STATE_EDITABLE: Indicates that this object can contain text, and that the
+ * user can change the textual contents of this object by editing those contents
+ * directly. For an object which is expected to be editable due to its type, but
+ * which cannot be edited due to the application or platform preventing the user
+ * from doing so, that object's #AtkStateSet should lack ATK_STATE_EDITABLE and
+ * should contain ATK_STATE_READ_ONLY.
+ *@ATK_STATE_ENABLED:  Indicates that this object is enabled, i.e. that it currently reflects some application state. Objects that are "greyed out" may lack this state, and may lack the STATE_SENSITIVE if direct user interaction cannot cause them to acquire STATE_ENABLED. See also: ATK_STATE_SENSITIVE
+ *@ATK_STATE_EXPANDABLE: Indicates this object allows progressive disclosure of its children
+ *@ATK_STATE_EXPANDED: Indicates this object its expanded - see ATK_STATE_EXPANDABLE above
+ *@ATK_STATE_FOCUSABLE: Indicates this object can accept keyboard focus, which means all events resulting from typing on the keyboard will normally be passed to it when it has focus
+ *@ATK_STATE_FOCUSED: Indicates this object currently has the keyboard focus
+ *@ATK_STATE_HORIZONTAL: Indicates the orientation of this object is horizontal; used, for instance, by objects of ATK_ROLE_SCROLL_BAR.  For objects where vertical/horizontal orientation is especially meaningful.
+ *@ATK_STATE_ICONIFIED: Indicates this object is minimized and is represented only by an icon
+ *@ATK_STATE_MODAL: Indicates something must be done with this object before the user can interact with an object in a different window
+ *@ATK_STATE_MULTI_LINE: Indicates this (text) object can contain multiple lines of text
+ *@ATK_STATE_MULTISELECTABLE: Indicates this object allows more than one of its children to be selected at the same time, or in the case of text objects, that the object supports non-contiguous text selections.
+ *@ATK_STATE_OPAQUE: Indicates this object paints every pixel within its rectangular region.
+ *@ATK_STATE_PRESSED: Indicates this object is currently pressed.
+ *@ATK_STATE_RESIZABLE: Indicates the size of this object is not fixed
+ *@ATK_STATE_SELECTABLE: Indicates this object is the child of an object that allows its children to be selected and that this child is one of those children that can be selected
+ *@ATK_STATE_SELECTED: Indicates this object is the child of an object that allows its children to be selected and that this child is one of those children that has been selected
+ *@ATK_STATE_SENSITIVE: Indicates this object is sensitive, e.g. to user interaction.
+ * STATE_SENSITIVE usually accompanies STATE_ENABLED for user-actionable controls,
+ * but may be found in the absence of STATE_ENABLED if the current visible state of the
+ * control is "disconnected" from the application state.  In such cases, direct user interaction
+ * can often result in the object gaining STATE_SENSITIVE, for instance if a user makes
+ * an explicit selection using an object whose current state is ambiguous or undefined.
+ * @see STATE_ENABLED, STATE_INDETERMINATE.
+ *@ATK_STATE_SHOWING: Indicates this object, the object's parent, the object's parent's parent, and so on,
+ * are all 'shown' to the end-user, i.e. subject to "exposure" if blocking or obscuring objects do not interpose
+ * between this object and the top of the window stack.
+ *@ATK_STATE_SINGLE_LINE: Indicates this (text) object can contain only a single line of text
+ *@ATK_STATE_STALE: Indicates that the information returned for this object may no longer be
+ * synchronized with the application state.  This is implied if the object has STATE_TRANSIENT,
+ * and can also occur towards the end of the object peer's lifecycle. It can also be used to indicate that
+ * the index associated with this object has changed since the user accessed the object (in lieu of
+ * "index-in-parent-changed" events).
+ *@ATK_STATE_TRANSIENT: Indicates this object is transient, i.e. a snapshot which may not emit events when its
+ * state changes.  Data from objects with ATK_STATE_TRANSIENT should not be cached, since there may be no
+ * notification given when the cached data becomes obsolete.
+ *@ATK_STATE_VERTICAL: Indicates the orientation of this object is vertical
+ *@ATK_STATE_VISIBLE: Indicates this object is visible, e.g. has been explicitly marked for exposure to the user.
+ * **note**: %ATK_STATE_VISIBLE is no guarantee that the object is actually unobscured on the screen, only
+ * that it is 'potentially' visible, barring obstruction, being scrolled or clipped out of the
+ * field of view, or having an ancestor container that has not yet made visible.
+ * A widget is potentially onscreen if it has both %ATK_STATE_VISIBLE and %ATK_STATE_SHOWING.
+ * The absence of %ATK_STATE_VISIBLE and %ATK_STATE_SHOWING is semantically equivalent to saying
+ * that an object is 'hidden'.  See also %ATK_STATE_TRUNCATED, which applies if an object with
+ * %ATK_STATE_VISIBLE and %ATK_STATE_SHOWING set lies within a viewport which means that its
+ * contents are clipped, e.g. a truncated spreadsheet cell or
+ * an image within a scrolling viewport.  Mostly useful for screen-review and magnification
+ * algorithms.
+ *@ATK_STATE_MANAGES_DESCENDANTS: Indicates that "active-descendant-changed" event
+ * is sent when children become 'active' (i.e. are selected or navigated to onscreen).
+ * Used to prevent need to enumerate all children in very large containers, like tables.
+ * The presence of STATE_MANAGES_DESCENDANTS is an indication to the client.
+ * that the children should not, and need not, be enumerated by the client.
+ * Objects implementing this state are expected to provide relevant state
+ * notifications to listening clients, for instance notifications of visibility
+ * changes and activation of their contained child objects, without the client
+ * having previously requested references to those children.
+ *@ATK_STATE_INDETERMINATE: Indicates that the value, or some other quantifiable
+ * property, of this AtkObject cannot be fully determined. In the case of a large
+ * data set in which the total number of items in that set is unknown (e.g. 1 of
+ * 999+), implementors should expose the currently-known set size (999) along
+ * with this state. In the case of a check box, this state should be used to
+ * indicate that the check box is a tri-state check box which is currently
+ * neither checked nor unchecked.
+ *@ATK_STATE_TRUNCATED: Indicates that an object is truncated, e.g. a text value in a speradsheet cell.
+ *@ATK_STATE_REQUIRED: Indicates that explicit user interaction with an object is required by the user interface, e.g. a required field in a "web-form" interface.
+ *@ATK_STATE_INVALID_ENTRY: Indicates that the object has encountered an error condition due to failure of input validation. For instance, a form control may acquire this state in response to invalid or malformed user input.
+ *@ATK_STATE_SUPPORTS_AUTOCOMPLETION:  Indicates that the object in question implements some form of ¨typeahead¨ or
+ * pre-selection behavior whereby entering the first character of one or more sub-elements
+ * causes those elements to scroll into view or become selected.  Subsequent character input
+ * may narrow the selection further as long as one or more sub-elements match the string.
+ * This state is normally only useful and encountered on objects that implement Selection.
+ * In some cases the typeahead behavior may result in full or partial ¨completion¨ of
+ * the data in the input field, in which case these input events may trigger text-changed
+ * events from the AtkText interface.  This state supplants @ATK_ROLE_AUTOCOMPLETE.
+ *@ATK_STATE_SELECTABLE_TEXT:Indicates that the object in question supports text selection. It should only be exposed on objects which implement the Text interface, in order to distinguish this state from @ATK_STATE_SELECTABLE, which infers that the object in question is a selectable child of an object which implements Selection. While similar, text selection and subelement selection are distinct operations.
+ *@ATK_STATE_DEFAULT: Indicates that the object is the "default" active component, i.e. the object which is activated by an end-user press of the "Enter" or "Return" key.  Typically a "close" or "submit" button.
+ *@ATK_STATE_ANIMATED: Indicates that the object changes its appearance dynamically as an inherent part of its presentation.  This state may come and go if an object is only temporarily animated on the way to a 'final' onscreen presentation.
+ * **note**: some applications, notably content viewers, may not be able to detect
+ * all kinds of animated content.  Therefore the absence of this state should not
+ * be taken as definitive evidence that the object's visual representation is
+ * static; this state is advisory.
+ *@ATK_STATE_VISITED: Indicates that the object (typically a hyperlink) has already been 'activated', and/or its backing data has already been downloaded, rendered, or otherwise "visited".
+ *@ATK_STATE_CHECKABLE: Indicates this object has the potential to be
+ *  checked, such as a checkbox or toggle-able table cell. @Since:
+ *  ATK-2.12
+ *@ATK_STATE_HAS_POPUP: Indicates that the object has a popup context
+ * menu or sub-level menu which may or may not be showing. This means
+ * that activation renders conditional content.  Note that ordinary
+ * tooltips are not considered popups in this context. @Since: ATK-2.12
+ *@ATK_STATE_HAS_TOOLTIP: Indicates this object has a tooltip. @Since: ATK-2.16
+ *@ATK_STATE_READ_ONLY: Indicates that a widget which is ENABLED and SENSITIVE
+ * has a value which can be read, but not modified, by the user. Note that this
+ * state should only be applied to widget types whose value is normally directly
+ * user modifiable, such as check boxes, radio buttons, spin buttons, text input
+ * fields, and combo boxes, as a means to convey that the expected interaction
+ * with that widget is not possible. When the expected interaction with a
+ * widget does not include modification by the user, as is the case with
+ * labels and containers, ATK_STATE_READ_ONLY should not be applied. See also
+ * ATK_STATE_EDITABLE. @Since: ATK-2-16
+ *@ATK_STATE_COLLAPSED: Indicates this object is collapsed. @Since: ATK-2.38
+ *@ATK_STATE_LAST_DEFINED: Not a valid state, used for finding end of enumeration
+ *
+ *The possible types of states of an object
+ **/
+typedef enum
+{
+  ATK_STATE_INVALID,
+  ATK_STATE_ACTIVE,
+  ATK_STATE_ARMED,
+  ATK_STATE_BUSY,
+  ATK_STATE_CHECKED,
+  ATK_STATE_DEFUNCT,
+  ATK_STATE_EDITABLE,
+  ATK_STATE_ENABLED,
+  ATK_STATE_EXPANDABLE,
+  ATK_STATE_EXPANDED,
+  ATK_STATE_FOCUSABLE,
+  ATK_STATE_FOCUSED,
+  ATK_STATE_HORIZONTAL,
+  ATK_STATE_ICONIFIED,
+  ATK_STATE_MODAL,
+  ATK_STATE_MULTI_LINE,
+  ATK_STATE_MULTISELECTABLE,
+  ATK_STATE_OPAQUE,
+  ATK_STATE_PRESSED,
+  ATK_STATE_RESIZABLE,
+  ATK_STATE_SELECTABLE,
+  ATK_STATE_SELECTED,
+  ATK_STATE_SENSITIVE,
+  ATK_STATE_SHOWING,
+  ATK_STATE_SINGLE_LINE,
+  ATK_STATE_STALE,
+  ATK_STATE_TRANSIENT,
+  ATK_STATE_VERTICAL,
+  ATK_STATE_VISIBLE,
+  ATK_STATE_MANAGES_DESCENDANTS,
+  ATK_STATE_INDETERMINATE,
+  ATK_STATE_TRUNCATED,
+  ATK_STATE_REQUIRED,
+  ATK_STATE_INVALID_ENTRY,
+  ATK_STATE_SUPPORTS_AUTOCOMPLETION,
+  ATK_STATE_SELECTABLE_TEXT,
+  ATK_STATE_DEFAULT,
+  ATK_STATE_ANIMATED,
+  ATK_STATE_VISITED,
+  ATK_STATE_CHECKABLE,
+  ATK_STATE_HAS_POPUP,
+  ATK_STATE_HAS_TOOLTIP,
+  ATK_STATE_READ_ONLY,
+  ATK_STATE_COLLAPSED,
+  ATK_STATE_LAST_DEFINED
+} AtkStateType;
+
+typedef guint64 AtkState;
+
+ATK_AVAILABLE_IN_ALL
+AtkStateType atk_state_type_register (const gchar *name);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_state_type_get_name (AtkStateType type);
+ATK_AVAILABLE_IN_ALL
+AtkStateType atk_state_type_for_name (const gchar *name);
+
+G_END_DECLS
+
+#endif /* __ATK_STATE_H__ */
diff --git a/atk/atkstateset.c b/atk/atkstateset.c
new file mode 100644 (file)
index 0000000..0d14b4a
--- /dev/null
@@ -0,0 +1,383 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "atkobject.h"
+#include "atkstateset.h"
+
+/**
+ * AtkStateSet:
+ *
+ * An AtkStateSet contains the states of an object.
+ *
+ * An AtkStateSet is a read-only representation of the full set of #AtkStates
+ * that apply to an object at a given time. This set is not meant to be
+ * modified, but rather created when #atk_object_ref_state_set() is called.
+ */
+
+#define ATK_STATE(state_enum) ((AtkState) ((guint64) 1 << ((state_enum) % 64)))
+
+struct _AtkRealStateSet
+{
+  GObject parent;
+
+  AtkState state;
+};
+
+typedef struct _AtkRealStateSet AtkRealStateSet;
+
+static void atk_state_set_class_init (AtkStateSetClass *klass);
+
+GType
+atk_state_set_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkStateSetClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_state_set_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkRealStateSet),
+        0,
+        (GInstanceInitFunc) NULL,
+      };
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkStateSet", &typeInfo, 0);
+    }
+  return type;
+}
+
+static void
+atk_state_set_class_init (AtkStateSetClass *klass)
+{
+}
+
+/**
+ * atk_state_set_new:
+ *
+ * Creates a new empty state set.
+ *
+ * Returns: a new #AtkStateSet
+ **/
+AtkStateSet *
+atk_state_set_new (void)
+{
+  return (AtkStateSet *) g_object_new (ATK_TYPE_STATE_SET, NULL);
+}
+
+/**
+ * atk_state_set_is_empty:
+ * @set: an #AtkStateType
+ *
+ * Checks whether the state set is empty, i.e. has no states set.
+ *
+ * Returns: %TRUE if @set has no states set, otherwise %FALSE
+ **/
+gboolean
+atk_state_set_is_empty (AtkStateSet *set)
+{
+  AtkRealStateSet *real_set;
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
+
+  real_set = (AtkRealStateSet *) set;
+
+  if (real_set->state)
+    return FALSE;
+  else
+    return TRUE;
+}
+
+/**
+ * atk_state_set_add_state:
+ * @set: an #AtkStateSet
+ * @type: an #AtkStateType
+ *
+ * Adds the state of the specified type to the state set if it is not already
+ * present.
+ *
+ * Note that because an #AtkStateSet is a read-only object, this method should
+ * be used to add a state to a newly-created set which will then be returned by
+ * #atk_object_ref_state_set. It should not be used to modify the existing state
+ * of an object. See also #atk_object_notify_state_change.
+ *
+ * Returns: %TRUE if  the state for @type is not already in @set.
+ **/
+gboolean
+atk_state_set_add_state (AtkStateSet *set,
+                         AtkStateType type)
+{
+  AtkRealStateSet *real_set;
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
+
+  real_set = (AtkRealStateSet *) set;
+
+  if (real_set->state & ATK_STATE (type))
+    return FALSE;
+  else
+    {
+      real_set->state |= ATK_STATE (type);
+      return TRUE;
+    }
+}
+/**
+ * atk_state_set_add_states:
+ * @set: an #AtkStateSet
+ * @types: (array length=n_types): an array of #AtkStateType
+ * @n_types: The number of elements in the array
+ *
+ * Adds the states of the specified types to the state set.
+ *
+ * Note that because an #AtkStateSet is a read-only object, this method should
+ * be used to add states to a newly-created set which will then be returned by
+ * #atk_object_ref_state_set. It should not be used to modify the existing state
+ * of an object. See also #atk_object_notify_state_change.
+ **/
+void
+atk_state_set_add_states (AtkStateSet *set,
+                          AtkStateType *types,
+                          gint n_types)
+{
+  AtkRealStateSet *real_set;
+  gint i;
+  g_return_if_fail (ATK_IS_STATE_SET (set));
+
+  real_set = (AtkRealStateSet *) set;
+
+  for (i = 0; i < n_types; i++)
+    {
+      real_set->state |= ATK_STATE (types[i]);
+    }
+}
+
+/**
+ * atk_state_set_clear_states:
+ * @set: an #AtkStateSet
+ *
+ * Removes all states from the state set.
+ **/
+void
+atk_state_set_clear_states (AtkStateSet *set)
+{
+  AtkRealStateSet *real_set;
+  g_return_if_fail (ATK_IS_STATE_SET (set));
+
+  real_set = (AtkRealStateSet *) set;
+
+  real_set->state = 0;
+}
+
+/**
+ * atk_state_set_contains_state:
+ * @set: an #AtkStateSet
+ * @type: an #AtkStateType
+ *
+ * Checks whether the state for the specified type is in the specified set.
+ *
+ * Returns: %TRUE if @type is the state type is in @set.
+ **/
+gboolean
+atk_state_set_contains_state (AtkStateSet *set,
+                              AtkStateType type)
+{
+  AtkRealStateSet *real_set;
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
+
+  real_set = (AtkRealStateSet *) set;
+
+  if (real_set->state & ATK_STATE (type))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+/**
+ * atk_state_set_contains_states:
+ * @set: an #AtkStateSet
+ * @types: (array length=n_types): an array of #AtkStateType
+ * @n_types: The number of elements in the array
+ *
+ * Checks whether the states for all the specified types are in the
+ * specified set.
+ *
+ * Returns: %TRUE if all the states for @type are in @set.
+ **/
+gboolean
+atk_state_set_contains_states (AtkStateSet *set,
+                               AtkStateType *types,
+                               gint n_types)
+{
+  AtkRealStateSet *real_set;
+  gint i;
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
+
+  real_set = (AtkRealStateSet *) set;
+
+  for (i = 0; i < n_types; i++)
+    {
+      if (!(real_set->state & ATK_STATE (types[i])))
+        return FALSE;
+    }
+  return TRUE;
+}
+
+/**
+ * atk_state_set_remove_state:
+ * @set: an #AtkStateSet
+ * @type: an #AtkType
+ *
+ * Removes the state for the specified type from the state set.
+ *
+ * Note that because an #AtkStateSet is a read-only object, this method should
+ * be used to remove a state to a newly-created set which will then be returned
+ * by #atk_object_ref_state_set. It should not be used to modify the existing
+ * state of an object. See also #atk_object_notify_state_change.
+ *
+ * Returns: %TRUE if @type was the state type is in @set.
+ **/
+gboolean
+atk_state_set_remove_state (AtkStateSet *set,
+                            AtkStateType type)
+{
+  AtkRealStateSet *real_set;
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
+
+  real_set = (AtkRealStateSet *) set;
+
+  if (real_set->state & ATK_STATE (type))
+    {
+      real_set->state ^= ATK_STATE (type);
+      return TRUE;
+    }
+  else
+    return FALSE;
+}
+
+/**
+ * atk_state_set_and_sets:
+ * @set: an #AtkStateSet
+ * @compare_set: another #AtkStateSet
+ *
+ * Constructs the intersection of the two sets, returning %NULL if the
+ * intersection is empty.
+ *
+ * Returns: (transfer full): a new #AtkStateSet which is the intersection of
+ * the two sets.
+ **/
+AtkStateSet *
+atk_state_set_and_sets (AtkStateSet *set,
+                        AtkStateSet *compare_set)
+{
+  AtkRealStateSet *real_set, *real_compare_set;
+  AtkStateSet *return_set = NULL;
+  AtkState state;
+
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
+  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
+
+  real_set = (AtkRealStateSet *) set;
+  real_compare_set = (AtkRealStateSet *) compare_set;
+
+  state = real_set->state & real_compare_set->state;
+  if (state)
+    {
+      return_set = atk_state_set_new ();
+      ((AtkRealStateSet *) return_set)->state = state;
+    }
+  return return_set;
+}
+
+/**
+ * atk_state_set_or_sets:
+ * @set: an #AtkStateSet
+ * @compare_set: another #AtkStateSet
+ *
+ * Constructs the union of the two sets.
+ *
+ * Returns: (nullable) (transfer full): a new #AtkStateSet which is
+ * the union of the two sets, returning %NULL is empty.
+ **/
+AtkStateSet *
+atk_state_set_or_sets (AtkStateSet *set,
+                       AtkStateSet *compare_set)
+{
+  AtkRealStateSet *real_set, *real_compare_set;
+  AtkStateSet *return_set = NULL;
+  AtkState state;
+
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
+  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
+
+  real_set = (AtkRealStateSet *) set;
+  real_compare_set = (AtkRealStateSet *) compare_set;
+
+  state = real_set->state | real_compare_set->state;
+
+  if (state)
+    {
+      return_set = atk_state_set_new ();
+      ((AtkRealStateSet *) return_set)->state = state;
+    }
+
+  return return_set;
+}
+
+/**
+ * atk_state_set_xor_sets:
+ * @set: an #AtkStateSet
+ * @compare_set: another #AtkStateSet
+ *
+ * Constructs the exclusive-or of the two sets, returning %NULL is empty.
+ * The set returned by this operation contains the states in exactly
+ * one of the two sets.
+ *
+ * Returns: (transfer full): a new #AtkStateSet which contains the states
+ * which are in exactly one of the two sets.
+ **/
+AtkStateSet *
+atk_state_set_xor_sets (AtkStateSet *set,
+                        AtkStateSet *compare_set)
+{
+  AtkRealStateSet *real_set, *real_compare_set;
+  AtkStateSet *return_set = NULL;
+  AtkState state, state1, state2;
+
+  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
+  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
+
+  real_set = (AtkRealStateSet *) set;
+  real_compare_set = (AtkRealStateSet *) compare_set;
+
+  state1 = real_set->state & (~real_compare_set->state);
+  state2 = (~real_set->state) & real_compare_set->state;
+  state = state1 | state2;
+
+  if (state)
+    {
+      return_set = atk_state_set_new ();
+      ((AtkRealStateSet *) return_set)->state = state;
+    }
+  return return_set;
+}
diff --git a/atk/atkstateset.h b/atk/atkstateset.h
new file mode 100644 (file)
index 0000000..9392e2b
--- /dev/null
@@ -0,0 +1,90 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_STATE_SET_H__
+#define __ATK_STATE_SET_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <atk/atkstate.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_STATE_SET (atk_state_set_get_type ())
+#define ATK_STATE_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_STATE_SET, AtkStateSet))
+#define ATK_STATE_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_STATE_SET, AtkStateSetClass))
+#define ATK_IS_STATE_SET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_STATE_SET))
+#define ATK_IS_STATE_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_STATE_SET))
+#define ATK_STATE_SET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_STATE_SET, AtkStateSetClass))
+
+typedef struct _AtkStateSetClass AtkStateSetClass;
+
+struct _AtkStateSet
+{
+  GObject parent;
+};
+
+struct _AtkStateSetClass
+{
+  GObjectClass parent;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_state_set_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkStateSet *atk_state_set_new (void);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_state_set_is_empty (AtkStateSet *set);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_state_set_add_state (AtkStateSet *set,
+                                  AtkStateType type);
+ATK_AVAILABLE_IN_ALL
+void atk_state_set_add_states (AtkStateSet *set,
+                               AtkStateType *types,
+                               gint n_types);
+ATK_AVAILABLE_IN_ALL
+void atk_state_set_clear_states (AtkStateSet *set);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_state_set_contains_state (AtkStateSet *set,
+                                       AtkStateType type);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_state_set_contains_states (AtkStateSet *set,
+                                        AtkStateType *types,
+                                        gint n_types);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_state_set_remove_state (AtkStateSet *set,
+                                     AtkStateType type);
+ATK_AVAILABLE_IN_ALL
+AtkStateSet *atk_state_set_and_sets (AtkStateSet *set,
+                                     AtkStateSet *compare_set);
+ATK_AVAILABLE_IN_ALL
+AtkStateSet *atk_state_set_or_sets (AtkStateSet *set,
+                                    AtkStateSet *compare_set);
+ATK_AVAILABLE_IN_ALL
+AtkStateSet *atk_state_set_xor_sets (AtkStateSet *set,
+                                     AtkStateSet *compare_set);
+
+G_END_DECLS
+
+#endif /* __ATK_STATE_SET_H__ */
diff --git a/atk/atkstreamablecontent.c b/atk/atkstreamablecontent.c
new file mode 100644 (file)
index 0000000..081c471
--- /dev/null
@@ -0,0 +1,180 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkstreamablecontent.h"
+
+/**
+ * AtkStreamableContent:
+ *
+ * The ATK interface which provides access to streamable content.
+ *
+ * An interface whereby an object allows its backing content to be
+ * streamed to clients.  Typical implementors would be images or
+ * icons, HTML content, or multimedia display/rendering widgets.
+ *
+ * Negotiation of content type is allowed. Clients may examine the
+ * backing data and transform, convert, or parse the content in order
+ * to present it in an alternate form to end-users.
+ *
+ * The AtkStreamableContent interface is particularly useful for
+ * saving, printing, or post-processing entire documents, or for
+ * persisting alternate views of a document. If document content
+ * itself is being serialized, stored, or converted, then use of the
+ * AtkStreamableContent interface can help address performance
+ * issues. Unlike most ATK interfaces, this interface is not strongly
+ * tied to the current user-agent view of the a particular document,
+ * but may in some cases give access to the underlying model data.
+ */
+
+GType
+atk_streamable_content_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkStreamableContentIface),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkStreamableContent", &tinfo, 0);
+    }
+
+  return type;
+}
+
+/**
+ * atk_streamable_content_get_n_mime_types:
+ * @streamable: a GObject instance that implements AtkStreamableContentIface
+ *
+ * Gets the number of mime types supported by this object.
+ *
+ * Returns: a gint which is the number of mime types supported by the object.
+ **/
+gint
+atk_streamable_content_get_n_mime_types (AtkStreamableContent *streamable)
+{
+  AtkStreamableContentIface *iface;
+
+  g_return_val_if_fail (ATK_IS_STREAMABLE_CONTENT (streamable), 0);
+
+  iface = ATK_STREAMABLE_CONTENT_GET_IFACE (streamable);
+
+  if (iface->get_n_mime_types)
+    return (iface->get_n_mime_types) (streamable);
+  else
+    return 0;
+}
+
+/**
+ * atk_streamable_content_get_mime_type:
+ * @streamable: a GObject instance that implements AtkStreamableContent
+ * @i: a gint representing the position of the mime type starting from 0
+ *
+ * Gets the character string of the specified mime type. The first mime
+ * type is at position 0, the second at position 1, and so on.
+ *
+ * Returns: a gchar* representing the specified mime type; the caller
+ * should not free the character string.
+ **/
+const gchar *
+atk_streamable_content_get_mime_type (AtkStreamableContent *streamable,
+                                      gint i)
+{
+  AtkStreamableContentIface *iface;
+
+  g_return_val_if_fail (i >= 0, NULL);
+  g_return_val_if_fail (ATK_IS_STREAMABLE_CONTENT (streamable), NULL);
+
+  iface = ATK_STREAMABLE_CONTENT_GET_IFACE (streamable);
+
+  if (iface->get_mime_type)
+    return (iface->get_mime_type) (streamable, i);
+  else
+    return NULL;
+}
+
+/**
+ * atk_streamable_content_get_stream:
+ * @streamable: a GObject instance that implements AtkStreamableContentIface
+ * @mime_type: a gchar* representing the mime type
+ *
+ * Gets the content in the specified mime type.
+ *
+ * Returns: (transfer full): A #GIOChannel which contains the content in the
+ * specified mime type.
+ **/
+GIOChannel *
+atk_streamable_content_get_stream (AtkStreamableContent *streamable,
+                                   const gchar *mime_type)
+{
+  AtkStreamableContentIface *iface;
+
+  g_return_val_if_fail (mime_type != NULL, NULL);
+  g_return_val_if_fail (ATK_IS_STREAMABLE_CONTENT (streamable), NULL);
+
+  iface = ATK_STREAMABLE_CONTENT_GET_IFACE (streamable);
+
+  if (iface->get_stream)
+    return (iface->get_stream) (streamable, mime_type);
+  else
+    return NULL;
+}
+
+/**
+ * atk_streamable_content_get_uri:
+ * @streamable: a GObject instance that implements AtkStreamableContentIface
+ * @mime_type: a gchar* representing the mime type, or NULL to request a URI
+ * for the default mime type.
+ *
+ * Get a string representing a URI in IETF standard format
+ * (see http://www.ietf.org/rfc/rfc2396.txt) from which the object's content
+ * may be streamed in the specified mime-type, if one is available.
+ * If mime_type is NULL, the URI for the default (and possibly only) mime-type is
+ * returned.
+ *
+ * Note that it is possible for get_uri to return NULL but for
+ * get_stream to work nonetheless, since not all GIOChannels connect to URIs.
+ *
+ * Returns: (nullable): Returns a string representing a URI, or %NULL
+ * if no corresponding URI can be constructed.
+ *
+ * Since: 1.12
+ **/
+const gchar *
+atk_streamable_content_get_uri (AtkStreamableContent *streamable,
+                                const gchar *mime_type)
+{
+  AtkStreamableContentIface *iface;
+
+  g_return_val_if_fail (mime_type != NULL, NULL);
+  g_return_val_if_fail (ATK_IS_STREAMABLE_CONTENT (streamable), NULL);
+
+  iface = ATK_STREAMABLE_CONTENT_GET_IFACE (streamable);
+
+  if (iface->get_uri)
+    return (iface->get_uri) (streamable, mime_type);
+  else
+    return NULL;
+}
diff --git a/atk/atkstreamablecontent.h b/atk/atkstreamablecontent.h
new file mode 100644 (file)
index 0000000..fac4b6a
--- /dev/null
@@ -0,0 +1,109 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_STREAMABLE_CONTENT_H__
+#define __ATK_STREAMABLE_CONTENT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_STREAMABLE_CONTENT (atk_streamable_content_get_type ())
+#define ATK_IS_STREAMABLE_CONTENT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_STREAMABLE_CONTENT)
+#define ATK_STREAMABLE_CONTENT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_STREAMABLE_CONTENT, AtkStreamableContent)
+#define ATK_STREAMABLE_CONTENT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_STREAMABLE_CONTENT, AtkStreamableContentIface))
+
+#ifndef _TYPEDEF_ATK_STREAMABLE_CONTENT
+#define _TYPEDEF_ATK_STREAMABLE_CONTENT
+typedef struct _AtkStreamableContent AtkStreamableContent;
+#endif
+typedef struct _AtkStreamableContentIface AtkStreamableContentIface;
+
+struct _AtkStreamableContentIface
+{
+  GTypeInterface parent;
+
+  /*
+   * Get the number of mime types supported by this object
+   */
+  gint (*get_n_mime_types) (AtkStreamableContent *streamable);
+  /*
+   * Gets the specified mime type supported by this object.
+   * The mime types are 0-based so the first mime type is
+   * at index 0, the second at index 1 and so on.  The mime-type
+   * at index 0 should be considered the "default" data type for the stream.
+   *
+   * This assumes that the strings for the mime types are stored in the
+   * AtkStreamableContent. Alternatively the const could be removed
+   * and the caller would be responsible for calling g_free() on the
+   * returned value.
+   */
+  const gchar *(*get_mime_type) (AtkStreamableContent *streamable,
+                                 gint i);
+  /*
+   * One possible implementation for this method is that it constructs the
+   * content appropriate for the mime type and then creates a temporary
+   * file containing the content, opens the file and then calls
+   * g_io_channel_unix_new_fd().
+   */
+  GIOChannel *(*get_stream) (AtkStreamableContent *streamable,
+                             const gchar *mime_type);
+
+  /*
+   * Returns a string representing a URI in IETF standard format
+   * (see http://www.ietf.org/rfc/rfc2396.txt) from which the object's content
+   * may be streamed in the specified mime-type.
+   * If mime_type is NULL, the URI for the default (and possibly only) mime-type is
+   * returned.
+   *
+   * returns NULL if the mime-type is not supported, or if no URI can be
+   * constructed.  Note that it is possible for get_uri to return NULL but for
+   * get_stream to work nonetheless, since not all GIOChannels connect to URIs.
+   */
+  const gchar *(*get_uri) (AtkStreamableContent *streamable,
+                           const gchar *mime_type);
+
+  AtkFunction pad1;
+  AtkFunction pad2;
+  AtkFunction pad3;
+};
+ATK_AVAILABLE_IN_ALL
+GType atk_streamable_content_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+gint atk_streamable_content_get_n_mime_types (AtkStreamableContent *streamable);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_streamable_content_get_mime_type (AtkStreamableContent *streamable,
+                                                   gint i);
+ATK_AVAILABLE_IN_ALL
+GIOChannel *atk_streamable_content_get_stream (AtkStreamableContent *streamable,
+                                               const gchar *mime_type);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_streamable_content_get_uri (AtkStreamableContent *streamable,
+                                             const gchar *mime_type);
+
+G_END_DECLS
+
+#endif /* __ATK_STREAMABLE_CONTENT_H__ */
diff --git a/atk/atktable.c b/atk/atktable.c
new file mode 100644 (file)
index 0000000..c1fa526
--- /dev/null
@@ -0,0 +1,982 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkmarshal.h"
+#include "atktable.h"
+
+/**
+ * AtkTable:
+ *
+ * The ATK interface implemented for UI components which contain tabular or row/column information.
+ *
+ * #AtkTable should be implemented by components which present
+ * elements ordered via rows and columns.  It may also be used to
+ * present tree-structured information if the nodes of the trees can
+ * be said to contain multiple "columns".  Individual elements of an
+ * #AtkTable are typically referred to as "cells". Those cells should
+ * implement the interface #AtkTableCell, but #Atk doesn't require
+ * them to be direct children of the current #AtkTable. They can be
+ * grand-children, grand-grand-children etc. #AtkTable provides the
+ * API needed to get a individual cell based on the row and column
+ * numbers.
+ *
+ * Children of #AtkTable are frequently "lightweight" objects, that
+ * is, they may not have backing widgets in the host UI toolkit.  They
+ * are therefore often transient.
+ *
+ * Since tables are often very complex, #AtkTable includes provision
+ * for offering simplified summary information, as well as row and
+ * column headers and captions.  Headers and captions are #AtkObjects
+ * which may implement other interfaces (#AtkText, #AtkImage, etc.) as
+ * appropriate.  #AtkTable summaries may themselves be (simplified)
+ * #AtkTables, etc.
+ *
+ * Note for implementors: in the past, #AtkTable required that all the
+ * cells should be direct children of #AtkTable, and provided some
+ * index based methods to request the cells. The practice showed that
+ * that forcing made #AtkTable implementation complex, and hard to
+ * expose other kind of children, like rows or captions. Right now,
+ * index-based methods are deprecated.
+ */
+
+enum
+{
+  ROW_INSERTED,
+  ROW_DELETED,
+  COLUMN_INSERTED,
+  COLUMN_DELETED,
+  ROW_REORDERED,
+  COLUMN_REORDERED,
+  MODEL_CHANGED,
+  LAST_SIGNAL
+};
+
+static void atk_table_base_init (gpointer *g_class);
+
+static guint atk_table_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_table_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkTableIface),
+        (GBaseInitFunc) atk_table_base_init,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkTable", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_table_base_init (gpointer *g_class)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
+    {
+      /**
+       * AtkTable::row-inserted:
+       * @atktable: the object which received the signal.
+       * @arg1: The index of the first row inserted.
+       * @arg2: The number of rows inserted.
+       *
+       * The "row-inserted" signal is emitted by an object which
+       * implements the AtkTable interface when a row is inserted.
+       */
+      atk_table_signals[ROW_INSERTED] =
+          g_signal_new ("row_inserted",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, row_inserted),
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT,
+                        G_TYPE_NONE,
+                        2, G_TYPE_INT, G_TYPE_INT);
+      /**
+       * AtkTable::column-inserted:
+       * @atktable: the object which received the signal.
+       * @arg1: The index of the column inserted.
+       * @arg2: The number of colums inserted.
+       *
+       * The "column-inserted" signal is emitted by an object which
+       * implements the AtkTable interface when a column is inserted.
+       */
+      atk_table_signals[COLUMN_INSERTED] =
+          g_signal_new ("column_inserted",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, column_inserted),
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT,
+                        G_TYPE_NONE,
+                        2, G_TYPE_INT, G_TYPE_INT);
+      /**
+       * AtkTable::row-deleted:
+       * @atktable: the object which received the signal.
+       * @arg1: The index of the first row deleted.
+       * @arg2: The number of rows deleted.
+       *
+       * The "row-deleted" signal is emitted by an object which
+       * implements the AtkTable interface when a row is deleted.
+       */
+      atk_table_signals[ROW_DELETED] =
+          g_signal_new ("row_deleted",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, row_deleted),
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT,
+                        G_TYPE_NONE,
+                        2, G_TYPE_INT, G_TYPE_INT);
+      /**
+       * AtkTable::column-deleted:
+       * @atktable: the object which received the signal.
+       * @arg1: The index of the first column deleted.
+       * @arg2: The number of columns deleted.
+       *
+       * The "column-deleted" signal is emitted by an object which
+       * implements the AtkTable interface when a column is deleted.
+       */
+      atk_table_signals[COLUMN_DELETED] =
+          g_signal_new ("column_deleted",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, column_deleted),
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT,
+                        G_TYPE_NONE,
+                        2, G_TYPE_INT, G_TYPE_INT);
+      /**
+       * AtkTable::row-reordered:
+       * @atktable: the object which received the signal.
+       *
+       * The "row-reordered" signal is emitted by an object which
+       * implements the AtkTable interface when the rows are
+       * reordered.
+       */
+      atk_table_signals[ROW_REORDERED] =
+          g_signal_new ("row_reordered",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, row_reordered),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE,
+                        0);
+      /**
+       * AtkTable::column-reordered:
+       * @atktable: the object which received the signal.
+       *
+       * The "column-reordered" signal is emitted by an object which
+       * implements the AtkTable interface when the columns are
+       * reordered.
+       */
+      atk_table_signals[COLUMN_REORDERED] =
+          g_signal_new ("column_reordered",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, column_reordered),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE,
+                        0);
+
+      /**
+       * AtkTable::model-changed:
+       * @atktable: the object which received the signal.
+       *
+       * The "model-changed" signal is emitted by an object which
+       * implements the AtkTable interface when the model displayed by
+       * the table changes.
+       */
+      atk_table_signals[MODEL_CHANGED] =
+          g_signal_new ("model_changed",
+                        ATK_TYPE_TABLE,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTableIface, model_changed),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_table_ref_at:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @column: a #gint representing a column in @table
+ *
+ * Get a reference to the table cell at @row, @column. This cell
+ * should implement the interface #AtkTableCell
+ *
+ * Returns: (transfer full): an #AtkObject representing the referred
+ * to accessible
+ **/
+AtkObject *
+atk_table_ref_at (AtkTable *table,
+                  gint row,
+                  gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+  g_return_val_if_fail (row >= 0, NULL);
+  g_return_val_if_fail (column >= 0, NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->ref_at)
+    return (iface->ref_at) (table, row, column);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_index_at:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @column: a #gint representing a column in @table
+ *
+ * Gets a #gint representing the index at the specified @row and
+ * @column.
+ *
+ * Deprecated: Since 2.12. Use atk_table_ref_at() in order to get the
+ * accessible that represents the cell at (@row, @column)
+ *
+ * Returns: a #gint representing the index at specified position.
+ * The value -1 is returned if the object at row,column is not a child
+ * of table or table does not implement this interface.
+ **/
+gint
+atk_table_get_index_at (AtkTable *table,
+                        gint row,
+                        gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), -1);
+  g_return_val_if_fail (row >= 0, -1);
+  g_return_val_if_fail (column >= 0, -1);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_index_at)
+    return (iface->get_index_at) (table, row, column);
+  else
+    return -1;
+}
+
+/**
+ * atk_table_get_row_at_index:
+ * @table: a GObject instance that implements AtkTableInterface
+ * @index_: a #gint representing an index in @table
+ *
+ * Gets a #gint representing the row at the specified @index_.
+ *
+ * Deprecated: since 2.12.
+ *
+ * Returns: a gint representing the row at the specified index,
+ * or -1 if the table does not implement this method.
+ **/
+gint
+atk_table_get_row_at_index (AtkTable *table,
+                            gint index)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), -1);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_row_at_index)
+    return (iface->get_row_at_index) (table, index);
+  else
+    return -1;
+}
+
+/**
+ * atk_table_get_column_at_index:
+ * @table: a GObject instance that implements AtkTableInterface
+ * @index_: a #gint representing an index in @table
+ *
+ * Gets a #gint representing the column at the specified @index_.
+ *
+ * Deprecated: Since 2.12.
+ *
+ * Returns: a gint representing the column at the specified index,
+ * or -1 if the table does not implement this method.
+ **/
+gint
+atk_table_get_column_at_index (AtkTable *table,
+                               gint index)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_column_at_index)
+    return (iface->get_column_at_index) (table, index);
+  else
+    return -1;
+}
+
+/**
+ * atk_table_get_caption:
+ * @table: a GObject instance that implements AtkTableInterface
+ *
+ * Gets the caption for the @table.
+ *
+ * Returns: (nullable) (transfer none): a AtkObject* representing the
+ * table caption, or %NULL if value does not implement this interface.
+ **/
+AtkObject *
+atk_table_get_caption (AtkTable *table)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_caption)
+    return (iface->get_caption) (table);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_n_columns:
+ * @table: a GObject instance that implements AtkTableIface
+ *
+ * Gets the number of columns in the table.
+ *
+ * Returns: a gint representing the number of columns, or 0
+ * if value does not implement this interface.
+ **/
+gint
+atk_table_get_n_columns (AtkTable *table)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_n_columns)
+    return (iface->get_n_columns) (table);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_get_column_description:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in @table
+ *
+ * Gets the description text of the specified @column in the table
+ *
+ * Returns: a gchar* representing the column description, or %NULL
+ * if value does not implement this interface.
+ **/
+const gchar *
+atk_table_get_column_description (AtkTable *table,
+                                  gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_column_description)
+    return (iface->get_column_description) (table, column);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_column_extent_at:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @column: a #gint representing a column in @table
+ *
+ * Gets the number of columns occupied by the accessible object
+ * at the specified @row and @column in the @table.
+ *
+ * Returns: a gint representing the column extent at specified position, or 0
+ * if value does not implement this interface.
+ **/
+gint
+atk_table_get_column_extent_at (AtkTable *table,
+                                gint row,
+                                gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_column_extent_at)
+    return (iface->get_column_extent_at) (table, row, column);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_get_column_header:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in the table
+ *
+ * Gets the column header of a specified column in an accessible table.
+ *
+ * Returns: (nullable) (transfer none): a AtkObject* representing the
+ * specified column header, or %NULL if value does not implement this
+ * interface.
+ **/
+AtkObject *
+atk_table_get_column_header (AtkTable *table, gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_column_header)
+    return (iface->get_column_header) (table, column);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_n_rows:
+ * @table: a GObject instance that implements AtkTableIface
+ *
+ * Gets the number of rows in the table.
+ *
+ * Returns: a gint representing the number of rows, or 0
+ * if value does not implement this interface.
+ **/
+gint
+atk_table_get_n_rows (AtkTable *table)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_n_rows)
+    return (iface->get_n_rows) (table);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_get_row_description:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ *
+ * Gets the description text of the specified row in the table
+ *
+ * Returns: (nullable): a gchar* representing the row description, or
+ * %NULL if value does not implement this interface.
+ **/
+const gchar *
+atk_table_get_row_description (AtkTable *table,
+                               gint row)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_row_description)
+    return (iface->get_row_description) (table, row);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_row_extent_at:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @column: a #gint representing a column in @table
+ *
+ * Gets the number of rows occupied by the accessible object
+ * at a specified @row and @column in the @table.
+ *
+ * Returns: a gint representing the row extent at specified position, or 0
+ * if value does not implement this interface.
+ **/
+gint
+atk_table_get_row_extent_at (AtkTable *table,
+                             gint row,
+                             gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_row_extent_at)
+    return (iface->get_row_extent_at) (table, row, column);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_get_row_header:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in the table
+ *
+ * Gets the row header of a specified row in an accessible table.
+ *
+ * Returns: (nullable) (transfer none): a AtkObject* representing the
+ * specified row header, or %NULL if value does not implement this
+ * interface.
+ **/
+AtkObject *
+atk_table_get_row_header (AtkTable *table, gint row)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_row_header)
+    return (iface->get_row_header) (table, row);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_summary:
+ * @table: a GObject instance that implements AtkTableIface
+ *
+ * Gets the summary description of the table.
+ *
+ * Returns: (transfer full): a AtkObject* representing a summary description
+ * of the table, or zero if value does not implement this interface.
+ **/
+AtkObject *
+atk_table_get_summary (AtkTable *table)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), NULL);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_summary)
+    return (iface->get_summary) (table);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_get_selected_rows:
+ * @table: a GObject instance that implements AtkTableIface
+ * @selected: a #gint** that is to contain the selected row numbers
+ *
+ * Gets the selected rows of the table by initializing **selected with
+ * the selected row numbers. This array should be freed by the caller.
+ *
+ * Returns: a gint representing the number of selected rows,
+ * or zero if value does not implement this interface.
+ **/
+gint
+atk_table_get_selected_rows (AtkTable *table, gint **selected)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_selected_rows)
+    return (iface->get_selected_rows) (table, selected);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_get_selected_columns:
+ * @table: a GObject instance that implements AtkTableIface
+ * @selected: a #gint** that is to contain the selected columns numbers
+ *
+ * Gets the selected columns of the table by initializing **selected with
+ * the selected column numbers. This array should be freed by the caller.
+ *
+ * Returns: a gint representing the number of selected columns,
+ * or %0 if value does not implement this interface.
+ **/
+gint
+atk_table_get_selected_columns (AtkTable *table, gint **selected)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), 0);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->get_selected_columns)
+    return (iface->get_selected_columns) (table, selected);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_is_column_selected:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in @table
+ *
+ * Gets a boolean value indicating whether the specified @column
+ * is selected
+ *
+ * Returns: a gboolean representing if the column is selected, or 0
+ * if value does not implement this interface.
+ **/
+gboolean
+atk_table_is_column_selected (AtkTable *table,
+                              gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->is_column_selected)
+    return (iface->is_column_selected) (table, column);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_table_is_row_selected:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ *
+ * Gets a boolean value indicating whether the specified @row
+ * is selected
+ *
+ * Returns: a gboolean representing if the row is selected, or 0
+ * if value does not implement this interface.
+ **/
+gboolean
+atk_table_is_row_selected (AtkTable *table,
+                           gint row)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->is_row_selected)
+    return (iface->is_row_selected) (table, row);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_table_is_selected:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @column: a #gint representing a column in @table
+ *
+ * Gets a boolean value indicating whether the accessible object
+ * at the specified @row and @column is selected
+ *
+ * Returns: a gboolean representing if the cell is selected, or 0
+ * if value does not implement this interface.
+ **/
+gboolean
+atk_table_is_selected (AtkTable *table,
+                       gint row,
+                       gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->is_selected)
+    return (iface->is_selected) (table, row, column);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_table_add_row_selection:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ *
+ * Adds the specified @row to the selection.
+ *
+ * Returns: a gboolean representing if row was successfully added to selection,
+ * or 0 if value does not implement this interface.
+ **/
+gboolean
+atk_table_add_row_selection (AtkTable *table,
+                             gint row)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->add_row_selection)
+    return (iface->add_row_selection) (table, row);
+  else
+    return FALSE;
+}
+/**
+ * atk_table_remove_row_selection:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ *
+ * Removes the specified @row from the selection.
+ *
+ * Returns: a gboolean representing if the row was successfully removed from
+ * the selection, or 0 if value does not implement this interface.
+ **/
+gboolean
+atk_table_remove_row_selection (AtkTable *table,
+                                gint row)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->remove_row_selection)
+    return (iface->remove_row_selection) (table, row);
+  else
+    return FALSE;
+}
+/**
+ * atk_table_add_column_selection:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in @table
+ *
+ * Adds the specified @column to the selection.
+ *
+ * Returns: a gboolean representing if the column was successfully added to
+ * the selection, or 0 if value does not implement this interface.
+ **/
+gboolean
+atk_table_add_column_selection (AtkTable *table,
+                                gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->add_column_selection)
+    return (iface->add_column_selection) (table, column);
+  else
+    return FALSE;
+}
+/**
+ * atk_table_remove_column_selection:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in @table
+ *
+ * Adds the specified @column to the selection.
+ *
+ * Returns: a gboolean representing if the column was successfully removed from
+ * the selection, or 0 if value does not implement this interface.
+ **/
+gboolean
+atk_table_remove_column_selection (AtkTable *table,
+                                   gint column)
+{
+  AtkTableIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE (table), FALSE);
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->remove_column_selection)
+    return (iface->remove_column_selection) (table, column);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_table_set_caption:
+ * @table: a GObject instance that implements AtkTableIface
+ * @caption: a #AtkObject representing the caption to set for @table
+ *
+ * Sets the caption for the table.
+ **/
+void
+atk_table_set_caption (AtkTable *table,
+                       AtkObject *caption)
+{
+  AtkTableIface *iface;
+
+  g_return_if_fail (ATK_IS_TABLE (table));
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->set_caption)
+    (iface->set_caption) (table, caption);
+}
+
+/**
+ * atk_table_set_column_description:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in @table
+ * @description: a #gchar representing the description text
+ * to set for the specified @column of the @table
+ *
+ * Sets the description text for the specified @column of the @table.
+ **/
+void
+atk_table_set_column_description (AtkTable *table,
+                                  gint column,
+                                  const gchar *description)
+{
+  AtkTableIface *iface;
+
+  g_return_if_fail (ATK_IS_TABLE (table));
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->set_column_description)
+    (iface->set_column_description) (table, column, description);
+}
+
+/**
+ * atk_table_set_column_header:
+ * @table: a GObject instance that implements AtkTableIface
+ * @column: a #gint representing a column in @table
+ * @header: an #AtkTable
+ *
+ * Sets the specified column header to @header.
+ **/
+void
+atk_table_set_column_header (AtkTable *table,
+                             gint column,
+                             AtkObject *header)
+{
+  AtkTableIface *iface;
+
+  g_return_if_fail (ATK_IS_TABLE (table));
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->set_column_header)
+    (iface->set_column_header) (table, column, header);
+}
+
+/**
+ * atk_table_set_row_description:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @description: a #gchar representing the description text
+ * to set for the specified @row of @table
+ *
+ * Sets the description text for the specified @row of @table.
+ **/
+void
+atk_table_set_row_description (AtkTable *table,
+                               gint row,
+                               const gchar *description)
+{
+  AtkTableIface *iface;
+
+  g_return_if_fail (ATK_IS_TABLE (table));
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->set_row_description)
+    (iface->set_row_description) (table, row, description);
+}
+
+/**
+ * atk_table_set_row_header:
+ * @table: a GObject instance that implements AtkTableIface
+ * @row: a #gint representing a row in @table
+ * @header: an #AtkTable
+ *
+ * Sets the specified row header to @header.
+ **/
+void
+atk_table_set_row_header (AtkTable *table,
+                          gint row,
+                          AtkObject *header)
+{
+  AtkTableIface *iface;
+
+  g_return_if_fail (ATK_IS_TABLE (table));
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->set_row_header)
+    (iface->set_row_header) (table, row, header);
+}
+
+/**
+ * atk_table_set_summary:
+ * @table: a GObject instance that implements AtkTableIface
+ * @accessible: an #AtkObject representing the summary description
+ * to set for @table
+ *
+ * Sets the summary description of the table.
+ **/
+void
+atk_table_set_summary (AtkTable *table,
+                       AtkObject *accessible)
+{
+  AtkTableIface *iface;
+
+  g_return_if_fail (ATK_IS_TABLE (table));
+
+  iface = ATK_TABLE_GET_IFACE (table);
+
+  if (iface->set_summary)
+    (iface->set_summary) (table, accessible);
+}
diff --git a/atk/atktable.h b/atk/atktable.h
new file mode 100644 (file)
index 0000000..c6fafe7
--- /dev/null
@@ -0,0 +1,229 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_TABLE_H__
+#define __ATK_TABLE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_TABLE (atk_table_get_type ())
+#define ATK_IS_TABLE(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_TABLE)
+#define ATK_TABLE(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_TABLE, AtkTable)
+#define ATK_TABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_TABLE, AtkTableIface))
+
+#ifndef _TYPEDEF_ATK_TABLE_
+#define _TYPEDEF_ATK_TABLE_
+typedef struct _AtkTable AtkTable;
+#endif
+typedef struct _AtkTableIface AtkTableIface;
+
+struct _AtkTableIface
+{
+  GTypeInterface parent;
+
+  AtkObject *(*ref_at) (AtkTable *table,
+                        gint row,
+                        gint column);
+  gint (*get_index_at) (AtkTable *table,
+                        gint row,
+                        gint column);
+  gint (*get_column_at_index) (AtkTable *table,
+                               gint index_);
+  gint (*get_row_at_index) (AtkTable *table,
+                            gint index_);
+  gint (*get_n_columns) (AtkTable *table);
+  gint (*get_n_rows) (AtkTable *table);
+  gint (*get_column_extent_at) (AtkTable *table,
+                                gint row,
+                                gint column);
+  gint (*get_row_extent_at) (AtkTable *table,
+                             gint row,
+                             gint column);
+  AtkObject *(*get_caption) (AtkTable *table);
+  const gchar *(*get_column_description) (AtkTable *table,
+                                          gint column);
+  AtkObject *(*get_column_header) (AtkTable *table,
+                                   gint column);
+  const gchar *(*get_row_description) (AtkTable *table,
+                                       gint row);
+  AtkObject *(*get_row_header) (AtkTable *table,
+                                gint row);
+  AtkObject *(*get_summary) (AtkTable *table);
+  void (*set_caption) (AtkTable *table,
+                       AtkObject *caption);
+  void (*set_column_description) (AtkTable *table,
+                                  gint column,
+                                  const gchar *description);
+  void (*set_column_header) (AtkTable *table,
+                             gint column,
+                             AtkObject *header);
+  void (*set_row_description) (AtkTable *table,
+                               gint row,
+                               const gchar *description);
+  void (*set_row_header) (AtkTable *table,
+                          gint row,
+                          AtkObject *header);
+  void (*set_summary) (AtkTable *table,
+                       AtkObject *accessible);
+  gint (*get_selected_columns) (AtkTable *table,
+                                gint **selected);
+  gint (*get_selected_rows) (AtkTable *table,
+                             gint **selected);
+  gboolean (*is_column_selected) (AtkTable *table,
+                                  gint column);
+  gboolean (*is_row_selected) (AtkTable *table,
+                               gint row);
+  gboolean (*is_selected) (AtkTable *table,
+                           gint row,
+                           gint column);
+  gboolean (*add_row_selection) (AtkTable *table,
+                                 gint row);
+  gboolean (*remove_row_selection) (AtkTable *table,
+                                    gint row);
+  gboolean (*add_column_selection) (AtkTable *table,
+                                    gint column);
+  gboolean (*remove_column_selection) (AtkTable *table,
+                                       gint column);
+
+  /*
+   * signal handlers
+   */
+  void (*row_inserted) (AtkTable *table,
+                        gint row,
+                        gint num_inserted);
+  void (*column_inserted) (AtkTable *table,
+                           gint column,
+                           gint num_inserted);
+  void (*row_deleted) (AtkTable *table,
+                       gint row,
+                       gint num_deleted);
+  void (*column_deleted) (AtkTable *table,
+                          gint column,
+                          gint num_deleted);
+  void (*row_reordered) (AtkTable *table);
+  void (*column_reordered) (AtkTable *table);
+  void (*model_changed) (AtkTable *table);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_table_get_type (void);
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_table_ref_at (AtkTable *table,
+                             gint row,
+                             gint column);
+ATK_DEPRECATED_IN_2_12_FOR (atk_table_ref_at)
+gint atk_table_get_index_at (AtkTable *table,
+                             gint row,
+                             gint column);
+ATK_DEPRECATED_IN_2_12
+gint atk_table_get_column_at_index (AtkTable *table,
+                                    gint index_);
+ATK_DEPRECATED_IN_2_12
+gint atk_table_get_row_at_index (AtkTable *table,
+                                 gint index_);
+ATK_AVAILABLE_IN_ALL
+gint atk_table_get_n_columns (AtkTable *table);
+ATK_AVAILABLE_IN_ALL
+gint atk_table_get_n_rows (AtkTable *table);
+ATK_AVAILABLE_IN_ALL
+gint atk_table_get_column_extent_at (AtkTable *table,
+                                     gint row,
+                                     gint column);
+ATK_AVAILABLE_IN_ALL
+gint atk_table_get_row_extent_at (AtkTable *table,
+                                  gint row,
+                                  gint column);
+ATK_AVAILABLE_IN_ALL
+AtkObject *
+atk_table_get_caption (AtkTable *table);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_table_get_column_description (AtkTable *table,
+                                               gint column);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_table_get_column_header (AtkTable *table,
+                                        gint column);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_table_get_row_description (AtkTable *table,
+                                            gint row);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_table_get_row_header (AtkTable *table,
+                                     gint row);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_table_get_summary (AtkTable *table);
+ATK_AVAILABLE_IN_ALL
+void atk_table_set_caption (AtkTable *table,
+                            AtkObject *caption);
+ATK_AVAILABLE_IN_ALL
+void atk_table_set_column_description (AtkTable *table,
+                                       gint column,
+                                       const gchar *description);
+ATK_AVAILABLE_IN_ALL
+void atk_table_set_column_header (AtkTable *table,
+                                  gint column,
+                                  AtkObject *header);
+ATK_AVAILABLE_IN_ALL
+void atk_table_set_row_description (AtkTable *table,
+                                    gint row,
+                                    const gchar *description);
+ATK_AVAILABLE_IN_ALL
+void atk_table_set_row_header (AtkTable *table,
+                               gint row,
+                               AtkObject *header);
+ATK_AVAILABLE_IN_ALL
+void atk_table_set_summary (AtkTable *table,
+                            AtkObject *accessible);
+ATK_AVAILABLE_IN_ALL
+gint atk_table_get_selected_columns (AtkTable *table,
+                                     gint **selected);
+ATK_AVAILABLE_IN_ALL
+gint atk_table_get_selected_rows (AtkTable *table,
+                                  gint **selected);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_is_column_selected (AtkTable *table,
+                                       gint column);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_is_row_selected (AtkTable *table,
+                                    gint row);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_is_selected (AtkTable *table,
+                                gint row,
+                                gint column);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_add_row_selection (AtkTable *table,
+                                      gint row);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_remove_row_selection (AtkTable *table,
+                                         gint row);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_add_column_selection (AtkTable *table,
+                                         gint column);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_table_remove_column_selection (AtkTable *table,
+                                            gint column);
+
+G_END_DECLS
+
+#endif /* __ATK_TABLE_H__ */
diff --git a/atk/atktablecell.c b/atk/atktablecell.c
new file mode 100644 (file)
index 0000000..29b8f0f
--- /dev/null
@@ -0,0 +1,275 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2014 SUSE LLC.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atktablecell.h"
+
+/**
+ * AtkTableCell:
+ *
+ * The ATK interface implemented for a cell inside a two-dimentional #AtkTable
+ *
+ * Being #AtkTable a component which present elements ordered via rows
+ * and columns, an #AtkTableCell is the interface which each of those
+ * elements, so "cells" should implement.
+ *
+ * See [iface@AtkTable]
+ */
+
+typedef AtkTableCellIface AtkTableCellInterface;
+G_DEFINE_INTERFACE (AtkTableCell, atk_table_cell, ATK_TYPE_OBJECT)
+
+static gboolean atk_table_cell_real_get_row_column_span (AtkTableCell *cell,
+                                                         gint *row,
+                                                         gint *column,
+                                                         gint *row_span,
+                                                         gint *column_span);
+
+static void
+atk_table_cell_default_init (AtkTableCellInterface *iface)
+{
+  iface->get_row_column_span = atk_table_cell_real_get_row_column_span;
+}
+
+/**
+ * atk_table_cell_get_column_span:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ *
+ * Returns the number of columns occupied by this cell accessible.
+ *
+ * Returns: a gint representing the number of columns occupied by this cell,
+ * or 0 if the cell does not implement this method.
+ *
+ * Since: 2.12
+ */
+gint
+atk_table_cell_get_column_span (AtkTableCell *cell)
+{
+  AtkTableCellIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), 0);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_column_span)
+    return (iface->get_column_span) (cell);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_cell_get_column_header_cells:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ *
+ * Returns the column headers as an array of cell accessibles.
+ *
+ * Returns: (element-type AtkObject) (transfer full): a GPtrArray of AtkObjects
+ * representing the column header cells.
+ *
+ * Since: 2.12
+ */
+GPtrArray *
+atk_table_cell_get_column_header_cells (AtkTableCell *cell)
+{
+  AtkTableCellIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), NULL);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_column_header_cells)
+    return (iface->get_column_header_cells) (cell);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_cell_get_position:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ * @row: (out): the row of the given cell.
+ * @column: (out): the column of the given cell.
+ *
+ * Retrieves the tabular position of this cell.
+ *
+ * Returns: TRUE if successful; FALSE otherwise.
+ *
+ * Since: 2.12
+ */
+gboolean
+atk_table_cell_get_position (AtkTableCell *cell,
+                             gint *row,
+                             gint *column)
+{
+  AtkTableCellIface *iface;
+  gint tmp_row, tmp_column;
+  gint *real_row = (row ? row : &tmp_row);
+  gint *real_column = (column ? column : &tmp_column);
+
+  *real_row = -1;
+  *real_column = -1;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), FALSE);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_position)
+    return (iface->get_position) (cell, real_row, real_column);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_table_cell_get_row_span:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ *
+ * Returns the number of rows occupied by this cell accessible.
+ *
+ * Returns: a gint representing the number of rows occupied by this cell,
+ * or 0 if the cell does not implement this method.
+ *
+ * Since: 2.12
+ */
+gint
+atk_table_cell_get_row_span (AtkTableCell *cell)
+{
+  AtkTableCellIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), 0);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_row_span)
+    return (iface->get_row_span) (cell);
+  else
+    return 0;
+}
+
+/**
+ * atk_table_cell_get_row_header_cells:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ *
+ * Returns the row headers as an array of cell accessibles.
+ *
+ * Returns: (element-type AtkObject) (transfer full): a GPtrArray of AtkObjects
+ * representing the row header cells.
+ *
+ * Since: 2.12
+ */
+GPtrArray *
+atk_table_cell_get_row_header_cells (AtkTableCell *cell)
+{
+  AtkTableCellIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), NULL);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_row_header_cells)
+    return (iface->get_row_header_cells) (cell);
+  else
+    return NULL;
+}
+
+/**
+ * atk_table_cell_get_row_column_span:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ * @row: (out): the row index of the given cell.
+ * @column: (out): the column index of the given cell.
+ * @row_span: (out): the number of rows occupied by this cell.
+ * @column_span: (out): the number of columns occupied by this cell.
+ *
+ * Gets the row and column indexes and span of this cell accessible.
+ *
+ * Note: If the object does not implement this function, then, by default, atk
+ * will implement this function by calling get_row_span and get_column_span
+ * on the object.
+ *
+ * Returns: TRUE if successful; FALSE otherwise.
+ *
+ * Since: 2.12
+ */
+gboolean
+atk_table_cell_get_row_column_span (AtkTableCell *cell,
+                                    gint *row,
+                                    gint *column,
+                                    gint *row_span,
+                                    gint *column_span)
+{
+  AtkTableCellIface *iface;
+  gint local_row = 0, local_column = 0;
+  gint local_row_span = 0, local_column_span = 0;
+  gint *real_row, *real_column;
+  gint *real_row_span, *real_column_span;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), FALSE);
+
+  real_row = (row ? row : &local_row);
+  real_column = (column ? column : &local_column);
+  real_row_span = (row_span ? row_span : &local_row_span);
+  real_column_span = (column_span ? column_span : &local_column_span);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_row_column_span)
+    return (iface->get_row_column_span) (cell, real_row, real_column,
+                                         real_row_span,
+                                         real_column_span);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_table_cell_get_table:
+ * @cell: a GObject instance that implements AtkTableCellIface
+ *
+ * Returns a reference to the accessible of the containing table.
+ *
+ * Returns: (transfer full): the atk object for the containing table.
+ *
+ * Since: 2.12
+ */
+AtkObject *
+atk_table_cell_get_table (AtkTableCell *cell)
+{
+  AtkTableCellIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TABLE_CELL (cell), FALSE);
+
+  iface = ATK_TABLE_CELL_GET_IFACE (cell);
+
+  if (iface->get_table)
+    return (iface->get_table) (cell);
+  else
+    return NULL;
+}
+
+static gboolean
+atk_table_cell_real_get_row_column_span (AtkTableCell *cell,
+                                         gint *row,
+                                         gint *column,
+                                         gint *row_span,
+                                         gint *column_span)
+{
+  atk_table_cell_get_position (cell, row, column);
+  *row_span = atk_table_cell_get_row_span (cell);
+  *column_span = atk_table_cell_get_column_span (cell);
+
+  return (*row != 0 && *column != 0 && *row_span > 0 && *column_span > 0);
+}
diff --git a/atk/atktablecell.h b/atk/atktablecell.h
new file mode 100644 (file)
index 0000000..2aeaf06
--- /dev/null
@@ -0,0 +1,110 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2014 SUSE LLC.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_TABLE_CELL_H__
+#define __ATK_TABLE_CELL_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_TABLE_CELL (atk_table_cell_get_type ())
+#define ATK_IS_TABLE_CELL(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_TABLE_CELL)
+#define ATK_TABLE_CELL(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_TABLE_CELL, AtkTableCell)
+#define ATK_TABLE_CELL_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_TABLE_CELL, AtkTableCellIface))
+
+#ifndef _TYPEDEF_ATK_TABLE_CELL_
+#define _TYPEDEF_ATK_TABLE_CELL_
+typedef struct _AtkTableCell AtkTableCell;
+#endif
+typedef struct _AtkTableCellIface AtkTableCellIface;
+
+/**
+ * AtkTableCellIface:
+ * @get_column_span: virtual function that returns the number of
+ *   columns occupied by this cell accessible
+ * @get_column_header_cells: virtual function that returns the column
+ *   headers as an array of cell accessibles
+ * @get_position: virtual function that retrieves the tabular position
+ *   of this cell
+ * @get_row_span: virtual function that returns the number of rows
+ *   occupied by this cell
+ * @get_row_header_cells: virtual function that returns the row
+ *   headers as an array of cell accessibles
+ * @get_row_column_span: virtual function that get the row an column
+ *   indexes and span of this cell
+ * @get_table: virtual function that returns a reference to the
+ *   accessible of the containing table
+ *
+ * AtkTableCell is an interface for cells inside an #AtkTable.
+ *
+ * Since: 2.12
+ */
+struct _AtkTableCellIface
+{
+  /*< private >*/
+  GTypeInterface parent;
+
+  /*< public >*/
+  gint (*get_column_span) (AtkTableCell *cell);
+  GPtrArray *(*get_column_header_cells) (AtkTableCell *cell);
+  gboolean (*get_position) (AtkTableCell *cell,
+                            gint *row,
+                            gint *column);
+  gint (*get_row_span) (AtkTableCell *cell);
+  GPtrArray *(*get_row_header_cells) (AtkTableCell *cell);
+  gboolean (*get_row_column_span) (AtkTableCell *cell,
+                                   gint *row,
+                                   gint *column,
+                                   gint *row_span,
+                                   gint *column_span);
+  AtkObject *(*get_table) (AtkTableCell *cell);
+};
+
+ATK_AVAILABLE_IN_2_12
+GType atk_table_cell_get_type (void);
+
+ATK_AVAILABLE_IN_2_12
+gint atk_table_cell_get_column_span (AtkTableCell *cell);
+ATK_AVAILABLE_IN_2_12
+GPtrArray *atk_table_cell_get_column_header_cells (AtkTableCell *cell);
+ATK_AVAILABLE_IN_2_12
+gboolean atk_table_cell_get_position (AtkTableCell *cell,
+                                      gint *row,
+                                      gint *column);
+ATK_AVAILABLE_IN_2_12
+gint atk_table_cell_get_row_span (AtkTableCell *cell);
+ATK_AVAILABLE_IN_2_12
+GPtrArray *atk_table_cell_get_row_header_cells (AtkTableCell *cell);
+ATK_AVAILABLE_IN_2_12
+gboolean atk_table_cell_get_row_column_span (AtkTableCell *cell,
+                                             gint *row,
+                                             gint *column,
+                                             gint *row_span,
+                                             gint *column_span);
+ATK_AVAILABLE_IN_2_12
+AtkObject *atk_table_cell_get_table (AtkTableCell *cell);
+
+G_END_DECLS
+
+#endif /* __ATK_TABLE_CELL_H__ */
diff --git a/atk/atktext.c b/atk/atktext.c
new file mode 100644 (file)
index 0000000..072b238
--- /dev/null
@@ -0,0 +1,1640 @@
+/* ATK - The Accessibility Toolkit for GTK+
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+#include "atkmarshal.h"
+
+#include <string.h>
+
+/**
+ * AtkText:
+ *
+ * The ATK interface implemented by components with text content.
+ *
+ * #AtkText should be implemented by #AtkObjects on behalf of widgets
+ * that have text content which is either attributed or otherwise
+ * non-trivial.  #AtkObjects whose text content is simple,
+ * unattributed, and very brief may expose that content via
+ * #atk_object_get_name instead; however if the text is editable,
+ * multi-line, typically longer than three or four words, attributed,
+ * selectable, or if the object already uses the 'name' ATK property
+ * for other information, the #AtkText interface should be used to
+ * expose the text content.  In the case of editable text content,
+ * #AtkEditableText (a subtype of the #AtkText interface) should be
+ * implemented instead.
+ *
+ *  #AtkText provides not only traversal facilities and change
+ * notification for text content, but also caret tracking and glyph
+ * bounding box calculations.  Note that the text strings are exposed
+ * as UTF-8, and are therefore potentially multi-byte, and
+ * caret-to-byte offset mapping makes no assumptions about the
+ * character length; also bounding box glyph-to-offset mapping may be
+ * complex for languages which use ligatures.
+ */
+
+static GPtrArray *extra_attributes = NULL;
+
+enum
+{
+  TEXT_CHANGED,
+  TEXT_CARET_MOVED,
+  TEXT_SELECTION_CHANGED,
+  TEXT_ATTRIBUTES_CHANGED,
+  TEXT_INSERT,
+  TEXT_REMOVE,
+  LAST_SIGNAL
+};
+
+static const char boolean[] =
+    "false\0"
+    "true";
+static const guint8 boolean_offsets[] = {
+  0, 6
+};
+
+static const char style[] =
+    "normal\0"
+    "oblique\0"
+    "italic";
+static const guint8 style_offsets[] = {
+  0, 7, 15
+};
+
+static const char variant[] =
+    "normal\0"
+    "small_caps";
+static const guint8 variant_offsets[] = {
+  0, 7
+};
+
+static const char stretch[] =
+    "ultra_condensed\0"
+    "extra_condensed\0"
+    "condensed\0"
+    "semi_condensed\0"
+    "normal\0"
+    "semi_expanded\0"
+    "expanded\0"
+    "extra_expanded\0"
+    "ultra_expanded";
+static const guint8 stretch_offsets[] = {
+  0, 16, 32, 42, 57, 64, 78, 87, 102
+};
+
+static const char justification[] =
+    "left\0"
+    "right\0"
+    "center\0"
+    "fill";
+static const guint8 justification_offsets[] = {
+  0, 5, 11, 18
+};
+
+static const char direction[] =
+    "none\0"
+    "ltr\0"
+    "rtl";
+static const guint8 direction_offsets[] = {
+  0, 5, 9
+};
+
+static const char wrap_mode[] =
+    "none\0"
+    "char\0"
+    "word\0"
+    "word_char";
+static const guint8 wrap_mode_offsets[] = {
+  0, 5, 10, 15
+};
+
+static const char underline[] =
+    "none\0"
+    "single\0"
+    "double\0"
+    "low\0"
+    "error";
+static const guint8 underline_offsets[] = {
+  0, 5, 12, 19, 23
+};
+
+static const char text_position[] =
+    "baseline\0"
+    "super\0"
+    "sub\0";
+static const guint8 text_position_offsets[] = {
+  0,
+  9,
+  15,
+};
+
+static void atk_text_base_init (AtkTextIface *class);
+
+static void atk_text_real_get_range_extents (AtkText *text,
+                                             gint start_offset,
+                                             gint end_offset,
+                                             AtkCoordType coord_type,
+                                             AtkTextRectangle *rect);
+
+static AtkTextRange **atk_text_real_get_bounded_ranges (AtkText *text,
+                                                        AtkTextRectangle *rect,
+                                                        AtkCoordType coord_type,
+                                                        AtkTextClipType x_clip_type,
+                                                        AtkTextClipType y_clip_type);
+
+static guint atk_text_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_text_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo tinfo = {
+        sizeof (AtkTextIface),
+        (GBaseInitFunc) atk_text_base_init,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) NULL /* atk_text_interface_init */,
+        (GClassFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkText", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_text_base_init (AtkTextIface *class)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
+    {
+      /*
+       * Note that text_changed signal supports details "insert", "delete",
+       * possibly "replace".
+       */
+
+      class->get_range_extents = atk_text_real_get_range_extents;
+      class->get_bounded_ranges = atk_text_real_get_bounded_ranges;
+
+      /**
+       * AtkText::text-changed:
+       * @atktext: the object which received the signal.
+       * @arg1: The position (character offset) of the insertion or deletion.
+       * @arg2: The length (in characters) of text inserted or deleted.
+       *
+       * The "text-changed" signal is emitted when the text of the
+       * object which implements the AtkText interface changes, This
+       * signal will have a detail which is either "insert" or
+       * "delete" which identifies whether the text change was an
+       * insertion or a deletion.
+       *
+       * Deprecated: 2.9.4: Use #AtkObject::text-insert or
+       * #AtkObject::text-remove instead.
+       */
+      atk_text_signals[TEXT_CHANGED] =
+          g_signal_new ("text_changed",
+                        ATK_TYPE_TEXT,
+                        G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                        G_STRUCT_OFFSET (AtkTextIface, text_changed),
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT,
+                        G_TYPE_NONE,
+                        2, G_TYPE_INT, G_TYPE_INT);
+
+      /**
+       * AtkText::text-insert:
+       * @atktext: the object which received the signal.
+       * @arg1: The position (character offset) of the insertion.
+       * @arg2: The length (in characters) of text inserted.
+       * @arg3: The new text inserted
+       *
+       * The "text-insert" signal is emitted when a new text is
+       * inserted. If the signal was not triggered by the user
+       * (e.g. typing or pasting text), the "system" detail should be
+       * included.
+       */
+      atk_text_signals[TEXT_INSERT] =
+          g_signal_new ("text_insert",
+                        ATK_TYPE_TEXT,
+                        G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT_STRING,
+                        G_TYPE_NONE,
+                        3, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
+
+      /**
+       * AtkText::text-remove:
+       * @atktext: the object which received the signal.
+       * @arg1: The position (character offset) of the removal.
+       * @arg2: The length (in characters) of text removed.
+       * @arg3: The old text removed
+       *
+       * The "text-remove" signal is emitted when a new text is
+       * removed. If the signal was not triggered by the user
+       * (e.g. typing or pasting text), the "system" detail should be
+       * included.
+       */
+      atk_text_signals[TEXT_REMOVE] =
+          g_signal_new ("text_remove",
+                        ATK_TYPE_TEXT,
+                        G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__INT_INT_STRING,
+                        G_TYPE_NONE,
+                        3, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING);
+
+      /**
+       * AtkText::text-caret-moved:
+       * @atktext: the object which received the signal.
+       * @arg1: The new position of the text caret.
+       *
+       * The "text-caret-moved" signal is emitted when the caret
+       * position of the text of an object which implements AtkText
+       * changes.
+       */
+      atk_text_signals[TEXT_CARET_MOVED] =
+          g_signal_new ("text_caret_moved",
+                        ATK_TYPE_TEXT,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTextIface, text_caret_moved),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__INT,
+                        G_TYPE_NONE,
+                        1, G_TYPE_INT);
+
+      /**
+       * AtkText::text-selection-changed:
+       * @atktext: the object which received the signal.
+       *
+       * The "text-selection-changed" signal is emitted when the
+       * selected text of an object which implements AtkText changes.
+       */
+      atk_text_signals[TEXT_SELECTION_CHANGED] =
+          g_signal_new ("text_selection_changed",
+                        ATK_TYPE_TEXT,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTextIface, text_selection_changed),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+      /**
+       * AtkText::text-attributes-changed:
+       * @atktext: the object which received the signal.
+       *
+       * The "text-attributes-changed" signal is emitted when the text
+       * attributes of the text of an object which implements AtkText
+       * changes.
+       */
+      atk_text_signals[TEXT_ATTRIBUTES_CHANGED] =
+          g_signal_new ("text_attributes_changed",
+                        ATK_TYPE_TEXT,
+                        G_SIGNAL_RUN_LAST,
+                        G_STRUCT_OFFSET (AtkTextIface, text_attributes_changed),
+                        (GSignalAccumulator) NULL, NULL,
+                        g_cclosure_marshal_VOID__VOID,
+                        G_TYPE_NONE, 0);
+
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_text_get_text:
+ * @text: an #AtkText
+ * @start_offset: a starting character offset within @text
+ * @end_offset: an ending character offset within @text, or -1 for the end of the string.
+ *
+ * Gets the specified text.
+ *
+ * Returns: a newly allocated string containing the text from @start_offset up
+ *          to, but not including @end_offset. Use g_free() to free the returned
+ *          string.
+ **/
+gchar *
+atk_text_get_text (AtkText *text,
+                   gint start_offset,
+                   gint end_offset)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (start_offset < 0 || end_offset < -1 ||
+      (end_offset != -1 && end_offset < start_offset))
+    return NULL;
+
+  if (iface->get_text)
+    return (*(iface->get_text)) (text, start_offset, end_offset);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_character_at_offset:
+ * @text: an #AtkText
+ * @offset: a character offset within @text
+ *
+ * Gets the specified text.
+ *
+ * Returns: the character at @offset or 0 in the case of failure.
+ **/
+gunichar
+atk_text_get_character_at_offset (AtkText *text,
+                                  gint offset)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), (gunichar) 0);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_character_at_offset)
+    return (*(iface->get_character_at_offset)) (text, offset);
+  else
+    return (gunichar) 0;
+}
+
+/**
+ * atk_text_get_text_after_offset:
+ * @text: an #AtkText
+ * @offset: position
+ * @boundary_type: An #AtkTextBoundary
+ * @start_offset: (out): the starting character offset of the returned string
+ * @end_offset: (out): the offset of the first character after the
+ *              returned substring
+ *
+ * Gets the specified text.
+ *
+ * Deprecated: 2.9.3: Please use atk_text_get_string_at_offset() instead.
+ *
+ * Returns: a newly allocated string containing the text after @offset bounded
+ *          by the specified @boundary_type. Use g_free() to free the returned
+ *          string.
+ **/
+gchar *
+atk_text_get_text_after_offset (AtkText *text,
+                                gint offset,
+                                AtkTextBoundary boundary_type,
+                                gint *start_offset,
+                                gint *end_offset)
+{
+  AtkTextIface *iface;
+  gint local_start_offset, local_end_offset;
+  gint *real_start_offset, *real_end_offset;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  if (start_offset)
+    real_start_offset = start_offset;
+  else
+    real_start_offset = &local_start_offset;
+  if (end_offset)
+    real_end_offset = end_offset;
+  else
+    real_end_offset = &local_end_offset;
+
+  if (offset < 0)
+    return NULL;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_text_after_offset)
+    return (*(iface->get_text_after_offset)) (text, offset, boundary_type, real_start_offset, real_end_offset);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_text_at_offset:
+ * @text: an #AtkText
+ * @offset: position
+ * @boundary_type: An #AtkTextBoundary
+ * @start_offset: (out): the starting character offset of the returned string
+ * @end_offset: (out): the offset of the first character after the
+ *              returned substring
+ *
+ * Gets the specified text.
+ *
+ * If the boundary_type if ATK_TEXT_BOUNDARY_CHAR the character at the
+ * offset is returned.
+ *
+ * If the boundary_type is ATK_TEXT_BOUNDARY_WORD_START the returned string
+ * is from the word start at or before the offset to the word start after
+ * the offset.
+ *
+ * The returned string will contain the word at the offset if the offset
+ * is inside a word and will contain the word before the offset if the
+ * offset is not inside a word.
+ *
+ * If the boundary type is ATK_TEXT_BOUNDARY_SENTENCE_START the returned
+ * string is from the sentence start at or before the offset to the sentence
+ * start after the offset.
+ *
+ * The returned string will contain the sentence at the offset if the offset
+ * is inside a sentence and will contain the sentence before the offset
+ * if the offset is not inside a sentence.
+ *
+ * If the boundary type is ATK_TEXT_BOUNDARY_LINE_START the returned
+ * string is from the line start at or before the offset to the line
+ * start after the offset.
+ *
+ * Deprecated: This method is deprecated since ATK version
+ * 2.9.4. Please use atk_text_get_string_at_offset() instead.
+ *
+ * Returns: a newly allocated string containing the text at @offset bounded
+ *          by the specified @boundary_type. Use g_free() to free the returned
+ *          string.
+ **/
+gchar *
+atk_text_get_text_at_offset (AtkText *text,
+                             gint offset,
+                             AtkTextBoundary boundary_type,
+                             gint *start_offset,
+                             gint *end_offset)
+{
+  AtkTextIface *iface;
+  gint local_start_offset, local_end_offset;
+  gint *real_start_offset, *real_end_offset;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  if (start_offset)
+    real_start_offset = start_offset;
+  else
+    real_start_offset = &local_start_offset;
+  if (end_offset)
+    real_end_offset = end_offset;
+  else
+    real_end_offset = &local_end_offset;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_text_at_offset)
+    return (*(iface->get_text_at_offset)) (text, offset, boundary_type, real_start_offset, real_end_offset);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_text_before_offset:
+ * @text: an #AtkText
+ * @offset: position
+ * @boundary_type: An #AtkTextBoundary
+ * @start_offset: (out): the starting character offset of the returned string
+ * @end_offset: (out): the offset of the first character after the
+ *              returned substring
+ *
+ * Gets the specified text.
+ *
+ * Deprecated: 2.9.3: Please use atk_text_get_string_at_offset() instead.
+ *
+ * Returns: a newly allocated string containing the text before @offset bounded
+ *          by the specified @boundary_type. Use g_free() to free the returned
+ *          string.
+ **/
+gchar *
+atk_text_get_text_before_offset (AtkText *text,
+                                 gint offset,
+                                 AtkTextBoundary boundary_type,
+                                 gint *start_offset,
+                                 gint *end_offset)
+{
+  AtkTextIface *iface;
+  gint local_start_offset, local_end_offset;
+  gint *real_start_offset, *real_end_offset;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  if (start_offset)
+    real_start_offset = start_offset;
+  else
+    real_start_offset = &local_start_offset;
+  if (end_offset)
+    real_end_offset = end_offset;
+  else
+    real_end_offset = &local_end_offset;
+
+  if (offset < 0)
+    return NULL;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_text_before_offset)
+    return (*(iface->get_text_before_offset)) (text, offset, boundary_type, real_start_offset, real_end_offset);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_string_at_offset:
+ * @text: an #AtkText
+ * @offset: position
+ * @granularity: An #AtkTextGranularity
+ * @start_offset: (out): the starting character offset of the returned string, or -1
+ *                in the case of error (e.g. invalid offset, not implemented)
+ * @end_offset: (out): the offset of the first character after the returned string,
+ *              or -1 in the case of error (e.g. invalid offset, not implemented)
+ *
+ * Gets a portion of the text exposed through an #AtkText according to a given @offset
+ * and a specific @granularity, along with the start and end offsets defining the
+ * boundaries of such a portion of text.
+ *
+ * If @granularity is ATK_TEXT_GRANULARITY_CHAR the character at the
+ * offset is returned.
+ *
+ * If @granularity is ATK_TEXT_GRANULARITY_WORD the returned string
+ * is from the word start at or before the offset to the word start after
+ * the offset.
+ *
+ * The returned string will contain the word at the offset if the offset
+ * is inside a word and will contain the word before the offset if the
+ * offset is not inside a word.
+ *
+ * If @granularity is ATK_TEXT_GRANULARITY_SENTENCE the returned string
+ * is from the sentence start at or before the offset to the sentence
+ * start after the offset.
+ *
+ * The returned string will contain the sentence at the offset if the offset
+ * is inside a sentence and will contain the sentence before the offset
+ * if the offset is not inside a sentence.
+ *
+ * If @granularity is ATK_TEXT_GRANULARITY_LINE the returned string
+ * is from the line start at or before the offset to the line
+ * start after the offset.
+ *
+ * If @granularity is ATK_TEXT_GRANULARITY_PARAGRAPH the returned string
+ * is from the start of the paragraph at or before the offset to the start
+ * of the following paragraph after the offset.
+ *
+ * Since: 2.10
+ *
+ * Returns: (nullable): a newly allocated string containing the text at
+ *          the @offset bounded by the specified @granularity. Use g_free()
+ *          to free the returned string.  Returns %NULL if the offset is invalid
+ *          or no implementation is available.
+ **/
+gchar *
+atk_text_get_string_at_offset (AtkText *text,
+                               gint offset,
+                               AtkTextGranularity granularity,
+                               gint *start_offset,
+                               gint *end_offset)
+{
+  AtkTextIface *iface;
+  gint local_start_offset, local_end_offset;
+  gint *real_start_offset, *real_end_offset;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  if (start_offset)
+    {
+      *start_offset = -1;
+      real_start_offset = start_offset;
+    }
+  else
+    real_start_offset = &local_start_offset;
+
+  if (end_offset)
+    {
+      *end_offset = -1;
+      real_end_offset = end_offset;
+    }
+  else
+    real_end_offset = &local_end_offset;
+
+  if (offset < 0)
+    return NULL;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_string_at_offset)
+    return (*(iface->get_string_at_offset)) (text, offset, granularity, real_start_offset, real_end_offset);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_caret_offset:
+ * @text: an #AtkText
+ *
+ * Gets the offset of the position of the caret (cursor).
+ *
+ * Returns: the character offset of the position of the caret or -1 if
+ *          the caret is not located inside the element or in the case of
+ *          any other failure.
+ **/
+gint
+atk_text_get_caret_offset (AtkText *text)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), 0);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_caret_offset)
+    return (*(iface->get_caret_offset)) (text);
+  else
+    return -1;
+}
+
+/**
+ * atk_text_get_character_extents:
+ * @text: an #AtkText
+ * @offset: The offset of the text character for which bounding information is required.
+ * @x: (out) (optional): Pointer for the x coordinate of the bounding box
+ * @y: (out) (optional): Pointer for the y coordinate of the bounding box
+ * @width: (out) (optional): Pointer for the width of the bounding box
+ * @height: (out) (optional): Pointer for the height of the bounding box
+ * @coords: specify whether coordinates are relative to the screen or widget window
+ *
+ * If the extent can not be obtained (e.g. missing support), all of x, y, width,
+ * height are set to -1.
+ *
+ * Get the bounding box containing the glyph representing the character at
+ *     a particular text offset.
+ **/
+void
+atk_text_get_character_extents (AtkText *text,
+                                gint offset,
+                                gint *x,
+                                gint *y,
+                                gint *width,
+                                gint *height,
+                                AtkCoordType coords)
+{
+  AtkTextIface *iface;
+  gint local_x, local_y, local_width, local_height;
+  gint *real_x, *real_y, *real_width, *real_height;
+
+  g_return_if_fail (ATK_IS_TEXT (text));
+
+  if (x)
+    real_x = x;
+  else
+    real_x = &local_x;
+  if (y)
+    real_y = y;
+  else
+    real_y = &local_y;
+  if (width)
+    real_width = width;
+  else
+    real_width = &local_width;
+  if (height)
+    real_height = height;
+  else
+    real_height = &local_height;
+
+  *real_x = -1;
+  *real_y = -1;
+  *real_width = -1;
+  *real_height = -1;
+
+  if (offset < 0)
+    return;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_character_extents)
+    (*(iface->get_character_extents)) (text, offset, real_x, real_y, real_width, real_height, coords);
+
+  if (*real_width < 0)
+    {
+      *real_x = *real_x + *real_width;
+      *real_width *= -1;
+    }
+}
+
+/**
+ * atk_text_get_run_attributes:
+ *@text: an #AtkText
+ *@offset: the character offset at which to get the attributes, -1 means the offset of
+ *the character to be inserted at the caret location.
+ *@start_offset: (out): the address to put the start offset of the range
+ *@end_offset: (out): the address to put the end offset of the range
+ *
+ *Creates an #AtkAttributeSet which consists of the attributes explicitly
+ *set at the position @offset in the text. @start_offset and @end_offset are
+ *set to the start and end of the range around @offset where the attributes are
+ *invariant. Note that @end_offset is the offset of the first character
+ *after the range.  See the enum AtkTextAttribute for types of text
+ *attributes that can be returned. Note that other attributes may also be
+ *returned.
+ *
+ *Returns: (transfer full): an #AtkAttributeSet which contains the attributes
+ *         explicitly set at @offset. This #AtkAttributeSet should be freed by
+ *         a call to atk_attribute_set_free().
+ **/
+AtkAttributeSet *
+atk_text_get_run_attributes (AtkText *text,
+                             gint offset,
+                             gint *start_offset,
+                             gint *end_offset)
+{
+  AtkTextIface *iface;
+  gint local_start_offset, local_end_offset;
+  gint *real_start_offset, *real_end_offset;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  if (start_offset)
+    real_start_offset = start_offset;
+  else
+    real_start_offset = &local_start_offset;
+  if (end_offset)
+    real_end_offset = end_offset;
+  else
+    real_end_offset = &local_end_offset;
+
+  if (offset < -1)
+    return NULL;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_run_attributes)
+    return (*(iface->get_run_attributes)) (text, offset, real_start_offset, real_end_offset);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_default_attributes:
+ *@text: an #AtkText
+ *
+ *Creates an #AtkAttributeSet which consists of the default values of
+ *attributes for the text. See the enum AtkTextAttribute for types of text
+ *attributes that can be returned. Note that other attributes may also be
+ *returned.
+ *
+ *Returns: (transfer full): an #AtkAttributeSet which contains the default text
+ *          attributes for this #AtkText. This #AtkAttributeSet should be freed by
+ *          a call to atk_attribute_set_free().
+ */
+AtkAttributeSet *
+atk_text_get_default_attributes (AtkText *text)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_default_attributes)
+    return (*(iface->get_default_attributes)) (text);
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_get_character_count:
+ * @text: an #AtkText
+ *
+ * Gets the character count.
+ *
+ * Returns: the number of characters or -1 in case of failure.
+ **/
+gint
+atk_text_get_character_count (AtkText *text)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), -1);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_character_count)
+    return (*(iface->get_character_count)) (text);
+  else
+    return -1;
+}
+
+/**
+ * atk_text_get_offset_at_point:
+ * @text: an #AtkText
+ * @x: screen x-position of character
+ * @y: screen y-position of character
+ * @coords: specify whether coordinates are relative to the screen or
+ * widget window
+ *
+ * Gets the offset of the character located at coordinates @x and @y. @x and @y
+ * are interpreted as being relative to the screen or this widget's window
+ * depending on @coords.
+ *
+ * Returns: the offset to the character which is located at  the specified
+ *          @x and @y coordinates of -1 in case of failure.
+ **/
+gint
+atk_text_get_offset_at_point (AtkText *text,
+                              gint x,
+                              gint y,
+                              AtkCoordType coords)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), -1);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_offset_at_point)
+    return (*(iface->get_offset_at_point)) (text, x, y, coords);
+  else
+    return -1;
+}
+
+/**
+ * atk_text_get_n_selections:
+ * @text: an #AtkText
+ *
+ * Gets the number of selected regions.
+ *
+ * Returns: The number of selected regions, or -1 in the case of failure.
+ **/
+gint
+atk_text_get_n_selections (AtkText *text)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), -1);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_n_selections)
+    return (*(iface->get_n_selections)) (text);
+  else
+    return -1;
+}
+
+/**
+ * atk_text_get_selection:
+ * @text: an #AtkText
+ * @selection_num: The selection number.  The selected regions are
+ * assigned numbers that correspond to how far the region is from the
+ * start of the text.  The selected region closest to the beginning
+ * of the text region is assigned the number 0, etc.  Note that adding,
+ * moving or deleting a selected region can change the numbering.
+ * @start_offset: (out): passes back the starting character offset of the selected region
+ * @end_offset: (out): passes back the ending character offset (offset immediately past)
+ * of the selected region
+ *
+ * Gets the text from the specified selection.
+ *
+ * Returns: a newly allocated string containing the selected text. Use g_free()
+ *          to free the returned string.
+ **/
+gchar *
+atk_text_get_selection (AtkText *text,
+                        gint selection_num,
+                        gint *start_offset,
+                        gint *end_offset)
+{
+  AtkTextIface *iface;
+  gint local_start_offset, local_end_offset;
+  gint *real_start_offset, *real_end_offset;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+
+  if (start_offset)
+    real_start_offset = start_offset;
+  else
+    real_start_offset = &local_start_offset;
+  if (end_offset)
+    real_end_offset = end_offset;
+  else
+    real_end_offset = &local_end_offset;
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_selection)
+    {
+      return (*(iface->get_selection)) (text, selection_num,
+                                        real_start_offset, real_end_offset);
+    }
+  else
+    return NULL;
+}
+
+/**
+ * atk_text_add_selection:
+ * @text: an #AtkText
+ * @start_offset: the starting character offset of the selected region
+ * @end_offset: the offset of the first character after the selected region.
+ *
+ * Adds a selection bounded by the specified offsets.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise
+ **/
+gboolean
+atk_text_add_selection (AtkText *text,
+                        gint start_offset,
+                        gint end_offset)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->add_selection)
+    return (*(iface->add_selection)) (text, start_offset, end_offset);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_text_remove_selection:
+ * @text: an #AtkText
+ * @selection_num: The selection number.  The selected regions are
+ * assigned numbers that correspond to how far the region is from the
+ * start of the text.  The selected region closest to the beginning
+ * of the text region is assigned the number 0, etc.  Note that adding,
+ * moving or deleting a selected region can change the numbering.
+ *
+ * Removes the specified selection.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise
+ **/
+gboolean
+atk_text_remove_selection (AtkText *text,
+                           gint selection_num)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->remove_selection)
+    return (*(iface->remove_selection)) (text, selection_num);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_text_set_selection:
+ * @text: an #AtkText
+ * @selection_num: The selection number.  The selected regions are
+ * assigned numbers that correspond to how far the region is from the
+ * start of the text.  The selected region closest to the beginning
+ * of the text region is assigned the number 0, etc.  Note that adding,
+ * moving or deleting a selected region can change the numbering.
+ * @start_offset: the new starting character offset of the selection
+ * @end_offset: the new end position of (e.g. offset immediately past)
+ * the selection
+ *
+ * Changes the start and end offset of the specified selection.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise
+ **/
+gboolean
+atk_text_set_selection (AtkText *text,
+                        gint selection_num,
+                        gint start_offset,
+                        gint end_offset)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->set_selection)
+    {
+      return (*(iface->set_selection)) (text, selection_num,
+                                        start_offset, end_offset);
+    }
+  else
+    return FALSE;
+}
+
+/**
+ * atk_text_set_caret_offset:
+ * @text: an #AtkText
+ * @offset: the character offset of the new caret position
+ *
+ * Sets the caret (cursor) position to the specified @offset.
+ *
+ * In the case of rich-text content, this method should either grab focus
+ * or move the sequential focus navigation starting point (if the application
+ * supports this concept) as if the user had clicked on the new caret position.
+ * Typically, this means that the target of this operation is the node containing
+ * the new caret position or one of its ancestors. In other words, after this
+ * method is called, if the user advances focus, it should move to the first
+ * focusable node following the new caret position.
+ *
+ * Calling this method should also scroll the application viewport in a way
+ * that matches the behavior of the application's typical caret motion or tab
+ * navigation as closely as possible. This also means that if the application's
+ * caret motion or focus navigation does not trigger a scroll operation, this
+ * method should not trigger one either. If the application does not have a caret
+ * motion or focus navigation operation, this method should try to scroll the new
+ * caret position into view while minimizing unnecessary scroll motion.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ **/
+gboolean
+atk_text_set_caret_offset (AtkText *text,
+                           gint offset)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->set_caret_offset)
+    {
+      return (*(iface->set_caret_offset)) (text, offset);
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+/**
+ * atk_text_get_range_extents:
+ * @text: an #AtkText
+ * @start_offset: The offset of the first text character for which boundary
+ *        information is required.
+ * @end_offset: The offset of the text character after the last character
+ *        for which boundary information is required.
+ * @coord_type: Specify whether coordinates are relative to the screen or widget window.
+ * @rect: (out): A pointer to a AtkTextRectangle which is filled in by this function.
+ *
+ * Get the bounding box for text within the specified range.
+ *
+ * If the extents can not be obtained (e.g. or missing support), the rectangle
+ * fields are set to -1.
+ *
+ * Since: 1.3
+ **/
+void
+atk_text_get_range_extents (AtkText *text,
+                            gint start_offset,
+                            gint end_offset,
+                            AtkCoordType coord_type,
+                            AtkTextRectangle *rect)
+{
+  AtkTextIface *iface;
+
+  g_return_if_fail (ATK_IS_TEXT (text));
+  g_return_if_fail (rect);
+  g_return_if_fail (start_offset >= 0 && start_offset < end_offset);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_range_extents)
+    (*(iface->get_range_extents)) (text, start_offset, end_offset, coord_type, rect);
+  else
+    {
+      rect->x = -1;
+      rect->y = -1;
+      rect->width = -1;
+      rect->height = -1;
+    }
+}
+
+/**
+ * atk_text_get_bounded_ranges: (virtual get_bounded_ranges)
+ * @text: an #AtkText
+ * @rect: An AtkTextRectangle giving the dimensions of the bounding box.
+ * @coord_type: Specify whether coordinates are relative to the screen or widget window.
+ * @x_clip_type: Specify the horizontal clip type.
+ * @y_clip_type: Specify the vertical clip type.
+ *
+ * Get the ranges of text in the specified bounding box.
+ *
+ * Since: 1.3
+ *
+ * Returns: (array zero-terminated=1): Array of AtkTextRange. The last
+ *          element of the array returned by this function will be NULL.
+ **/
+AtkTextRange **
+atk_text_get_bounded_ranges (AtkText *text,
+                             AtkTextRectangle *rect,
+                             AtkCoordType coord_type,
+                             AtkTextClipType x_clip_type,
+                             AtkTextClipType y_clip_type)
+{
+  AtkTextIface *iface;
+
+  g_return_val_if_fail (ATK_IS_TEXT (text), NULL);
+  g_return_val_if_fail (rect, NULL);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->get_bounded_ranges)
+    return (*(iface->get_bounded_ranges)) (text, rect, coord_type, x_clip_type, y_clip_type);
+  else
+    return NULL;
+}
+
+/**
+ * atk_attribute_set_free:
+ * @attrib_set: The #AtkAttributeSet to free
+ *
+ * Frees the memory used by an #AtkAttributeSet, including all its
+ * #AtkAttributes.
+ **/
+void
+atk_attribute_set_free (AtkAttributeSet *attrib_set)
+{
+  GSList *temp;
+
+  temp = attrib_set;
+
+  while (temp != NULL)
+    {
+      AtkAttribute *att;
+
+      att = temp->data;
+
+      g_free (att->name);
+      g_free (att->value);
+      g_free (att);
+      temp = temp->next;
+    }
+  g_slist_free (attrib_set);
+}
+
+/**
+ * atk_text_attribute_register:
+ * @name: a name string
+ *
+ * Associate @name with a new #AtkTextAttribute
+ *
+ * Returns: an #AtkTextAttribute associated with @name
+ **/
+AtkTextAttribute
+atk_text_attribute_register (const gchar *name)
+{
+  g_return_val_if_fail (name, ATK_TEXT_ATTR_INVALID);
+
+  if (!extra_attributes)
+    extra_attributes = g_ptr_array_new ();
+
+  g_ptr_array_add (extra_attributes, g_strdup (name));
+  return extra_attributes->len + ATK_TEXT_ATTR_LAST_DEFINED;
+}
+
+/**
+ * atk_text_attribute_get_name:
+ * @attr: The #AtkTextAttribute whose name is required
+ *
+ * Gets the name corresponding to the #AtkTextAttribute
+ *
+ * Returns: a string containing the name; this string should not be freed
+ **/
+const gchar *
+atk_text_attribute_get_name (AtkTextAttribute attr)
+{
+  GTypeClass *type_class;
+  GEnumValue *value;
+  const gchar *name = NULL;
+
+  type_class = g_type_class_ref (ATK_TYPE_TEXT_ATTRIBUTE);
+  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), NULL);
+
+  value = g_enum_get_value (G_ENUM_CLASS (type_class), attr);
+
+  if (value)
+    {
+      name = value->value_nick;
+    }
+  else
+    {
+      if (extra_attributes)
+        {
+          gint n = attr;
+
+          n -= ATK_TEXT_ATTR_LAST_DEFINED + 1;
+
+          if (n < extra_attributes->len)
+
+            name = g_ptr_array_index (extra_attributes, n);
+        }
+    }
+  g_type_class_unref (type_class);
+  return name;
+}
+
+/**
+ * atk_text_attribute_for_name:
+ * @name: a string which is the (non-localized) name of an ATK text attribute.
+ *
+ * Get the #AtkTextAttribute type corresponding to a text attribute name.
+ *
+ * Returns: the #AtkTextAttribute enumerated type corresponding to the specified
+ *          name, or #ATK_TEXT_ATTRIBUTE_INVALID if no matching text attribute
+ *          is found.
+ **/
+AtkTextAttribute
+atk_text_attribute_for_name (const gchar *name)
+{
+  GTypeClass *type_class;
+  GEnumValue *value;
+  AtkTextAttribute type = ATK_TEXT_ATTR_INVALID;
+
+  g_return_val_if_fail (name, ATK_TEXT_ATTR_INVALID);
+
+  type_class = g_type_class_ref (ATK_TYPE_TEXT_ATTRIBUTE);
+  g_return_val_if_fail (G_IS_ENUM_CLASS (type_class), ATK_TEXT_ATTR_INVALID);
+
+  value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name);
+
+  if (value)
+    {
+      type = value->value;
+    }
+  else
+    {
+      gint i;
+
+      if (extra_attributes)
+        {
+          for (i = 0; i < extra_attributes->len; i++)
+            {
+              gchar *extra_attribute = (gchar *) g_ptr_array_index (extra_attributes, i);
+
+              g_return_val_if_fail (extra_attribute, ATK_TEXT_ATTR_INVALID);
+
+              if (strcmp (name, extra_attribute) == 0)
+                {
+                  type = i + 1 + ATK_TEXT_ATTR_LAST_DEFINED;
+                  break;
+                }
+            }
+        }
+    }
+  g_type_class_unref (type_class);
+
+  return type;
+}
+
+/**
+ * atk_text_attribute_get_value:
+ * @attr: The #AtkTextAttribute for which a value is required
+ * @index_: The index of the required value
+ *
+ * Gets the value for the index of the #AtkTextAttribute
+ *
+ * Returns: (nullable): a string containing the value; this string
+ * should not be freed; %NULL is returned if there are no values
+ * maintained for the attr value.
+ **/
+const gchar *
+atk_text_attribute_get_value (AtkTextAttribute attr,
+                              gint index)
+{
+  switch (attr)
+    {
+    case ATK_TEXT_ATTR_INVISIBLE:
+    case ATK_TEXT_ATTR_EDITABLE:
+    case ATK_TEXT_ATTR_BG_FULL_HEIGHT:
+    case ATK_TEXT_ATTR_STRIKETHROUGH:
+    case ATK_TEXT_ATTR_BG_STIPPLE:
+    case ATK_TEXT_ATTR_FG_STIPPLE:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (boolean_offsets));
+      return boolean + boolean_offsets[index];
+    case ATK_TEXT_ATTR_UNDERLINE:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (underline_offsets));
+      return underline + underline_offsets[index];
+    case ATK_TEXT_ATTR_WRAP_MODE:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (wrap_mode_offsets));
+      return wrap_mode + wrap_mode_offsets[index];
+    case ATK_TEXT_ATTR_DIRECTION:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (direction_offsets));
+      return direction + direction_offsets[index];
+    case ATK_TEXT_ATTR_JUSTIFICATION:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (justification_offsets));
+      return justification + justification_offsets[index];
+    case ATK_TEXT_ATTR_STRETCH:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (stretch_offsets));
+      return stretch + stretch_offsets[index];
+    case ATK_TEXT_ATTR_VARIANT:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (variant_offsets));
+      return variant + variant_offsets[index];
+    case ATK_TEXT_ATTR_STYLE:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (style_offsets));
+      return style + style_offsets[index];
+    case ATK_TEXT_ATTR_TEXT_POSITION:
+      g_assert (index >= 0 && index < G_N_ELEMENTS (text_position_offsets));
+      return text_position + text_position_offsets[index];
+    default:
+      return NULL;
+    }
+}
+
+static void
+atk_text_rectangle_union (AtkTextRectangle *src1,
+                          AtkTextRectangle *src2,
+                          AtkTextRectangle *dest)
+{
+  gint dest_x, dest_y;
+
+  /*
+   * Some invocations of e.g. atk_text_get_character_extents
+   * may return "-1" rectangles for character positions without support for
+   * getting an extent. In that case we have to ignore them instead of using -1
+   * values in computations.
+   */
+  if (src1->width == -1)
+    {
+      *dest = *src2;
+      return;
+    }
+  if (src2->width == -1)
+    {
+      *dest = *src1;
+      return;
+    }
+
+  dest_x = MIN (src1->x, src2->x);
+  dest_y = MIN (src1->y, src2->y);
+  dest->width = MAX (src1->x + src1->width, src2->x + src2->width) - dest_x;
+  dest->height = MAX (src1->y + src1->height, src2->y + src2->height) - dest_y;
+  dest->x = dest_x;
+  dest->y = dest_y;
+}
+
+static gboolean
+atk_text_rectangle_contain (AtkTextRectangle *clip,
+                            AtkTextRectangle *bounds,
+                            AtkTextClipType x_clip_type,
+                            AtkTextClipType y_clip_type)
+{
+  gboolean x_min_ok, x_max_ok, y_min_ok, y_max_ok;
+
+  x_min_ok = (bounds->x >= clip->x) ||
+             ((bounds->x + bounds->width >= clip->x) &&
+              ((x_clip_type == ATK_TEXT_CLIP_NONE) ||
+               (x_clip_type == ATK_TEXT_CLIP_MAX)));
+
+  x_max_ok = (bounds->x + bounds->width <= clip->x + clip->width) ||
+             ((bounds->x <= clip->x + clip->width) &&
+              ((x_clip_type == ATK_TEXT_CLIP_NONE) ||
+               (x_clip_type == ATK_TEXT_CLIP_MIN)));
+
+  y_min_ok = (bounds->y >= clip->y) ||
+             ((bounds->y + bounds->height >= clip->y) &&
+              ((y_clip_type == ATK_TEXT_CLIP_NONE) ||
+               (y_clip_type == ATK_TEXT_CLIP_MAX)));
+
+  y_max_ok = (bounds->y + bounds->height <= clip->y + clip->height) ||
+             ((bounds->y <= clip->y + clip->height) &&
+              ((y_clip_type == ATK_TEXT_CLIP_NONE) ||
+               (y_clip_type == ATK_TEXT_CLIP_MIN)));
+
+  return (x_min_ok && x_max_ok && y_min_ok && y_max_ok);
+}
+
+/**
+ * atk_text_scroll_substring_to:
+ * @text: an #AtkText
+ * @start_offset: start offset in the @text
+ * @end_offset: end offset in the @text, or -1 for the end of the text.
+ * @type: specify where the object should be made visible.
+ *
+ * Makes a substring of @text visible on the screen by scrolling all necessary parents.
+ *
+ * Since: 2.32
+ *
+ * Returns: whether scrolling was successful.
+ */
+gboolean
+atk_text_scroll_substring_to (AtkText *text,
+                              gint start_offset,
+                              gint end_offset,
+                              AtkScrollType type)
+{
+  AtkTextIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->scroll_substring_to)
+    return (iface->scroll_substring_to) (text, start_offset, end_offset, type);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_text_scroll_substring_to_point:
+ * @text: an #AtkText
+ * @start_offset: start offset in the @text
+ * @end_offset: end offset in the @text, or -1 for the end of the text.
+ * @coords: specify whether coordinates are relative to the screen or to the
+ * parent object.
+ * @x: x-position where to scroll to
+ * @y: y-position where to scroll to
+ *
+ * Move the top-left of a substring of @text to a given position of the screen
+ * by scrolling all necessary parents.
+ *
+ * Since: 2.32
+ *
+ * Returns: whether scrolling was successful.
+ */
+gboolean
+atk_text_scroll_substring_to_point (AtkText *text,
+                                    gint start_offset,
+                                    gint end_offset,
+                                    AtkCoordType coords,
+                                    gint x,
+                                    gint y)
+{
+  AtkTextIface *iface = NULL;
+  g_return_val_if_fail (ATK_IS_TEXT (text), FALSE);
+
+  iface = ATK_TEXT_GET_IFACE (text);
+
+  if (iface->scroll_substring_to_point)
+    return (iface->scroll_substring_to_point) (text, start_offset, end_offset, coords, x, y);
+  else
+    return FALSE;
+}
+
+static void
+atk_text_real_get_range_extents (AtkText *text,
+                                 gint start_offset,
+                                 gint end_offset,
+                                 AtkCoordType coord_type,
+                                 AtkTextRectangle *rect)
+{
+  gint i;
+  AtkTextRectangle cbounds, bounds;
+
+  atk_text_get_character_extents (text, start_offset,
+                                  &bounds.x, &bounds.y,
+                                  &bounds.width, &bounds.height,
+                                  coord_type);
+
+  for (i = start_offset + 1; i < end_offset; i++)
+    {
+      atk_text_get_character_extents (text, i,
+                                      &cbounds.x, &cbounds.y,
+                                      &cbounds.width, &cbounds.height,
+                                      coord_type);
+      atk_text_rectangle_union (&bounds, &cbounds, &bounds);
+    }
+
+  rect->x = bounds.x;
+  rect->y = bounds.y;
+  rect->width = bounds.width;
+  rect->height = bounds.height;
+}
+
+static AtkTextRange **
+atk_text_real_get_bounded_ranges (AtkText *text,
+                                  AtkTextRectangle *rect,
+                                  AtkCoordType coord_type,
+                                  AtkTextClipType x_clip_type,
+                                  AtkTextClipType y_clip_type)
+{
+  gint bounds_min_offset, bounds_max_offset;
+  gint min_line_start = 0, min_line_end = 0;
+  gint max_line_start = 0, max_line_end = 0;
+  gchar *line;
+  gint curr_offset;
+  gint offset;
+  gint num_ranges = 0;
+  gint range_size = 1;
+  AtkTextRectangle cbounds;
+  AtkTextRange **range;
+
+  range = NULL;
+  bounds_min_offset = atk_text_get_offset_at_point (text, rect->x, rect->y, coord_type);
+  bounds_max_offset = atk_text_get_offset_at_point (text, rect->x + rect->width, rect->y + rect->height, coord_type);
+
+  if (bounds_min_offset == 0 &&
+      bounds_min_offset == bounds_max_offset)
+    return NULL;
+
+  line = atk_text_get_text_at_offset (text, bounds_min_offset,
+                                      ATK_TEXT_BOUNDARY_LINE_START,
+                                      &min_line_start, &min_line_end);
+  g_free (line);
+  line = atk_text_get_text_at_offset (text, bounds_max_offset,
+                                      ATK_TEXT_BOUNDARY_LINE_START,
+                                      &max_line_start, &max_line_end);
+  g_free (line);
+  bounds_min_offset = MIN (min_line_start, max_line_start);
+  bounds_max_offset = MAX (min_line_end, max_line_end);
+
+  curr_offset = bounds_min_offset;
+  while (curr_offset < bounds_max_offset)
+    {
+      offset = curr_offset;
+
+      while (curr_offset < bounds_max_offset)
+        {
+          atk_text_get_character_extents (text, curr_offset,
+                                          &cbounds.x, &cbounds.y,
+                                          &cbounds.width, &cbounds.height,
+                                          coord_type);
+          if (!atk_text_rectangle_contain (rect, &cbounds, x_clip_type, y_clip_type))
+            break;
+          curr_offset++;
+        }
+      if (curr_offset > offset)
+        {
+          AtkTextRange *one_range = g_new (AtkTextRange, 1);
+
+          one_range->start_offset = offset;
+          one_range->end_offset = curr_offset;
+          one_range->content = atk_text_get_text (text, offset, curr_offset);
+          atk_text_get_range_extents (text, offset, curr_offset, coord_type, &one_range->bounds);
+
+          if (num_ranges >= range_size - 1)
+            {
+              range_size *= 2;
+              range = g_realloc (range, range_size * sizeof (gpointer));
+            }
+          range[num_ranges] = one_range;
+          num_ranges++;
+        }
+      curr_offset++;
+      if (range)
+        range[num_ranges] = NULL;
+    }
+  return range;
+}
+
+/**
+ * atk_text_free_ranges:
+ * @ranges: (array): A pointer to an array of #AtkTextRange which is
+ *   to be freed.
+ *
+ * Frees the memory associated with an array of AtkTextRange. It is assumed
+ * that the array was returned by the function atk_text_get_bounded_ranges
+ * and is NULL terminated.
+ *
+ * Since: 1.3
+ **/
+void
+atk_text_free_ranges (AtkTextRange **ranges)
+{
+  AtkTextRange **first = ranges;
+
+  if (ranges)
+    {
+      while (*ranges)
+        {
+          AtkTextRange *range;
+
+          range = *ranges;
+          ranges++;
+          g_free (range->content);
+          g_free (range);
+        }
+      g_free (first);
+    }
+}
+
+static AtkTextRange *
+atk_text_range_copy (AtkTextRange *src)
+{
+  AtkTextRange *dst = g_new0 (AtkTextRange, 1);
+  dst->bounds = src->bounds;
+  dst->start_offset = src->start_offset;
+  dst->end_offset = src->end_offset;
+  if (src->content)
+    dst->content = g_strdup (src->content);
+  return dst;
+}
+
+static void
+atk_text_range_free (AtkTextRange *range)
+{
+  g_free (range->content);
+  g_free (range);
+}
+
+G_DEFINE_BOXED_TYPE (AtkTextRange, atk_text_range, atk_text_range_copy, atk_text_range_free)
diff --git a/atk/atktext.h b/atk/atktext.h
new file mode 100644 (file)
index 0000000..861bd61
--- /dev/null
@@ -0,0 +1,492 @@
+/* ATK - The Accessibility Toolkit for GTK+
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_TEXT_H__
+#define __ATK_TEXT_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkcomponent.h>
+#include <atk/atkobject.h>
+#include <atk/atkutil.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/**
+ *AtkTextAttribute:
+ *@ATK_TEXT_ATTR_INVALID: Invalid attribute, like bad spelling or grammar.
+ *@ATK_TEXT_ATTR_LEFT_MARGIN: The pixel width of the left margin
+ *@ATK_TEXT_ATTR_RIGHT_MARGIN: The pixel width of the right margin
+ *@ATK_TEXT_ATTR_INDENT: The number of pixels that the text is indented
+ *@ATK_TEXT_ATTR_INVISIBLE: Either "true" or "false" indicating whether text is visible or not
+ *@ATK_TEXT_ATTR_EDITABLE: Either "true" or "false" indicating whether text is editable or not
+ *@ATK_TEXT_ATTR_PIXELS_ABOVE_LINES: Pixels of blank space to leave above each newline-terminated line.
+ *@ATK_TEXT_ATTR_PIXELS_BELOW_LINES: Pixels of blank space to leave below each newline-terminated line.
+ *@ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP: Pixels of blank space to leave between wrapped lines inside the same newline-terminated line (paragraph).
+ *@ATK_TEXT_ATTR_BG_FULL_HEIGHT: "true" or "false" whether to make the background color for each character the height of the highest font used on the current line, or the height of the font used for the current character.
+ *@ATK_TEXT_ATTR_RISE: Number of pixels that the characters are risen above the baseline. See also ATK_TEXT_ATTR_TEXT_POSITION.
+ *@ATK_TEXT_ATTR_UNDERLINE: "none", "single", "double", "low", or "error"
+ *@ATK_TEXT_ATTR_STRIKETHROUGH: "true" or "false" whether the text is strikethrough
+ *@ATK_TEXT_ATTR_SIZE: The size of the characters in points. eg: 10
+ *@ATK_TEXT_ATTR_SCALE: The scale of the characters. The value is a string representation of a double
+ *@ATK_TEXT_ATTR_WEIGHT: The weight of the characters.
+ *@ATK_TEXT_ATTR_LANGUAGE: The language used
+ *@ATK_TEXT_ATTR_FAMILY_NAME: The font family name
+ *@ATK_TEXT_ATTR_BG_COLOR: The background color. The value is an RGB value of the format "%u,%u,%u"
+ *@ATK_TEXT_ATTR_FG_COLOR:The foreground color. The value is an RGB value of the format "%u,%u,%u"
+ *@ATK_TEXT_ATTR_BG_STIPPLE: "true" if a #GdkBitmap is set for stippling the background color.
+ *@ATK_TEXT_ATTR_FG_STIPPLE: "true" if a #GdkBitmap is set for stippling the foreground color.
+ *@ATK_TEXT_ATTR_WRAP_MODE: The wrap mode of the text, if any. Values are "none", "char", "word", or "word_char".
+ *@ATK_TEXT_ATTR_DIRECTION: The direction of the text, if set. Values are "none", "ltr" or "rtl"
+ *@ATK_TEXT_ATTR_JUSTIFICATION: The justification of the text, if set. Values are "left", "right", "center" or "fill"
+ *@ATK_TEXT_ATTR_STRETCH: The stretch of the text, if set. Values are "ultra_condensed", "extra_condensed", "condensed", "semi_condensed", "normal", "semi_expanded", "expanded", "extra_expanded" or "ultra_expanded"
+ *@ATK_TEXT_ATTR_VARIANT: The capitalization variant of the text, if set. Values are "normal" or "small_caps"
+ *@ATK_TEXT_ATTR_STYLE: The slant style of the text, if set. Values are "normal", "oblique" or "italic"
+ *@ATK_TEXT_ATTR_TEXT_POSITION: The vertical position with respect to the baseline. Values are "baseline", "super", or "sub". Note that a super or sub text attribute refers to position with respect to the baseline of the prior character.
+ *@ATK_TEXT_ATTR_LAST_DEFINED: not a valid text attribute, used for finding end of enumeration
+ *
+ * Describes the text attributes supported
+ **/
+typedef enum
+{
+  ATK_TEXT_ATTR_INVALID = 0,
+  ATK_TEXT_ATTR_LEFT_MARGIN,
+  ATK_TEXT_ATTR_RIGHT_MARGIN,
+  ATK_TEXT_ATTR_INDENT,
+  ATK_TEXT_ATTR_INVISIBLE,
+  ATK_TEXT_ATTR_EDITABLE,
+  ATK_TEXT_ATTR_PIXELS_ABOVE_LINES,
+  ATK_TEXT_ATTR_PIXELS_BELOW_LINES,
+  ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP,
+  ATK_TEXT_ATTR_BG_FULL_HEIGHT,
+  ATK_TEXT_ATTR_RISE,
+  ATK_TEXT_ATTR_UNDERLINE,
+  ATK_TEXT_ATTR_STRIKETHROUGH,
+  ATK_TEXT_ATTR_SIZE,
+  ATK_TEXT_ATTR_SCALE,
+  ATK_TEXT_ATTR_WEIGHT,
+  ATK_TEXT_ATTR_LANGUAGE,
+  ATK_TEXT_ATTR_FAMILY_NAME,
+  ATK_TEXT_ATTR_BG_COLOR,
+  ATK_TEXT_ATTR_FG_COLOR,
+  ATK_TEXT_ATTR_BG_STIPPLE,
+  ATK_TEXT_ATTR_FG_STIPPLE,
+  ATK_TEXT_ATTR_WRAP_MODE,
+  ATK_TEXT_ATTR_DIRECTION,
+  ATK_TEXT_ATTR_JUSTIFICATION,
+  ATK_TEXT_ATTR_STRETCH,
+  ATK_TEXT_ATTR_VARIANT,
+  ATK_TEXT_ATTR_STYLE,
+  ATK_TEXT_ATTR_TEXT_POSITION,
+  ATK_TEXT_ATTR_LAST_DEFINED
+} AtkTextAttribute;
+
+ATK_AVAILABLE_IN_ALL
+AtkTextAttribute atk_text_attribute_register (const gchar *name);
+
+#define ATK_TYPE_TEXT (atk_text_get_type ())
+#define ATK_IS_TEXT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_TEXT)
+#define ATK_TEXT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_TEXT, AtkText)
+#define ATK_TEXT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_TEXT, AtkTextIface))
+
+#ifndef _TYPEDEF_ATK_TEXT_
+#define _TYPEDEF_ATK_TEXT_
+typedef struct _AtkText AtkText;
+#endif
+typedef struct _AtkTextIface AtkTextIface;
+
+/**
+ *AtkTextBoundary:
+ *@ATK_TEXT_BOUNDARY_CHAR: Boundary is the boundary between characters
+ * (including non-printing characters)
+ *@ATK_TEXT_BOUNDARY_WORD_START: Boundary is the start (i.e. first character) of a word.
+ *@ATK_TEXT_BOUNDARY_WORD_END: Boundary is the end (i.e. last
+ * character) of a word.
+ *@ATK_TEXT_BOUNDARY_SENTENCE_START: Boundary is the first character in a sentence.
+ *@ATK_TEXT_BOUNDARY_SENTENCE_END: Boundary is the last (terminal)
+ * character in a sentence; in languages which use "sentence stop"
+ * punctuation such as English, the boundary is thus the '.', '?', or
+ * similar terminal punctuation character.
+ *@ATK_TEXT_BOUNDARY_LINE_START: Boundary is the initial character of the content or a
+ * character immediately following a newline, linefeed, or return character.
+ *@ATK_TEXT_BOUNDARY_LINE_END: Boundary is the linefeed, or return
+ * character.
+ *
+ * Text boundary types used for specifying boundaries for regions of text.
+ * This enumeration is deprecated since 2.9.4 and should not be used. Use
+ * AtkTextGranularity with #atk_text_get_string_at_offset instead.
+ **/
+typedef enum
+{
+  ATK_TEXT_BOUNDARY_CHAR,
+  ATK_TEXT_BOUNDARY_WORD_START,
+  ATK_TEXT_BOUNDARY_WORD_END,
+  ATK_TEXT_BOUNDARY_SENTENCE_START,
+  ATK_TEXT_BOUNDARY_SENTENCE_END,
+  ATK_TEXT_BOUNDARY_LINE_START,
+  ATK_TEXT_BOUNDARY_LINE_END
+} AtkTextBoundary;
+
+/**
+ *AtkTextGranularity:
+ *@ATK_TEXT_GRANULARITY_CHAR: Granularity is defined by the boundaries between characters
+ * (including non-printing characters)
+ *@ATK_TEXT_GRANULARITY_WORD: Granularity is defined by the boundaries of a word,
+ * starting at the beginning of the current word and finishing at the beginning of
+ * the following one, if present.
+ *@ATK_TEXT_GRANULARITY_SENTENCE: Granularity is defined by the boundaries of a sentence,
+ * starting at the beginning of the current sentence and finishing at the beginning of
+ * the following one, if present.
+ *@ATK_TEXT_GRANULARITY_LINE: Granularity is defined by the boundaries of a line,
+ * starting at the beginning of the current line and finishing at the beginning of
+ * the following one, if present.
+ *@ATK_TEXT_GRANULARITY_PARAGRAPH: Granularity is defined by the boundaries of a paragraph,
+ * starting at the beginning of the current paragraph and finishing at the beginning of
+ * the following one, if present.
+ *
+ * Text granularity types used for specifying the granularity of the region of
+ * text we are interested in.
+ **/
+typedef enum
+{
+  ATK_TEXT_GRANULARITY_CHAR,
+  ATK_TEXT_GRANULARITY_WORD,
+  ATK_TEXT_GRANULARITY_SENTENCE,
+  ATK_TEXT_GRANULARITY_LINE,
+  ATK_TEXT_GRANULARITY_PARAGRAPH
+} AtkTextGranularity;
+
+/**
+ * AtkTextRectangle:
+ * @x: The horizontal coordinate of a rectangle
+ * @y: The vertical coordinate of a rectangle
+ * @width: The width of a rectangle
+ * @height: The height of a rectangle
+ *
+ * A structure used to store a rectangle used by AtkText.
+ **/
+
+typedef struct _AtkTextRectangle AtkTextRectangle;
+
+struct _AtkTextRectangle
+{
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+};
+
+/**
+ * AtkTextRange:
+ * @bounds: A rectangle giving the bounds of the text range
+ * @start_offset: The start offset of a AtkTextRange
+ * @end_offset: The end offset of a AtkTextRange
+ * @content: The text in the text range
+ *
+ * A structure used to describe a text range.
+ **/
+typedef struct _AtkTextRange AtkTextRange;
+
+struct _AtkTextRange
+{
+  AtkTextRectangle bounds;
+  gint start_offset;
+  gint end_offset;
+  gchar *content;
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_text_range_get_type (void);
+
+/**
+ *AtkTextClipType:
+ *@ATK_TEXT_CLIP_NONE: No clipping to be done
+ *@ATK_TEXT_CLIP_MIN: Text clipped by min coordinate is omitted
+ *@ATK_TEXT_CLIP_MAX: Text clipped by max coordinate is omitted
+ *@ATK_TEXT_CLIP_BOTH: Only text fully within mix/max bound is retained
+ *
+ *Describes the type of clipping required.
+ **/
+typedef enum
+{
+  ATK_TEXT_CLIP_NONE,
+  ATK_TEXT_CLIP_MIN,
+  ATK_TEXT_CLIP_MAX,
+  ATK_TEXT_CLIP_BOTH
+} AtkTextClipType;
+
+/**
+ * AtkTextIface:
+ * @get_text_after_offset: Gets specified text. This virtual function
+ *   is deprecated and it should not be overridden.
+ * @get_text_at_offset: Gets specified text. This virtual function
+ *   is deprecated and it should not be overridden.
+ * @get_text_before_offset: Gets specified text. This virtual function
+ *   is deprecated and it should not be overridden.
+ * @get_string_at_offset: Gets a portion of the text exposed through
+ *   an AtkText according to a given offset and a specific
+ *   granularity, along with the start and end offsets defining the
+ *   boundaries of such a portion of text.
+ * @text_changed: the signal handler which is executed when there is a
+ *   text change. This virtual function is deprecated sice 2.9.4 and
+ *   it should not be overriden.
+ */
+struct _AtkTextIface
+{
+  GTypeInterface parent;
+
+  gchar *(*get_text) (AtkText *text,
+                      gint start_offset,
+                      gint end_offset);
+  gchar *(*get_text_after_offset) (AtkText *text,
+                                   gint offset,
+                                   AtkTextBoundary boundary_type,
+                                   gint *start_offset,
+                                   gint *end_offset);
+  gchar *(*get_text_at_offset) (AtkText *text,
+                                gint offset,
+                                AtkTextBoundary boundary_type,
+                                gint *start_offset,
+                                gint *end_offset);
+  gunichar (*get_character_at_offset) (AtkText *text,
+                                       gint offset);
+  gchar *(*get_text_before_offset) (AtkText *text,
+                                    gint offset,
+                                    AtkTextBoundary boundary_type,
+                                    gint *start_offset,
+                                    gint *end_offset);
+  gint (*get_caret_offset) (AtkText *text);
+  AtkAttributeSet *(*get_run_attributes) (AtkText *text,
+                                          gint offset,
+                                          gint *start_offset,
+                                          gint *end_offset);
+  AtkAttributeSet *(*get_default_attributes) (AtkText *text);
+  void (*get_character_extents) (AtkText *text,
+                                 gint offset,
+                                 gint *x,
+                                 gint *y,
+                                 gint *width,
+                                 gint *height,
+                                 AtkCoordType coords);
+  gint (*get_character_count) (AtkText *text);
+  gint (*get_offset_at_point) (AtkText *text,
+                               gint x,
+                               gint y,
+                               AtkCoordType coords);
+  gint (*get_n_selections) (AtkText *text);
+  gchar *(*get_selection) (AtkText *text,
+                           gint selection_num,
+                           gint *start_offset,
+                           gint *end_offset);
+  gboolean (*add_selection) (AtkText *text,
+                             gint start_offset,
+                             gint end_offset);
+  gboolean (*remove_selection) (AtkText *text,
+                                gint selection_num);
+  gboolean (*set_selection) (AtkText *text,
+                             gint selection_num,
+                             gint start_offset,
+                             gint end_offset);
+  gboolean (*set_caret_offset) (AtkText *text,
+                                gint offset);
+
+  /*
+   * signal handlers
+   */
+  void (*text_changed) (AtkText *text,
+                        gint position,
+                        gint length);
+  void (*text_caret_moved) (AtkText *text,
+                            gint location);
+  void (*text_selection_changed) (AtkText *text);
+
+  void (*text_attributes_changed) (AtkText *text);
+
+  void (*get_range_extents) (AtkText *text,
+                             gint start_offset,
+                             gint end_offset,
+                             AtkCoordType coord_type,
+                             AtkTextRectangle *rect);
+
+  AtkTextRange **(*get_bounded_ranges) (AtkText *text,
+                                        AtkTextRectangle *rect,
+                                        AtkCoordType coord_type,
+                                        AtkTextClipType x_clip_type,
+                                        AtkTextClipType y_clip_type);
+
+  gchar *(*get_string_at_offset) (AtkText *text,
+                                  gint offset,
+                                  AtkTextGranularity granularity,
+                                  gint *start_offset,
+                                  gint *end_offset);
+  /*
+   * Scrolls this text range so it becomes visible on the screen.
+   *
+   * scroll_substring_to lets the implementation compute an appropriate target
+   * position on the screen, with type used as a positioning hint.
+   *
+   * scroll_substring_to_point lets the client specify a precise target position
+   * on the screen for the top-left of the substring.
+   *
+   * Since ATK 2.32
+   */
+  gboolean (*scroll_substring_to) (AtkText *text,
+                                   gint start_offset,
+                                   gint end_offset,
+                                   AtkScrollType type);
+  gboolean (*scroll_substring_to_point) (AtkText *text,
+                                         gint start_offset,
+                                         gint end_offset,
+                                         AtkCoordType coords,
+                                         gint x,
+                                         gint y);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_text_get_type (void);
+
+/*
+ * Additional AtkObject properties used by AtkText:
+ *    "accessible_text" (accessible text has changed)
+ *    "accessible_caret" (accessible text cursor position changed:
+ *                         editable text only)
+ */
+
+ATK_AVAILABLE_IN_ALL
+gchar *atk_text_get_text (AtkText *text,
+                          gint start_offset,
+                          gint end_offset);
+ATK_AVAILABLE_IN_ALL
+gunichar atk_text_get_character_at_offset (AtkText *text,
+                                           gint offset);
+ATK_DEPRECATED_IN_2_10_FOR (atk_text_get_string_at_offset)
+gchar *atk_text_get_text_after_offset (AtkText *text,
+                                       gint offset,
+                                       AtkTextBoundary boundary_type,
+                                       gint *start_offset,
+                                       gint *end_offset);
+ATK_DEPRECATED_IN_2_10_FOR (atk_text_get_string_at_offset)
+gchar *atk_text_get_text_at_offset (AtkText *text,
+                                    gint offset,
+                                    AtkTextBoundary boundary_type,
+                                    gint *start_offset,
+                                    gint *end_offset);
+ATK_DEPRECATED_IN_2_10_FOR (atk_text_get_string_at_offset)
+gchar *atk_text_get_text_before_offset (AtkText *text,
+                                        gint offset,
+                                        AtkTextBoundary boundary_type,
+                                        gint *start_offset,
+                                        gint *end_offset);
+ATK_AVAILABLE_IN_2_10
+gchar *atk_text_get_string_at_offset (AtkText *text,
+                                      gint offset,
+                                      AtkTextGranularity granularity,
+                                      gint *start_offset,
+                                      gint *end_offset);
+ATK_AVAILABLE_IN_ALL
+gint atk_text_get_caret_offset (AtkText *text);
+ATK_AVAILABLE_IN_ALL
+void atk_text_get_character_extents (AtkText *text,
+                                     gint offset,
+                                     gint *x,
+                                     gint *y,
+                                     gint *width,
+                                     gint *height,
+                                     AtkCoordType coords);
+ATK_AVAILABLE_IN_ALL
+AtkAttributeSet *atk_text_get_run_attributes (AtkText *text,
+                                              gint offset,
+                                              gint *start_offset,
+                                              gint *end_offset);
+ATK_AVAILABLE_IN_ALL
+AtkAttributeSet *atk_text_get_default_attributes (AtkText *text);
+ATK_AVAILABLE_IN_ALL
+gint atk_text_get_character_count (AtkText *text);
+ATK_AVAILABLE_IN_ALL
+gint atk_text_get_offset_at_point (AtkText *text,
+                                   gint x,
+                                   gint y,
+                                   AtkCoordType coords);
+ATK_AVAILABLE_IN_ALL
+gint atk_text_get_n_selections (AtkText *text);
+ATK_AVAILABLE_IN_ALL
+gchar *atk_text_get_selection (AtkText *text,
+                               gint selection_num,
+                               gint *start_offset,
+                               gint *end_offset);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_text_add_selection (AtkText *text,
+                                 gint start_offset,
+                                 gint end_offset);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_text_remove_selection (AtkText *text,
+                                    gint selection_num);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_text_set_selection (AtkText *text,
+                                 gint selection_num,
+                                 gint start_offset,
+                                 gint end_offset);
+ATK_AVAILABLE_IN_ALL
+gboolean atk_text_set_caret_offset (AtkText *text,
+                                    gint offset);
+ATK_AVAILABLE_IN_ALL
+void atk_text_get_range_extents (AtkText *text,
+
+                                 gint start_offset,
+                                 gint end_offset,
+                                 AtkCoordType coord_type,
+                                 AtkTextRectangle *rect);
+ATK_AVAILABLE_IN_ALL
+AtkTextRange **atk_text_get_bounded_ranges (AtkText *text,
+                                            AtkTextRectangle *rect,
+                                            AtkCoordType coord_type,
+                                            AtkTextClipType x_clip_type,
+                                            AtkTextClipType y_clip_type);
+ATK_AVAILABLE_IN_ALL
+void atk_text_free_ranges (AtkTextRange **ranges);
+ATK_AVAILABLE_IN_ALL
+void atk_attribute_set_free (AtkAttributeSet *attrib_set);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_text_attribute_get_name (AtkTextAttribute attr);
+ATK_AVAILABLE_IN_ALL
+AtkTextAttribute atk_text_attribute_for_name (const gchar *name);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_text_attribute_get_value (AtkTextAttribute attr,
+                                           gint index_);
+
+ATK_AVAILABLE_IN_2_32
+gboolean atk_text_scroll_substring_to (AtkText *text,
+                                       gint start_offset,
+                                       gint end_offset,
+                                       AtkScrollType type);
+
+ATK_AVAILABLE_IN_2_32
+gboolean atk_text_scroll_substring_to_point (AtkText *text,
+                                             gint start_offset,
+                                             gint end_offset,
+                                             AtkCoordType coords,
+                                             gint x,
+                                             gint y);
+
+G_END_DECLS
+
+#endif /* __ATK_TEXT_H__ */
diff --git a/atk/atkutil.c b/atk/atkutil.c
new file mode 100644 (file)
index 0000000..cf5eb3b
--- /dev/null
@@ -0,0 +1,597 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkmarshal.h"
+#include "atkutil.h"
+
+/**
+ * AtkUtil:
+ *
+ * A set of ATK utility functions for event and toolkit support.
+ *
+ * A set of ATK utility functions which are used to support event
+ * registration of various types, and obtaining the 'root' accessible
+ * of a process and information about the current ATK implementation
+ * and toolkit version.
+ */
+
+static void atk_util_class_init (AtkUtilClass *klass);
+
+static AtkObject *previous_focus_object = NULL;
+
+typedef struct _AtkUtilListenerInfo AtkUtilListenerInfo;
+struct _AtkUtilListenerInfo
+{
+  gint key;
+  guint signal_id;
+  gulong hook_id;
+};
+static GHashTable *listener_list = NULL;
+
+GType
+atk_util_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      static const GTypeInfo typeInfo = {
+        sizeof (AtkUtilClass),
+        (GBaseInitFunc) NULL,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) atk_util_class_init,
+        (GClassFinalizeFunc) NULL,
+        NULL,
+        sizeof (AtkUtil),
+        0,
+        (GInstanceInitFunc) NULL,
+      };
+      type = g_type_register_static (G_TYPE_OBJECT, "AtkUtil", &typeInfo, 0);
+    }
+  return type;
+}
+
+/*
+ * This file supports the addition and removal of multiple focus handlers
+ * as long as they are all called in the same thread.
+ */
+static AtkEventListenerInit focus_tracker_init = (AtkEventListenerInit) NULL;
+
+static gboolean init_done = FALSE;
+
+/*
+ * Array of FocusTracker structs
+ */
+static GArray *trackers = NULL;
+static guint global_index = 0;
+
+typedef struct _FocusTracker FocusTracker;
+
+struct _FocusTracker
+{
+  guint index;
+  AtkEventListener func;
+};
+
+/**
+ * atk_focus_tracker_init: (skip)
+ * @init: Function to be called for focus tracker initialization
+ *
+ * Specifies the function to be called for focus tracker initialization.
+ * This function should be called by an implementation of the
+ * ATK interface if any specific work needs to be done to enable
+ * focus tracking.
+ *
+ * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
+ * to be implemented by ATK itself.
+ *
+ **/
+void
+atk_focus_tracker_init (AtkEventListenerInit init)
+{
+  if (!focus_tracker_init)
+    focus_tracker_init = init;
+}
+
+/**
+ * atk_add_focus_tracker: (skip)
+ * @focus_tracker: Function to be added to the list of functions to be called
+ * when an object receives focus.
+ *
+ * Adds the specified function to the list of functions to be called
+ * when an object receives focus.
+ *
+ * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
+ * to be implemented by ATK itself. If you need focus tracking on your
+ * implementation, subscribe to the #AtkObject::state-change "focused" signal.
+ *
+ * Returns: added focus tracker id, or 0 on failure.
+ **/
+guint
+atk_add_focus_tracker (AtkEventListener focus_tracker)
+{
+  g_return_val_if_fail (focus_tracker, 0);
+
+  if (!init_done)
+    {
+      if (focus_tracker_init)
+        {
+          focus_tracker_init ();
+        }
+      trackers = g_array_sized_new (FALSE, TRUE, sizeof (FocusTracker), 0);
+      init_done = TRUE;
+    }
+  if (init_done)
+    {
+      FocusTracker item;
+
+      item.index = ++global_index;
+      item.func = focus_tracker;
+      trackers = g_array_append_val (trackers, item);
+      return global_index;
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+/**
+ * atk_remove_focus_tracker:
+ * @tracker_id: the id of the focus tracker to remove
+ *
+ * Removes the specified focus tracker from the list of functions
+ * to be called when any object receives focus.
+ *
+ * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
+ *   to be implemented by ATK itself. If you need focus tracking on your
+ *   implementation, subscribe to the #AtkObject::state-change "focused"
+ *   signal.
+ */
+void
+atk_remove_focus_tracker (guint tracker_id)
+{
+  FocusTracker *item;
+  guint i;
+
+  if (trackers == NULL)
+    return;
+
+  if (tracker_id == 0)
+    return;
+
+  for (i = 0; i < trackers->len; i++)
+    {
+      item = &g_array_index (trackers, FocusTracker, i);
+      if (item->index == tracker_id)
+        {
+          trackers = g_array_remove_index (trackers, i);
+          break;
+        }
+    }
+}
+
+/**
+ * atk_focus_tracker_notify:
+ * @object: an #AtkObject
+ *
+ * Cause the focus tracker functions which have been specified to be
+ * executed for the object.
+ *
+ * Deprecated: 2.9.4: Focus tracking has been dropped as a feature
+ * to be implemented by ATK itself. As #AtkObject::focus-event was
+ * deprecated in favor of a #AtkObject::state-change signal, in order
+ * to notify a focus change on your implementation, you can use
+ * atk_object_notify_state_change() instead.
+ **/
+void
+atk_focus_tracker_notify (AtkObject *object)
+{
+  FocusTracker *item;
+  guint i;
+
+  if (trackers == NULL)
+    return;
+
+  if (object == previous_focus_object)
+    return;
+  else
+    {
+      if (previous_focus_object)
+        g_object_unref (previous_focus_object);
+
+      previous_focus_object = object;
+      if (object)
+        {
+          g_object_ref (object);
+
+          for (i = 0; i < trackers->len; i++)
+            {
+              item = &g_array_index (trackers, FocusTracker, i);
+              g_return_if_fail (item != NULL);
+              item->func (object);
+            }
+        }
+    }
+}
+
+static guint
+add_listener (GSignalEmissionHook listener,
+              const gchar *object_type,
+              const gchar *signal_name,
+              const gchar *detail_string,
+              const gchar *hook_data)
+{
+  GType type;
+  guint signal_id;
+  gint rc = 0;
+  static gint listener_idx = 1;
+  GQuark detail_quark = 0;
+
+  type = g_type_from_name (object_type);
+  if (type)
+    {
+      signal_id = g_signal_lookup (signal_name, type);
+      detail_quark = g_quark_from_string (detail_string);
+
+      if (signal_id > 0)
+        {
+          AtkUtilListenerInfo *listener_info;
+
+          rc = listener_idx;
+
+          listener_info = g_new (AtkUtilListenerInfo, 1);
+          listener_info->key = listener_idx;
+          listener_info->hook_id =
+              g_signal_add_emission_hook (signal_id, detail_quark, listener,
+                                          g_strdup (hook_data),
+                                          (GDestroyNotify) g_free);
+          listener_info->signal_id = signal_id;
+
+          g_hash_table_insert (listener_list, &(listener_info->key), listener_info);
+          listener_idx++;
+        }
+      else
+        {
+          g_debug ("Signal type %s not supported\n", signal_name);
+        }
+    }
+  else
+    {
+      g_warning ("Invalid object type %s\n", object_type);
+    }
+  return rc;
+}
+
+static guint
+atk_util_real_add_global_event_listener (GSignalEmissionHook listener,
+                                         const gchar *event_type)
+{
+  guint rc = 0;
+  gchar **split_string;
+  guint length;
+
+  split_string = g_strsplit (event_type, ":", 0);
+  length = g_strv_length (split_string);
+
+  if ((length == 3) || (length == 4))
+    rc = add_listener (listener, split_string[1], split_string[2],
+                       split_string[3], event_type);
+
+  g_strfreev (split_string);
+
+  return rc;
+}
+
+static void
+atk_util_real_remove_global_event_listener (guint remove_listener)
+{
+  if (remove_listener > 0)
+    {
+      AtkUtilListenerInfo *listener_info;
+      gint tmp_idx = remove_listener;
+
+      listener_info = (AtkUtilListenerInfo *)
+          g_hash_table_lookup (listener_list, &tmp_idx);
+
+      if (listener_info != NULL)
+        {
+          /* Hook id of 0 and signal id of 0 are invalid */
+          if (listener_info->hook_id != 0 && listener_info->signal_id != 0)
+            {
+              /* Remove the emission hook */
+              g_signal_remove_emission_hook (listener_info->signal_id,
+                                             listener_info->hook_id);
+
+              /* Remove the element from the hash */
+              g_hash_table_remove (listener_list, &tmp_idx);
+            }
+          else
+            {
+              g_warning ("Invalid listener hook_id %ld or signal_id %d\n",
+                         listener_info->hook_id, listener_info->signal_id);
+            }
+        }
+      else
+        {
+          g_warning ("No listener with the specified listener id %d",
+                     remove_listener);
+        }
+    }
+  else
+    {
+      g_warning ("Invalid listener_id %d", remove_listener);
+    }
+}
+
+/**
+ * atk_add_global_event_listener: (skip)
+ * @listener: the listener to notify
+ * @event_type: the type of event for which notification is requested
+ *
+ * Adds the specified function to the list of functions to be called
+ * when an ATK event of type event_type occurs.
+ *
+ * The format of event_type is the following:
+ *  "ATK:&lt;atk_type&gt;:&lt;atk_event&gt;:&lt;atk_event_detail&gt;
+ *
+ * Where "ATK" works as the namespace, &lt;atk_interface&gt; is the name of
+ * the ATK type (interface or object), &lt;atk_event&gt; is the name of the
+ * signal defined on that interface and &lt;atk_event_detail&gt; is the
+ * gsignal detail of that signal. You can find more info about gsignal
+ * details here:
+ * http://developer.gnome.org/gobject/stable/gobject-Signals.html
+ *
+ * The first three parameters are mandatory. The last one is optional.
+ *
+ * For example:
+ *   ATK:AtkObject:state-change
+ *   ATK:AtkText:text-selection-changed
+ *   ATK:AtkText:text-insert:system
+ *
+ * Toolkit implementor note: ATK provides a default implementation for
+ * this virtual method. ATK implementors are discouraged from
+ * reimplementing this method.
+ *
+ * Toolkit implementor note: this method is not intended to be used by
+ * ATK implementors but by ATK consumers.
+ *
+ * ATK consumers note: as this method adds a listener for a given ATK
+ * type, that type should be already registered on the GType system
+ * before calling this method. A simple way to do that is creating an
+ * instance of #AtkNoOpObject. This class implements all ATK
+ * interfaces, so creating the instance will register all ATK types as
+ * a collateral effect.
+ *
+ * Returns: added event listener id, or 0 on failure.
+ **/
+guint
+atk_add_global_event_listener (GSignalEmissionHook listener,
+                               const gchar *event_type)
+{
+  guint retval;
+  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
+
+  if (klass->add_global_event_listener)
+    {
+      retval = klass->add_global_event_listener (listener, event_type);
+    }
+  else
+    {
+      retval = 0;
+    }
+  g_type_class_unref (klass);
+
+  return retval;
+}
+
+/**
+ * atk_remove_global_event_listener:
+ * @listener_id: the id of the event listener to remove
+ *
+ * @listener_id is the value returned by #atk_add_global_event_listener
+ * when you registered that event listener.
+ *
+ * Toolkit implementor note: ATK provides a default implementation for
+ * this virtual method. ATK implementors are discouraged from
+ * reimplementing this method.
+ *
+ * Toolkit implementor note: this method is not intended to be used by
+ * ATK implementors but by ATK consumers.
+ *
+ * Removes the specified event listener
+ **/
+void
+atk_remove_global_event_listener (guint listener_id)
+{
+  AtkUtilClass *klass = g_type_class_peek (ATK_TYPE_UTIL);
+
+  if (klass && klass->remove_global_event_listener)
+    klass->remove_global_event_listener (listener_id);
+}
+
+/**
+ * atk_add_key_event_listener: (skip)
+ * @listener: the listener to notify
+ * @data: a #gpointer that points to a block of data that should be sent to the registered listeners,
+ *        along with the event notification, when it occurs.
+ *
+ * Adds the specified function to the list of functions to be called
+ *        when a key event occurs.  The @data element will be passed to the
+ *        #AtkKeySnoopFunc (@listener) as the @func_data param, on notification.
+ *
+ * Returns: added event listener id, or 0 on failure.
+ **/
+guint
+atk_add_key_event_listener (AtkKeySnoopFunc listener, gpointer data)
+{
+  guint retval;
+  AtkUtilClass *klass = g_type_class_peek (ATK_TYPE_UTIL);
+  if (klass && klass->add_key_event_listener)
+    {
+      retval = klass->add_key_event_listener (listener, data);
+    }
+  else
+    {
+      retval = 0;
+    }
+
+  return retval;
+}
+
+/**
+ * atk_remove_key_event_listener:
+ * @listener_id: the id of the event listener to remove
+ *
+ * @listener_id is the value returned by #atk_add_key_event_listener
+ * when you registered that event listener.
+ *
+ * Removes the specified event listener.
+ **/
+void
+atk_remove_key_event_listener (guint listener_id)
+{
+  AtkUtilClass *klass = g_type_class_peek (ATK_TYPE_UTIL);
+
+  if (klass->remove_key_event_listener)
+    klass->remove_key_event_listener (listener_id);
+}
+
+/**
+ * atk_get_root:
+ *
+ * Gets the root accessible container for the current application.
+ *
+ * Returns: (transfer none): the root accessible container for the current
+ * application
+ **/
+AtkObject *
+atk_get_root (void)
+{
+  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
+  AtkObject *retval;
+
+  if (klass->get_root)
+    {
+      retval = klass->get_root ();
+    }
+  else
+    {
+      retval = NULL;
+    }
+  g_type_class_unref (klass);
+
+  return retval;
+}
+
+/**
+ * atk_get_focus_object:
+ *
+ * Gets the currently focused object.
+ *
+ * Since: 1.6
+ *
+ * Returns: (transfer none): the currently focused object for the current
+ * application
+ **/
+AtkObject *
+atk_get_focus_object (void)
+{
+  return previous_focus_object;
+}
+
+/**
+ * atk_get_toolkit_name:
+ *
+ * Gets name string for the GUI toolkit implementing ATK for this application.
+ *
+ * Returns: name string for the GUI toolkit implementing ATK for this application
+ **/
+const gchar *
+atk_get_toolkit_name (void)
+{
+  const gchar *retval;
+  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
+  if (klass->get_toolkit_name)
+    {
+      retval = klass->get_toolkit_name ();
+    }
+  else
+    {
+      retval = NULL;
+    }
+  g_type_class_unref (klass);
+
+  return retval;
+}
+
+/**
+ * atk_get_toolkit_version:
+ *
+ * Gets version string for the GUI toolkit implementing ATK for this application.
+ *
+ * Returns: version string for the GUI toolkit implementing ATK for this application
+ **/
+const gchar *
+atk_get_toolkit_version (void)
+{
+  const gchar *retval;
+  AtkUtilClass *klass = g_type_class_ref (ATK_TYPE_UTIL);
+  if (klass->get_toolkit_version)
+    {
+      retval = klass->get_toolkit_version ();
+    }
+  else
+    {
+      retval = NULL;
+    }
+  g_type_class_unref (klass);
+
+  return retval;
+}
+
+/**
+ * atk_get_version:
+ *
+ * Gets the current version for ATK.
+ *
+ * Returns: version string for ATK
+ *
+ * Since: 1.20
+ */
+const gchar *
+atk_get_version (void)
+{
+  return ATK_VERSION;
+}
+
+static void
+atk_util_class_init (AtkUtilClass *klass)
+{
+  klass->add_global_event_listener = atk_util_real_add_global_event_listener;
+  klass->remove_global_event_listener = atk_util_real_remove_global_event_listener;
+  klass->get_root = NULL;
+  klass->get_toolkit_name = NULL;
+  klass->get_toolkit_version = NULL;
+
+  listener_list = g_hash_table_new_full (g_int_hash, g_int_equal, NULL,
+                                         g_free);
+}
diff --git a/atk/atkutil.h b/atk/atkutil.h
new file mode 100644 (file)
index 0000000..844fe2a
--- /dev/null
@@ -0,0 +1,367 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_UTIL_H__
+#define __ATK_UTIL_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_UTIL (atk_util_get_type ())
+#define ATK_IS_UTIL(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_UTIL)
+#define ATK_UTIL(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_UTIL, AtkUtil)
+#define ATK_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_UTIL, AtkUtilClass))
+#define ATK_IS_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_UTIL))
+#define ATK_UTIL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_UTIL, AtkUtilClass))
+
+#ifndef _TYPEDEF_ATK_UTIL_
+#define _TYPEDEF_ATK_UTIL_
+typedef struct _AtkUtil AtkUtil;
+typedef struct _AtkUtilClass AtkUtilClass;
+typedef struct _AtkKeyEventStruct AtkKeyEventStruct;
+#endif
+
+/**
+ * AtkEventListener:
+ * @obj: An #AtkObject instance for whom the callback will be called when
+ * the specified event (e.g. 'focus:') takes place.
+ *
+ * A function which is called when an object emits a matching event,
+ * as used in #atk_add_focus_tracker.
+ * Currently the only events for which object-specific handlers are
+ * supported are events of type "focus:".  Most clients of ATK will prefer to
+ * attach signal handlers for the various ATK signals instead.
+ *
+ * see [id@atk_add_focus_tracker]
+ **/
+typedef void (*AtkEventListener) (AtkObject *obj);
+/**
+ * AtkEventListenerInit:
+ *
+ * An #AtkEventListenerInit function is a special function that is
+ * called in order to initialize the per-object event registration system
+ * used by #AtkEventListener, if any preparation is required.
+ *
+ * see [id@atk_focus_tracker_init]
+ **/
+typedef void (*AtkEventListenerInit) (void);
+/**
+ * AtkKeySnoopFunc:
+ * @event: an AtkKeyEventStruct containing information about the key event for which
+ * notification is being given.
+ * @user_data: a block of data which will be passed to the event listener, on notification.
+ *
+ * An #AtkKeySnoopFunc is a type of callback which is called whenever a key event occurs,
+ * if registered via atk_add_key_event_listener.  It allows for pre-emptive
+ * interception of key events via the return code as described below.
+ *
+ * Returns: TRUE (nonzero) if the event emission should be stopped and the event
+ * discarded without being passed to the normal GUI recipient; FALSE (zero) if the
+ * event dispatch to the client application should proceed as normal.
+ *
+ * see [id@atk_add_key_event_listener]
+ **/
+typedef gint (*AtkKeySnoopFunc) (AtkKeyEventStruct *event,
+                                 gpointer user_data);
+
+/**
+ * AtkKeyEventStruct:
+ * @type: An AtkKeyEventType, generally one of ATK_KEY_EVENT_PRESS or ATK_KEY_EVENT_RELEASE
+ * @state: A bitmask representing the state of the modifier keys immediately after the event takes place.
+ * The meaning of the bits is currently defined to match the bitmask used by GDK in
+ * GdkEventType.state, see
+ * http://developer.gnome.org/doc/API/2.0/gdk/gdk-Event-Structures.html#GdkEventKey
+ * @keyval: A guint representing a keysym value corresponding to those used by GDK and X11: see
+ * /usr/X11/include/keysymdef.h.
+ * @length: The length of member #string.
+ * @string: A string containing one of the following: either a string approximating the text that would
+ * result from this keypress, if the key is a control or graphic character, or a symbolic name for this keypress.
+ * Alphanumeric and printable keys will have the symbolic key name in this string member, for instance "A". "0",
+ * "semicolon", "aacute".  Keypad keys have the prefix "KP".
+ * @keycode: The raw hardware code that generated the key event.  This field is raraly useful.
+ * @timestamp: A timestamp in milliseconds indicating when the event occurred.
+ * These timestamps are relative to a starting point which should be considered arbitrary,
+ * and only used to compare the dispatch times of events to one another.
+ *
+ * Encapsulates information about a key event.
+ **/
+struct _AtkKeyEventStruct
+{
+  gint type;
+  guint state;
+  guint keyval;
+  gint length;
+  gchar *string;
+  guint16 keycode;
+  guint32 timestamp;
+};
+
+/**
+ *AtkKeyEventType:
+ *@ATK_KEY_EVENT_PRESS: specifies a key press event
+ *@ATK_KEY_EVENT_RELEASE: specifies a key release event
+ *@ATK_KEY_EVENT_LAST_DEFINED: Not a valid value; specifies end of enumeration
+ *
+ *Specifies the type of a keyboard evemt.
+ **/
+typedef enum
+{
+  ATK_KEY_EVENT_PRESS,
+  ATK_KEY_EVENT_RELEASE,
+  ATK_KEY_EVENT_LAST_DEFINED
+} AtkKeyEventType;
+
+struct _AtkUtil
+{
+  GObject parent;
+};
+
+/**
+ * AtkUtilClass:
+ * @add_global_event_listener: adds the specified function to the list
+ *  of functions to be called when an ATK event occurs. ATK
+ *  implementors are discouraged from reimplementing this method.
+ * @remove_global_event_listener: removes the specified function to
+ *  the list of functions to be called when an ATK event occurs. ATK
+ *  implementors are discouraged from reimplementing this method.
+ * @add_key_event_listener: adds the specified function to the list of
+ *  functions to be called when a key event occurs.
+ * @remove_key_event_listener: remove the specified function to the
+ *  list of functions to be called when a key event occurs.
+ * @get_root: gets the root accessible container for the current
+ *  application.
+ * @get_toolkit_name: gets name string for the GUI toolkit
+ *  implementing ATK for this application.
+ * @get_toolkit_version: gets version string for the GUI toolkit
+ *  implementing ATK for this application.
+ *
+ */
+struct _AtkUtilClass
+{
+  GObjectClass parent;
+  guint (*add_global_event_listener) (GSignalEmissionHook listener,
+                                      const gchar *event_type);
+  void (*remove_global_event_listener) (guint listener_id);
+  guint (*add_key_event_listener) (AtkKeySnoopFunc listener,
+                                   gpointer data);
+  void (*remove_key_event_listener) (guint listener_id);
+  AtkObject *(*get_root) (void);
+  const gchar *(*get_toolkit_name) (void);
+  const gchar *(*get_toolkit_version) (void);
+};
+ATK_AVAILABLE_IN_ALL
+GType atk_util_get_type (void);
+
+/**
+ *AtkCoordType:
+ *@ATK_XY_SCREEN: specifies xy coordinates relative to the screen
+ *@ATK_XY_WINDOW: specifies xy coordinates relative to the widget's
+ * top-level window
+ *@ATK_XY_PARENT: specifies xy coordinates relative to the widget's
+ * immediate parent. Since: 2.30
+ *
+ *Specifies how xy coordinates are to be interpreted. Used by functions such
+ *as atk_component_get_position() and atk_text_get_character_extents()
+ **/
+typedef enum
+{
+  ATK_XY_SCREEN,
+  ATK_XY_WINDOW,
+  ATK_XY_PARENT
+} AtkCoordType;
+
+ATK_DEPRECATED_IN_2_10
+guint atk_add_focus_tracker (AtkEventListener focus_tracker);
+ATK_DEPRECATED_IN_2_10
+void atk_remove_focus_tracker (guint tracker_id);
+ATK_DEPRECATED_IN_2_10
+void atk_focus_tracker_init (AtkEventListenerInit init);
+ATK_DEPRECATED_IN_2_10
+void atk_focus_tracker_notify (AtkObject *object);
+ATK_AVAILABLE_IN_ALL
+guint atk_add_global_event_listener (GSignalEmissionHook listener,
+                                     const gchar *event_type);
+ATK_AVAILABLE_IN_ALL
+void atk_remove_global_event_listener (guint listener_id);
+ATK_AVAILABLE_IN_ALL
+guint atk_add_key_event_listener (AtkKeySnoopFunc listener, gpointer data);
+ATK_AVAILABLE_IN_ALL
+void atk_remove_key_event_listener (guint listener_id);
+
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_get_root (void);
+ATK_AVAILABLE_IN_ALL
+AtkObject *atk_get_focus_object (void);
+
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_get_toolkit_name (void);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_get_toolkit_version (void);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_get_version (void);
+
+/* --- GType boilerplate --- */
+/* convenience macros for atk type implementations, which for a type GtkGadgetAccessible will:
+ * - prototype: static void     gtk_gadget_accessible_class_init (GtkGadgetClass *klass);
+ * - prototype: static void     gtk_gadget_accessible_init       (GtkGadget      *self);
+ * - define:    static gpointer gtk_gadget_accessible_parent_class = NULL;
+ *   gtk_gadget_accessible_parent_class is initialized prior to calling gtk_gadget_class_init()
+ * - implement: GType           gtk_gadget_accessible_get_type (void) { ... }
+ * - support custom code in gtk_gadget_accessible_get_type() after the type is registered.
+ *
+ * macro arguments: TypeName, type_name, TYPE_PARENT, CODE
+ * example: ATK_DEFINE_TYPE_WITH_CODE (GtkGadgetAccessible, gtk_gadget_accessible, GTK_TYPE_GADGET,
+ *                                     G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE, gtk_gadget_accessible_table_iface_init))
+ */
+
+/**
+ * ATK_DEFINE_TYPE:
+ * @TN: The name of the new type, in Camel case.
+ * @t_n: The name of the new type, in lowercase, with words separated by '_'.
+ * @T_P: The #GType of the parent type.
+ *
+ * A convenience macro for type ATK implementations, which declares a class
+ * initialization function, an instance initialization function (see #GTypeInfo
+ * for information about these) and a static variable named
+ * @t_n _parent_class pointing to the parent class. Furthermore, it
+ * defines a _get_type() function.
+ *
+ * Since: 1.22
+ */
+#define ATK_DEFINE_TYPE(TN, t_n, T_P) ATK_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
+
+/**
+ * ATK_DEFINE_TYPE_WITH_CODE:
+ * @TN: The name of the new type, in Camel case.
+ * @t_n: The name of the new type in lowercase, with words separated by '_'.
+ * @T_P: The #GType of the parent type.
+ * @_C_: Custom code that gets inserted in the _get_type() function.
+ *
+ * A convenience macro for ATK type implementations.
+ * Similar to ATK_DEFINE_TYPE(), but allows you to insert custom code into the
+ * _get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE().
+ *
+ * Since: 1.22
+ */
+#define ATK_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_)         \
+  _ATK_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) { _C_; } \
+  _ATK_DEFINE_TYPE_EXTENDED_END ()
+
+/**
+ * ATK_DEFINE_ABSTRACT_TYPE:
+ * @TN: The name of the new type, in Camel case.
+ * @t_n: The name of the new type, in lowercase, with words separated by '_'.
+ * @T_P: The #GType of the parent type.
+ *
+ * A convenience macro for ATK type implementations.
+ * Similar to ATK_DEFINE_TYPE(), but defines an abstract type.
+ *
+ * Since: 1.22
+ */
+#define ATK_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) ATK_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {})
+
+/**
+ * ATK_DEFINE_ABSTRACT_TYPE_WITH_CODE:
+ * @TN: The name of the new type, in Camel case.
+ * @t_n: The name of the new type, in lowercase, with words separated by '_'.
+ * @T_P: The #GType of the parent type.
+ * @_C_: Custom code that gets inserted in the _get_type() function.
+ *
+ * A convenience macro for ATK type implementations.
+ * Similar to ATK_DEFINE_TYPE_WITH_CODE(), but defines an abstract type.
+ *
+ * Since: 1.22
+ */
+#define ATK_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_)                   \
+  _ATK_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) { _C_; } \
+  _ATK_DEFINE_TYPE_EXTENDED_END ()
+
+/**
+ * ATK_DEFINE_TYPE_EXTENDED:
+ * @TN: The name of the new type, in Camel case.
+ * @t_n: The name of the new type, in lowercase, with words separated by '_'.
+ * @T_P: The #GType of the parent type.
+ * @_f_: #GTypeFlags to pass to g_type_register_static()
+ * @_C_: Custom code that gets inserted in the _get_type() function.
+ *
+ * The most general convenience macro for ATK type implementations, on which
+ * ATK_DEFINE_TYPE(), etc are based.
+ *
+ * Since: 1.22
+ */
+#define ATK_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_)       \
+  _ATK_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) { _C_; } \
+  _ATK_DEFINE_TYPE_EXTENDED_END ()
+
+#define _ATK_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE, flags)                  \
+                                                                                           \
+  static void type_name##_init (TypeName *self);                                           \
+  static void type_name##_class_init (TypeName##Class *klass);                             \
+  static gpointer type_name##_parent_class = NULL;                                         \
+  static void type_name##_class_intern_init (gpointer klass)                               \
+  {                                                                                        \
+    type_name##_parent_class = g_type_class_peek_parent (klass);                           \
+    type_name##_class_init ((TypeName##Class *) klass);                                    \
+  }                                                                                        \
+                                                                                           \
+  ATK_AVAILABLE_IN_ALL                                                                     \
+  GType                                                                                    \
+      type_name##_get_type (void)                                                          \
+  {                                                                                        \
+    static volatile gsize g_define_type_id__volatile = 0;                                  \
+    if (g_once_init_enter (&g_define_type_id__volatile))                                   \
+      {                                                                                    \
+        AtkObjectFactory *factory;                                                         \
+        GType derived_type;                                                                \
+        GTypeQuery query;                                                                  \
+        GType derived_atk_type;                                                            \
+        GType g_define_type_id;                                                            \
+                                                                                           \
+        /* Figure out the size of the class and instance we are deriving from */           \
+        derived_type = g_type_parent (TYPE);                                               \
+        factory = atk_registry_get_factory (atk_get_default_registry (),                   \
+                                            derived_type);                                 \
+        derived_atk_type = atk_object_factory_get_accessible_type (factory);               \
+        g_type_query (derived_atk_type, &query);                                           \
+                                                                                           \
+        g_define_type_id =                                                                 \
+            g_type_register_static_simple (derived_atk_type,                               \
+                                           g_intern_static_string (#TypeName),             \
+                                           query.class_size,                               \
+                                           (GClassInitFunc) type_name##_class_intern_init, \
+                                           query.instance_size,                            \
+                                           (GInstanceInitFunc) type_name##_init,           \
+                                           (GTypeFlags) flags);                            \
+        { /* custom code follows */
+#define _ATK_DEFINE_TYPE_EXTENDED_END()                              \
+  /* following custom code */                                        \
+  }                                                                  \
+  g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
+  }                                                                  \
+  return g_define_type_id__volatile;                                 \
+  } /* closes type_name##_get_type() */
+
+G_END_DECLS
+
+#endif /* __ATK_UTIL_H__ */
diff --git a/atk/atkvalue.c b/atk/atkvalue.c
new file mode 100644 (file)
index 0000000..ecef4d9
--- /dev/null
@@ -0,0 +1,747 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001, 2002, 2003 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+#include <string.h>
+
+#include "atk-enum-types.h"
+#include "atkmarshal.h"
+#include "atkprivate.h"
+#include "atkvalue.h"
+
+/**
+ * AtkValue:
+ *
+ * The ATK interface implemented by valuators and components which display or select a value from a bounded range of values.
+ *
+ * #AtkValue should be implemented for components which either display
+ * a value from a bounded range, or which allow the user to specify a
+ * value from a bounded range, or both. For instance, most sliders and
+ * range controls, as well as dials, should have #AtkObject
+ * representations which implement #AtkValue on the component's
+ * behalf. #AtKValues may be read-only, in which case attempts to
+ * alter the value return would fail.
+ *
+ * <refsect1 id="current-value-text">
+ * <title>On the subject of current value text</title>
+ * <para>
+ * In addition to providing the current value, implementors can
+ * optionally provide an end-user-consumable textual description
+ * associated with this value. This description should be included
+ * when the numeric value fails to convey the full, on-screen
+ * representation seen by users.
+ * </para>
+ *
+ * <example>
+ * <title>Password strength</title>
+ * A password strength meter whose value changes as the user types
+ * their new password. Red is used for values less than 4.0, yellow
+ * for values between 4.0 and 7.0, and green for values greater than
+ * 7.0. In this instance, value text should be provided by the
+ * implementor. Appropriate value text would be "weak", "acceptable,"
+ * and "strong" respectively.
+ * </example>
+ *
+ * A level bar whose value changes to reflect the battery charge. The
+ * color remains the same regardless of the charge and there is no
+ * on-screen text reflecting the fullness of the battery. In this
+ * case, because the position within the bar is the only indication
+ * the user has of the current charge, value text should not be
+ * provided by the implementor.
+ *
+ * <refsect2 id="implementor-notes">
+ * <title>Implementor Notes</title>
+ * <para>
+ * Implementors should bear in mind that assistive technologies will
+ * likely prefer the value text provided over the numeric value when
+ * presenting a widget's value. As a result, strings not intended for
+ * end users should not be exposed in the value text, and strings
+ * which are exposed should be localized. In the case of widgets which
+ * display value text on screen, for instance through a separate label
+ * in close proximity to the value-displaying widget, it is still
+ * expected that implementors will expose the value text using the
+ * above API.
+ * </para>
+ *
+ * <para>
+ * #AtkValue should NOT be implemented for widgets whose displayed
+ * value is not reflective of a meaningful amount. For instance, a
+ * progress pulse indicator whose value alternates between 0.0 and 1.0
+ * to indicate that some process is still taking place should not
+ * implement #AtkValue because the current value does not reflect
+ * progress towards completion.
+ * </para>
+ * </refsect2>
+ * </refsect1>
+ *
+ * <refsect1 id="ranges">
+ * <title>On the subject of ranges</title>
+ * <para>
+ * In addition to providing the minimum and maximum values,
+ * implementors can optionally provide details about subranges
+ * associated with the widget. These details should be provided by the
+ * implementor when both of the following are communicated visually to
+ * the end user:
+ * </para>
+ * <itemizedlist>
+ *   <listitem>The existence of distinct ranges such as "weak",
+ *   "acceptable", and "strong" indicated by color, bar tick marks,
+ *   and/or on-screen text.</listitem>
+ *   <listitem>Where the current value stands within a given subrange,
+ *   for instance illustrating progression from very "weak" towards
+ *   nearly "acceptable" through changes in shade and/or position on
+ *   the bar within the "weak" subrange.</listitem>
+ * </itemizedlist>
+ * <para>
+ * If both of the above do not apply to the widget, it should be
+ * sufficient to expose the numeric value, along with the value text
+ * if appropriate, to make the widget accessible.
+ * </para>
+ *
+ * <refsect2 id="ranges-implementor-notes">
+ * <title>Implementor Notes</title>
+ * <para>
+ * If providing subrange details is deemed necessary, all possible
+ * values of the widget are expected to fall within one of the
+ * subranges defined by the implementor.
+ * </para>
+ * </refsect2>
+ * </refsect1>
+ *
+ * <refsect1 id="localization">
+ * <title>On the subject of localization of end-user-consumable text
+ * values</title>
+ * <para>
+ * Because value text and subrange descriptors are human-consumable,
+ * implementors are expected to provide localized strings which can be
+ * directly presented to end users via their assistive technology. In
+ * order to simplify this for implementors, implementors can use
+ * atk_value_type_get_localized_name() with the following
+ * already-localized constants for commonly-needed values can be used:
+ * </para>
+ *
+ * <itemizedlist>
+ *   <listitem>ATK_VALUE_VERY_WEAK</listitem>
+ *   <listitem>ATK_VALUE_WEAK</listitem>
+ *   <listitem>ATK_VALUE_ACCEPTABLE</listitem>
+ *   <listitem>ATK_VALUE_STRONG</listitem>
+ *   <listitem>ATK_VALUE_VERY_STRONG</listitem>
+ *   <listitem>ATK_VALUE_VERY_LOW</listitem>
+ *   <listitem>ATK_VALUE_LOW</listitem>
+ *   <listitem>ATK_VALUE_MEDIUM</listitem>
+ *   <listitem>ATK_VALUE_HIGH</listitem>
+ *   <listitem>ATK_VALUE_VERY_HIGH</listitem>
+ *   <listitem>ATK_VALUE_VERY_BAD</listitem>
+ *   <listitem>ATK_VALUE_BAD</listitem>
+ *   <listitem>ATK_VALUE_GOOD</listitem>
+ *   <listitem>ATK_VALUE_VERY_GOOD</listitem>
+ *   <listitem>ATK_VALUE_BEST</listitem>
+ *   <listitem>ATK_VALUE_SUBSUBOPTIMAL</listitem>
+ *   <listitem>ATK_VALUE_SUBOPTIMAL</listitem>
+ *   <listitem>ATK_VALUE_OPTIMAL</listitem>
+ * </itemizedlist>
+ * <para>
+ * Proposals for additional constants, along with their use cases,
+ * should be submitted to the GNOME Accessibility Team.
+ * </para>
+ * </refsect1>
+ *
+ * <refsect1 id="changes">
+ * <title>On the subject of changes</title>
+ * <para>
+ * Note that if there is a textual description associated with the new
+ * numeric value, that description should be included regardless of
+ * whether or not it has also changed.
+ * </para>
+ * </refsect1>
+ */
+
+static GPtrArray *value_type_names = NULL;
+
+enum
+{
+  VALUE_CHANGED,
+  LAST_SIGNAL
+};
+
+/* These are listed here for extraction by intltool */
+#if 0
+/* Translators: This string describes a range within value-related
+ * widgets such as a password-strength meter. Note that what such a
+ * widget presents is controlled by application developers. Thus
+ * assistive technologies such as screen readers are expected to
+ * present this string alone or as a token in a list.
+ */
+N_("very weak")
+/* Translators: This string describes a range within value-related
+ * widgets such as a password-strength meter. Note that what such a
+ * widget presents is controlled by application developers. Thus
+ * assistive technologies such as screen readers are expected to
+ * present this string alone or as a token in a list.
+ */
+N_("weak")
+/* Translators: This string describes a range within value-related
+ * widgets such as a password-strength meter. Note that what such a
+ * widget presents is controlled by application developers. Thus
+ * assistive technologies such as screen readers are expected to
+ * present this string alone or as a token in a list.
+ */
+N_("acceptable")
+/* Translators: This string describes a range within value-related
+ * widgets such as a password-strength meter. Note that what such a
+ * widget presents is controlled by application developers. Thus
+ * assistive technologies such as screen readers are expected to
+ * present this string alone or as a token in a list.
+ */
+N_("strong")
+/* Translators: This string describes a range within value-related
+ * widgets such as a password-strength meter. Note that what such a
+ * widget presents is controlled by application developers. Thus
+ * assistive technologies such as screen readers are expected to
+ * present this string alone or as a token in a list.
+ */
+N_("very strong")
+/* Translators: This string describes a range within value-related
+ * widgets such as a volume slider. Note that what such a widget
+ * presents (e.g. temperature, volume, price) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("very low")
+/* Translators: This string describes a range within value-related
+ * widgets such as a volume slider. Note that what such a widget
+ * presents (e.g. temperature, volume, price) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("medium")
+/* Translators: This string describes a range within value-related
+ * widgets such as a volume slider. Note that what such a widget
+ * presents (e.g. temperature, volume, price) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("high")
+/* Translators: This string describes a range within value-related
+ * widgets such as a volume slider. Note that what such a widget
+ * presents (e.g. temperature, volume, price) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("very high")
+/* Translators: This string describes a range within value-related
+ * widgets such as a hard drive usage. Note that what such a widget
+ * presents (e.g. hard drive usage, network traffic) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("very bad")
+/* Translators: This string describes a range within value-related
+ * widgets such as a hard drive usage. Note that what such a widget
+ * presents (e.g. hard drive usage, network traffic) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("bad")
+/* Translators: This string describes a range within value-related
+ * widgets such as a hard drive usage. Note that what such a widget
+ * presents (e.g. hard drive usage, network traffic) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("good")
+/* Translators: This string describes a range within value-related
+ * widgets such as a hard drive usage. Note that what such a widget
+ * presents (e.g. hard drive usage, network traffic) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("very good")
+/* Translators: This string describes a range within value-related
+ * widgets such as a hard drive usage. Note that what such a widget
+ * presents (e.g. hard drive usage, network traffic) is controlled by
+ * application developers. Thus assistive technologies such as screen
+ * readers are expected to present this string alone or as a token in
+ * a list.
+ */
+N_("best")
+#endif
+
+static void atk_value_base_init (AtkValueIface *class);
+
+static guint atk_value_signals[LAST_SIGNAL] = { 0 };
+
+GType
+atk_value_get_type (void)
+{
+  static GType type = 0;
+
+  if (!type)
+    {
+      GTypeInfo tinfo = {
+        sizeof (AtkValueIface),
+        (GBaseInitFunc) atk_value_base_init,
+        (GBaseFinalizeFunc) NULL,
+
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtkValue", &tinfo, 0);
+    }
+
+  return type;
+}
+
+static void
+atk_value_base_init (AtkValueIface *class)
+{
+  static gboolean initialized = FALSE;
+  if (!initialized)
+    {
+      /**
+       * AtkValue::value-changed:
+       * @atkvalue: the object on which the signal was emitted.
+       * @value: the new value in a numerical form.
+       * @text: human readable text alternative (also called
+       * description) of this object. NULL if not available.
+       *
+       * The 'value-changed' signal is emitted when the current value
+       * that represent the object changes. @value is the numerical
+       * representation of this new value.  @text is the human
+       * readable text alternative of @value, and can be NULL if it is
+       * not available. Note that if there is a textual description
+       * associated with the new numeric value, that description
+       * should be included regardless of whether or not it has also
+       * changed.
+       *
+       * Example: a password meter whose value changes as the user
+       * types their new password. Appropiate value text would be
+       * "weak", "acceptable" and "strong".
+       *
+       * Since: 2.12
+       */
+      atk_value_signals[VALUE_CHANGED] =
+          g_signal_new ("value_changed",
+                        ATK_TYPE_VALUE,
+                        G_SIGNAL_RUN_LAST,
+                        0,
+                        (GSignalAccumulator) NULL, NULL,
+                        atk_marshal_VOID__DOUBLE_STRING,
+                        G_TYPE_NONE,
+                        2, G_TYPE_DOUBLE, G_TYPE_STRING);
+
+      initialized = TRUE;
+    }
+}
+
+/**
+ * atk_value_get_current_value:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @value: (out): a #GValue representing the current accessible value
+ *
+ * Gets the value of this object.
+ *
+ * Deprecated: Since 2.12. Use atk_value_get_value_and_text()
+ * instead.
+ **/
+void
+atk_value_get_current_value (AtkValue *obj,
+                             GValue *value)
+{
+  AtkValueIface *iface;
+
+  g_return_if_fail (value != NULL);
+  g_return_if_fail (ATK_IS_VALUE (obj));
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_current_value)
+    {
+      if (G_IS_VALUE (value))
+        g_value_unset (value);
+      else
+        memset (value, 0, sizeof (*value));
+
+      (iface->get_current_value) (obj, value);
+    }
+}
+
+/**
+ * atk_value_get_maximum_value:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @value: (out): a #GValue representing the maximum accessible value
+ *
+ * Gets the maximum value of this object.
+ *
+ * Deprecated: Since 2.12. Use atk_value_get_range() instead.
+ **/
+void
+atk_value_get_maximum_value (AtkValue *obj,
+                             GValue *value)
+{
+  AtkValueIface *iface;
+
+  g_return_if_fail (value != NULL);
+  g_return_if_fail (ATK_IS_VALUE (obj));
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_maximum_value)
+    {
+      if (G_IS_VALUE (value))
+        g_value_unset (value);
+      else
+        memset (value, 0, sizeof (*value));
+
+      (iface->get_maximum_value) (obj, value);
+    }
+}
+
+/**
+ * atk_value_get_minimum_value:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @value: (out): a #GValue representing the minimum accessible value
+ *
+ * Gets the minimum value of this object.
+ *
+ * Deprecated: Since 2.12. Use atk_value_get_range() instead.
+ **/
+void
+atk_value_get_minimum_value (AtkValue *obj,
+                             GValue *value)
+{
+  AtkValueIface *iface;
+
+  g_return_if_fail (value != NULL);
+  g_return_if_fail (ATK_IS_VALUE (obj));
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_minimum_value)
+    {
+      if (G_IS_VALUE (value))
+        g_value_unset (value);
+      else
+        memset (value, 0, sizeof (*value));
+
+      (iface->get_minimum_value) (obj, value);
+    }
+}
+
+/**
+ * atk_value_get_minimum_increment:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @value: (out): a #GValue representing the minimum increment by which the accessible value may be changed
+ *
+ * Gets the minimum increment by which the value of this object may be changed.  If zero,
+ * the minimum increment is undefined, which may mean that it is limited only by the
+ * floating point precision of the platform.
+ *
+ * Since: 1.12
+ *
+ * Deprecated: Since 2.12. Use atk_value_get_increment() instead.
+ **/
+void
+atk_value_get_minimum_increment (AtkValue *obj,
+                                 GValue *value)
+{
+  AtkValueIface *iface;
+
+  g_return_if_fail (value != NULL);
+  g_return_if_fail (ATK_IS_VALUE (obj));
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_minimum_increment)
+    {
+      if (G_IS_VALUE (value))
+        g_value_unset (value);
+      else
+        memset (value, 0, sizeof (*value));
+
+      (iface->get_minimum_increment) (obj, value);
+    }
+}
+
+/**
+ * atk_value_set_current_value:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @value: a #GValue which is the desired new accessible value.
+ *
+ * Sets the value of this object.
+ *
+ * Returns: %TRUE if new value is successfully set, %FALSE otherwise.
+ *
+ * Deprecated: Since 2.12. Use atk_value_set_value() instead.
+ **/
+gboolean
+atk_value_set_current_value (AtkValue *obj,
+                             const GValue *value)
+{
+  AtkValueIface *iface;
+
+  g_return_val_if_fail (ATK_IS_VALUE (obj), FALSE);
+  g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->set_current_value)
+    return (iface->set_current_value) (obj, value);
+  else
+    return FALSE;
+}
+
+/**
+ * atk_value_get_value_and_text:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @value: (out): address of #gdouble to put the current value of @obj
+ * @text: (out) (allow-none): address of #gchar to put the human
+ * readable text alternative for @value
+ *
+ * Gets the current value and the human readable text alternative of
+ * @obj. @text is a newly created string, that must be freed by the
+ * caller. Can be NULL if no descriptor is available.
+ *
+ * Since: 2.12
+ **/
+
+void
+atk_value_get_value_and_text (AtkValue *obj,
+                              gdouble *value,
+                              gchar **text)
+{
+  AtkValueIface *iface;
+
+  g_return_if_fail (ATK_IS_VALUE (obj));
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_value_and_text)
+    {
+      (iface->get_value_and_text) (obj, value, text);
+    }
+  else
+    {
+      *value = 0.0;
+      if (text)
+        *text = NULL;
+    }
+}
+
+/**
+ * atk_value_get_range:
+ * @obj: a GObject instance that implements AtkValueIface
+ *
+ * Gets the range of this object.
+ *
+ * Returns: (nullable) (transfer full): a newly allocated #AtkRange
+ * that represents the minimum, maximum and descriptor (if available)
+ * of @obj. NULL if that range is not defined.
+ *
+ * Since: 2.12
+ **/
+AtkRange *
+atk_value_get_range (AtkValue *obj)
+{
+  AtkValueIface *iface;
+
+  g_return_val_if_fail (ATK_IS_VALUE (obj), NULL);
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_range)
+    {
+      return (iface->get_range) (obj);
+    }
+  else
+    return NULL;
+}
+
+/**
+ * atk_value_get_increment:
+ * @obj: a GObject instance that implements AtkValueIface
+ *
+ * Gets the minimum increment by which the value of this object may be
+ * changed.  If zero, the minimum increment is undefined, which may
+ * mean that it is limited only by the floating point precision of the
+ * platform.
+ *
+ * Return value: the minimum increment by which the value of this
+ * object may be changed. zero if undefined.
+ *
+ * Since: 2.12
+ **/
+gdouble
+atk_value_get_increment (AtkValue *obj)
+{
+  AtkValueIface *iface;
+
+  g_return_val_if_fail (ATK_IS_VALUE (obj), 0);
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_increment)
+    {
+      return (iface->get_increment) (obj);
+    }
+  else
+    return 0;
+}
+
+/**
+ * atk_value_get_sub_ranges:
+ * @obj: a GObject instance that implements AtkValueIface
+ *
+ * Gets the list of subranges defined for this object. See #AtkValue
+ * introduction for examples of subranges and when to expose them.
+ *
+ * Returns: (element-type AtkRange) (transfer full): an #GSList of
+ * #AtkRange which each of the subranges defined for this object. Free
+ * the returns list with g_slist_free().
+ *
+ * Since: 2.12
+ **/
+GSList *
+atk_value_get_sub_ranges (AtkValue *obj)
+{
+  AtkValueIface *iface;
+
+  g_return_val_if_fail (ATK_IS_VALUE (obj), NULL);
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->get_sub_ranges)
+    {
+      return (iface->get_sub_ranges) (obj);
+    }
+  else
+    return NULL;
+}
+
+/**
+ * atk_value_set_value:
+ * @obj: a GObject instance that implements AtkValueIface
+ * @new_value: a double which is the desired new accessible value.
+ *
+ * Sets the value of this object.
+ *
+ * This method is intended to provide a way to change the value of the
+ * object. In any case, it is possible that the value can't be
+ * modified (ie: a read-only component). If the value changes due this
+ * call, it is possible that the text could change, and will trigger
+ * an #AtkValue::value-changed signal emission.
+ *
+ * Note for implementors: the deprecated atk_value_set_current_value()
+ * method returned TRUE or FALSE depending if the value was assigned
+ * or not. In the practice several implementors were not able to
+ * decide it, and returned TRUE in any case. For that reason it is not
+ * required anymore to return if the value was properly assigned or
+ * not.
+ *
+ * Since: 2.12
+ **/
+void
+atk_value_set_value (AtkValue *obj,
+                     const gdouble new_value)
+{
+  AtkValueIface *iface;
+
+  g_return_if_fail (ATK_IS_VALUE (obj));
+
+  iface = ATK_VALUE_GET_IFACE (obj);
+
+  if (iface->set_value)
+    {
+      (iface->set_value) (obj, new_value);
+    }
+}
+
+static void
+initialize_value_type_names ()
+{
+  GTypeClass *enum_class;
+  GEnumValue *enum_value;
+  int i;
+  gchar *value_type_name = NULL;
+
+  if (value_type_names)
+    return;
+
+  value_type_names = g_ptr_array_new ();
+  enum_class = g_type_class_ref (ATK_TYPE_VALUE_TYPE);
+  if (!G_IS_ENUM_CLASS (enum_class))
+    return;
+
+  for (i = 0; i < ATK_VALUE_LAST_DEFINED; i++)
+    {
+      enum_value = g_enum_get_value (G_ENUM_CLASS (enum_class), i);
+      value_type_name = g_strdup (enum_value->value_nick);
+      _compact_name (value_type_name);
+      g_ptr_array_add (value_type_names, value_type_name);
+    }
+
+  g_type_class_unref (enum_class);
+}
+
+/**
+ * atk_value_type_get_name:
+ * @value_type: The #AtkValueType whose name is required
+ *
+ * Gets the description string describing the #AtkValueType @value_type.
+ *
+ * Returns: the string describing the #AtkValueType
+ */
+const gchar *
+atk_value_type_get_name (AtkValueType value_type)
+{
+  g_return_val_if_fail (value_type >= 0, NULL);
+
+  if (!value_type_names)
+    initialize_value_type_names ();
+
+  if (value_type < value_type_names->len)
+    return g_ptr_array_index (value_type_names, value_type);
+
+  return NULL;
+}
+
+/**
+ * atk_value_type_get_localized_name:
+ * @value_type: The #AtkValueType whose localized name is required
+ *
+ * Gets the localized description string describing the #AtkValueType @value_type.
+ *
+ * Returns: the localized string describing the #AtkValueType
+ **/
+const gchar *
+atk_value_type_get_localized_name (AtkValueType value_type)
+{
+  _gettext_initialization ();
+
+  return dgettext (GETTEXT_PACKAGE, atk_value_type_get_name (value_type));
+}
diff --git a/atk/atkvalue.h b/atk/atkvalue.h
new file mode 100644 (file)
index 0000000..05a918e
--- /dev/null
@@ -0,0 +1,162 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_VALUE_H__
+#define __ATK_VALUE_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+#include <atk/atkrange.h>
+
+G_BEGIN_DECLS
+
+#define ATK_TYPE_VALUE (atk_value_get_type ())
+#define ATK_IS_VALUE(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_VALUE)
+#define ATK_VALUE(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_VALUE, AtkValue)
+#define ATK_VALUE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_VALUE, AtkValueIface))
+
+#ifndef _TYPEDEF_ATK_VALUE_
+#define _TYPEDEF_ATK_VALUE__
+typedef struct _AtkValue AtkValue;
+#endif
+typedef struct _AtkValueIface AtkValueIface;
+
+/**
+ * AtkValueType:
+ *
+ * Default types for a given value. Those are defined in order to
+ * easily get localized strings to describe a given value or a given
+ * subrange, using atk_value_type_get_localized_name().
+ *
+ */
+typedef enum
+{
+  ATK_VALUE_VERY_WEAK,
+  ATK_VALUE_WEAK,
+  ATK_VALUE_ACCEPTABLE,
+  ATK_VALUE_STRONG,
+  ATK_VALUE_VERY_STRONG,
+  ATK_VALUE_VERY_LOW,
+  ATK_VALUE_LOW,
+  ATK_VALUE_MEDIUM,
+  ATK_VALUE_HIGH,
+  ATK_VALUE_VERY_HIGH,
+  ATK_VALUE_VERY_BAD,
+  ATK_VALUE_BAD,
+  ATK_VALUE_GOOD,
+  ATK_VALUE_VERY_GOOD,
+  ATK_VALUE_BEST,
+  ATK_VALUE_LAST_DEFINED
+} AtkValueType;
+
+/**
+ * AtkValueIface:
+ * @get_current_value: This virtual function is deprecated since 2.12
+ *  and it should not be overriden.
+ * @get_maximum_value: This virtual function is deprecated since 2.12
+ *  and it should not be overriden.
+ * @get_minimum_value: This virtual function is deprecated since 2.12
+ *  and it should not be overriden.
+ * @set_current_value: This virtual function is deprecated since 2.12
+ *  and it should not be overriden.
+ * @get_minimum_increment: This virtual function is deprecated since
+ *  2.12 and it should not be overriden.
+ * @get_value_and_text: gets the current value and the human readable
+ * text alternative (if available) of this object. Since 2.12.
+ * @get_range: gets the range that defines the minimum and maximum
+ *  value of this object. Returns NULL if there is no range
+ *  defined. Since 2.12.
+ * @get_increment: gets the minimum increment by which the value of
+ *  this object may be changed. If zero it is undefined. Since 2.12.
+ * @get_sub_ranges: returns a list of different subranges, and their
+ *  description (if available) of this object. Returns NULL if there
+ *  is not subranges defined. Since 2.12.
+ * @set_value: sets the value of this object. Since 2.12.
+ */
+struct _AtkValueIface
+{
+  GTypeInterface parent;
+
+  /*<deprecated>*/
+  void (*get_current_value) (AtkValue *obj,
+                             GValue *value);
+  void (*get_maximum_value) (AtkValue *obj,
+                             GValue *value);
+  void (*get_minimum_value) (AtkValue *obj,
+                             GValue *value);
+  gboolean (*set_current_value) (AtkValue *obj,
+                                 const GValue *value);
+  void (*get_minimum_increment) (AtkValue *obj,
+                                 GValue *value);
+  /*</deprecated>*/
+  void (*get_value_and_text) (AtkValue *obj,
+                              gdouble *value,
+                              gchar **text);
+  AtkRange *(*get_range) (AtkValue *obj);
+  gdouble (*get_increment) (AtkValue *obj);
+  GSList *(*get_sub_ranges) (AtkValue *obj);
+  void (*set_value) (AtkValue *obj,
+                     const gdouble new_value);
+};
+
+ATK_AVAILABLE_IN_ALL
+GType atk_value_get_type (void);
+
+ATK_DEPRECATED_IN_2_12_FOR (atk_value_get_value_and_text)
+void atk_value_get_current_value (AtkValue *obj,
+                                  GValue *value);
+
+ATK_DEPRECATED_IN_2_12_FOR (atk_value_get_range)
+void atk_value_get_maximum_value (AtkValue *obj,
+                                  GValue *value);
+ATK_DEPRECATED_IN_2_12_FOR (atk_value_get_range)
+void atk_value_get_minimum_value (AtkValue *obj,
+                                  GValue *value);
+ATK_DEPRECATED_IN_2_12_FOR (atk_value_set_value)
+gboolean atk_value_set_current_value (AtkValue *obj,
+                                      const GValue *value);
+ATK_DEPRECATED_IN_2_12_FOR (atk_value_get_increment)
+void atk_value_get_minimum_increment (AtkValue *obj,
+                                      GValue *value);
+
+ATK_AVAILABLE_IN_2_12
+void atk_value_get_value_and_text (AtkValue *obj,
+                                   gdouble *value,
+                                   gchar **text);
+ATK_AVAILABLE_IN_2_12
+AtkRange *atk_value_get_range (AtkValue *obj);
+ATK_AVAILABLE_IN_2_12
+gdouble atk_value_get_increment (AtkValue *obj);
+ATK_AVAILABLE_IN_2_12
+GSList *atk_value_get_sub_ranges (AtkValue *obj);
+ATK_AVAILABLE_IN_2_12
+void atk_value_set_value (AtkValue *obj,
+                          const gdouble new_value);
+/* AtkValueType methods */
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_value_type_get_name (AtkValueType value_type);
+ATK_AVAILABLE_IN_ALL
+const gchar *atk_value_type_get_localized_name (AtkValueType value_type);
+
+G_END_DECLS
+
+#endif /* __ATK_VALUE_H__ */
diff --git a/atk/atkversion.c b/atk/atkversion.c
new file mode 100644 (file)
index 0000000..388a801
--- /dev/null
@@ -0,0 +1,131 @@
+/* ATK -  Accessibility Toolkit
+ *
+ * Copyright (C) 2012 Igalia, S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atk.h"
+
+/**
+ * atkversion:
+ *
+ * TODO title Versioning macros
+ *
+ * Variables and functions to check the ATK version
+ *
+ * ATK provides a set of macros and methods for checking the version
+ * of the library at compile and run time.
+ */
+
+/**
+ * atk_get_major_version:
+ *
+ * Returns the major version number of the ATK library.  (e.g. in ATK
+ * version 2.7.4 this is 2.)
+ *
+ * This function is in the library, so it represents the ATK library
+ * your code is running against. In contrast, the #ATK_MAJOR_VERSION
+ * macro represents the major version of the ATK headers you have
+ * included when compiling your code.
+ *
+ * Returns: the major version number of the ATK library
+ *
+ * Since: 2.8
+ */
+guint
+atk_get_major_version (void)
+{
+  return ATK_MAJOR_VERSION;
+}
+
+/**
+ * atk_get_minor_version:
+ *
+ * Returns the minor version number of the ATK library.  (e.g. in ATK
+ * version 2.7.4 this is 7.)
+ *
+ * This function is in the library, so it represents the ATK library
+ * your code is are running against. In contrast, the
+ * #ATK_MINOR_VERSION macro represents the minor version of the ATK
+ * headers you have included when compiling your code.
+ *
+ * Returns: the minor version number of the ATK library
+ *
+ * Since: 2.8
+ */
+guint
+atk_get_minor_version (void)
+{
+  return ATK_MINOR_VERSION;
+}
+
+/**
+ * atk_get_micro_version:
+ *
+ * Returns the micro version number of the ATK library.  (e.g. in ATK
+ * version 2.7.4 this is 4.)
+ *
+ * This function is in the library, so it represents the ATK library
+ * your code is are running against. In contrast, the
+ * #ATK_MICRO_VERSION macro represents the micro version of the ATK
+ * headers you have included when compiling your code.
+ *
+ * Returns: the micro version number of the ATK library
+ *
+ * Since: 2.8
+ */
+guint
+atk_get_micro_version (void)
+{
+  return ATK_MICRO_VERSION;
+}
+
+/**
+ * atk_get_binary_age:
+ *
+ * Returns the binary age as passed to libtool when building the ATK
+ * library the process is running against.
+ *
+ * Returns: the binary age of the ATK library
+ *
+ * Since: 2.8
+ */
+guint
+atk_get_binary_age (void)
+{
+  return ATK_BINARY_AGE;
+}
+
+/**
+ * atk_get_interface_age:
+ *
+ * Returns the interface age as passed to libtool when building the
+ * ATK library the process is running against.
+ *
+ * Returns: the interface age of the ATK library
+ *
+ * Since: 2.8
+ */
+guint
+atk_get_interface_age (void)
+{
+  return ATK_INTERFACE_AGE;
+}
diff --git a/atk/atkversion.h.in b/atk/atkversion.h.in
new file mode 100644 (file)
index 0000000..66ddf46
--- /dev/null
@@ -0,0 +1,476 @@
+/* ATK -  Accessibility Toolkit
+ *
+ * Copyright (C) 2012 Igalia, S.L.
+ * Copyright (C) 2014 Chun-wei Fan
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined (__ATK_H_INSIDE__) && !defined (ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#ifndef __ATK_VERSION_H__
+#define __ATK_VERSION_H__
+
+#include <glib.h>
+
+/**
+ * ATK_MAJOR_VERSION:
+ *
+ * Like atk_get_major_version(), but from the headers used at
+ * application compile time, rather than from the library linked
+ * against at application run time.
+ *
+ * Since: 2.7.4
+ */
+#define ATK_MAJOR_VERSION (@ATK_MAJOR_VERSION@)
+
+/**
+ * ATK_MINOR_VERSION:
+ *
+ * Like atk_get_minor_version(), but from the headers used at
+ * application compile time, rather than from the library linked
+ * against at application run time.
+ *
+ * Since: 2.7.4
+ */
+#define ATK_MINOR_VERSION (@ATK_MINOR_VERSION@)
+
+/**
+ * ATK_MICRO_VERSION:
+ *
+ * Like atk_get_micro_version(), but from the headers used at
+ * application compile time, rather than from the library linked
+ * against at application run time.
+ *
+ * Since: 2.7.4
+ */
+#define ATK_MICRO_VERSION (@ATK_MICRO_VERSION@)
+
+/**
+ * ATK_BINARY_AGE:
+ *
+ * Like atk_get_binary_age(), but from the headers used at
+ * application compile time, rather than from the library linked
+ * against at application run time.
+ *
+ * Since: 2.7.4
+ */
+#define ATK_BINARY_AGE    (@ATK_BINARY_AGE@)
+
+/**
+ * ATK_INTERFACE_AGE:
+ *
+ * Like atk_get_interface_age(), but from the headers used at
+ * application compile time, rather than from the library linked
+ * against at application run time.
+ *
+ * Since: 2.7.4
+ */
+#define ATK_INTERFACE_AGE (@ATK_INTERFACE_AGE@)
+
+/**
+ * ATK_CHECK_VERSION:
+ * @major: major version (e.g. 1 for version 1.2.5)
+ * @minor: minor version (e.g. 2 for version 1.2.5)
+ * @micro: micro version (e.g. 5 for version 1.2.5)
+ *
+ * Returns %TRUE if the version of the ATK header files is the same as
+ * or newer than the passed-in version.
+ *
+ * Since: 2.7.4
+ */
+#define ATK_CHECK_VERSION(major,minor,micro)                          \
+    (ATK_MAJOR_VERSION > (major) ||                                   \
+     (ATK_MAJOR_VERSION == (major) && ATK_MINOR_VERSION > (minor)) || \
+     (ATK_MAJOR_VERSION == (major) && ATK_MINOR_VERSION == (minor) && \
+      ATK_MICRO_VERSION >= (micro)))
+
+#ifndef _ATK_EXTERN
+#define _ATK_EXTERN extern
+#endif
+
+/**
+ * ATK_VERSION_2_2:
+ *
+ * A macro that evaluates to the 2.2 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+#define ATK_VERSION_2_2       (G_ENCODE_VERSION (2, 2))
+
+/**
+ * ATK_VERSION_2_4:
+ *
+ * A macro that evaluates to the 2.4 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+#define ATK_VERSION_2_4       (G_ENCODE_VERSION (2, 4))
+
+/**
+ * ATK_VERSION_2_6:
+ *
+ * A macro that evaluates to the 2.6 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+#define ATK_VERSION_2_6       (G_ENCODE_VERSION (2, 6))
+
+/**
+ * ATK_VERSION_2_8:
+ *
+ * A macro that evaluates to the 2.8 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+#define ATK_VERSION_2_8       (G_ENCODE_VERSION (2, 8))
+
+/**
+ * ATK_VERSION_2_10:
+ *
+ * A macro that evaluates to the 2.10 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+
+#define ATK_VERSION_2_10       (G_ENCODE_VERSION (2, 10))
+/**
+ * ATK_VERSION_2_12:
+ *
+ * A macro that evaluates to the 2.12 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+#define ATK_VERSION_2_12       (G_ENCODE_VERSION (2, 12))
+
+/**
+ * ATK_VERSION_2_14:
+ *
+ * A macro that evaluates to the 2.14 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.14
+ */
+#define ATK_VERSION_2_14       (G_ENCODE_VERSION (2, 14))
+
+/**
+ * ATK_VERSION_2_30:
+ *
+ * A macro that evaluates to the 2.30 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.30
+ */
+#define ATK_VERSION_2_30       (G_ENCODE_VERSION (2, 30))
+
+/**
+ * ATK_VERSION_2_32:
+ *
+ * A macro that evaluates to the 2.30 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.52
+ */
+#define ATK_VERSION_2_32       (G_ENCODE_VERSION (2, 32))
+
+/**
+ * ATK_VERSION_2_36:
+ *
+ * A macro that evaluates to the 2.36 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.36
+ */
+#define ATK_VERSION_2_36       (G_ENCODE_VERSION (2, 36))
+
+/**
+ * ATK_VERSION_2_52:
+ *
+ * A macro that evaluates to the 2.52 version of ATK, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 2.52
+ */
+#define ATK_VERSION_2_52       (G_ENCODE_VERSION (2, 52))
+
+/* evaluates to the current stable version; for development cycles,
+ * this means the next stable target
+ */
+#if (ATK_MINOR_VERSION % 2)
+#define ATK_VERSION_CUR_STABLE         (G_ENCODE_VERSION (ATK_MAJOR_VERSION, ATK_MINOR_VERSION + 1))
+#else
+#define ATK_VERSION_CUR_STABLE         (G_ENCODE_VERSION (ATK_MAJOR_VERSION, ATK_MINOR_VERSION))
+#endif
+
+/* evaluates to the previous stable version */
+#if (ATK_MINOR_VERSION % 2)
+#define ATK_VERSION_PREV_STABLE        (G_ENCODE_VERSION (ATK_MAJOR_VERSION, ATK_MINOR_VERSION - 1))
+#else
+#define ATK_VERSION_PREV_STABLE        (G_ENCODE_VERSION (ATK_MAJOR_VERSION, ATK_MINOR_VERSION - 2))
+#endif
+
+/**
+ * ATK_VERSION_MIN_REQUIRED:
+ *
+ * A macro that should be defined by the user prior to including
+ * the atk/atk.h header.
+ * The definition should be one of the predefined ATK version
+ * macros: %ATK_VERSION_2_12, %ATK_VERSION_2_14,...
+ *
+ * This macro defines the earliest version of ATK that the package is
+ * required to be able to compile against.
+ *
+ * If the compiler is configured to warn about the use of deprecated
+ * functions, then using functions that were deprecated in version
+ * %ATK_VERSION_MIN_REQUIRED or earlier will cause warnings (but
+ * using functions deprecated in later releases will not).
+ *
+ * Since: 2.14
+ */
+/* If the package sets ATK_VERSION_MIN_REQUIRED to some future
+ * ATK_VERSION_X_Y value that we don't know about, it will compare as
+ * 0 in preprocessor tests.
+ */
+#ifndef ATK_VERSION_MIN_REQUIRED
+# define ATK_VERSION_MIN_REQUIRED      (ATK_VERSION_CUR_STABLE)
+#elif ATK_VERSION_MIN_REQUIRED == 0
+# undef  ATK_VERSION_MIN_REQUIRED
+# define ATK_VERSION_MIN_REQUIRED      (ATK_VERSION_CUR_STABLE + 2)
+#endif
+
+/**
+ * ATK_VERSION_MAX_ALLOWED:
+ *
+ * A macro that should be defined by the user prior to including
+ * the atk/atk.h header.
+ * The definition should be one of the predefined ATK version
+ * macros: %ATK_VERSION_2_12, %ATK_VERSION_2_14,...
+ *
+ * This macro defines the latest version of the ATK API that the
+ * package is allowed to make use of.
+ *
+ * If the compiler is configured to warn about the use of deprecated
+ * functions, then using functions added after version
+ * %ATK_VERSION_MAX_ALLOWED will cause warnings.
+ *
+ * Unless you are using ATK_CHECK_VERSION() or the like to compile
+ * different code depending on the ATK version, then this should be
+ * set to the same value as %ATK_VERSION_MIN_REQUIRED.
+ *
+ * Since: 2.14
+ */
+#if !defined (ATK_VERSION_MAX_ALLOWED) || (ATK_VERSION_MAX_ALLOWED == 0)
+# undef ATK_VERSION_MAX_ALLOWED
+# define ATK_VERSION_MAX_ALLOWED      (ATK_VERSION_CUR_STABLE)
+#endif
+
+/* sanity checks */
+#if ATK_VERSION_MIN_REQUIRED > ATK_VERSION_CUR_STABLE
+#error "ATK_VERSION_MIN_REQUIRED must be <= ATK_VERSION_CUR_STABLE"
+#endif
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_MIN_REQUIRED
+#error "ATK_VERSION_MAX_ALLOWED must be >= ATK_VERSION_MIN_REQUIRED"
+#endif
+#if ATK_VERSION_MIN_REQUIRED < ATK_VERSION_2_2
+#error "ATK_VERSION_MIN_REQUIRED must be >= ATK_VERSION_2_2"
+#endif
+
+/* these macros are used to mark deprecated functions, and thus have to be
+ * exposed in a public header.
+ *
+ * do *not* use them in other libraries depending on Atk: use G_DEPRECATED
+ * and G_DEPRECATED_FOR, or use your own wrappers around them.
+ */
+#ifdef ATK_DISABLE_DEPRECATION_WARNINGS
+#define ATK_DEPRECATED _ATK_EXTERN
+#define ATK_DEPRECATED_FOR(f) _ATK_EXTERN
+#define ATK_UNAVAILABLE(maj,min) _ATK_EXTERN
+#else
+#define ATK_DEPRECATED G_DEPRECATED _ATK_EXTERN
+#define ATK_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _ATK_EXTERN
+#define ATK_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _ATK_EXTERN
+#endif
+
+#define ATK_AVAILABLE_IN_ALL _ATK_EXTERN
+
+/* XXX: Every new stable minor release should add a set of macros here */
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_2
+# define ATK_DEPRECATED_IN_2_2                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_2_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_2                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_2_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_2
+# define ATK_AVAILABLE_IN_2_2                 ATK_UNAVAILABLE(2, 2)
+#else
+# define ATK_AVAILABLE_IN_2_2                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_4
+# define ATK_DEPRECATED_IN_2_4                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_4_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_4                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_4_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_4
+# define ATK_AVAILABLE_IN_2_4                 ATK_UNAVAILABLE(2, 4)
+#else
+# define ATK_AVAILABLE_IN_2_4                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_6
+# define ATK_DEPRECATED_IN_2_6                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_6_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_6                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_6_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_6
+# define ATK_AVAILABLE_IN_2_6                 ATK_UNAVAILABLE(2, 6)
+#else
+# define ATK_AVAILABLE_IN_2_6                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_8
+# define ATK_DEPRECATED_IN_2_8                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_8_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_8                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_8_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_8
+# define ATK_AVAILABLE_IN_2_8                 ATK_UNAVAILABLE(2, 8)
+#else
+# define ATK_AVAILABLE_IN_2_8                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_10
+# define ATK_DEPRECATED_IN_2_10                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_10_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_10                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_10_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_10
+# define ATK_AVAILABLE_IN_2_10                 ATK_UNAVAILABLE(2, 10)
+#else
+# define ATK_AVAILABLE_IN_2_10                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_12
+# define ATK_DEPRECATED_IN_2_12                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_12_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_12                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_12_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_12
+# define ATK_AVAILABLE_IN_2_12                 ATK_UNAVAILABLE(2, 12)
+#else
+# define ATK_AVAILABLE_IN_2_12                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_14
+# define ATK_DEPRECATED_IN_2_14                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_14_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_14                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_14_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_14
+# define ATK_AVAILABLE_IN_2_14                 ATK_UNAVAILABLE(2, 14)
+#else
+# define ATK_AVAILABLE_IN_2_14                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_30
+# define ATK_DEPRECATED_IN_2_30                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_30_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_30                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_30_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_30
+# define ATK_AVAILABLE_IN_2_30                 ATK_UNAVAILABLE(2, 30)
+#else
+# define ATK_AVAILABLE_IN_2_30                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_32
+# define ATK_AVAILABLE_IN_2_32                 ATK_UNAVAILABLE(2, 32)
+#else
+# define ATK_AVAILABLE_IN_2_32                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MIN_REQUIRED >= ATK_VERSION_2_36
+# define ATK_DEPRECATED_IN_2_36                ATK_DEPRECATED
+# define ATK_DEPRECATED_IN_2_36_FOR(f)         ATK_DEPRECATED_FOR(f)
+#else
+# define ATK_DEPRECATED_IN_2_36                _ATK_EXTERN
+# define ATK_DEPRECATED_IN_2_36_FOR(f)         _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_36
+# define ATK_AVAILABLE_IN_2_36                 ATK_UNAVAILABLE(2, 36)
+#else
+# define ATK_AVAILABLE_IN_2_36                 _ATK_EXTERN
+#endif
+
+#if ATK_VERSION_MAX_ALLOWED < ATK_VERSION_2_52
+# define ATK_AVAILABLE_IN_2_52                 ATK_UNAVAILABLE(2, 52)
+#else
+# define ATK_AVAILABLE_IN_2_52                 _ATK_EXTERN
+#endif
+
+ATK_AVAILABLE_IN_2_8
+guint atk_get_major_version (void) G_GNUC_CONST;
+ATK_AVAILABLE_IN_2_8
+guint atk_get_minor_version (void) G_GNUC_CONST;
+ATK_AVAILABLE_IN_2_8
+guint atk_get_micro_version (void) G_GNUC_CONST;
+ATK_AVAILABLE_IN_2_8
+guint atk_get_binary_age    (void) G_GNUC_CONST;
+ATK_AVAILABLE_IN_2_8
+guint atk_get_interface_age (void) G_GNUC_CONST;
+
+#define atk_major_version atk_get_major_version ()
+#define atk_minor_version atk_get_minor_version ()
+#define atk_micro_version atk_get_micro_version ()
+#define atk_binary_age atk_get_binary_age ()
+#define atk_interface_age atk_get_interface_age ()
+
+#endif /* __ATK_VERSION_H__ */
diff --git a/atk/atkwindow.c b/atk/atkwindow.c
new file mode 100644 (file)
index 0000000..7699b83
--- /dev/null
@@ -0,0 +1,169 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "atkmarshal.h"
+#include "atkwindow.h"
+
+/**
+ * AtkWindow:
+ *
+ * The ATK Interface provided by UI components that represent a top-level window.
+ *
+ * #AtkWindow should be implemented by the UI elements that represent
+ * a top-level window, such as the main window of an application or
+ * dialog.
+ *
+ * See [class@AtkObject]
+ */
+
+enum
+{
+  ACTIVATE,
+  CREATE,
+  DEACTIVATE,
+  DESTROY,
+  MAXIMIZE,
+  MINIMIZE,
+  MOVE,
+  RESIZE,
+  RESTORE,
+  LAST_SIGNAL
+};
+
+static guint atk_window_signals[LAST_SIGNAL] = { 0 };
+
+static guint
+atk_window_add_signal (const gchar *name)
+{
+  return g_signal_new (name,
+                       ATK_TYPE_WINDOW,
+                       G_SIGNAL_RUN_LAST,
+                       0,
+                       (GSignalAccumulator) NULL, NULL,
+                       g_cclosure_marshal_VOID__VOID,
+                       G_TYPE_NONE,
+                       0);
+}
+
+typedef AtkWindowIface AtkWindowInterface;
+G_DEFINE_INTERFACE (AtkWindow, atk_window, ATK_TYPE_OBJECT)
+
+static void
+atk_window_default_init (AtkWindowIface *iface)
+{
+  static gboolean initialized = FALSE;
+
+  if (!initialized)
+    {
+      /**
+       * AtkWindow::activate:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::activate is emitted when a window
+       * becomes the active window of the application or session.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[ACTIVATE] = atk_window_add_signal ("activate");
+      /**
+       * AtkWindow::create:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::create is emitted when a new window
+       * is created.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[CREATE] = atk_window_add_signal ("create");
+      /**
+       * AtkWindow::deactivate:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::deactivate is emitted when a window is
+       * no longer the active window of the application or session.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[DEACTIVATE] = atk_window_add_signal ("deactivate");
+      /**
+       * AtkWindow::destroy:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::destroy is emitted when a window is
+       * destroyed.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[DESTROY] = atk_window_add_signal ("destroy");
+      /**
+       * AtkWindow::maximize:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::maximize is emitted when a window
+       * is maximized.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[MAXIMIZE] = atk_window_add_signal ("maximize");
+      /**
+       * AtkWindow::minimize:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::minimize is emitted when a window
+       * is minimized.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[MINIMIZE] = atk_window_add_signal ("minimize");
+      /**
+       * AtkWindow::move:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::move is emitted when a window
+       * is moved.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[MOVE] = atk_window_add_signal ("move");
+      /**
+       * AtkWindow::resize:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::resize is emitted when a window
+       * is resized.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[RESIZE] = atk_window_add_signal ("resize");
+      /**
+       * AtkWindow::restore:
+       * @object: the object which received the signal
+       *
+       * The signal #AtkWindow::restore is emitted when a window
+       * is restored.
+       *
+       * Since: 2.2
+       */
+      atk_window_signals[RESTORE] = atk_window_add_signal ("restore");
+
+      initialized = TRUE;
+    }
+}
diff --git a/atk/atkwindow.h b/atk/atkwindow.h
new file mode 100644 (file)
index 0000000..446c4af
--- /dev/null
@@ -0,0 +1,52 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __ATK_WINDOW_H__
+#define __ATK_WINDOW_H__
+
+#if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined(__ATK_H_INSIDE__) && !defined(ATK_COMPILATION)
+#error "Only <atk/atk.h> can be included directly."
+#endif
+
+#include <atk/atkobject.h>
+
+G_BEGIN_DECLS
+
+/*
+ * AtkWindow describes signals pertaining to on-screen windows.
+ */
+
+#define ATK_TYPE_WINDOW (atk_window_get_type ())
+#define ATK_IS_WINDOW(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_WINDOW)
+#define ATK_WINDOW(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_WINDOW, AtkWindow)
+#define ATK_WINDOW_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATK_TYPE_WINDOW, AtkWindowIface))
+
+typedef struct _AtkWindow AtkWindow; /* Dummy typedef */
+typedef struct _AtkWindowIface AtkWindowIface;
+
+struct _AtkWindowIface
+{
+  GTypeInterface parent;
+};
+
+ATK_AVAILABLE_IN_2_2
+GType atk_window_get_type (void);
+G_END_DECLS
+
+#endif /* __ATK_WINDOW_H__ */
diff --git a/atk/meson.build b/atk/meson.build
new file mode 100644 (file)
index 0000000..5cbf785
--- /dev/null
@@ -0,0 +1,171 @@
+atk_sources = [
+  'atkaction.c',
+  'atkcomponent.c',
+  'atkdocument.c',
+  'atkeditabletext.c',
+  'atkgobjectaccessible.c',
+  'atkhyperlink.c',
+  'atkhyperlinkimpl.c',
+  'atkhypertext.c',
+  'atkimage.c',
+  'atknoopobject.c',
+  'atknoopobjectfactory.c',
+  'atkobject.c',
+  'atkobjectfactory.c',
+  'atkplug.c',
+  'atkprivate.c',
+  'atkrange.c',
+  'atkregistry.c',
+  'atkrelation.c',
+  'atkrelationset.c',
+  'atkselection.c',
+  'atksocket.c',
+  'atkstate.c',
+  'atkstateset.c',
+  'atkstreamablecontent.c',
+  'atktable.c',
+  'atktablecell.c',
+  'atktext.c',
+  'atkutil.c',
+  'atkmisc.c',
+  'atkvalue.c',
+  'atkversion.c',
+  'atkwindow.c',
+]
+
+atk_headers = [
+  'atkaction.h',
+  'atkcomponent.h',
+  'atkdocument.h',
+  'atkeditabletext.h',
+  'atkgobjectaccessible.h',
+  'atkhyperlink.h',
+  'atkhyperlinkimpl.h',
+  'atkhypertext.h',
+  'atkimage.h',
+  'atkmisc.h',
+  'atknoopobject.h',
+  'atknoopobjectfactory.h',
+  'atkobject.h',
+  'atkobjectfactory.h',
+  'atkplug.h',
+  'atkrange.h',
+  'atkregistry.h',
+  'atkrelation.h',
+  'atkrelationtype.h',
+  'atkrelationset.h',
+  'atkselection.h',
+  'atksocket.h',
+  'atkstate.h',
+  'atkstateset.h',
+  'atkstreamablecontent.h',
+  'atktable.h',
+  'atktablecell.h',
+  'atktext.h',
+  'atkutil.h',
+  'atkvalue.h',
+  'atkwindow.h',
+  'atk-autocleanups.h',
+]
+
+install_headers(atk_headers + ['atk.h'], subdir: atk_api_path)
+
+# Features header
+atk_version_conf = configuration_data()
+atk_version_conf.set('ATK_MAJOR_VERSION', atspi_major_version)
+atk_version_conf.set('ATK_MINOR_VERSION', atspi_minor_version)
+atk_version_conf.set('ATK_MICRO_VERSION', atspi_micro_version)
+atk_version_conf.set('ATK_BINARY_AGE', atk_binary_age)
+atk_version_conf.set('ATK_INTERFACE_AGE', atk_interface_age)
+atk_version_conf.set('LT_CURRENT_MINUS_AGE', '0')
+atk_version_conf.set('ATK_VERSION', atspi_version)
+
+atk_includedir = join_paths(get_option('prefix'), get_option('includedir'))
+
+atk_version_h = configure_file(input: 'atkversion.h.in',
+  output: 'atkversion.h',
+  configuration: atk_version_conf,
+  install_dir: join_paths(atk_includedir, atk_api_path),
+)
+
+# Marshallers
+atk_marshals = gnome.genmarshal('atkmarshal',
+  sources: 'atkmarshal.list',
+  prefix: 'atk_marshal',
+)
+atk_marshal_h = atk_marshals[1]
+
+# Enumerations for GType
+atk_enums = gnome.mkenums('atk-enum-types',
+  sources: atk_headers,
+  c_template: 'atk-enum-types.c.template',
+  h_template: 'atk-enum-types.h.template',
+  install_dir: join_paths(atk_includedir, atk_api_path),
+  install_header: true,
+)
+atk_enum_h = atk_enums[1]
+
+atk_cflags = [
+  '-DG_LOG_DOMAIN="Atk"',
+  '-DG_LOG_USE_STRUCTURED=1',
+  '-DGLIB_DISABLE_DEPRECATION_WARNINGS',
+  '-DATK_DISABLE_DEPRECATION_WARNINGS',
+  '-DATK_COMPILATION',
+]
+
+if host_system == 'windows'
+  atk_win_rc = configure_file(
+    input: 'atk.rc.in',
+    output: 'atk.rc',
+    configuration: atk_version_conf,
+  )
+  atk_win_res = import('windows').compile_resources(atk_win_rc)
+  atk_sources += atk_win_res
+endif
+
+libatk = library(atk_api_name,
+  sources: atk_sources + atk_enums + atk_marshals,
+  soversion: atk_soversion,
+  version: atk_libversion,
+  install: true,
+  dependencies: [glib_dep, gobject_dep],
+  include_directories: [ root_inc, atk_inc ],
+  c_args: common_cflags + atk_cflags,
+  link_args: common_ldflags,
+)
+
+atk_sources_dep = [ atk_enum_h ]
+
+if have_gir
+  atk_gir = gnome.generate_gir(libatk,
+    sources: atk_sources + atk_headers + [ atk_enum_h ] + [ atk_version_h ],
+    namespace: 'Atk',
+    nsversion: atk_api_version,
+    identifier_prefix: 'Atk',
+    symbol_prefix: 'atk',
+    export_packages: 'atk',
+    includes: [ 'GObject-2.0' ],
+    install: true,
+    extra_args: [
+      '--quiet',
+      '--c-include=atk/atk.h',
+      '-DATK_COMPILATION',
+    ],
+  )
+
+  atk_sources_dep += atk_gir
+endif
+
+libatk_dep = declare_dependency(link_with: libatk,
+  include_directories: [ root_inc, atk_inc ],
+  dependencies: [glib_dep, gobject_dep],
+  sources: atk_sources_dep,
+)
+
+pkgconfig.generate(libatk,
+  name: 'Atk',
+  description: 'Accessibility Toolkit',
+  subdirs: atk_api_name,
+  filebase: 'atk',
+  libraries: [glib_dep, gobject_dep],
+)
index e7e748b..fdb572f 100644 (file)
 #ifndef _ATSPI_ACCESSIBLE_PRIVATE_H_
 #define _ATSPI_ACCESSIBLE_PRIVATE_H_
 
-G_BEGIN_DECLS
+#include <glib.h>
 
 #include "atspi-accessible.h"
 #include "atspimarshal.h"
 
+G_BEGIN_DECLS
+
 struct _AtspiAccessiblePrivate
 {
   GHashTable *cache;
   guint cache_ref_count;
+  guint iteration_stamp;
 };
 
 GHashTable *
@@ -44,4 +47,4 @@ void
 _atspi_accessible_unref_cache (AtspiAccessible *accessible);
 G_END_DECLS
 
-#endif /* _ATSPI_ACCESSIBLE_H_ */
+#endif /* _ATSPI_ACCESSIBLE_H_ */
index 26cf0ba..2fa742f 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include "atspi-private.h"
 #include "atspi-accessible-private.h"
+#include "atspi-private.h"
 #include <string.h>
 
-enum {
+/**
+ * AtspiAccessible:
+ *
+ * The base interface which is implemented by all accessible objects.
+ *
+ * All objects support interfaces for querying their contained 'children'
+ * and position in the accessible-object hierarchy, whether or not they
+ * actually have children.
+ */
+
+enum
+{
   REGION_CHANGED,
   MODE_CHANGED,
   LAST_SIGNAL
@@ -35,13 +46,15 @@ enum {
 static gboolean enable_caching = FALSE;
 static guint quark_locale;
 
-static guint atspi_accessible_signals[LAST_SIGNAL] = { 0, };
+static guint atspi_accessible_signals[LAST_SIGNAL] = {
+  0,
+};
 
 static gboolean
 screen_reader_signal_watcher (GSignalInvocationHint *signal_hint,
-                              guint                  n_param_values,
-                              const GValue          *param_values,
-                              gpointer               data)
+                              guint n_param_values,
+                              const GValue *param_values,
+                              gpointer data)
 {
   GObject *object;
   AtspiAccessible *accessible;
@@ -54,7 +67,7 @@ screen_reader_signal_watcher (GSignalInvocationHint *signal_hint,
   gchar *dbus_name;
 
   object = g_value_get_object (param_values + 0);
-  g_return_val_if_fail (ATSPI_IS_ACCESSIBLE(object), FALSE);
+  g_return_val_if_fail (ATSPI_IS_ACCESSIBLE (object), FALSE);
 
   g_signal_query (signal_hint->signal_id, &signal_query);
   name = signal_query.signal_name;
@@ -65,6 +78,7 @@ screen_reader_signal_watcher (GSignalInvocationHint *signal_hint,
   if (n_param_values > 2 && G_VALUE_HOLDS_INT (param_values + 2))
     detail2 = g_value_get_int (param_values + 2);
   accessible = ATSPI_ACCESSIBLE (object);
+  g_return_val_if_fail (accessible->parent.app != NULL, FALSE);
 
   dbus_name = _atspi_strdup_and_adjust_for_dbus (name);
   signal = dbus_message_new_signal (ATSPI_DBUS_PATH_SCREEN_READER,
@@ -88,7 +102,7 @@ screen_reader_signal_watcher (GSignalInvocationHint *signal_hint,
   dbus_message_iter_close_container (&iter, &iter_array);
   dbus_connection_send (_atspi_bus (), signal, NULL);
   dbus_message_unref (signal);
-  return TRUE; 
+  return TRUE;
 }
 
 static void
@@ -151,20 +165,7 @@ atspi_value_interface_init (AtspiValue *value)
 {
 }
 
-G_DEFINE_TYPE_WITH_CODE (AtspiAccessible, atspi_accessible, ATSPI_TYPE_OBJECT,
-                         G_ADD_PRIVATE (AtspiAccessible)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_ACTION, atspi_action_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_COLLECTION, atspi_collection_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_COMPONENT, atspi_component_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_DOCUMENT, atspi_document_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_EDITABLE_TEXT, atspi_editable_text_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_HYPERTEXT, atspi_hypertext_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_IMAGE, atspi_image_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_SELECTION, atspi_selection_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TABLE, atspi_table_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TABLE_CELL, atspi_table_cell_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TEXT, atspi_text_interface_init)
-                         G_IMPLEMENT_INTERFACE (ATSPI_TYPE_VALUE, atspi_value_interface_init))
+G_DEFINE_TYPE_WITH_CODE (AtspiAccessible, atspi_accessible, ATSPI_TYPE_OBJECT, G_ADD_PRIVATE (AtspiAccessible) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_ACTION, atspi_action_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_COLLECTION, atspi_collection_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_COMPONENT, atspi_component_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_DOCUMENT, atspi_document_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_EDITABLE_TEXT, atspi_editable_text_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_HYPERTEXT, atspi_hypertext_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_IMAGE, atspi_image_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_SELECTION, atspi_selection_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TABLE, atspi_table_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TABLE_CELL, atspi_table_cell_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_TEXT, atspi_text_interface_init) G_IMPLEMENT_INTERFACE (ATSPI_TYPE_VALUE, atspi_value_interface_init))
 
 #ifdef DEBUG_REF_COUNTS
 static gint accessible_count = 0;
@@ -174,7 +175,7 @@ static void
 atspi_accessible_unref (GObject *accessible)
 {
   if (accessible != NULL)
-    g_object_unref(accessible);
+    g_object_unref (accessible);
 }
 
 static void
@@ -183,7 +184,7 @@ atspi_accessible_init (AtspiAccessible *accessible)
 #ifdef DEBUG_REF_COUNTS
   accessible_count++;
   g_hash_table_insert (_atspi_get_live_refs (), accessible, NULL);
-  g_print("at-spi: init: %d objects\n", accessible_count);
+  g_print ("at-spi: init: %d objects\n", accessible_count);
 #endif
 
   accessible->priv = atspi_accessible_get_instance_private (accessible);
@@ -211,30 +212,31 @@ atspi_accessible_dispose (GObject *object)
 
   parent = accessible->accessible_parent;
   if (parent)
-  {
-    accessible->accessible_parent = NULL;
-    if (parent->children)
-      g_ptr_array_remove (parent->children, accessible);
-    g_object_unref (parent);
-  }
-
-  if (accessible->children) for (i = accessible->children->len - 1; i >= 0; i--)
-  {
-    AtspiAccessible *child = g_ptr_array_index (accessible->children, i);
-    if (child && child->accessible_parent == accessible)
     {
-      child->accessible_parent = NULL;
-      g_object_unref (accessible);
+      accessible->accessible_parent = NULL;
+      if (parent->children)
+        g_ptr_array_remove (parent->children, accessible);
+      g_object_unref (parent);
     }
-  }
 
   if (accessible->children)
-  {
-    g_ptr_array_free (accessible->children, TRUE);
-    accessible->children = NULL;
-  }
+    for (i = accessible->children->len - 1; i >= 0; i--)
+      {
+        AtspiAccessible *child = g_ptr_array_index (accessible->children, i);
+        if (child && child->accessible_parent == accessible)
+          {
+            child->accessible_parent = NULL;
+            g_object_unref (accessible);
+          }
+      }
+
+  if (accessible->children)
+    {
+      g_ptr_array_free (accessible->children, TRUE);
+      accessible->children = NULL;
+    }
 
-  G_OBJECT_CLASS (atspi_accessible_parent_class) ->dispose (object);
+  G_OBJECT_CLASS (atspi_accessible_parent_class)->dispose (object);
 }
 
 static void
@@ -286,14 +288,14 @@ atspi_accessible_class_init (AtspiAccessibleClass *klass)
    * needed to highlight the object that the screen reader is reading.
    */
   atspi_accessible_signals[REGION_CHANGED] =
-    g_signal_new ("region_changed",
-                 G_TYPE_FROM_CLASS (klass),
-                 G_SIGNAL_RUN_LAST,
-                 G_STRUCT_OFFSET (AtspiAccessibleClass, region_changed), 
-                 NULL, NULL,
-                 atspi_marshal_VOID__INT_INT,
-                 G_TYPE_NONE,
-                 2, G_TYPE_INT, G_TYPE_INT);
+      g_signal_new ("region_changed",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST,
+                    G_STRUCT_OFFSET (AtspiAccessibleClass, region_changed),
+                    NULL, NULL,
+                    atspi_marshal_VOID__INT_INT,
+                    G_TYPE_NONE,
+                    2, G_TYPE_INT, G_TYPE_INT);
 
   /**
    * AtspiAccessible::mode-changed:
@@ -308,16 +310,16 @@ atspi_accessible_class_init (AtspiAccessibleClass *klass)
    * mouse-review
    * say-all
    * caret-tracking
-  */
+   */
   atspi_accessible_signals[MODE_CHANGED] =
-    g_signal_new ("mode_changed",
-                 G_TYPE_FROM_CLASS (klass),
-                 G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
-                 G_STRUCT_OFFSET (AtspiAccessibleClass, mode_changed), 
-                 NULL, NULL,
-                 atspi_marshal_VOID__INT_STRING,
-                 G_TYPE_NONE,
-                 2, G_TYPE_INT, G_TYPE_STRING);
+      g_signal_new ("mode_changed",
+                    G_TYPE_FROM_CLASS (klass),
+                    G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+                    G_STRUCT_OFFSET (AtspiAccessibleClass, mode_changed),
+                    NULL, NULL,
+                    atspi_marshal_VOID__INT_STRING,
+                    G_TYPE_NONE,
+                    2, G_TYPE_INT, G_TYPE_STRING);
 
   g_signal_add_emission_hook (atspi_accessible_signals[REGION_CHANGED], 0,
                               screen_reader_signal_watcher, NULL,
@@ -333,23 +335,28 @@ atspi_accessible_class_init (AtspiAccessibleClass *klass)
  *
  * Gets the name of an #AtspiAccessible object.
  *
- * Returns: a UTF-8 string indicating the name of the #AtspiAccessible object 
+ * Returns: a UTF-8 string indicating the name of the #AtspiAccessible object
  * or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_name (AtspiAccessible *obj, GError **error)
 {
   g_return_val_if_fail (obj != NULL, g_strdup (""));
+  gchar *name = NULL;
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_NAME))
-  {
-    g_free (obj->name);
-    obj->name = NULL;
-    if (!_atspi_dbus_get_property (obj, atspi_interface_accessible, "Name", error,
-                                   "s", &obj->name))
-      return g_strdup ("");
-    _atspi_accessible_add_cache (obj, ATSPI_CACHE_NAME);
-  }
+    {
+      g_free (obj->name);
+      obj->name = NULL;
+      if (!_atspi_dbus_get_property (obj, atspi_interface_accessible, "Name", error,
+                                     "s", &name))
+        return g_strdup ("");
+      _atspi_accessible_add_cache (obj, ATSPI_CACHE_NAME);
+      if (!obj->name)
+        obj->name = name;
+      else
+        free (name);
+    }
   return g_strdup (obj->name);
 }
 
@@ -359,24 +366,29 @@ atspi_accessible_get_name (AtspiAccessible *obj, GError **error)
  *
  * Gets the description of an #AtspiAccessible object.
  *
- * Returns: a UTF-8 string describing the #AtspiAccessible object 
+ * Returns: a UTF-8 string describing the #AtspiAccessible object
  * or NULL on exception.
  **/
 gchar *
 atspi_accessible_get_description (AtspiAccessible *obj, GError **error)
 {
   g_return_val_if_fail (obj != NULL, g_strdup (""));
+  gchar *description = NULL;
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_DESCRIPTION))
-  {
-    g_free (obj->description);
-    obj->description = NULL;
-    if (!_atspi_dbus_get_property (obj, atspi_interface_accessible,
-                                   "Description", error, "s",
-                                   &obj->description))
-      return g_strdup ("");
-    _atspi_accessible_add_cache (obj, ATSPI_CACHE_DESCRIPTION);
-  }
+    {
+      g_free (obj->description);
+      obj->description = NULL;
+      if (!_atspi_dbus_get_property (obj, atspi_interface_accessible,
+                                     "Description", error, "s",
+                                     &obj->description))
+        return g_strdup ("");
+      _atspi_accessible_add_cache (obj, ATSPI_CACHE_DESCRIPTION);
+      if (!obj->description)
+        obj->description = description;
+      else
+        free (description);
+    }
   return g_strdup (obj->description);
 }
 
@@ -400,34 +412,34 @@ atspi_accessible_get_parent (AtspiAccessible *obj, GError **error)
   g_return_val_if_fail (obj != NULL, NULL);
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT))
-  {
-    DBusMessage *message, *reply;
-    DBusMessageIter iter, iter_variant;
-    if (!obj->parent.app)
-      return NULL;
-    message = dbus_message_new_method_call (obj->parent.app->bus_name,
-                                            obj->parent.path,
-                                            DBUS_INTERFACE_PROPERTIES, "Get");
-    if (!message)
-      return NULL;
-    dbus_message_append_args (message, DBUS_TYPE_STRING, &atspi_interface_accessible,
-                               DBUS_TYPE_STRING, &str_parent,
-                              DBUS_TYPE_INVALID);
-    reply = _atspi_dbus_send_with_reply_and_block (message, error);
-    if (!reply)
-      return NULL;
-    if (strcmp (dbus_message_get_signature (reply), "v") != 0)
     {
+      DBusMessage *message, *reply;
+      DBusMessageIter iter, iter_variant;
+      if (!obj->parent.app)
+        return NULL;
+      message = dbus_message_new_method_call (obj->parent.app->bus_name,
+                                              obj->parent.path,
+                                              DBUS_INTERFACE_PROPERTIES, "Get");
+      if (!message)
+        return NULL;
+      dbus_message_append_args (message, DBUS_TYPE_STRING, &atspi_interface_accessible,
+                                DBUS_TYPE_STRING, &str_parent,
+                                DBUS_TYPE_INVALID);
+      reply = _atspi_dbus_send_with_reply_and_block (message, error);
+      if (!reply)
+        return NULL;
+      if (strcmp (dbus_message_get_signature (reply), "v") != 0)
+        {
+          dbus_message_unref (reply);
+          return NULL;
+        }
+      dbus_message_iter_init (reply, &iter);
+      dbus_message_iter_recurse (&iter, &iter_variant);
+      g_clear_object (&obj->accessible_parent);
+      obj->accessible_parent = _atspi_dbus_consume_accessible (&iter_variant);
       dbus_message_unref (reply);
-      return NULL;
+      _atspi_accessible_add_cache (obj, ATSPI_CACHE_PARENT);
     }
-    dbus_message_iter_init (reply, &iter);
-    dbus_message_iter_recurse (&iter, &iter_variant);
-    g_clear_object (&obj->accessible_parent);
-    obj->accessible_parent = _atspi_dbus_return_accessible_from_iter (&iter_variant);
-    dbus_message_unref (reply);
-    _atspi_accessible_add_cache (obj, ATSPI_CACHE_PARENT);
-  }
   if (!obj->accessible_parent)
     return NULL;
   return g_object_ref (obj->accessible_parent);
@@ -449,16 +461,16 @@ atspi_accessible_get_child_count (AtspiAccessible *obj, GError **error)
   g_return_val_if_fail (obj != NULL, -1);
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_CHILDREN))
-  {
-    dbus_int32_t ret;
-    if (!_atspi_dbus_get_property (obj, atspi_interface_accessible,
-                                   "ChildCount", error, "i", &ret))
-      return -1;
-    return ret;
-  }
+    {
+      dbus_int32_t ret;
+      if (!_atspi_dbus_get_property (obj, atspi_interface_accessible,
+                                     "ChildCount", error, "i", &ret))
+        return -1;
+      return ret;
+    }
 
   if (!obj->children)
-    return 0;  /* assume it's disposed */
+    return 0; /* assume it's disposed */
 
   return obj->children->len;
 }
@@ -475,8 +487,8 @@ atspi_accessible_get_child_count (AtspiAccessible *obj, GError **error)
  **/
 AtspiAccessible *
 atspi_accessible_get_child_at_index (AtspiAccessible *obj,
-                            gint    child_index,
-                            GError **error)
+                                     gint child_index,
+                                     GError **error)
 {
   AtspiAccessible *child;
   DBusMessage *reply;
@@ -484,28 +496,33 @@ atspi_accessible_get_child_at_index (AtspiAccessible *obj,
   g_return_val_if_fail (obj != NULL, NULL);
 
   if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_CHILDREN))
-  {
-    if (!obj->children)
-      return NULL;     /* assume disposed */
+    {
+      if (!obj->children)
+        return NULL; /* assume disposed */
 
-    child = g_ptr_array_index (obj->children, child_index);
-    if (child)
-      return g_object_ref (child);
-  }
+      if (child_index < obj->children->len)
+        {
+          child = g_ptr_array_index (obj->children, child_index);
+          if (child)
+            return g_object_ref (child);
+        }
+    }
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
-                                   "GetChildAtIndex", error, "i", child_index);
+                                    "GetChildAtIndex", error, "i", child_index);
   child = _atspi_dbus_return_accessible_from_message (reply);
 
   if (!child)
     return NULL;
 
   if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_CHILDREN))
-  {
+    {
       if (child_index >= obj->children->len)
         g_ptr_array_set_size (obj->children, child_index + 1);
-    g_ptr_array_index (obj->children, child_index) = g_object_ref (child);
-  }
+      else if (g_ptr_array_index (obj->children, child_index))
+        g_object_unref (g_ptr_array_index (obj->children, child_index));
+      g_ptr_array_index (obj->children, child_index) = g_object_ref (child);
+    }
   return child;
 }
 
@@ -513,7 +530,7 @@ atspi_accessible_get_child_at_index (AtspiAccessible *obj,
  * atspi_accessible_get_index_in_parent:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Gets the index of an #AtspiAccessible object within its parent's 
+ * Gets the index of an #AtspiAccessible object within its parent's
  * #AtspiAccessible children list.
  *
  * Returns: a #glong indicating the index of the #AtspiAccessible object
@@ -528,17 +545,17 @@ atspi_accessible_get_index_in_parent (AtspiAccessible *obj, GError **error)
 
   g_return_val_if_fail (obj != NULL, -1);
   if (_atspi_accessible_test_cache (obj, ATSPI_CACHE_PARENT))
-  {
-    if (!obj->accessible_parent)
-      return -1;
+    {
+      if (!obj->accessible_parent)
+        return -1;
 
-    if (!_atspi_accessible_test_cache (obj->accessible_parent, ATSPI_CACHE_CHILDREN) || !obj->accessible_parent->children)
+      if (!_atspi_accessible_test_cache (obj->accessible_parent, ATSPI_CACHE_CHILDREN) || !obj->accessible_parent->children)
         goto dbus;
 
-    for (i = 0; i < obj->accessible_parent->children->len; i++)
-      if (g_ptr_array_index (obj->accessible_parent->children, i) == obj)
-        return i;
-  }
+      for (i = 0; i < obj->accessible_parent->children->len; i++)
+        if (g_ptr_array_index (obj->accessible_parent->children, i) == obj)
+          return i;
+    }
 
 dbus:
   _atspi_dbus_call (obj, atspi_interface_accessible,
@@ -580,12 +597,12 @@ atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error)
   dbus_message_iter_init (reply, &iter);
   dbus_message_iter_recurse (&iter, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    AtspiRelation *relation;
-    relation = _atspi_relation_new_from_iter (&iter_array);
-    ret = g_array_append_val (ret, relation);
-    dbus_message_iter_next (&iter_array);
-  }
+    {
+      AtspiRelation *relation;
+      relation = _atspi_relation_new_from_iter (&iter_array);
+      ret = g_array_append_val (ret, relation);
+      dbus_message_iter_next (&iter_array);
+    }
   dbus_message_unref (reply);
   return ret;
 }
@@ -606,15 +623,15 @@ atspi_accessible_get_role (AtspiAccessible *obj, GError **error)
   g_return_val_if_fail (obj != NULL, ATSPI_ROLE_INVALID);
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_ROLE))
-  {
-    dbus_uint32_t role;
-    /* TODO: Make this a property */
-    if (_atspi_dbus_call (obj, atspi_interface_accessible, "GetRole", error, "=>u", &role))
     {
-      obj->role = role;
-    _atspi_accessible_add_cache (obj, ATSPI_CACHE_ROLE);
+      dbus_uint32_t role;
+      /* TODO: Make this a property */
+      if (_atspi_dbus_call (obj, atspi_interface_accessible, "GetRole", error, "=>u", &role))
+        {
+          obj->role = role;
+          _atspi_accessible_add_cache (obj, ATSPI_CACHE_ROLE);
+        }
     }
-  }
   return obj->role;
 }
 
@@ -654,12 +671,12 @@ atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error)
  * atspi_accessible_get_localized_role_name:
  * @obj: a pointer to the #AtspiAccessible object on which to operate.
  *
- * Gets a UTF-8 string corresponding to the name of the role played by an 
+ * Gets a UTF-8 string corresponding to the name of the role played by an
  * object, translated to the current locale.
  * This method will return useful values for roles that fall outside the
  * enumeration used in atspi_accessible_getRole ().
  *
- * Returns: a localized, UTF-8 string specifying the type of UI role played 
+ * Returns: a localized, UTF-8 string specifying the type of UI role played
  * by an #AtspiAccessible object.
  *
  **/
@@ -667,9 +684,14 @@ gchar *
 atspi_accessible_get_localized_role_name (AtspiAccessible *obj, GError **error)
 {
   char *retval = NULL;
+  AtspiRole role;
 
   g_return_val_if_fail (obj != NULL, NULL);
 
+  role = atspi_accessible_get_role (obj, error);
+  if (role >= 0 && role < ATSPI_ROLE_COUNT && role != ATSPI_ROLE_EXTENDED)
+    return atspi_role_get_localized_name (role);
+
   _atspi_dbus_call (obj, atspi_interface_accessible, "GetLocalizedRoleName", error, "=>s", &retval);
 
   if (!retval)
@@ -703,17 +725,17 @@ atspi_accessible_get_state_set (AtspiAccessible *obj)
     return defunct_set ();
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_STATES))
-  {
-    DBusMessage *reply;
-    DBusMessageIter iter;
-    reply = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
-                                      "GetState", NULL, "");
-    _ATSPI_DBUS_CHECK_SIG (reply, "au", NULL, defunct_set ());
-    dbus_message_iter_init (reply, &iter);
-    _atspi_dbus_set_state (obj, &iter);
-    dbus_message_unref (reply);
-    _atspi_accessible_add_cache (obj, ATSPI_CACHE_STATES);
-  }
+    {
+      DBusMessage *reply;
+      DBusMessageIter iter;
+      reply = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
+                                        "GetState", NULL, "");
+      _ATSPI_DBUS_CHECK_SIG (reply, "au", NULL, defunct_set ());
+      dbus_message_iter_init (reply, &iter);
+      _atspi_dbus_set_state (obj, &iter);
+      dbus_message_unref (reply);
+      _atspi_accessible_add_cache (obj, ATSPI_CACHE_STATES);
+    }
 
   return g_object_ref (obj->states);
 }
@@ -722,7 +744,7 @@ atspi_accessible_get_state_set (AtspiAccessible *obj)
  * atspi_accessible_get_attributes:
  * @obj: The #AtspiAccessible being queried.
  *
- * Gets the #AttributeSet representing any assigned 
+ * Gets the #AttributeSet representing any assigned
  * name-value pair attributes or annotations for this object.
  * For typographic, textual, or textually-semantic attributes, see
  * atspi_text_get_attributes instead.
@@ -735,24 +757,24 @@ atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error)
 {
   DBusMessage *message;
 
-    g_return_val_if_fail (obj != NULL, NULL);
+  g_return_val_if_fail (obj != NULL, NULL);
 
   if (obj->priv->cache)
-  {
-    GValue *val = g_hash_table_lookup (obj->priv->cache, "Attributes");
-    if (val)
-      return g_value_dup_boxed (val);
-  }
+    {
+      GValue *val = g_hash_table_lookup (obj->priv->cache, "Attributes");
+      if (val)
+        return g_value_dup_boxed (val);
+    }
 
   if (!_atspi_accessible_test_cache (obj, ATSPI_CACHE_ATTRIBUTES))
-  {
-    message = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
-                                        "GetAttributes", error, "");
-    g_clear_pointer (&(obj->attributes), g_hash_table_unref);
+    {
+      message = _atspi_dbus_call_partial (obj, atspi_interface_accessible,
+                                          "GetAttributes", error, "");
+      g_clear_pointer (&(obj->attributes), g_hash_table_unref);
 
-    obj->attributes = _atspi_dbus_return_hash_from_message (message);
-    _atspi_accessible_add_cache (obj, ATSPI_CACHE_ATTRIBUTES);
-  }
+      obj->attributes = _atspi_dbus_return_hash_from_message (message);
+      _atspi_accessible_add_cache (obj, ATSPI_CACHE_ATTRIBUTES);
+    }
 
   if (!obj->attributes)
     return NULL;
@@ -762,7 +784,7 @@ atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error)
 static void
 add_to_attribute_array (gpointer key, gpointer value, gpointer data)
 {
-  GArray **array = (GArray **)data;
+  GArray **array = (GArray **) data;
   gchar *str = g_strconcat (key, ":", value, NULL);
   *array = g_array_append_val (*array, str);
 }
@@ -771,7 +793,7 @@ add_to_attribute_array (gpointer key, gpointer value, gpointer data)
  * atspi_accessible_get_attributes_as_array:
  * @obj: The #AtspiAccessible being queried.
  *
- * Gets a #GArray representing any assigned 
+ * Gets a #GArray representing any assigned
  * name-value pair attributes or annotations for this object.
  * For typographic, textual, or textually-semantic attributes, see
  * atspi_text_get_attributes_as_array instead.
@@ -784,19 +806,19 @@ atspi_accessible_get_attributes_as_array (AtspiAccessible *obj, GError **error)
 {
   DBusMessage *message;
 
-    g_return_val_if_fail (obj != NULL, NULL);
+  g_return_val_if_fail (obj != NULL, NULL);
 
   if (obj->priv->cache)
-  {
-    GValue *val = g_hash_table_lookup (obj->priv->cache, "Attributes");
-    if (val)
     {
-      GArray *array = g_array_new (TRUE, TRUE, sizeof (gchar *));
-      GHashTable *attributes = g_value_get_boxed (val);
-      g_hash_table_foreach (attributes, add_to_attribute_array, &array);
-      return array;
+      GValue *val = g_hash_table_lookup (obj->priv->cache, "Attributes");
+      if (val)
+        {
+          GArray *array = g_array_new (TRUE, TRUE, sizeof (gchar *));
+          GHashTable *attributes = g_value_get_boxed (val);
+          g_hash_table_foreach (attributes, add_to_attribute_array, &array);
+          return array;
+        }
     }
-  }
 
   message = _atspi_dbus_call_partial (obj, atspi_interface_accessible, "GetAttributes", error, "");
   return _atspi_dbus_return_attribute_array_from_message (message);
@@ -818,33 +840,33 @@ atspi_accessible_get_application (AtspiAccessible *obj, GError **error)
 
   g_object_ref (obj);
   for (;;)
-  {
-    parent = atspi_accessible_get_parent (obj, NULL);
-    if (!parent && obj->parent.app &&
-        atspi_accessible_get_role (obj, NULL) != ATSPI_ROLE_APPLICATION)
     {
-      AtspiAccessible *root = g_object_ref (obj->parent.app->root);
-      if (root)
-      {
-        g_object_unref (obj);
-        if (atspi_accessible_get_role (root, NULL) == ATSPI_ROLE_DESKTOP_FRAME)
+      parent = atspi_accessible_get_parent (obj, NULL);
+      if (!parent && obj->parent.app &&
+          atspi_accessible_get_role (obj, NULL) != ATSPI_ROLE_APPLICATION)
         {
-          g_object_unref (root);
-          return NULL;
+          AtspiAccessible *root = g_object_ref (obj->parent.app->root);
+          if (root)
+            {
+              g_object_unref (obj);
+              if (atspi_accessible_get_role (root, NULL) == ATSPI_ROLE_DESKTOP_FRAME)
+                {
+                  g_object_unref (root);
+                  return NULL;
+                }
+              return root;
+            }
         }
-        return root;
-      }
+      if (!parent || parent == obj ||
+          atspi_accessible_get_role (parent, NULL) == ATSPI_ROLE_DESKTOP_FRAME)
+        {
+          if (parent)
+            g_object_unref (parent);
+          return obj;
+        }
+      g_object_unref (obj);
+      obj = parent;
     }
-    if (!parent || parent == obj ||
-        atspi_accessible_get_role (parent, NULL) == ATSPI_ROLE_DESKTOP_FRAME)
-  {
-    if (parent)
-      g_object_unref (parent);
-    return obj;
-  }
-    g_object_unref (obj);
-    obj = parent;
-  }
 }
 
 /* Application-specific methods */
@@ -929,7 +951,7 @@ atspi_accessible_get_atspi_version (AtspiAccessible *obj, GError **error)
  * Gets the application id for a #AtspiAccessible object.
  * Only works on application root objects.
  *
- * Returns: a positive #gint indicating the id for the #AtspiAccessible object 
+ * Returns: a positive #gint indicating the id for the #AtspiAccessible object
  * or -1 on exception.
  **/
 gint
@@ -940,16 +962,15 @@ atspi_accessible_get_id (AtspiAccessible *obj, GError **error)
   g_return_val_if_fail (obj != NULL, -1);
 
   if (!_atspi_dbus_get_property (obj, atspi_interface_application, "Id", error, "i", &ret))
-      return -1;
+    return -1;
   return ret;
 }
 
-
 /* Interface query methods */
 
 static gboolean
 _atspi_accessible_is_a (AtspiAccessible *accessible,
-                     const char *interface_name)
+                        const char *interface_name)
 {
   int n;
 
@@ -959,28 +980,28 @@ _atspi_accessible_is_a (AtspiAccessible *accessible,
     }
 
   if (!_atspi_accessible_test_cache (accessible, ATSPI_CACHE_INTERFACES))
-  {
-    DBusMessage *reply;
-    DBusMessageIter iter;
-    reply = _atspi_dbus_call_partial (accessible, atspi_interface_accessible,
-                                      "GetInterfaces", NULL, "");
-    _ATSPI_DBUS_CHECK_SIG (reply, "as", NULL, FALSE);
-    dbus_message_iter_init (reply, &iter);
-    _atspi_dbus_set_interfaces (accessible, &iter);
-    dbus_message_unref (reply);
-    _atspi_accessible_add_cache (accessible, ATSPI_CACHE_INTERFACES);
-  }
+    {
+      DBusMessage *reply;
+      DBusMessageIter iter;
+      reply = _atspi_dbus_call_partial (accessible, atspi_interface_accessible,
+                                        "GetInterfaces", NULL, "");
+      _ATSPI_DBUS_CHECK_SIG (reply, "as", NULL, FALSE);
+      dbus_message_iter_init (reply, &iter);
+      _atspi_dbus_set_interfaces (accessible, &iter);
+      dbus_message_unref (reply);
+    }
 
   n = _atspi_get_iface_num (interface_name);
-  if (n == -1) return FALSE;
-  return (gboolean) ((accessible->interfaces & (1 << n))? TRUE: FALSE);
+  if (n == -1)
+    return FALSE;
+  return (gboolean) ((accessible->interfaces & (1 << n)) ? TRUE : FALSE);
 }
 
 /**
  * atspi_accessible_is_action:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements the 
+ * Query whether the specified #AtspiAccessible implements the
  * #AtspiAction interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiAction interface,
@@ -990,7 +1011,7 @@ gboolean
 atspi_accessible_is_action (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_action);
+                                 atspi_interface_action);
 }
 
 /**
@@ -1007,10 +1028,10 @@ gboolean
 atspi_accessible_is_application (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_application);
+                                 atspi_interface_application);
 }
 
-/**                      
+/**
  * atspi_accessible_is_collection:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
@@ -1023,8 +1044,8 @@ atspi_accessible_is_application (AtspiAccessible *obj)
 gboolean
 atspi_accessible_is_collection (AtspiAccessible *obj)
 {
-     return _atspi_accessible_is_a (obj,
-                             atspi_interface_collection);
+  return _atspi_accessible_is_a (obj,
+                                 atspi_interface_collection);
 }
 
 /**
@@ -1040,7 +1061,7 @@ gboolean
 atspi_accessible_is_component (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_component);
+                                 atspi_interface_component);
 }
 
 /**
@@ -1057,7 +1078,7 @@ gboolean
 atspi_accessible_is_document (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_document);
+                                 atspi_interface_document);
 }
 
 /**
@@ -1074,9 +1095,9 @@ gboolean
 atspi_accessible_is_editable_text (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_editable_text);
+                                 atspi_interface_editable_text);
 }
-                                                                                                                                                                        
+
 /**
  * atspi_accessible_is_hypertext:
  * @obj: a pointer to the #AtspiAccessible instance to query.
@@ -1091,14 +1112,14 @@ gboolean
 atspi_accessible_is_hypertext (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_hypertext);
+                                 atspi_interface_hypertext);
 }
 
 /**
  * atspi_accessible_is_hyperlink:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements the 
+ * Query whether the specified #AtspiAccessible implements the
  * #AtspiHyperlink interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiHypertext interface,
@@ -1108,7 +1129,7 @@ gboolean
 atspi_accessible_is_hyperlink (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_hyperlink);
+                                 atspi_interface_hyperlink);
 }
 
 /**
@@ -1120,12 +1141,12 @@ atspi_accessible_is_hyperlink (AtspiAccessible *obj)
  *
  * Returns: #TRUE if @obj implements the #AtspiImage interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_image (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_image);
+                                 atspi_interface_image);
 }
 
 /**
@@ -1137,12 +1158,12 @@ atspi_accessible_is_image (AtspiAccessible *obj)
  *
  * Returns: #TRUE if @obj implements the #AtspiSelection interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_selection (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_selection);
+                                 atspi_interface_selection);
 }
 
 /**
@@ -1154,12 +1175,12 @@ atspi_accessible_is_selection (AtspiAccessible *obj)
  *
  * Returns: #TRUE if @obj implements the #AtspiTable interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_table (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_table);
+                                 atspi_interface_table);
 }
 
 /**
@@ -1171,12 +1192,12 @@ atspi_accessible_is_table (AtspiAccessible *obj)
  *
  * Returns: #TRUE if @obj implements the #AtspiTable interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_table_cell (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_table_cell);
+                                 atspi_interface_table_cell);
 }
 
 /**
@@ -1188,7 +1209,7 @@ atspi_accessible_is_table_cell (AtspiAccessible *obj)
  *
  * Returns: #TRUE if @obj implements the #AtspiStreamableContent interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_streamable_content (AtspiAccessible *obj)
 {
@@ -1205,17 +1226,17 @@ atspi_accessible_is_streamable_content (AtspiAccessible *obj)
  * atspi_accessible_is_text:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
- * Query whether the specified #AtspiAccessible implements the 
+ * Query whether the specified #AtspiAccessible implements the
  * #AtspiText interface.
  *
  * Returns: #TRUE if @obj implements the #AtspiText interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_text (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_text);
+                                 atspi_interface_text);
 }
 
 /**
@@ -1227,16 +1248,16 @@ atspi_accessible_is_text (AtspiAccessible *obj)
  *
  * Returns: #TRUE if @obj implements the #AtspiValue interface,
  *          #FALSE otherwise.
-**/
+ **/
 gboolean
 atspi_accessible_is_value (AtspiAccessible *obj)
 {
   return _atspi_accessible_is_a (obj,
-                             atspi_interface_value);
+                                 atspi_interface_value);
 }
 
 /**
- * atspi_accessible_get_action: (rename-to atspi_accessible_get_action_iface)
+ * atspi_accessible_get_action:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiAction interface for an #AtspiAccessible.
@@ -1249,8 +1270,7 @@ atspi_accessible_is_value (AtspiAccessible *obj)
 AtspiAction *
 atspi_accessible_get_action (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_action) ?
-          g_object_ref (ATSPI_ACTION (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_action) ? g_object_ref (ATSPI_ACTION (accessible)) : NULL);
 }
 
 /**
@@ -1265,12 +1285,11 @@ atspi_accessible_get_action (AtspiAccessible *accessible)
 AtspiAction *
 atspi_accessible_get_action_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_action) ?
-          g_object_ref (ATSPI_ACTION (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_action) ? g_object_ref (ATSPI_ACTION (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_collection: (rename-to atspi_accessible_get_collection_iface)
+ * atspi_accessible_get_collection:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiCollection interface for an #AtspiAccessible.
@@ -1283,8 +1302,7 @@ atspi_accessible_get_action_iface (AtspiAccessible *accessible)
 AtspiCollection *
 atspi_accessible_get_collection (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_collection) ?
-          g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_collection) ? g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);
 }
 
 /**
@@ -1299,12 +1317,11 @@ atspi_accessible_get_collection (AtspiAccessible *accessible)
 AtspiCollection *
 atspi_accessible_get_collection_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_collection) ?
-          g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_collection) ? g_object_ref (ATSPI_COLLECTION (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_component: (rename-to atspi_accessible_get_component_iface)
+ * atspi_accessible_get_component:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiComponent interface for an #AtspiAccessible.
@@ -1317,8 +1334,7 @@ atspi_accessible_get_collection_iface (AtspiAccessible *accessible)
 AtspiComponent *
 atspi_accessible_get_component (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_component) ?
-          g_object_ref (ATSPI_COMPONENT (obj)) : NULL);
+  return (_atspi_accessible_is_a (obj, atspi_interface_component) ? g_object_ref (ATSPI_COMPONENT (obj)) : NULL);
 }
 
 /**
@@ -1333,12 +1349,11 @@ atspi_accessible_get_component (AtspiAccessible *obj)
 AtspiComponent *
 atspi_accessible_get_component_iface (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_component) ?
-          g_object_ref (ATSPI_COMPONENT (obj)) : NULL);
+  return (_atspi_accessible_is_a (obj, atspi_interface_component) ? g_object_ref (ATSPI_COMPONENT (obj)) : NULL);
 }
 
 /**
- * atspi_accessible_get_document: (rename-to atspi_accessible_get_document_iface)
+ * atspi_accessible_get_document:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiDocument interface for an #AtspiAccessible.
@@ -1351,8 +1366,7 @@ atspi_accessible_get_component_iface (AtspiAccessible *obj)
 AtspiDocument *
 atspi_accessible_get_document (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_document) ?
-          g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_document) ? g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);
 }
 
 /**
@@ -1367,12 +1381,11 @@ atspi_accessible_get_document (AtspiAccessible *accessible)
 AtspiDocument *
 atspi_accessible_get_document_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_document) ?
-          g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_document) ? g_object_ref (ATSPI_DOCUMENT (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_editable_text: (rename-to atspi_accessible_get_editable_text_iface)
+ * atspi_accessible_get_editable_text:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiEditableText interface for an #AtspiAccessible.
@@ -1385,8 +1398,7 @@ atspi_accessible_get_document_iface (AtspiAccessible *accessible)
 AtspiEditableText *
 atspi_accessible_get_editable_text (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_editable_text) ?
-          g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_editable_text) ? g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);
 }
 
 /**
@@ -1401,8 +1413,7 @@ atspi_accessible_get_editable_text (AtspiAccessible *accessible)
 AtspiEditableText *
 atspi_accessible_get_editable_text_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_editable_text) ?
-          g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_editable_text) ? g_object_ref (ATSPI_EDITABLE_TEXT (accessible)) : NULL);
 }
 
 /**
@@ -1417,12 +1428,11 @@ atspi_accessible_get_editable_text_iface (AtspiAccessible *accessible)
 AtspiHyperlink *
 atspi_accessible_get_hyperlink (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_hyperlink) ?
-          _atspi_hyperlink_new (accessible->parent.app, accessible->parent.path) : NULL);
+  return (_atspi_accessible_is_a (accessible, atspi_interface_hyperlink) ? _atspi_hyperlink_new (accessible->parent.app, accessible->parent.path) : NULL);
 }
 
 /**
- * atspi_accessible_get_hypertext: (rename-to atspi_accessible_get_hypertext_iface)
+ * atspi_accessible_get_hypertext:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiHypertext interface for an #AtspiAccessible.
@@ -1435,8 +1445,7 @@ atspi_accessible_get_hyperlink (AtspiAccessible *accessible)
 AtspiHypertext *
 atspi_accessible_get_hypertext (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_hypertext) ?
-          g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_hypertext) ? g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);
 }
 
 /**
@@ -1451,12 +1460,11 @@ atspi_accessible_get_hypertext (AtspiAccessible *accessible)
 AtspiHypertext *
 atspi_accessible_get_hypertext_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_hypertext) ?
-          g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_hypertext) ? g_object_ref (ATSPI_HYPERTEXT (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_image: (rename-to atspi_accessible_get_image_iface)
+ * atspi_accessible_get_image:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiImage interface for an #AtspiAccessible.
@@ -1469,8 +1477,7 @@ atspi_accessible_get_hypertext_iface (AtspiAccessible *accessible)
 AtspiImage *
 atspi_accessible_get_image (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_image) ?
-          g_object_ref (ATSPI_IMAGE (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_image) ? g_object_ref (ATSPI_IMAGE (accessible)) : NULL);
 }
 
 /**
@@ -1485,12 +1492,11 @@ atspi_accessible_get_image (AtspiAccessible *accessible)
 AtspiImage *
 atspi_accessible_get_image_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_image) ?
-          g_object_ref (ATSPI_IMAGE (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_image) ? g_object_ref (ATSPI_IMAGE (accessible)) : NULL);
 }
 
 /**
- * atspi_accessible_get_selection: (rename-to atspi_accessible_get_selection_iface)
+ * atspi_accessible_get_selection:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiSelection interface for an #AtspiAccessible.
@@ -1503,8 +1509,7 @@ atspi_accessible_get_image_iface (AtspiAccessible *accessible)
 AtspiSelection *
 atspi_accessible_get_selection (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_selection) ?
-          g_object_ref (ATSPI_SELECTION (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_selection) ? g_object_ref (ATSPI_SELECTION (accessible)) : NULL);
 }
 
 /**
@@ -1519,8 +1524,7 @@ atspi_accessible_get_selection (AtspiAccessible *accessible)
 AtspiSelection *
 atspi_accessible_get_selection_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_selection) ?
-          g_object_ref (ATSPI_SELECTION (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_selection) ? g_object_ref (ATSPI_SELECTION (accessible)) : NULL);
 }
 
 #if 0
@@ -1542,7 +1546,7 @@ atspi_accessible_get_streamable_content (AtspiAccessible *accessible)
 #endif
 
 /**
- * atspi_accessible_get_table: (rename-to atspi_accessible_get_table_iface)
+ * atspi_accessible_get_table:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiTable interface for an #AtspiAccessible.
@@ -1555,8 +1559,7 @@ atspi_accessible_get_streamable_content (AtspiAccessible *accessible)
 AtspiTable *
 atspi_accessible_get_table (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_table) ?
-          g_object_ref (ATSPI_TABLE (obj)) : NULL);  
+  return (_atspi_accessible_is_a (obj, atspi_interface_table) ? g_object_ref (ATSPI_TABLE (obj)) : NULL);
 }
 
 /**
@@ -1571,8 +1574,7 @@ atspi_accessible_get_table (AtspiAccessible *obj)
 AtspiTable *
 atspi_accessible_get_table_iface (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_table) ?
-          g_object_ref (ATSPI_TABLE (obj)) : NULL);  
+  return (_atspi_accessible_is_a (obj, atspi_interface_table) ? g_object_ref (ATSPI_TABLE (obj)) : NULL);
 }
 
 /**
@@ -1587,12 +1589,11 @@ atspi_accessible_get_table_iface (AtspiAccessible *obj)
 AtspiTableCell *
 atspi_accessible_get_table_cell (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_table_cell) ?
-          g_object_ref (ATSPI_TABLE_CELL (obj)) : NULL);  
+  return (_atspi_accessible_is_a (obj, atspi_interface_table_cell) ? g_object_ref (ATSPI_TABLE_CELL (obj)) : NULL);
 }
 
 /**
- * atspi_accessible_get_text: (rename-to atspi_accessible_get_text_iface)
+ * atspi_accessible_get_text:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiTable interface for an #AtspiAccessible.
@@ -1605,8 +1606,7 @@ atspi_accessible_get_table_cell (AtspiAccessible *obj)
 AtspiText *
 atspi_accessible_get_text (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_text) ?
-          g_object_ref (ATSPI_TEXT (obj)) : NULL);
+  return (_atspi_accessible_is_a (obj, atspi_interface_text) ? g_object_ref (ATSPI_TEXT (obj)) : NULL);
 }
 
 /**
@@ -1621,12 +1621,11 @@ atspi_accessible_get_text (AtspiAccessible *obj)
 AtspiText *
 atspi_accessible_get_text_iface (AtspiAccessible *obj)
 {
-  return (_atspi_accessible_is_a (obj, atspi_interface_text) ?
-          g_object_ref (ATSPI_TEXT (obj)) : NULL);
+  return (_atspi_accessible_is_a (obj, atspi_interface_text) ? g_object_ref (ATSPI_TEXT (obj)) : NULL);
 }
 
 /**
- * atspi_accessible_get_value: (rename-to atspi_accessible_get_value_iface)
+ * atspi_accessible_get_value:
  * @obj: a pointer to the #AtspiAccessible instance to query.
  *
  * Gets the #AtspiTable interface for an #AtspiAccessible.
@@ -1639,8 +1638,7 @@ atspi_accessible_get_text_iface (AtspiAccessible *obj)
 AtspiValue *
 atspi_accessible_get_value (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_value) ?
-          g_object_ref (ATSPI_VALUE (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_value) ? g_object_ref (ATSPI_VALUE (accessible)) : NULL);
 }
 
 /**
@@ -1655,8 +1653,7 @@ atspi_accessible_get_value (AtspiAccessible *accessible)
 AtspiValue *
 atspi_accessible_get_value_iface (AtspiAccessible *accessible)
 {
-  return (_atspi_accessible_is_a (accessible, atspi_interface_value) ?
-          g_object_ref (ATSPI_VALUE (accessible)) : NULL);  
+  return (_atspi_accessible_is_a (accessible, atspi_interface_value) ? g_object_ref (ATSPI_VALUE (accessible)) : NULL);
 }
 
 static void
@@ -1716,13 +1713,12 @@ atspi_accessible_get_interfaces (AtspiAccessible *obj)
   return ret;
 }
 
-AtspiAccessible * 
+AtspiAccessible *
 _atspi_accessible_new (AtspiApplication *app, const gchar *path)
 {
   AtspiAccessible *accessible;
-  
+
   accessible = g_object_new (ATSPI_TYPE_ACCESSIBLE, NULL);
-  g_return_val_if_fail (accessible != NULL, NULL);
 
   accessible->parent.app = g_object_ref (app);
   accessible->parent.path = g_strdup (path);
@@ -1754,6 +1750,34 @@ atspi_accessible_set_cache_mask (AtspiAccessible *accessible, AtspiCache mask)
   enable_caching = TRUE;
 }
 
+static void
+atspi_accessible_clear_cache_internal (AtspiAccessible *obj, guint iteration_stamp)
+{
+  gint i;
+
+  if (obj && obj->priv->iteration_stamp != iteration_stamp)
+    {
+      obj->priv->iteration_stamp = iteration_stamp;
+      atspi_accessible_clear_cache_single (obj);
+      if (obj->children)
+        for (i = 0; i < obj->children->len; i++)
+          atspi_accessible_clear_cache_internal (g_ptr_array_index (obj->children, i), iteration_stamp);
+    }
+}
+
+/**
+ * atspi_accessible_clear_cache_single:
+ * @obj: The #AtspiAccessible whose cache to clear.
+ *
+ * Clears the cached information only for the given accessible.
+ */
+void
+atspi_accessible_clear_cache_single (AtspiAccessible *obj)
+{
+  if (obj)
+    obj->cached_properties = ATSPI_CACHE_NONE;
+}
+
 /**
  * atspi_accessible_clear_cache:
  * @obj: The #AtspiAccessible whose cache to clear.
@@ -1764,15 +1788,9 @@ atspi_accessible_set_cache_mask (AtspiAccessible *accessible, AtspiCache mask)
 void
 atspi_accessible_clear_cache (AtspiAccessible *obj)
 {
-  gint i;
+  static guint iteration_stamp = 0;
 
-  if (obj)
-  {
-    obj->cached_properties = ATSPI_CACHE_NONE;
-    if (obj->children)
-      for (i = 0; i < obj->children->len; i++)
-        atspi_accessible_clear_cache (g_ptr_array_index (obj->children, i));
-  }
+  atspi_accessible_clear_cache_internal (obj, ++iteration_stamp);
 }
 
 /**
@@ -1796,7 +1814,7 @@ atspi_accessible_get_process_id (AtspiAccessible *accessible, GError **error)
 
   if (!accessible->parent.app || !accessible->parent.app->bus_name)
     {
-      g_set_error_literal(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "Process is defunct");
+      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, "Process is defunct");
       return -1;
     }
 
@@ -1811,14 +1829,14 @@ atspi_accessible_get_process_id (AtspiAccessible *accessible, GError **error)
   reply = dbus_connection_send_with_reply_and_block (bus, message, -1, &d_error);
   dbus_message_unref (message);
   if (reply)
-  {
-    if (!strcmp (dbus_message_get_signature (reply), "u"))
-      dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &pid, DBUS_TYPE_INVALID);
-    dbus_message_unref (reply);
-  }
+    {
+      if (!strcmp (dbus_message_get_signature (reply), "u"))
+        dbus_message_get_args (reply, NULL, DBUS_TYPE_UINT32, &pid, DBUS_TYPE_INVALID);
+      dbus_message_unref (reply);
+    }
   if (dbus_error_is_set (&d_error))
     {
-      g_set_error_literal(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "Process is defunct");
+      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, "Process is defunct");
       dbus_error_free (&d_error);
     }
   return pid;
@@ -1832,15 +1850,15 @@ _atspi_accessible_get_cache_mask (AtspiAccessible *accessible)
   if (!accessible->parent.app)
     return ATSPI_CACHE_NONE;
 
- mask = accessible->parent.app->cache;
 mask = accessible->parent.app->cache;
   if (mask == ATSPI_CACHE_UNDEFINED &&
       accessible->parent.app->root &&
       accessible->parent.app->root->accessible_parent)
-  {
-    AtspiAccessible *desktop = atspi_get_desktop (0);
-    mask = desktop->parent.app->cache;
-    g_object_unref (desktop);
-  }
+    {
+      AtspiAccessible *desktop = atspi_get_desktop (0);
+      mask = desktop->parent.app->cache;
+      g_object_unref (desktop);
+    }
 
   if (mask == ATSPI_CACHE_UNDEFINED)
     mask = ATSPI_CACHE_DEFAULT;
@@ -1855,8 +1873,7 @@ _atspi_accessible_test_cache (AtspiAccessible *accessible, AtspiCache flag)
   AtspiCache result = accessible->cached_properties & mask & flag;
   if (accessible->states && atspi_state_set_contains (accessible->states, ATSPI_STATE_TRANSIENT))
     return FALSE;
-  return (result != 0 && (atspi_main_loop || enable_caching ||
-                          flag == ATSPI_CACHE_INTERFACES) &&
+  return (result != 0 && (atspi_main_loop || enable_caching || flag == ATSPI_CACHE_INTERFACES) &&
           !atspi_no_cache);
 }
 
@@ -1880,7 +1897,7 @@ _atspi_accessible_add_cache (AtspiAccessible *accessible, AtspiCache flag)
  * Returns: a UTF-8 string indicating the POSIX-style LC_MESSAGES
  *          locale of @accessible.
  **/
-const gchar*
+const gchar *
 atspi_accessible_get_object_locale (AtspiAccessible *accessible, GError **error)
 {
   gchar *locale;
@@ -1889,14 +1906,14 @@ atspi_accessible_get_object_locale (AtspiAccessible *accessible, GError **error)
 
   locale = g_object_get_qdata (G_OBJECT (accessible), quark_locale);
   if (!locale)
-  {
-    if (!_atspi_dbus_get_property (accessible, atspi_interface_accessible,
-                                   "Locale", error, "s", &locale))
-      return NULL;
-    if (locale)
-      g_object_set_qdata_full (G_OBJECT (accessible), quark_locale, locale,
-                               g_free);
-  }
+    {
+      if (!_atspi_dbus_get_property (accessible, atspi_interface_accessible,
+                                     "Locale", error, "s", &locale))
+        return NULL;
+      if (locale)
+        g_object_set_qdata_full (G_OBJECT (accessible), quark_locale, locale,
+                                 g_free);
+    }
   return locale;
 }
 
@@ -1913,7 +1930,7 @@ atspi_accessible_get_object_locale (AtspiAccessible *accessible, GError **error)
  * Returns: a character string representing the accessible id of the
  * #AtspiAccessible object or NULL on exception.
  **/
-gchar*
+gchar *
 atspi_accessible_get_accessible_id (AtspiAccessible *obj, GError **error)
 {
   gchar *accessible_id;
@@ -1921,12 +1938,39 @@ atspi_accessible_get_accessible_id (AtspiAccessible *obj, GError **error)
   g_return_val_if_fail (obj != NULL, NULL);
 
   if (!_atspi_dbus_get_property (obj, atspi_interface_accessible,
-                                "AccessibleId", error, "s", &accessible_id))
+                                 "AccessibleId", error, "s", &accessible_id))
     return NULL;
 
   return accessible_id;
 }
 
+/**
+ * atspi_accessible_get_help_text:
+ * @obj: an #AtspiAccessible
+ *
+ * Gets the help text associated with the accessible, if set. When this is
+ * present, it provides information that a screen reader can relay to the user
+ * to explain how to interact with the object.
+ *
+ * Since: 2.52
+ *
+ * Returns: a character string representing the help text for the
+ * #AtspiAccessible object or NULL on exception.
+ **/
+gchar *
+atspi_accessible_get_help_text (AtspiAccessible *obj, GError **error)
+{
+  gchar *help_text;
+
+  g_return_val_if_fail (obj != NULL, NULL);
+
+  if (!_atspi_dbus_get_property (obj, atspi_interface_accessible,
+                                 "HelpText", error, "s", &help_text))
+    return NULL;
+
+  return help_text;
+}
+
 void
 free_value (gpointer data)
 {
@@ -1955,9 +1999,9 @@ _atspi_accessible_unref_cache (AtspiAccessible *accessible)
   AtspiAccessiblePrivate *priv = accessible->priv;
 
   if (priv->cache)
-  {
-    g_hash_table_unref (priv->cache);
-    if (--priv->cache_ref_count == 0)
-      priv->cache = NULL;
-  }
+    {
+      g_hash_table_unref (priv->cache);
+      if (--priv->cache_ref_count == 0)
+        priv->cache = NULL;
+    }
 }
index 35c0d5b..c5cc285 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,12 +36,12 @@ G_BEGIN_DECLS
 #include "atspi-stateset.h"
 #include "atspi-types.h"
 
-#define ATSPI_TYPE_ACCESSIBLE                        (atspi_accessible_get_type ())
-#define ATSPI_ACCESSIBLE(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_ACCESSIBLE, AtspiAccessible))
-#define ATSPI_ACCESSIBLE_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_ACCESSIBLE, AtspiAccessibleClass))
-#define ATSPI_IS_ACCESSIBLE(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_ACCESSIBLE))
-#define ATSPI_IS_ACCESSIBLE_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_ACCESSIBLE))
-#define ATSPI_ACCESSIBLE_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_ACCESSIBLE, AtspiAccessibleClass))
+#define ATSPI_TYPE_ACCESSIBLE (atspi_accessible_get_type ())
+#define ATSPI_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_ACCESSIBLE, AtspiAccessible))
+#define ATSPI_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_ACCESSIBLE, AtspiAccessibleClass))
+#define ATSPI_IS_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_ACCESSIBLE))
+#define ATSPI_IS_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_ACCESSIBLE))
+#define ATSPI_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_ACCESSIBLE, AtspiAccessibleClass))
 
 typedef struct _AtspiAccessiblePrivate AtspiAccessiblePrivate;
 
@@ -69,108 +69,112 @@ struct _AtspiAccessibleClass
   void (*mode_changed) (AtspiAccessible *accessible, gboolean enabled);
 };
 
-GType atspi_accessible_get_type (void); 
+GType atspi_accessible_get_type (void);
 
 AtspiAccessible *
 _atspi_accessible_new (AtspiApplication *app, const gchar *path);
 
-gchar * atspi_accessible_get_name (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_name (AtspiAccessible *obj, GError **error);
 
-gchar * atspi_accessible_get_description (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_description (AtspiAccessible *obj, GError **error);
 
-AtspiAccessible * atspi_accessible_get_parent (AtspiAccessible *obj, GError **error);
+AtspiAccessible *atspi_accessible_get_parent (AtspiAccessible *obj, GError **error);
 
 gint atspi_accessible_get_child_count (AtspiAccessible *obj, GError **error);
 
-AtspiAccessible * atspi_accessible_get_child_at_index (AtspiAccessible *obj, gint    child_index, GError **error);
+AtspiAccessible *atspi_accessible_get_child_at_index (AtspiAccessible *obj, gint child_index, GError **error);
 
 gint atspi_accessible_get_index_in_parent (AtspiAccessible *obj, GError **error);
 
-GArray * atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error);
+GArray *atspi_accessible_get_relation_set (AtspiAccessible *obj, GError **error);
 
 AtspiRole atspi_accessible_get_role (AtspiAccessible *obj, GError **error);
 
-gchar * atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error);
 
-gchar * atspi_accessible_get_localized_role_name (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_localized_role_name (AtspiAccessible *obj, GError **error);
 
-AtspiStateSet * atspi_accessible_get_state_set (AtspiAccessible *obj);
+AtspiStateSet *atspi_accessible_get_state_set (AtspiAccessible *obj);
 
-GHashTable * atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error);
+GHashTable *atspi_accessible_get_attributes (AtspiAccessible *obj, GError **error);
 
-GArray * atspi_accessible_get_attributes_as_array (AtspiAccessible *obj, GError **error);
+GArray *atspi_accessible_get_attributes_as_array (AtspiAccessible *obj, GError **error);
 
-gchar * atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error);
 
-gchar * atspi_accessible_get_toolkit_version (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_toolkit_version (AtspiAccessible *obj, GError **error);
 
-gchar * atspi_accessible_get_atspi_version (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_atspi_version (AtspiAccessible *obj, GError **error);
 
 gint atspi_accessible_get_id (AtspiAccessible *obj, GError **error);
 
-AtspiAccessible * atspi_accessible_get_application (AtspiAccessible *obj, GError **error);
+AtspiAccessible *atspi_accessible_get_application (AtspiAccessible *obj, GError **error);
 
 #ifndef ATSPI_DISABLE_DEPRECATED
-AtspiAction * atspi_accessible_get_action (AtspiAccessible *obj);
+AtspiAction *atspi_accessible_get_action (AtspiAccessible *obj);
 
-AtspiCollection * atspi_accessible_get_collection (AtspiAccessible *obj);
+AtspiCollection *atspi_accessible_get_collection (AtspiAccessible *obj);
 
-AtspiComponent * atspi_accessible_get_component (AtspiAccessible *obj);
+AtspiComponent *atspi_accessible_get_component (AtspiAccessible *obj);
 
-AtspiDocument * atspi_accessible_get_document (AtspiAccessible *obj);
+AtspiDocument *atspi_accessible_get_document (AtspiAccessible *obj);
 
-AtspiEditableText * atspi_accessible_get_editable_text (AtspiAccessible *obj);
+AtspiEditableText *atspi_accessible_get_editable_text (AtspiAccessible *obj);
 
-AtspiHyperlink * atspi_accessible_get_hyperlink (AtspiAccessible *obj);
+AtspiHyperlink *atspi_accessible_get_hyperlink (AtspiAccessible *obj);
 
-AtspiHypertext * atspi_accessible_get_hypertext (AtspiAccessible *obj);
+AtspiHypertext *atspi_accessible_get_hypertext (AtspiAccessible *obj);
 
-AtspiImage * atspi_accessible_get_image (AtspiAccessible *obj);
+AtspiImage *atspi_accessible_get_image (AtspiAccessible *obj);
 
-AtspiSelection * atspi_accessible_get_selection (AtspiAccessible *obj);
+AtspiSelection *atspi_accessible_get_selection (AtspiAccessible *obj);
 
-AtspiTable * atspi_accessible_get_table (AtspiAccessible *obj);
+AtspiTable *atspi_accessible_get_table (AtspiAccessible *obj);
 
-AtspiTableCell * atspi_accessible_get_table_cell (AtspiAccessible *obj);
+AtspiTableCell *atspi_accessible_get_table_cell (AtspiAccessible *obj);
 
-AtspiText * atspi_accessible_get_text (AtspiAccessible *obj);
+AtspiText *atspi_accessible_get_text (AtspiAccessible *obj);
 
-AtspiValue * atspi_accessible_get_value (AtspiAccessible *obj);
+AtspiValue *atspi_accessible_get_value (AtspiAccessible *obj);
 #endif
 
-AtspiAction * atspi_accessible_get_action_iface (AtspiAccessible *obj);
+AtspiAction *atspi_accessible_get_action_iface (AtspiAccessible *obj);
 
-AtspiCollection * atspi_accessible_get_collection_iface (AtspiAccessible *obj);
+AtspiCollection *atspi_accessible_get_collection_iface (AtspiAccessible *obj);
 
-AtspiComponent * atspi_accessible_get_component_iface (AtspiAccessible *obj);
+AtspiComponent *atspi_accessible_get_component_iface (AtspiAccessible *obj);
 
-AtspiDocument * atspi_accessible_get_document_iface (AtspiAccessible *obj);
+AtspiDocument *atspi_accessible_get_document_iface (AtspiAccessible *obj);
 
-AtspiEditableText * atspi_accessible_get_editable_text_iface (AtspiAccessible *obj);
+AtspiEditableText *atspi_accessible_get_editable_text_iface (AtspiAccessible *obj);
 
-AtspiHypertext * atspi_accessible_get_hypertext_iface (AtspiAccessible *obj);
+AtspiHypertext *atspi_accessible_get_hypertext_iface (AtspiAccessible *obj);
 
-AtspiImage * atspi_accessible_get_image_iface (AtspiAccessible *obj);
+AtspiImage *atspi_accessible_get_image_iface (AtspiAccessible *obj);
 
-AtspiSelection * atspi_accessible_get_selection_iface (AtspiAccessible *obj);
+AtspiSelection *atspi_accessible_get_selection_iface (AtspiAccessible *obj);
 
-AtspiTable * atspi_accessible_get_table_iface (AtspiAccessible *obj);
+AtspiTable *atspi_accessible_get_table_iface (AtspiAccessible *obj);
 
-AtspiText * atspi_accessible_get_text_iface (AtspiAccessible *obj);
+AtspiText *atspi_accessible_get_text_iface (AtspiAccessible *obj);
 
-AtspiValue * atspi_accessible_get_value_iface (AtspiAccessible *obj);
+AtspiValue *atspi_accessible_get_value_iface (AtspiAccessible *obj);
 
-GArray * atspi_accessible_get_interfaces (AtspiAccessible *obj);
+GArray *atspi_accessible_get_interfaces (AtspiAccessible *obj);
 
-const gcharatspi_accessible_get_object_locale (AtspiAccessible *accessible, GError **error);
+const gchar *atspi_accessible_get_object_locale (AtspiAccessible *accessible, GError **error);
 
 void atspi_accessible_set_cache_mask (AtspiAccessible *accessible, AtspiCache mask);
 
 void atspi_accessible_clear_cache (AtspiAccessible *obj);
 
+void atspi_accessible_clear_cache_single (AtspiAccessible *obj);
+
 guint atspi_accessible_get_process_id (AtspiAccessible *accessible, GError **error);
 
-gchar * atspi_accessible_get_accessible_id (AtspiAccessible *obj, GError **error);
+gchar *atspi_accessible_get_accessible_id (AtspiAccessible *obj, GError **error);
+
+gchar *atspi_accessible_get_help_text (AtspiAccessible *obj, GError **error);
 
 /* private */
 void _atspi_accessible_add_cache (AtspiAccessible *accessible, AtspiCache flag);
@@ -179,4 +183,4 @@ gboolean _atspi_accessible_test_cache (AtspiAccessible *accessible, AtspiCache f
 
 G_END_DECLS
 
-#endif /* _ATSPI_ACCESSIBLE_H_ */
+#endif /* _ATSPI_ACCESSIBLE_H_ */
index bc9cb7b..fee13f0 100644 (file)
@@ -95,7 +95,7 @@ atspi_action_get_action_description (AtspiAction *obj, int i, GError **error)
  *        there are multiple parts to a keybinding string (typically 3).
  *        They are delimited with ";".  The first is the action's
  *        keybinding which is usable if the object implementing the action
- *        is currently posted to the screen, e.g. if a menu is posted 
+ *        is currently posted to the screen, e.g. if a menu is posted
  *        then these keybindings for the corresponding menu-items are
  *        available.  The second keybinding substring is the full key sequence
  *        necessary to post the action's widget and activate it, e.g. for
@@ -104,11 +104,11 @@ atspi_action_get_action_description (AtspiAction *obj, int i, GError **error)
  *        during the lifetime of the containing toplevel window as a whole,
  *        whereas the first keybinding string only works while the object
  *        implementing AtkAction is posted.  The third (and optional)
- *        keybinding string is the "keyboard shortcut" which invokes the 
- *        action without posting any menus. 
+ *        keybinding string is the "keyboard shortcut" which invokes the
+ *        action without posting any menus.
  *        Meta-keys are indicated by the conventional strings
  *        "&lt;Control&gt;", "&lt;Alt&gt;", "&lt;Shift&gt;", "&lt;Mod2&gt;",
- *        etc. (we use the same string as gtk_accelerator_name() in 
+ *        etc. (we use the same string as gtk_accelerator_name() in
  *        gtk+-2.X.
  *
  * Returns: a UTF-8 string which can be parsed to determine the @i-th
@@ -224,16 +224,15 @@ atspi_action_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiAction),
-      (GBaseInitFunc) atspi_action_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiAction", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiAction),
+        (GBaseInitFunc) atspi_action_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiAction", &tinfo, 0);
+    }
   return type;
 }
index e1056e7..2f6501c 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_ACTION                    (atspi_action_get_type ())
-#define ATSPI_IS_ACTION(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_ACTION)
-#define ATSPI_ACTION(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_ACTION, AtspiAction)
-#define ATSPI_ACTION_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_ACTION, AtspiAction))
+#define ATSPI_TYPE_ACTION (atspi_action_get_type ())
+#define ATSPI_IS_ACTION(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_ACTION)
+#define ATSPI_ACTION(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_ACTION, AtspiAction)
+#define ATSPI_ACTION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_ACTION, AtspiAction))
 
 GType atspi_action_get_type ();
 
@@ -45,23 +45,22 @@ struct _AtspiAction
   GTypeInterface parent;
 };
 
-gchar * atspi_action_get_action_description (AtspiAction *obj, int i, GError **error);
+gchar *atspi_action_get_action_description (AtspiAction *obj, int i, GError **error);
 
-gchar * atspi_action_get_action_name (AtspiAction *obj, gint i, GError **error);
+gchar *atspi_action_get_action_name (AtspiAction *obj, gint i, GError **error);
 
 gint atspi_action_get_n_actions (AtspiAction *obj, GError **error);
 
-gchar * atspi_action_get_key_binding (AtspiAction *obj, gint i, GError **error);
-
+gchar *atspi_action_get_key_binding (AtspiAction *obj, gint i, GError **error);
 
-gchar * atspi_action_get_localized_name (AtspiAction *obj, gint i, GError **error);
+gchar *atspi_action_get_localized_name (AtspiAction *obj, gint i, GError **error);
 
 gboolean atspi_action_do_action (AtspiAction *obj, gint i, GError **error);
 
 #ifndef ATSPI_DISABLE_DEPRECATED
-gchar * atspi_action_get_description (AtspiAction *obj, gint i, GError **error);
-gchar * atspi_action_get_name (AtspiAction *obj, gint i, GError **error);
+gchar *atspi_action_get_description (AtspiAction *obj, gint i, GError **error);
+gchar *atspi_action_get_name (AtspiAction *obj, gint i, GError **error);
 #endif
 G_END_DECLS
 
-#endif /* _ATSPI_ACTION_H_ */
+#endif /* _ATSPI_ACTION_H_ */
index cccaf86..91b281f 100644 (file)
 
 #include "atspi-private.h"
 
+/**
+ * AtspiApplication:
+ *
+ * An interface identifying the root object associated
+ * with a running application.
+ *
+ * An interface identifying an object which is the root of the
+ * hierarchy associated with a running application.
+ */
+
 G_DEFINE_TYPE (AtspiApplication, atspi_application, G_TYPE_OBJECT)
 
 static void
@@ -42,26 +52,26 @@ atspi_application_dispose (GObject *object)
   AtspiApplication *application = ATSPI_APPLICATION (object);
 
   if (application->bus)
-  {
-    if (application->bus != _atspi_bus ())
-      dbus_connection_close (application->bus);
-    dbus_connection_unref (application->bus);
-    application->bus = NULL;
-  }
+    {
+      if (application->bus != _atspi_bus ())
+        dbus_connection_close (application->bus);
+      dbus_connection_unref (application->bus);
+      application->bus = NULL;
+    }
 
   if (application->hash)
-  {
-    g_hash_table_foreach (application->hash, dispose_accessible, NULL);
-    g_hash_table_unref (application->hash);
-    application->hash = NULL;
-  }
+    {
+      g_hash_table_foreach (application->hash, dispose_accessible, NULL);
+      g_hash_table_unref (application->hash);
+      application->hash = NULL;
+    }
 
   if (application->root)
-  {
-    g_clear_object (&application->root->parent.app);
-    g_object_unref (application->root);
-    application->root = NULL;
-  }
+    {
+      g_clear_object (&application->root->parent.app);
+      g_object_unref (application->root);
+      application->root = NULL;
+    }
 
   G_OBJECT_CLASS (atspi_application_parent_class)->dispose (object);
 }
@@ -92,8 +102,9 @@ AtspiApplication *
 _atspi_application_new (const gchar *bus_name)
 {
   AtspiApplication *application;
-  
+
   application = g_object_new (ATSPI_TYPE_APPLICATION, NULL);
+  application->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
   application->bus_name = g_strdup (bus_name);
   application->root = NULL;
   return application;
index 0662031..691e1c4 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include <dbus/dbus.h>
 
-#include "atspi-types.h"
 #include "atspi-accessible.h"
+#include "atspi-types.h"
 #include <sys/time.h>
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_APPLICATION                        (atspi_application_get_type ())
-#define ATSPI_APPLICATION(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_APPLICATION, AtspiApplication))
-#define ATSPI_APPLICATION_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_APPLICATION, AtspiAccessibleClass))
-#define ATSPI_IS_APPLICATION(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_APPLICATION))
-#define ATSPI_IS_APPLICATION_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_APPLICATION))
-#define ATSPI_APPLICATION_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_APPLICATION, AtspiAccessibleClass))
+#define ATSPI_TYPE_APPLICATION (atspi_application_get_type ())
+#define ATSPI_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_APPLICATION, AtspiApplication))
+#define ATSPI_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_APPLICATION, AtspiAccessibleClass))
+#define ATSPI_IS_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_APPLICATION))
+#define ATSPI_IS_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_APPLICATION))
+#define ATSPI_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_APPLICATION, AtspiAccessibleClass))
 
 typedef struct _AtspiApplication AtspiApplication;
 struct _AtspiApplication
@@ -68,4 +68,4 @@ GType atspi_application_get_type (void);
 
 G_END_DECLS
 
-#endif /* _ATSPI_APPLICATION_H_ */
+#endif /* _ATSPI_APPLICATION_H_ */
index d4d1537..b7b2ca2 100644 (file)
 /* TODO: Improve documentation and implement some missing functions */
 
 /**
+ * AtspiCollection
+ *
+ * An interface designed to allow accessibles which satisfy a set of
+ * criteria to be returned.
+ *
+ * An interface designed to allow accessibles which satisfy a set of
+ * criteria to be returned. This interface can be used to avoid iteration
+ * or client-side search of the object tree.
+ */
+
+/**
  * atspi_collection_is_ancestor_of:
  *
  * Not yet implemented.
@@ -45,8 +56,7 @@ new_message (AtspiCollection *collection, char *method)
 {
   AtspiAccessible *accessible;
 
-  if (!collection)
-    return NULL;
+  g_assert (collection != NULL);
 
   accessible = ATSPI_ACCESSIBLE (collection);
   if (!accessible->parent.app)
@@ -74,7 +84,7 @@ append_accessible (DBusMessage *message, AtspiAccessible *accessible)
   dbus_message_iter_init_append (message, &iter);
   dbus_message_iter_append_basic (&iter, DBUS_TYPE_OBJECT_PATH,
                                   &accessible->parent.path);
-  return TRUE; /* TODO: Check for out-of-memory */
+  return TRUE; /* TODO: Check for out-of-memory */
 }
 
 static GArray *
@@ -89,12 +99,12 @@ return_accessibles (DBusMessage *message)
   dbus_message_iter_recurse (&iter, &iter_array);
 
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    AtspiAccessible *accessible;
-    accessible = _atspi_dbus_return_accessible_from_iter (&iter_array);
-    ret = g_array_append_val (ret, accessible);
-    /* Iter was moved already, so no need to call dbus_message_iter_next */
-  }
+    {
+      AtspiAccessible *accessible;
+      accessible = _atspi_dbus_consume_accessible (&iter_array);
+      ret = g_array_append_val (ret, accessible);
+      /* Iter was moved already, so no need to call dbus_message_iter_next */
+    }
   dbus_message_unref (message);
   return ret;
 }
@@ -109,9 +119,9 @@ return_accessibles (DBusMessage *message)
  * @traverse: Not supported.
  *
  * Gets all #AtspiAccessible objects from the @collection matching a given
- * @rule.  
+ * @rule.
  *
- * Returns: (element-type AtspiAccessible*) (transfer full): All 
+ * Returns: (element-type AtspiAccessible*) (transfer full): All
  *          #AtspiAccessible objects matching the given match rule.
  **/
 GArray *
@@ -159,8 +169,8 @@ atspi_collection_get_matches (AtspiCollection *collection,
  * @count: The maximum number of results to return, or 0 for no limit.
  * @traverse: Not supported.
  *
- * Gets all #AtspiAccessible objects from the @collection, after 
- * @current_object, matching a given @rule.  
+ * Gets all #AtspiAccessible objects from the @collection, after
+ * @current_object, matching a given @rule.
  *
  * Returns: (element-type AtspiAccessible*) (transfer full): All
  *          #AtspiAccessible objects matching the given match rule after
@@ -168,14 +178,14 @@ atspi_collection_get_matches (AtspiCollection *collection,
  **/
 GArray *
 atspi_collection_get_matches_to (AtspiCollection *collection,
-                              AtspiAccessible *current_object,
-                              AtspiMatchRule *rule,
-                              AtspiCollectionSortOrder sortby,
-                              AtspiCollectionTreeTraversalType tree,
-                              gboolean limit_scope,
-                              gint count,
-                              gboolean traverse,
-                              GError **error)
+                                 AtspiAccessible *current_object,
+                                 AtspiMatchRule *rule,
+                                 AtspiCollectionSortOrder sortby,
+                                 AtspiCollectionTreeTraversalType tree,
+                                 gboolean limit_scope,
+                                 gint count,
+                                 gboolean traverse,
+                                 GError **error)
 {
   DBusMessage *message = new_message (collection, "GetMatchesTo");
   DBusMessage *reply;
@@ -193,7 +203,7 @@ atspi_collection_get_matches_to (AtspiCollection *collection,
   if (!append_match_rule (message, rule))
     return NULL;
   dbus_message_append_args (message, DBUS_TYPE_UINT32, &d_sortby,
-                                     DBUS_TYPE_UINT32, &d_tree,
+                            DBUS_TYPE_UINT32, &d_tree,
                             DBUS_TYPE_BOOLEAN, &d_limit_scope,
                             DBUS_TYPE_INT32, &d_count,
                             DBUS_TYPE_BOOLEAN, &d_traverse,
@@ -216,22 +226,22 @@ atspi_collection_get_matches_to (AtspiCollection *collection,
  * @count: The maximum number of results to return, or 0 for no limit.
  * @traverse: Not supported.
  *
- * Gets all #AtspiAccessible objects from the @collection, before  
- * @current_object, matching a given @rule.  
+ * Gets all #AtspiAccessible objects from the @collection, before
+ * @current_object, matching a given @rule.
  *
- * Returns: (element-type AtspiAccessible*) (transfer full): All 
+ * Returns: (element-type AtspiAccessible*) (transfer full): All
  *          #AtspiAccessible objects matching the given match rule that preceed
  *          @current_object.
  **/
 GArray *
 atspi_collection_get_matches_from (AtspiCollection *collection,
-                              AtspiAccessible *current_object,
-                              AtspiMatchRule *rule,
-                              AtspiCollectionSortOrder sortby,
-                              AtspiCollectionTreeTraversalType tree,
-                              gint count,
-                              gboolean traverse,
-                              GError **error)
+                                   AtspiAccessible *current_object,
+                                   AtspiMatchRule *rule,
+                                   AtspiCollectionSortOrder sortby,
+                                   AtspiCollectionTreeTraversalType tree,
+                                   gint count,
+                                   gboolean traverse,
+                                   GError **error)
 {
   DBusMessage *message = new_message (collection, "GetMatchesFrom");
   DBusMessage *reply;
@@ -261,7 +271,7 @@ atspi_collection_get_matches_from (AtspiCollection *collection,
 /**
  * atspi_collection_get_active_descendant:
  *
-* Returns: (transfer full): The active descendant of the given object.
+ * Returns: (transfer full): The active descendant of the given object.
  * Not yet implemented.
  **/
 AtspiAccessible *
@@ -281,16 +291,15 @@ atspi_collection_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiCollection),
-      (GBaseInitFunc) atspi_collection_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiCollection", &tinfo, 0);
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiCollection),
+        (GBaseInitFunc) atspi_collection_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
 
-  }
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiCollection", &tinfo, 0);
+    }
   return type;
 }
index 9b564c5..a0d0cdc 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include "atspi-constants.h"
 
-#include "atspi-types.h"
 #include "atspi-matchrule.h"
+#include "atspi-types.h"
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_COLLECTION                    (atspi_collection_get_type ())
-#define ATSPI_IS_COLLECTION(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_COLLECTION)
-#define ATSPI_COLLECTION(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_COLLECTION, AtspiCollection)
-#define ATSPI_COLLECTION_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_COLLECTION, AtspiCollection))
+#define ATSPI_TYPE_COLLECTION (atspi_collection_get_type ())
+#define ATSPI_IS_COLLECTION(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_COLLECTION)
+#define ATSPI_COLLECTION(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_COLLECTION, AtspiCollection)
+#define ATSPI_COLLECTION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_COLLECTION, AtspiCollection))
 
 GType atspi_collection_get_type ();
 
@@ -49,14 +49,14 @@ struct _AtspiCollection
 
 gboolean atspi_collection_is_ancestor_of (AtspiCollection *collection, AtspiAccessible *test, GError **error);
 
-GArray * atspi_collection_get_matches (AtspiCollection *collection, AtspiMatchRule *rule, AtspiCollectionSortOrder sortby, gint count, gboolean traverse, GError **error);
+GArray *atspi_collection_get_matches (AtspiCollection *collection, AtspiMatchRule *rule, AtspiCollectionSortOrder sortby, gint count, gboolean traverse, GError **error);
 
-GArray * atspi_collection_get_matches_to (AtspiCollection *collection, AtspiAccessible *current_object, AtspiMatchRule *rule, AtspiCollectionSortOrder sortby, AtspiCollectionTreeTraversalType tree, gboolean limit_scope, gint count, gboolean traverse, GError **error);
+GArray *atspi_collection_get_matches_to (AtspiCollection *collection, AtspiAccessible *current_object, AtspiMatchRule *rule, AtspiCollectionSortOrder sortby, AtspiCollectionTreeTraversalType tree, gboolean limit_scope, gint count, gboolean traverse, GError **error);
 
-GArray * atspi_collection_get_matches_from (AtspiCollection *collection, AtspiAccessible *current_object, AtspiMatchRule *rule, AtspiCollectionSortOrder sortby, AtspiCollectionTreeTraversalType tree, gint count, gboolean traverse, GError **error);
+GArray *atspi_collection_get_matches_from (AtspiCollection *collection, AtspiAccessible *current_object, AtspiMatchRule *rule, AtspiCollectionSortOrder sortby, AtspiCollectionTreeTraversalType tree, gint count, gboolean traverse, GError **error);
 
-AtspiAccessible * atspi_collection_get_active_descendant (AtspiCollection *collection, GError **error);
+AtspiAccessible *atspi_collection_get_active_descendant (AtspiCollection *collection, GError **error);
 
 G_END_DECLS
 
-#endif /* _ATSPI_COLLECTION_H_ */
+#endif /* _ATSPI_COLLECTION_H_ */
index 59879bb..008b4be 100644 (file)
  *
  */
 
-#include "atspi-private.h"
 #include "atspi-accessible-private.h"
+#include "atspi-private.h"
+
+/**
+ * AtspiComponent
+ *
+ * An interface implemented by objects which have onscreen visual
+ * representations.
+ *
+ * The Component interface is implemented by objects which occupy on-screen
+ * space, e.g. objects which have onscreen visual representations. The methods
+ * in Component allow clients to identify where the objects lie in the onscreen
+ * coordinate system, their relative size, stacking order, and position. It
+ * also provides a mechanism whereby keyboard focus may be transferred to
+ * specific user interface elements programmatically.  This is a 2D API.
+ * Coordinates of 3D objects are projected into the 2-dimensional screen view
+ * for purposes of this interface.
+ */
 
 void
 atspi_rect_free (AtspiRect *rect)
@@ -75,9 +91,10 @@ G_DEFINE_BOXED_TYPE (AtspiPoint, atspi_point, atspi_point_copy, g_free)
  **/
 gboolean
 atspi_component_contains (AtspiComponent *obj,
-                              gint x,
-                              gint y,
-                              AtspiCoordType ctype, GError **error)
+                          gint x,
+                          gint y,
+                          AtspiCoordType ctype,
+                          GError **error)
 {
   dbus_bool_t retval = FALSE;
   dbus_int32_t d_x = x, d_y = y;
@@ -107,9 +124,10 @@ atspi_component_contains (AtspiComponent *obj,
  **/
 AtspiAccessible *
 atspi_component_get_accessible_at_point (AtspiComponent *obj,
-                                          gint x,
-                                          gint y,
-                                          AtspiCoordType ctype, GError **error)
+                                         gint x,
+                                         gint y,
+                                         AtspiCoordType ctype,
+                                         GError **error)
 {
   dbus_int32_t d_x = x, d_y = y;
   dbus_uint32_t d_ctype = ctype;
@@ -136,7 +154,8 @@ atspi_component_get_accessible_at_point (AtspiComponent *obj,
  **/
 AtspiRect *
 atspi_component_get_extents (AtspiComponent *obj,
-                                AtspiCoordType ctype, GError **error)
+                             AtspiCoordType ctype,
+                             GError **error)
 {
   dbus_uint32_t d_ctype = ctype;
   AtspiRect bbox;
@@ -147,13 +166,13 @@ atspi_component_get_extents (AtspiComponent *obj,
 
   accessible = ATSPI_ACCESSIBLE (obj);
   if (accessible->priv->cache && ctype == ATSPI_COORD_TYPE_SCREEN)
-  {
-    GValue *val = g_hash_table_lookup (accessible->priv->cache, "Component.ScreenExtents");
-    if (val)
     {
-      return g_value_dup_boxed (val);
+      GValue *val = g_hash_table_lookup (accessible->priv->cache, "Component.ScreenExtents");
+      if (val)
+        {
+          return g_value_dup_boxed (val);
+        }
     }
-  }
 
   _atspi_dbus_call (obj, atspi_interface_component, "GetExtents", error, "u=>(iiii)", d_ctype, &bbox);
   return atspi_rect_copy (&bbox);
@@ -173,9 +192,10 @@ atspi_component_get_extents (AtspiComponent *obj,
  **/
 AtspiPoint *
 atspi_component_get_position (AtspiComponent *obj,
-                                 AtspiCoordType ctype, GError **error)
+                              AtspiCoordType ctype,
+                              GError **error)
 {
-  dbus_int32_t d_x, d_y;
+  dbus_int32_t d_x = -1, d_y = -1;
   dbus_uint32_t d_ctype = ctype;
   AtspiPoint ret;
 
@@ -204,7 +224,7 @@ atspi_component_get_position (AtspiComponent *obj,
 AtspiPoint *
 atspi_component_get_size (AtspiComponent *obj, GError **error)
 {
-  dbus_int32_t d_w, d_h;
+  dbus_int32_t d_w = -1, d_h = -1;
   AtspiPoint ret;
 
   ret.x = ret.y = -1;
@@ -221,7 +241,7 @@ atspi_component_get_size (AtspiComponent *obj, GError **error)
  * atspi_component_get_layer:
  * @obj: a pointer to the #AtspiComponent to query.
  *
- * Queries which layer the component is painted into, to help determine its 
+ * Queries which layer the component is painted into, to help determine its
  *      visibility in terms of stacking order.
  *
  * Returns: the #AtspiComponentLayer into which this component is painted.
@@ -243,7 +263,7 @@ atspi_component_get_layer (AtspiComponent *obj, GError **error)
  * Queries the z stacking order of a component which is in the MDI or window
  *       layer. (Bigger z-order numbers mean nearer the top)
  *
- * Returns: a #gshort indicating the stacking order of the component 
+ * Returns: a #gshort indicating the stacking order of the component
  *       in the MDI layer, or -1 if the component is not in the MDI layer.
  **/
 gshort
@@ -282,10 +302,10 @@ atspi_component_grab_focus (AtspiComponent *obj, GError **error)
  *
  * Gets the opacity/alpha value of a component, if alpha blending is in use.
  *
- * Returns: the opacity value of a component, as a #gdouble between 0.0 and 1.0. 
+ * Returns: the opacity value of a component, as a #gdouble between 0.0 and 1.0.
  **/
-gdouble      
-atspi_component_get_alpha    (AtspiComponent *obj, GError **error)
+gdouble
+atspi_component_get_alpha (AtspiComponent *obj, GError **error)
 {
   double retval = 1;
 
@@ -297,8 +317,8 @@ atspi_component_get_alpha    (AtspiComponent *obj, GError **error)
 /**
  * atspi_component_set_extents:
  * @obj: a pointer to the #AtspiComponent to move.
- * @x: the new vertical position to which the component should be moved.
- * @y: the new horizontal position to which the component should be moved.
+ * @x: the new horizontal position to which the component should be moved.
+ * @y: the new vertical position to which the component should be moved.
  * @width: the width to which the component should be resized.
  * @height: the height to which the component should be resized.
  * @ctype: the coordinate system in which the position is specified.
@@ -327,11 +347,11 @@ atspi_component_set_extents (AtspiComponent *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   if (!aobj->parent.app || !aobj->parent.app->bus_name)
-  {
-    g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
-                          _("The application no longer exists"));
-    return FALSE;
-  }
+    {
+      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
+                           _ ("The application no longer exists"));
+      return FALSE;
+    }
 
   message = dbus_message_new_method_call (aobj->parent.app->bus_name,
                                           aobj->parent.path,
@@ -342,10 +362,10 @@ atspi_component_set_extents (AtspiComponent *obj,
 
   dbus_message_iter_init_append (message, &iter);
   if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &iter_struct))
-  {
-    dbus_message_unref (message);
-    return FALSE;
-  }
+    {
+      dbus_message_unref (message);
+      return FALSE;
+    }
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_x);
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_y);
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_width);
@@ -355,7 +375,7 @@ atspi_component_set_extents (AtspiComponent *obj,
 
   reply = _atspi_dbus_send_with_reply_and_block (message, error);
   dbus_message_get_args (reply, NULL, DBUS_TYPE_BOOLEAN, &retval,
-                              DBUS_TYPE_INVALID);
+                         DBUS_TYPE_INVALID);
   dbus_message_unref (reply);
   return retval;
 }
@@ -363,8 +383,8 @@ atspi_component_set_extents (AtspiComponent *obj,
 /**
  * atspi_component_set_position:
  * @obj: a pointer to the #AtspiComponent to move.
- * @x: the new vertical position to which the component should be moved.
- * @y: the new horizontal position to which the component should be moved.
+ * @x: the new horizontal position to which the component should be moved.
+ * @y: the new vertical position to which the component should be moved.
  * @ctype: the coordinate system in which the position is specified.
  *         (e.g. ATSPI_COORD_TYPE_WINDOW, ATSPI_COORD_TYPE_SCREEN).
  *
@@ -397,7 +417,7 @@ atspi_component_set_position (AtspiComponent *obj,
  * @width: the width to which the component should be resized.
  * @height: the height to which the component should be resized.
  *
- * Resizes the specified component to the given coordinates.
+ * Resizes the specified component to the given pixel dimensions.
  *
  * Returns: #TRUE if successful; #FALSE otherwise.
  **/
@@ -485,16 +505,15 @@ atspi_component_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiComponent),
-      (GBaseInitFunc) atspi_component_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiComponent),
+        (GBaseInitFunc) atspi_component_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
 
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiComponent", &tinfo, 0);
-
-  }
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiComponent", &tinfo, 0);
+    }
   return type;
 }
index 4e8f0ad..b23d436 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -44,10 +44,10 @@ struct _AtspiRect
 
 /**
  * ATSPI_TYPE_RECT:
- * 
+ *
  * The #GType for a boxed type holding a #AtspiRect.
  */
-#define        ATSPI_TYPE_RECT (atspi_rect_get_type ())
+#define ATSPI_TYPE_RECT (atspi_rect_get_type ())
 
 GType atspi_rect_get_type ();
 
@@ -62,19 +62,19 @@ struct _AtspiPoint
 
 /**
  * ATSPI_TYPE_POINT:
- * 
+ *
  * The #GType for a boxed type holding a #AtspiPoint.
  */
-#define        ATSPI_TYPE_POINT (atspi_point_get_type ())
+#define ATSPI_TYPE_POINT (atspi_point_get_type ())
 
 GType atspi_point_get_type ();
 
 AtspiPoint *atspi_point_copy (AtspiPoint *src);
 
-#define ATSPI_TYPE_COMPONENT                    (atspi_component_get_type ())
-#define ATSPI_IS_COMPONENT(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_COMPONENT)
-#define ATSPI_COMPONENT(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_COMPONENT, AtspiComponent)
-#define ATSPI_COMPONENT_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_COMPONENT, AtspiComponent))
+#define ATSPI_TYPE_COMPONENT (atspi_component_get_type ())
+#define ATSPI_IS_COMPONENT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_COMPONENT)
+#define ATSPI_COMPONENT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_COMPONENT, AtspiComponent)
+#define ATSPI_COMPONENT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_COMPONENT, AtspiComponent))
 
 GType atspi_component_get_type ();
 
@@ -99,7 +99,7 @@ gshort atspi_component_get_mdi_z_order (AtspiComponent *obj, GError **error);
 
 gboolean atspi_component_grab_focus (AtspiComponent *obj, GError **error);
 
-gdouble      atspi_component_get_alpha    (AtspiComponent *obj, GError **error);
+gdouble atspi_component_get_alpha (AtspiComponent *obj, GError **error);
 
 gboolean atspi_component_set_extents (AtspiComponent *obj, gint x, gint y, gint width, gint height, AtspiCoordType ctype, GError **error);
 
@@ -113,4 +113,4 @@ gboolean atspi_component_scroll_to_point (AtspiComponent *obj, AtspiCoordType co
 
 G_END_DECLS
 
-#endif /* _ATSPI_COMPONENT_H_ */
+#endif /* _ATSPI_COMPONENT_H_ */
index 3a8da00..93946b8 100644 (file)
 
 #ifndef _ATSPI_CONSTANTS_H_
 #define _ATSPI_CONSTANTS_H_
+/**
+ * AtspiConstants:
+ *
+ * Constant definitions needed by multiple interfaces.
+ */
+
 #ifdef __cplusplus
-extern "C" {
+extern "C"
+{
 #endif
 
-/**
- * AtspiLocaleType:
- * @ATSPI_LOCALE_TYPE_MESSAGES: For localizable natural-language messages.
- * @ATSPI_LOCALE_TYPE_COLLATE: For regular expression matching and string 
- * collation. 
- * @ATSPI_LOCALE_TYPE_CTYPE: For regular expression matching, character 
- * classification, conversion, case-sensitive comparison, and wide character 
- * functions. 
- * @ATSPI_LOCALE_TYPE_MONETARY: For monetary formatting.
- * @ATSPI_LOCALE_TYPE_NUMERIC: For number formatting (such as the decimal 
- * point and the thousands separator).
- * @ATSPI_LOCALE_TYPE_TIME: For time and date formatting.
- *
- * Used by interfaces #AtspiText and #AtspiDocument, this
- * enumeration corresponds to the POSIX 'setlocale' enum values.
- *
- **/
-typedef enum {
+  /**
+   * AtspiLocaleType:
+   * @ATSPI_LOCALE_TYPE_MESSAGES: For localizable natural-language messages.
+   * @ATSPI_LOCALE_TYPE_COLLATE: For regular expression matching and string
+   * collation.
+   * @ATSPI_LOCALE_TYPE_CTYPE: For regular expression matching, character
+   * classification, conversion, case-sensitive comparison, and wide character
+   * functions.
+   * @ATSPI_LOCALE_TYPE_MONETARY: For monetary formatting.
+   * @ATSPI_LOCALE_TYPE_NUMERIC: For number formatting (such as the decimal
+   * point and the thousands separator).
+   * @ATSPI_LOCALE_TYPE_TIME: For time and date formatting.
+   *
+   * Used by interfaces #AtspiText and #AtspiDocument, this
+   * enumeration corresponds to the POSIX 'setlocale' enum values.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_LOCALE_TYPE_MESSAGES,
     ATSPI_LOCALE_TYPE_COLLATE,
     ATSPI_LOCALE_TYPE_CTYPE,
     ATSPI_LOCALE_TYPE_MONETARY,
     ATSPI_LOCALE_TYPE_NUMERIC,
     ATSPI_LOCALE_TYPE_TIME,
-} AtspiLocaleType;
+  } AtspiLocaleType;
 
 /**
  * ATSPI_LOCALE_TYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiLocaleType.
  **/
-#define ATSPI_LOCALE_TYPE_COUNT (5+1)
+#define ATSPI_LOCALE_TYPE_COUNT (5 + 1)
 
-/**
- * AtspiCoordType:
- * @ATSPI_COORD_TYPE_SCREEN: Specifies xy coordinates relative to the screen.
- * @ATSPI_COORD_TYPE_WINDOW: Specifies xy coordinates relative to the widget's
- * top-level window.
- * @ATSPI_COORD_TYPE_PARENT: Specifies xy coordinates relative to the widget's
- * immediate parent.
- *
- * Enumeration used by #AtspiComponent, #AtspiImage, and #AtspiText interfaces
- * to specify whether coordinates are relative to the window or the screen.
- *
- **/
-typedef enum {
+  /**
+   * AtspiCoordType:
+   * @ATSPI_COORD_TYPE_SCREEN: Specifies xy coordinates relative to the screen.
+   * @ATSPI_COORD_TYPE_WINDOW: Specifies xy coordinates relative to the widget's
+   * top-level window.
+   * @ATSPI_COORD_TYPE_PARENT: Specifies xy coordinates relative to the widget's
+   * immediate parent.
+   *
+   * Enumeration used by #AtspiComponent, #AtspiImage, and #AtspiText interfaces
+   * to specify whether coordinates are relative to the window or the screen.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_COORD_TYPE_SCREEN,
     ATSPI_COORD_TYPE_WINDOW,
     ATSPI_COORD_TYPE_PARENT,
-} AtspiCoordType;
+  } AtspiCoordType;
 
 /**
  * ATSPI_COORD_TYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiCoordType.
  **/
-#define ATSPI_COORD_TYPE_COUNT (2+1)
+#define ATSPI_COORD_TYPE_COUNT (2 + 1)
 
-/**
- * AtspiCollectionSortOrder:
- * @ATSPI_Collection_SORT_ORDER_INVALID: Invalid sort order
- * @ATSPI_Collection_SORT_ORDER_CANONICAL: Canonical sort order
- * @ATSPI_Collection_SORT_ORDER_FLOW: Flow sort order
- * @ATSPI_Collection_SORT_ORDER_TAB: Tab sort order
- * @ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL: Reverse canonical sort order
- * @ATSPI_Collection_SORT_ORDER_REVERSE_FLOW: Reverse flow sort order
- * @ATSPI_Collection_SORT_ORDER_REVERSE_TAB: Reverse tab sort order
- * @ATSPI_Collection_SORT_ORDER_LAST_DEFINED: Used only to determine the end of the
- * enumeration.
+  /**
  * AtspiCollectionSortOrder:
  * @ATSPI_Collection_SORT_ORDER_INVALID: Invalid sort order
  * @ATSPI_Collection_SORT_ORDER_CANONICAL: Canonical sort order
  * @ATSPI_Collection_SORT_ORDER_FLOW: Flow sort order
  * @ATSPI_Collection_SORT_ORDER_TAB: Tab sort order
  * @ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL: Reverse canonical sort order
  * @ATSPI_Collection_SORT_ORDER_REVERSE_FLOW: Reverse flow sort order
  * @ATSPI_Collection_SORT_ORDER_REVERSE_TAB: Reverse tab sort order
  * @ATSPI_Collection_SORT_ORDER_LAST_DEFINED: Used only to determine the end of the
  * enumeration.
 
- *
- * Enumeration used by interface #AtspiCollection to specify
- * the way #AtspiAccesible objects should be sorted.
- *
- **/
-typedef enum {
+   *
+   * Enumeration used by interface #AtspiCollection to specify
+   * the way #AtspiAccesible objects should be sorted.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_Collection_SORT_ORDER_INVALID,
     ATSPI_Collection_SORT_ORDER_CANONICAL,
     ATSPI_Collection_SORT_ORDER_FLOW,
@@ -174,66 +184,68 @@ typedef enum {
     ATSPI_Collection_SORT_ORDER_REVERSE_FLOW,
     ATSPI_Collection_SORT_ORDER_REVERSE_TAB,
     ATSPI_Collection_SORT_ORDER_LAST_DEFINED,
-} AtspiCollectionSortOrder;
+  } AtspiCollectionSortOrder;
 
 /**
  * ATSPI_SORTORDER_COUNT:
  *
  * One higher than the highest valid value of #AtspiCollectionSortOrder.
  */
-#define ATSPI_SORTORDER_COUNT (7+1)
+#define ATSPI_SORTORDER_COUNT (7 + 1)
 
-/**
- * AtspiCollectionMatchType:
- * @ATSPI_Collection_MATCH_INVALID: Indicates an error condition or
- * uninitialized value.
- * @ATSPI_Collection_MATCH_ALL: #TRUE if all of the criteria are met.
- * @ATSPI_Collection_MATCH_ANY: #TRUE if any of the criteria are met.
- * @ATSPI_Collection_MATCH_NONE: #TRUE if none of the criteria are met.
- * @ATSPI_Collection_MATCH_EMPTY: Same as @ATSPI_Collection_MATCH_ALL if
- * the criteria is non-empty; for empty criteria this rule requires returned
- * value to also have empty set.
- * @ATSPI_Collection_MATCH_LAST_DEFINED: Used only to determine the end of the
- * enumeration.
- *
- * Enumeration used by #AtspiMatchRule to specify
- * how to interpret #AtspiAccessible objects.
- *
- **/
-typedef enum {
+  /**
+   * AtspiCollectionMatchType:
+   * @ATSPI_Collection_MATCH_INVALID: Indicates an error condition or
+   * uninitialized value.
+   * @ATSPI_Collection_MATCH_ALL: #TRUE if all of the criteria are met.
+   * @ATSPI_Collection_MATCH_ANY: #TRUE if any of the criteria are met.
+   * @ATSPI_Collection_MATCH_NONE: #TRUE if none of the criteria are met.
+   * @ATSPI_Collection_MATCH_EMPTY: Same as @ATSPI_Collection_MATCH_ALL if
+   * the criteria is non-empty; for empty criteria this rule requires returned
+   * value to also have empty set.
+   * @ATSPI_Collection_MATCH_LAST_DEFINED: Used only to determine the end of the
+   * enumeration.
+   *
+   * Enumeration used by #AtspiMatchRule to specify
+   * how to interpret #AtspiAccessible objects.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_Collection_MATCH_INVALID,
     ATSPI_Collection_MATCH_ALL,
     ATSPI_Collection_MATCH_ANY,
     ATSPI_Collection_MATCH_NONE,
     ATSPI_Collection_MATCH_EMPTY,
     ATSPI_Collection_MATCH_LAST_DEFINED,
-} AtspiCollectionMatchType;
+  } AtspiCollectionMatchType;
 
 /**
  * ATSPI_MATCHTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiCollectionMatchType.
  **/
-#define ATSPI_MATCHTYPES_COUNT (5+1)
+#define ATSPI_MATCHTYPES_COUNT (5 + 1)
 
-/**
- * AtspiCollectionTreeTraversalType:
- * @ATSPI_Collection_TREE_RESTRICT_CHILDREN: Restrict children tree traveral
- * @ATSPI_Collection_TREE_RESTRICT_SIBLING: Restrict sibling tree traversal
- * @ATSPI_Collection_TREE_INORDER: In-order tree traversal.
- * @ATSPI_Collection_TREE_LAST_DEFINED: Used only to determine the end of the
- * enumeration.
- *
- * Enumeration used by interface #AtspiCollection to specify
- * restrictions on #AtspiAccesible objects to be traversed.
- *
- **/
-typedef enum {
+  /**
+   * AtspiCollectionTreeTraversalType:
+   * @ATSPI_Collection_TREE_RESTRICT_CHILDREN: Restrict children tree traveral
+   * @ATSPI_Collection_TREE_RESTRICT_SIBLING: Restrict sibling tree traversal
+   * @ATSPI_Collection_TREE_INORDER: In-order tree traversal.
+   * @ATSPI_Collection_TREE_LAST_DEFINED: Used only to determine the end of the
+   * enumeration.
+   *
+   * Enumeration used by interface #AtspiCollection to specify
+   * restrictions on #AtspiAccesible objects to be traversed.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_Collection_TREE_RESTRICT_CHILDREN,
     ATSPI_Collection_TREE_RESTRICT_SIBLING,
     ATSPI_Collection_TREE_INORDER,
     ATSPI_Collection_TREE_LAST_DEFINED,
-} AtspiCollectionTreeTraversalType;
+  } AtspiCollectionTreeTraversalType;
 
 /**
  * ATSPI_TREETRAVERSALTYPE_COUNT:
@@ -241,49 +253,50 @@ typedef enum {
  * One higher than the highest valid value of
  * #AtspiCollection_TreeTraversalType.
  */
-#define ATSPI_TREETRAVERSALTYPE_COUNT (3+1)
+#define ATSPI_TREETRAVERSALTYPE_COUNT (3 + 1)
 
-/**
- * AtspiComponentLayer:
- * @ATSPI_LAYER_INVALID: Indicates an error condition or uninitialized value.
- * @ATSPI_LAYER_BACKGROUND: The bottom-most layer, over which everything else
- * is painted.        The 'desktop background' is generally in this layer.
- * @ATSPI_LAYER_CANVAS: The 'background' layer for most content renderers and
- * UI #AtspiComponent containers.
- * @ATSPI_LAYER_WIDGET: The layer in which the majority of ordinary
- * 'foreground' widgets reside.
- * @ATSPI_LAYER_MDI: A special layer between @ATSPI_LAYER_CANVAS and 
- * @ATSPI_LAYER_WIDGET, in which the 'pseudo windows' (e.g. the MDI frames) 
- * reside. See #atspi_component_get_mdi_z_order. 
- * @ATSPI_LAYER_POPUP: A layer for popup window content, above
- * @ATSPI_LAYER_WIDGET.
- * @ATSPI_LAYER_OVERLAY: The topmost layer.
- * @ATSPI_LAYER_WINDOW: The layer in which a toplevel window background usually
- * resides.
- * @ATSPI_LAYER_LAST_DEFINED: Used only to determine the end of the
- * enumeration.
- *
- * The #AtspiComponentLayer of an #AtspiComponent instance indicates its 
- * relative stacking order with respect to the onscreen visual representation 
- * of the UI. #AtspiComponentLayer, in combination with #AtspiComponent bounds 
- * information, can be used to compute the visibility of all or part of a 
- * component.  This is important in programmatic determination of 
- * region-of-interest for magnification, and in 
- * flat screen review models of the screen, as well as
- * for other uses. Objects residing in two of the #AtspiComponentLayer 
- * categories support further z-ordering information, with respect to their 
- * peers in the same layer: namely, @ATSPI_LAYER_WINDOW and 
- * @ATSPI_LAYER_MDI.  Relative stacking order for other objects within the 
- * same layer is not available; the recommended heuristic is 
- * first child paints first. In other words, assume that the 
- * first siblings in the child list are subject to being overpainted by later 
- * siblings if their bounds intersect. The order of layers, from bottom to top,
- *  is: @ATSPI_LAYER_BACKGROUND, @ATSPI_LAYER_WINDOW, @ATSPI_LAYER_MDI,
- * @ATSPI_LAYER_CANVAS, @ATSPI_LAYER_WIDGET, @ATSPI_LAYER_POPUP, and      
- * @ATSPI_LAYER_OVERLAY.
- *
- */
-typedef enum {
+  /**
+   * AtspiComponentLayer:
+   * @ATSPI_LAYER_INVALID: Indicates an error condition or uninitialized value.
+   * @ATSPI_LAYER_BACKGROUND: The bottom-most layer, over which everything else
+   * is painted.        The 'desktop background' is generally in this layer.
+   * @ATSPI_LAYER_CANVAS: The 'background' layer for most content renderers and
+   * UI #AtspiComponent containers.
+   * @ATSPI_LAYER_WIDGET: The layer in which the majority of ordinary
+   * 'foreground' widgets reside.
+   * @ATSPI_LAYER_MDI: A special layer between @ATSPI_LAYER_CANVAS and
+   * @ATSPI_LAYER_WIDGET, in which the 'pseudo windows' (e.g. the MDI frames)
+   * reside. See #atspi_component_get_mdi_z_order.
+   * @ATSPI_LAYER_POPUP: A layer for popup window content, above
+   * @ATSPI_LAYER_WIDGET.
+   * @ATSPI_LAYER_OVERLAY: The topmost layer.
+   * @ATSPI_LAYER_WINDOW: The layer in which a toplevel window background usually
+   * resides.
+   * @ATSPI_LAYER_LAST_DEFINED: Used only to determine the end of the
+   * enumeration.
+   *
+   * The #AtspiComponentLayer of an #AtspiComponent instance indicates its
+   * relative stacking order with respect to the onscreen visual representation
+   * of the UI. #AtspiComponentLayer, in combination with #AtspiComponent bounds
+   * information, can be used to compute the visibility of all or part of a
+   * component.  This is important in programmatic determination of
+   * region-of-interest for magnification, and in
+   * flat screen review models of the screen, as well as
+   * for other uses. Objects residing in two of the #AtspiComponentLayer
+   * categories support further z-ordering information, with respect to their
+   * peers in the same layer: namely, @ATSPI_LAYER_WINDOW and
+   * @ATSPI_LAYER_MDI.  Relative stacking order for other objects within the
+   * same layer is not available; the recommended heuristic is
+   * first child paints first. In other words, assume that the
+   * first siblings in the child list are subject to being overpainted by later
+   * siblings if their bounds intersect. The order of layers, from bottom to top,
+   *  is: @ATSPI_LAYER_BACKGROUND, @ATSPI_LAYER_WINDOW, @ATSPI_LAYER_MDI,
+   * @ATSPI_LAYER_CANVAS, @ATSPI_LAYER_WIDGET, @ATSPI_LAYER_POPUP, and
+   * @ATSPI_LAYER_OVERLAY.
+   *
+   */
+  typedef enum
+  {
     ATSPI_LAYER_INVALID,
     ATSPI_LAYER_BACKGROUND,
     ATSPI_LAYER_CANVAS,
@@ -293,56 +306,57 @@ typedef enum {
     ATSPI_LAYER_OVERLAY,
     ATSPI_LAYER_WINDOW,
     ATSPI_LAYER_LAST_DEFINED,
-} AtspiComponentLayer;
+  } AtspiComponentLayer;
 
 /**
  * ATSPI_COMPONENTLAYER_COUNT:
  *
  * One higher than the highest valid value of #AtspiComponentLayer.
  **/
-#define ATSPI_COMPONENTLAYER_COUNT (8+1)
+#define ATSPI_COMPONENTLAYER_COUNT (8 + 1)
 
-/**
- * AtspiTextBoundaryType:
- * @ATSPI_TEXT_BOUNDARY_CHAR: An #AtspiText instance is bounded by this 
- * character only. Start and end offsets differ by one, by definition, 
- * for this value.
- * @ATSPI_TEXT_BOUNDARY_WORD_START: Boundary condition is start of a word; i.e.
- * range is from start of one word to the start of another word.
- * @ATSPI_TEXT_BOUNDARY_WORD_END: Boundary condition is the end of a word; i.e.
- * range is from the end of one word to the end of another. Some locales
- * may not distinguish between words and characters or glyphs. In particular,
- * those locales which use wholly or partially ideographic character sets. 
- * In these cases, characters may be returned in lieu of multi-character
- * substrings.
- * @ATSPI_TEXT_BOUNDARY_SENTENCE_START: Boundary condition is start of a
- * sentence, as determined by the application. Some locales or
- * character sets may not include explicit sentence delimiters, so this
- * boundary type can not always be honored. Some locales will return lines
- * of text instead of grammatical sentences.
- * @ATSPI_TEXT_BOUNDARY_SENTENCE_END: Boundary condition is end of a sentence,
- * as determined by the application, including the sentence-delimiting
- * character, for instance '.' Some locales or character sets may not
- * include explicit sentence delimiters, so this boundary type can not
- * always be honored. Some locales will return lines of text instead of
- * grammatical sentences.
- * @ATSPI_TEXT_BOUNDARY_LINE_START: Boundary condition is the start of a line;
- * i.e. range is from start of one line to the start of another.  This
- * generally means that an end-of-line character will appear at the end of
- * the range.
- * @ATSPI_TEXT_BOUNDARY_LINE_END: Boundary condition is the end of a line; i.e.
- * range is from start of one line to the start of another.  This generally 
- * means that an end-of-line character will be the first character of the
- * range.
- *
- * Specifies the boundary conditions determining a run of text as returned from
- * #atspi_text_get_text_at_offset, #atspi_text_get_text_after_offset, and
- * #atspi_text_get_text_before_offset.
- *
- * This enumerationis deprecated since 2.9.90 and should not be used. Use
- * AtspiTextGranularity with #atspi_text_get_string_at_offset instead.
- **/
-typedef enum {
+  /**
+   * AtspiTextBoundaryType:
+   * @ATSPI_TEXT_BOUNDARY_CHAR: An #AtspiText instance is bounded by this
+   * character only. Start and end offsets differ by one, by definition,
+   * for this value.
+   * @ATSPI_TEXT_BOUNDARY_WORD_START: Boundary condition is start of a word; i.e.
+   * range is from start of one word to the start of another word.
+   * @ATSPI_TEXT_BOUNDARY_WORD_END: Boundary condition is the end of a word; i.e.
+   * range is from the end of one word to the end of another. Some locales
+   * may not distinguish between words and characters or glyphs. In particular,
+   * those locales which use wholly or partially ideographic character sets.
+   * In these cases, characters may be returned in lieu of multi-character
+   * substrings.
+   * @ATSPI_TEXT_BOUNDARY_SENTENCE_START: Boundary condition is start of a
+   * sentence, as determined by the application. Some locales or
+   * character sets may not include explicit sentence delimiters, so this
+   * boundary type can not always be honored. Some locales will return lines
+   * of text instead of grammatical sentences.
+   * @ATSPI_TEXT_BOUNDARY_SENTENCE_END: Boundary condition is end of a sentence,
+   * as determined by the application, including the sentence-delimiting
+   * character, for instance '.' Some locales or character sets may not
+   * include explicit sentence delimiters, so this boundary type can not
+   * always be honored. Some locales will return lines of text instead of
+   * grammatical sentences.
+   * @ATSPI_TEXT_BOUNDARY_LINE_START: Boundary condition is the start of a line;
+   * i.e. range is from start of one line to the start of another.  This
+   * generally means that an end-of-line character will appear at the end of
+   * the range.
+   * @ATSPI_TEXT_BOUNDARY_LINE_END: Boundary condition is the end of a line; i.e.
+   * range is from start of one line to the start of another.  This generally
+   * means that an end-of-line character will be the first character of the
+   * range.
+   *
+   * Specifies the boundary conditions determining a run of text as returned from
+   * #atspi_text_get_text_at_offset, #atspi_text_get_text_after_offset, and
+   * #atspi_text_get_text_before_offset.
+   *
+   * This enumerationis deprecated since 2.9.90 and should not be used. Use
+   * AtspiTextGranularity with #atspi_text_get_string_at_offset instead.
+   **/
+  typedef enum
+  {
     ATSPI_TEXT_BOUNDARY_CHAR,
     ATSPI_TEXT_BOUNDARY_WORD_START,
     ATSPI_TEXT_BOUNDARY_WORD_END,
@@ -350,244 +364,247 @@ typedef enum {
     ATSPI_TEXT_BOUNDARY_SENTENCE_END,
     ATSPI_TEXT_BOUNDARY_LINE_START,
     ATSPI_TEXT_BOUNDARY_LINE_END,
-} AtspiTextBoundaryType;
+  } AtspiTextBoundaryType;
 
-/**
- *AtspiTextGranularity:
- *@ATSPI_TEXT_GRANULARITY_CHAR: Granularity is defined by the boundaries between characters
- * (including non-printing characters)
- *@ATSPI_TEXT_GRANULARITY_WORD: Granularity is defined by the boundaries of a word,
- * starting at the beginning of the current word and finishing at the beginning of
- * the following one, if present.
- *@ATSPI_TEXT_GRANULARITY_SENTENCE: Granularity is defined by the boundaries of a sentence,
- * starting at the beginning of the current sentence and finishing at the beginning of
- * the following one, if present.
- *@ATSPI_TEXT_GRANULARITY_LINE: Granularity is defined by the boundaries of a line,
- * starting at the beginning of the current line and finishing at the beginning of
- * the following one, if present.
- *@ATSPI_TEXT_GRANULARITY_PARAGRAPH: Granularity is defined by the boundaries of a paragraph,
- * starting at the beginning of the current paragraph and finishing at the beginning of
- * the following one, if present.
- *
- * Text granularity types used for specifying the granularity of the region of
- * text we are interested in.
- **/
-typedef enum {
-  ATSPI_TEXT_GRANULARITY_CHAR,
-  ATSPI_TEXT_GRANULARITY_WORD,
-  ATSPI_TEXT_GRANULARITY_SENTENCE,
-  ATSPI_TEXT_GRANULARITY_LINE,
-  ATSPI_TEXT_GRANULARITY_PARAGRAPH
-} AtspiTextGranularity;
+  /**
+   *AtspiTextGranularity:
+   *@ATSPI_TEXT_GRANULARITY_CHAR: Granularity is defined by the boundaries between characters
+   * (including non-printing characters)
+   *@ATSPI_TEXT_GRANULARITY_WORD: Granularity is defined by the boundaries of a word,
+   * starting at the beginning of the current word and finishing at the beginning of
+   * the following one, if present.
+   *@ATSPI_TEXT_GRANULARITY_SENTENCE: Granularity is defined by the boundaries of a sentence,
+   * starting at the beginning of the current sentence and finishing at the beginning of
+   * the following one, if present.
+   *@ATSPI_TEXT_GRANULARITY_LINE: Granularity is defined by the boundaries of a line,
+   * starting at the beginning of the current line and finishing at the beginning of
+   * the following one, if present.
+   *@ATSPI_TEXT_GRANULARITY_PARAGRAPH: Granularity is defined by the boundaries of a paragraph,
+   * starting at the beginning of the current paragraph and finishing at the beginning of
+   * the following one, if present.
+   *
+   * Text granularity types used for specifying the granularity of the region of
+   * text we are interested in.
+   **/
+  typedef enum
+  {
+    ATSPI_TEXT_GRANULARITY_CHAR,
+    ATSPI_TEXT_GRANULARITY_WORD,
+    ATSPI_TEXT_GRANULARITY_SENTENCE,
+    ATSPI_TEXT_GRANULARITY_LINE,
+    ATSPI_TEXT_GRANULARITY_PARAGRAPH
+  } AtspiTextGranularity;
 
 /**
  * ATSPI_TEXT_BOUNDARY_TYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiTextBoundaryType.
  */
-#define ATSPI_TEXT_BOUNDARY_TYPE_COUNT (6+1)
+#define ATSPI_TEXT_BOUNDARY_TYPE_COUNT (6 + 1)
 
-/**
- * AtspiTextClipType:
- * @ATSPI_TEXT_CLIP_NONE: No characters/glyphs are omitted.
- * @ATSPI_TEXT_CLIP_MIN: Characters/glyphs clipped by the minimum coordinate
- * are omitted.
- * @ATSPI_TEXT_CLIP_MAX: Characters/glyphs which intersect the maximum
- * coordinate are omitted.
- * @ATSPI_TEXT_CLIP_BOTH: Only glyphs falling entirely within the region
- * bounded by min and max are retained.
- *
- * Enumeration used by interface #AtspiText to indicate
- * how to treat characters intersecting bounding boxes.
- *
- **/
-typedef enum {
+  /**
+   * AtspiTextClipType:
+   * @ATSPI_TEXT_CLIP_NONE: No characters/glyphs are omitted.
+   * @ATSPI_TEXT_CLIP_MIN: Characters/glyphs clipped by the minimum coordinate
+   * are omitted.
+   * @ATSPI_TEXT_CLIP_MAX: Characters/glyphs which intersect the maximum
+   * coordinate are omitted.
+   * @ATSPI_TEXT_CLIP_BOTH: Only glyphs falling entirely within the region
+   * bounded by min and max are retained.
+   *
+   * Enumeration used by interface #AtspiText to indicate
+   * how to treat characters intersecting bounding boxes.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_TEXT_CLIP_NONE,
     ATSPI_TEXT_CLIP_MIN,
     ATSPI_TEXT_CLIP_MAX,
     ATSPI_TEXT_CLIP_BOTH,
-} AtspiTextClipType;
+  } AtspiTextClipType;
 
 /**
  * ATSPI_TEXT_CLIP_TYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiTextClipType.
  */
-#define ATSPI_TEXT_CLIP_TYPE_COUNT (3+1)
+#define ATSPI_TEXT_CLIP_TYPE_COUNT (3 + 1)
 
-/**
- * AtspiStateType:
- * @ATSPI_STATE_INVALID: Indicates an invalid state - probably an error 
- * condition.
- * @ATSPI_STATE_ACTIVE: Indicates a window is currently the active window, or
- * an object is the active subelement within a container or table.
- * @ATSPI_STATE_ACTIVE should not be used for objects which have
- * #ATSPI_STATE_FOCUSABLE or #ATSPI_STATE_SELECTABLE: Those objects should use
- * @ATSPI_STATE_FOCUSED and @ATSPI_STATE_SELECTED respectively.
- * @ATSPI_STATE_ACTIVE is a means to indicate that an object which is not
- * focusable and not selectable is the currently-active item within its
- * parent container.
- * @ATSPI_STATE_ARMED: Indicates that the object is armed.
- * @ATSPI_STATE_BUSY: Indicates the current object is busy, i.e. onscreen
- * representation is in the process of changing, or       the object is
- * temporarily unavailable for interaction due to activity already in progress.
- * @ATSPI_STATE_CHECKED: Indicates this object is currently checked.
- * @ATSPI_STATE_COLLAPSED: Indicates this object is collapsed.
- * @ATSPI_STATE_DEFUNCT: Indicates that this object no longer has a valid
- * backing widget        (for instance, if its peer object has been destroyed).
- * @ATSPI_STATE_EDITABLE: Indicates the user can change the contents of this
- * object.
- * @ATSPI_STATE_ENABLED: Indicates that this object is enabled, i.e. that it
- * currently reflects some application state. Objects that are "greyed out"
- * may lack this state, and may lack the @ATSPI_STATE_SENSITIVE if direct
- * user interaction cannot cause them to acquire @ATSPI_STATE_ENABLED. 
- * See @ATSPI_STATE_SENSITIVE.
- * @ATSPI_STATE_EXPANDABLE: Indicates this object allows progressive
- * disclosure of its children.
- * @ATSPI_STATE_EXPANDED: Indicates this object is expanded.
- * @ATSPI_STATE_FOCUSABLE: Indicates this object can accept keyboard focus,
- * which means all events resulting from typing on the keyboard will
- * normally be passed to it when it has focus.
- * @ATSPI_STATE_FOCUSED: Indicates this object currently has the keyboard
- * focus.
- * @ATSPI_STATE_HAS_TOOLTIP: Indicates that the object has an associated
- * tooltip.
- * @ATSPI_STATE_HORIZONTAL: Indicates the orientation of this object is
- * horizontal.
- * @ATSPI_STATE_ICONIFIED: Indicates this object is minimized and is
- * represented only by an icon.
- * @ATSPI_STATE_MODAL: Indicates something must be done with this object
- * before the user can interact with an object in a different window.
- * @ATSPI_STATE_MULTI_LINE: Indicates this (text) object can contain multiple
- * lines of text.
- * @ATSPI_STATE_MULTISELECTABLE: Indicates this object allows more than one of
- * its children to be selected at the same time, or in the case of text
- * objects, that the object supports non-contiguous text selections.
- * @ATSPI_STATE_OPAQUE: Indicates this object paints every pixel within its
- * rectangular region. It also indicates an alpha value of unity, if it
- * supports alpha blending.
- * @ATSPI_STATE_PRESSED: Indicates this object is currently pressed.
- * @ATSPI_STATE_RESIZABLE: Indicates the size of this object's size is not
- * fixed.
- * @ATSPI_STATE_SELECTABLE: Indicates this object is the child of an object
- * that allows its children to be selected and that this child is one of
- * those children       that can be selected.
- * @ATSPI_STATE_SELECTED: Indicates this object is the child of an object that
- * allows its children to be selected and that this child is one of those
- * children that has been selected.
- * @ATSPI_STATE_SENSITIVE: Indicates this object is sensitive, e.g. to user
- * interaction. @ATSPI_STATE_SENSITIVE usually accompanies.
- * @ATSPI_STATE_ENABLED for user-actionable controls, but may be found in the 
- * absence of @ATSPI_STATE_ENABLED if the current visible state of the control 
- * is "disconnected" from the application state.  In such cases, direct user
- * interaction can often result in the object gaining @ATSPI_STATE_SENSITIVE, 
- * for instance if a user makes an explicit selection using an object whose
- * current state is ambiguous or undefined. See @ATSPI_STATE_ENABLED,
- * @ATSPI_STATE_INDETERMINATE.
- * @ATSPI_STATE_SHOWING: Indicates this object, the object's parent, the
- * object's parent's parent, and so on, are all 'shown' to the end-user,
- * i.e. subject to "exposure" if blocking or obscuring objects do not
- * interpose between this object and the top of the window stack.
- * @ATSPI_STATE_SINGLE_LINE: Indicates this (text) object can contain only a
- * single line of text.
- * @ATSPI_STATE_STALE: Indicates that the information returned for this object
- * may no longer be synchronized with the application state.  This can occur
- * if the object has @ATSPI_STATE_TRANSIENT, and can also occur towards the 
- * end of the object peer's lifecycle.
- * @ATSPI_STATE_TRANSIENT: Indicates this object is transient.
- * @ATSPI_STATE_VERTICAL: Indicates the orientation of this object is vertical;
- * for example this state may appear on such objects as scrollbars, text
- * objects (with vertical text flow), separators, etc.
- * @ATSPI_STATE_VISIBLE: Indicates this object is visible, e.g. has been
- * explicitly marked for exposure to the user. @ATSPI_STATE_VISIBLE is no 
- * guarantee that the object is actually unobscured on the screen, only that 
- * it is 'potentially' visible, barring obstruction, being scrolled or clipped 
- * out of the field of view, or having an ancestor container that has not yet 
- * made visible. A widget is potentially onscreen if it has both 
- * @ATSPI_STATE_VISIBLE and @ATSPI_STATE_SHOWING. The absence of 
- * @ATSPI_STATE_VISIBLE and @ATSPI_STATE_SHOWING is
- * semantically equivalent to saying that an object is 'hidden'.
- * @ATSPI_STATE_MANAGES_DESCENDANTS: Indicates that "active-descendant-changed"
- * event is sent when children become 'active' (i.e. are selected or
- * navigated to onscreen).  Used to prevent need to enumerate all children
- * in very large containers, like tables. The presence of
- * @ATSPI_STATE_MANAGES_DESCENDANTS is an indication to the client that the
- * children should not, and need not, be enumerated by the client.
- * Objects implementing this state are expected to provide relevant state      
- * notifications to listening clients, for instance notifications of 
- * visibility changes and activation of their contained child objects, without 
- * the client having previously requested references to those children.
- * @ATSPI_STATE_INDETERMINATE: Indicates that a check box or other boolean
- * indicator is in a state other than checked or not checked.  This
- * usually means that the boolean value reflected or controlled by the
- * object does not apply consistently to the entire current context.      
- * For example, a checkbox for the "Bold" attribute of text may have
- * @ATSPI_STATE_INDETERMINATE if the currently selected text contains a mixture
- * of weight attributes. In many cases interacting with a
- * @ATSPI_STATE_INDETERMINATE object will cause the context's corresponding
- * boolean attribute to be homogenized, whereupon the object will lose
- * @ATSPI_STATE_INDETERMINATE and a corresponding state-changed event will be
- * fired.
- * @ATSPI_STATE_REQUIRED: Indicates that user interaction with this object is
- * 'required' from the user, for instance before completing the
- * processing of a form.
- * @ATSPI_STATE_TRUNCATED:       Indicates that an object's onscreen content
- * is truncated, e.g. a text value in a spreadsheet cell.
- * @ATSPI_STATE_ANIMATED: Indicates this object's visual representation is
- * dynamic, not static. This state may be applied to an object during an
- * animated 'effect' and be removed from the object once its visual
- * representation becomes static. Some applications, notably content viewers,
- * may not be able to detect all kinds of animated content.  Therefore the
- * absence of this state should not be taken as
- * definitive evidence that the object's visual representation is      
- * static; this state is advisory.
- * @ATSPI_STATE_INVALID_ENTRY: This object has indicated an error condition
- * due to failure of input validation.  For instance, a form control may
- * acquire this state in response to invalid or malformed user input.
- * @ATSPI_STATE_SUPPORTS_AUTOCOMPLETION: This state indicates that the object
- * in question implements some form of typeahead or       
- * pre-selection behavior whereby entering the first character of one or more
- * sub-elements causes those elements to scroll into view or become
- * selected. Subsequent character input may narrow the selection further as
- * long as one or more sub-elements match the string. This state is normally
- * only useful and encountered on objects that implement #AtspiSelection.
- * In some cases the typeahead behavior may result in full or partial
- * completion of the data in the input field, in which case
- * these input events may trigger text-changed events from the source.
- * @ATSPI_STATE_SELECTABLE_TEXT: This state indicates that the object in
- * question supports text selection. It should only be exposed on objects
- * which implement the #AtspiText interface, in order to distinguish this state
- * from @ATSPI_STATE_SELECTABLE, which infers that the object in question is a
- * selectable child of an object which implements #AtspiSelection. While 
- * similar, text selection and subelement selection are distinct operations.
- * @ATSPI_STATE_IS_DEFAULT: This state indicates that the object in question is
- * the 'default' interaction object in a dialog, i.e. the one that gets
- * activated if the user presses "Enter" when the dialog is initially
- * posted.
- * @ATSPI_STATE_VISITED: This state indicates that the object (typically a
- * hyperlink) has already been activated or invoked, with the result that
- * some backing data has been downloaded or rendered.
- *@ATSPI_STATE_CHECKABLE: Indicates this object has the potential to
- *  be checked, such as a checkbox or toggle-able table cell. @Since:
- *  2.12
- *@ATSPI_STATE_HAS_POPUP: Indicates that the object has a popup
- * context menu or sub-level menu which may or may not be
- * showing. This means that activation renders conditional content.
- * Note that ordinary tooltips are not considered popups in this
- * context. @Since: 2.12
- * @ATSPI_STATE_READ_ONLY: Indicates that an object which is ENABLED and
- * SENSITIVE has a value which can be read, but not modified, by the
- * user. @Since: 2.16
- * @ATSPI_STATE_LAST_DEFINED: This value of the enumeration should not be used
- * as a parameter, it indicates the number of items in the #AtspiStateType
- * enumeration.
- *
- * 
- * Enumeration used by various interfaces indicating every possible state 
- * an #AtspiAccesible object can assume.
- *
- **/
-typedef enum {
+  /**
+   * AtspiStateType:
+   * @ATSPI_STATE_INVALID: Indicates an invalid state - probably an error
+   * condition.
+   * @ATSPI_STATE_ACTIVE: Indicates a window is currently the active window, or
+   * an object is the active subelement within a container or table.
+   * @ATSPI_STATE_ACTIVE should not be used for objects which have
+   * #ATSPI_STATE_FOCUSABLE or #ATSPI_STATE_SELECTABLE: Those objects should use
+   * @ATSPI_STATE_FOCUSED and @ATSPI_STATE_SELECTED respectively.
+   * @ATSPI_STATE_ACTIVE is a means to indicate that an object which is not
+   * focusable and not selectable is the currently-active item within its
+   * parent container.
+   * @ATSPI_STATE_ARMED: Indicates that the object is armed.
+   * @ATSPI_STATE_BUSY: Indicates the current object is busy, i.e. onscreen
+   * representation is in the process of changing, or       the object is
+   * temporarily unavailable for interaction due to activity already in progress.
+   * @ATSPI_STATE_CHECKED: Indicates this object is currently checked.
+   * @ATSPI_STATE_COLLAPSED: Indicates this object is collapsed.
+   * @ATSPI_STATE_DEFUNCT: Indicates that this object no longer has a valid
+   * backing widget        (for instance, if its peer object has been destroyed).
+   * @ATSPI_STATE_EDITABLE: Indicates the user can change the contents of this
+   * object.
+   * @ATSPI_STATE_ENABLED: Indicates that this object is enabled, i.e. that it
+   * currently reflects some application state. Objects that are "greyed out"
+   * may lack this state, and may lack the @ATSPI_STATE_SENSITIVE if direct
+   * user interaction cannot cause them to acquire @ATSPI_STATE_ENABLED.
+   * See @ATSPI_STATE_SENSITIVE.
+   * @ATSPI_STATE_EXPANDABLE: Indicates this object allows progressive
+   * disclosure of its children.
+   * @ATSPI_STATE_EXPANDED: Indicates this object is expanded.
+   * @ATSPI_STATE_FOCUSABLE: Indicates this object can accept keyboard focus,
+   * which means all events resulting from typing on the keyboard will
+   * normally be passed to it when it has focus.
+   * @ATSPI_STATE_FOCUSED: Indicates this object currently has the keyboard
+   * focus.
+   * @ATSPI_STATE_HAS_TOOLTIP: Indicates that the object has an associated
+   * tooltip.
+   * @ATSPI_STATE_HORIZONTAL: Indicates the orientation of this object is
+   * horizontal.
+   * @ATSPI_STATE_ICONIFIED: Indicates this object is minimized and is
+   * represented only by an icon.
+   * @ATSPI_STATE_MODAL: Indicates something must be done with this object
+   * before the user can interact with an object in a different window.
+   * @ATSPI_STATE_MULTI_LINE: Indicates this (text) object can contain multiple
+   * lines of text.
+   * @ATSPI_STATE_MULTISELECTABLE: Indicates this object allows more than one of
+   * its children to be selected at the same time, or in the case of text
+   * objects, that the object supports non-contiguous text selections.
+   * @ATSPI_STATE_OPAQUE: Indicates this object paints every pixel within its
+   * rectangular region. It also indicates an alpha value of unity, if it
+   * supports alpha blending.
+   * @ATSPI_STATE_PRESSED: Indicates this object is currently pressed.
+   * @ATSPI_STATE_RESIZABLE: Indicates the size of this object's size is not
+   * fixed.
+   * @ATSPI_STATE_SELECTABLE: Indicates this object is the child of an object
+   * that allows its children to be selected and that this child is one of
+   * those children       that can be selected.
+   * @ATSPI_STATE_SELECTED: Indicates this object is the child of an object that
+   * allows its children to be selected and that this child is one of those
+   * children that has been selected.
+   * @ATSPI_STATE_SENSITIVE: Indicates this object is sensitive, e.g. to user
+   * interaction. @ATSPI_STATE_SENSITIVE usually accompanies.
+   * @ATSPI_STATE_ENABLED for user-actionable controls, but may be found in the
+   * absence of @ATSPI_STATE_ENABLED if the current visible state of the control
+   * is "disconnected" from the application state.  In such cases, direct user
+   * interaction can often result in the object gaining @ATSPI_STATE_SENSITIVE,
+   * for instance if a user makes an explicit selection using an object whose
+   * current state is ambiguous or undefined. See @ATSPI_STATE_ENABLED,
+   * @ATSPI_STATE_INDETERMINATE.
+   * @ATSPI_STATE_SHOWING: Indicates this object, the object's parent, the
+   * object's parent's parent, and so on, are all 'shown' to the end-user,
+   * i.e. subject to "exposure" if blocking or obscuring objects do not
+   * interpose between this object and the top of the window stack.
+   * @ATSPI_STATE_SINGLE_LINE: Indicates this (text) object can contain only a
+   * single line of text.
+   * @ATSPI_STATE_STALE: Indicates that the information returned for this object
+   * may no longer be synchronized with the application state.  This can occur
+   * if the object has @ATSPI_STATE_TRANSIENT, and can also occur towards the
+   * end of the object peer's lifecycle.
+   * @ATSPI_STATE_TRANSIENT: Indicates this object is transient.
+   * @ATSPI_STATE_VERTICAL: Indicates the orientation of this object is vertical;
+   * for example this state may appear on such objects as scrollbars, text
+   * objects (with vertical text flow), separators, etc.
+   * @ATSPI_STATE_VISIBLE: Indicates this object is visible, e.g. has been
+   * explicitly marked for exposure to the user. @ATSPI_STATE_VISIBLE is no
+   * guarantee that the object is actually unobscured on the screen, only that
+   * it is 'potentially' visible, barring obstruction, being scrolled or clipped
+   * out of the field of view, or having an ancestor container that has not yet
+   * made visible. A widget is potentially onscreen if it has both
+   * @ATSPI_STATE_VISIBLE and @ATSPI_STATE_SHOWING. The absence of
+   * @ATSPI_STATE_VISIBLE and @ATSPI_STATE_SHOWING is
+   * semantically equivalent to saying that an object is 'hidden'.
+   * @ATSPI_STATE_MANAGES_DESCENDANTS: Indicates that "active-descendant-changed"
+   * event is sent when children become 'active' (i.e. are selected or
+   * navigated to onscreen).  Used to prevent need to enumerate all children
+   * in very large containers, like tables. The presence of
+   * @ATSPI_STATE_MANAGES_DESCENDANTS is an indication to the client that the
+   * children should not, and need not, be enumerated by the client.
+   * Objects implementing this state are expected to provide relevant state
+   * notifications to listening clients, for instance notifications of
+   * visibility changes and activation of their contained child objects, without
+   * the client having previously requested references to those children.
+   * @ATSPI_STATE_INDETERMINATE: Indicates that a check box or other boolean
+   * indicator is in a state other than checked or not checked.  This
+   * usually means that the boolean value reflected or controlled by the
+   * object does not apply consistently to the entire current context.
+   * For example, a checkbox for the "Bold" attribute of text may have
+   * @ATSPI_STATE_INDETERMINATE if the currently selected text contains a mixture
+   * of weight attributes. In many cases interacting with a
+   * @ATSPI_STATE_INDETERMINATE object will cause the context's corresponding
+   * boolean attribute to be homogenized, whereupon the object will lose
+   * @ATSPI_STATE_INDETERMINATE and a corresponding state-changed event will be
+   * fired.
+   * @ATSPI_STATE_REQUIRED: Indicates that user interaction with this object is
+   * 'required' from the user, for instance before completing the
+   * processing of a form.
+   * @ATSPI_STATE_TRUNCATED:     Indicates that an object's onscreen content
+   * is truncated, e.g. a text value in a spreadsheet cell.
+   * @ATSPI_STATE_ANIMATED: Indicates this object's visual representation is
+   * dynamic, not static. This state may be applied to an object during an
+   * animated 'effect' and be removed from the object once its visual
+   * representation becomes static. Some applications, notably content viewers,
+   * may not be able to detect all kinds of animated content.  Therefore the
+   * absence of this state should not be taken as
+   * definitive evidence that the object's visual representation is
+   * static; this state is advisory.
+   * @ATSPI_STATE_INVALID_ENTRY: This object has indicated an error condition
+   * due to failure of input validation.  For instance, a form control may
+   * acquire this state in response to invalid or malformed user input.
+   * @ATSPI_STATE_SUPPORTS_AUTOCOMPLETION: This state indicates that the object
+   * in question implements some form of typeahead or
+   * pre-selection behavior whereby entering the first character of one or more
+   * sub-elements causes those elements to scroll into view or become
+   * selected. Subsequent character input may narrow the selection further as
+   * long as one or more sub-elements match the string. This state is normally
+   * only useful and encountered on objects that implement #AtspiSelection.
+   * In some cases the typeahead behavior may result in full or partial
+   * completion of the data in the input field, in which case
+   * these input events may trigger text-changed events from the source.
+   * @ATSPI_STATE_SELECTABLE_TEXT: This state indicates that the object in
+   * question supports text selection. It should only be exposed on objects
+   * which implement the #AtspiText interface, in order to distinguish this state
+   * from @ATSPI_STATE_SELECTABLE, which infers that the object in question is a
+   * selectable child of an object which implements #AtspiSelection. While
+   * similar, text selection and subelement selection are distinct operations.
+   * @ATSPI_STATE_IS_DEFAULT: This state indicates that the object in question is
+   * the 'default' interaction object in a dialog, i.e. the one that gets
+   * activated if the user presses "Enter" when the dialog is initially
+   * posted.
+   * @ATSPI_STATE_VISITED: This state indicates that the object (typically a
+   * hyperlink) has already been activated or invoked, with the result that
+   * some backing data has been downloaded or rendered.
+   *@ATSPI_STATE_CHECKABLE: Indicates this object has the potential to
+   *  be checked, such as a checkbox or toggle-able table cell. @Since:
+   *  2.12
+   *@ATSPI_STATE_HAS_POPUP: Indicates that the object has a popup
+   * context menu or sub-level menu which may or may not be
+   * showing. This means that activation renders conditional content.
+   * Note that ordinary tooltips are not considered popups in this
+   * context. @Since: 2.12
+   * @ATSPI_STATE_READ_ONLY: Indicates that an object which is ENABLED and
+   * SENSITIVE has a value which can be read, but not modified, by the
+   * user. @Since: 2.16
+   * @ATSPI_STATE_LAST_DEFINED: This value of the enumeration should not be used
+   * as a parameter, it indicates the number of items in the #AtspiStateType
+   * enumeration.
+   *
+   *
+   * Enumeration used by various interfaces indicating every possible state
+   * an #AtspiAccesible object can assume.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_STATE_INVALID,
     ATSPI_STATE_ACTIVE,
     ATSPI_STATE_ARMED,
@@ -633,96 +650,99 @@ typedef enum {
     ATSPI_STATE_HAS_POPUP,
     ATSPI_STATE_READ_ONLY,
     ATSPI_STATE_LAST_DEFINED,
-} AtspiStateType;
+  } AtspiStateType;
 
 /**
  * ATSPI_STATETYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiStateType.
  **/
-#define ATSPI_STATETYPE_COUNT (41+1)
+#define ATSPI_STATETYPE_COUNT (41 + 1)
 
-/**
- * AtspiKeyEventType:
- * @ATSPI_KEY_PRESSED: Key press event
- * @ATSPI_KEY_RELEASED: Key release event
- *
- * Deprecated. Should not be used.
- *
- **/
-typedef enum {
+  /**
+   * AtspiKeyEventType:
+   * @ATSPI_KEY_PRESSED: Key press event
+   * @ATSPI_KEY_RELEASED: Key release event
+   *
+   * Deprecated. Should not be used.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_KEY_PRESSED,
     ATSPI_KEY_RELEASED,
-} AtspiKeyEventType;
+  } AtspiKeyEventType;
 
 /**
  * ATSPI_KEYEVENTTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiKeyEventType.
  **/
-#define ATSPI_KEYEVENTTYPE_COUNT (1+1)
+#define ATSPI_KEYEVENTTYPE_COUNT (1 + 1)
 
-/**
- * AtspiEventType:
- * @ATSPI_KEY_PRESSED_EVENT: Indicates that a key on a keyboard device was 
- * pressed.
- * @ATSPI_KEY_RELEASED_EVENT: Indicates that a key on a keyboard device was 
- * released.
- * @ATSPI_BUTTON_PRESSED_EVENT: Indicates that a button on a non-keyboard 
- * human interface device (HID) was pressed.
- * @ATSPI_BUTTON_RELEASED_EVENT: Indicates that a button on a non-keyboard
- * human interface device (HID) was released.
- *
- * Enumeration used to specify the event types of interest to an 
- * #AtspiEventListener, or 
- * to identify the type of an event for which notification has been sent.  
- *
- **/
-typedef enum {
+  /**
+   * AtspiEventType:
+   * @ATSPI_KEY_PRESSED_EVENT: Indicates that a key on a keyboard device was
+   * pressed.
+   * @ATSPI_KEY_RELEASED_EVENT: Indicates that a key on a keyboard device was
+   * released.
+   * @ATSPI_BUTTON_PRESSED_EVENT: Indicates that a button on a non-keyboard
+   * human interface device (HID) was pressed.
+   * @ATSPI_BUTTON_RELEASED_EVENT: Indicates that a button on a non-keyboard
+   * human interface device (HID) was released.
+   *
+   * Enumeration used to specify the event types of interest to an
+   * #AtspiEventListener, or
+   * to identify the type of an event for which notification has been sent.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_KEY_PRESSED_EVENT,
     ATSPI_KEY_RELEASED_EVENT,
     ATSPI_BUTTON_PRESSED_EVENT,
     ATSPI_BUTTON_RELEASED_EVENT,
-} AtspiEventType;
+  } AtspiEventType;
 
 /**
  * ATSPI_EVENTTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiEventType.
  */
-#define ATSPI_EVENTTYPE_COUNT (3+1)
+#define ATSPI_EVENTTYPE_COUNT (3 + 1)
 
-/**
- * AtspiKeySynthType:
- * @ATSPI_KEY_PRESS: Emulates the pressing of a hardware keyboard key.
- * @ATSPI_KEY_RELEASE: Emulates the release of a hardware keyboard key.
- * @ATSPI_KEY_PRESSRELEASE: Emulates the pressing and immediate releasing
- * of a hardware keyboard key.
- * @ATSPI_KEY_SYM: A symbolic key event is generated, without specifying a
- * hardware key. Note: if the keysym is not present in the current keyboard
- * map, the #AtspiDeviceEventController instance has a limited ability to 
- * generate such keysyms on-the-fly. Reliability of GenerateKeyboardEvent 
- * calls using out-of-keymap keysyms will vary from system to system, and on 
- * the number of different out-of-keymap keysyms being generated in quick
- * succession. 
- * In practice this is rarely significant, since the keysyms of interest to 
- * AT clients and keyboard emulators are usually part of the current keymap, 
- * i.e., present on the system keyboard for the current locale (even if a 
- * physical hardware keyboard is not connected).
- * @ATSPI_KEY_STRING: A string is converted to its equivalent keyboard events
- * and emitted. If the string consists of complex characters or composed
- * characters which are not in the current keymap, string emission is
- * subject to the out-of-keymap limitations described for
- * @ATSPI_KEY_SYM. In practice this limitation primarily effects
- * Chinese and Japanese locales.
- * @ATSPI_KEY_LOCKMODIFIERS: Emulates locking a set of modifiers.
- * @ATSPI_KEY_UNLOCKMODIFIERS: Emulates unlocking a set of modifiers.
- *
- * Enumeration used when synthesizing keyboard input via
- * #atspi_generate_keyboard_event.
- *
- **/
-typedef enum {
+  /**
+   * AtspiKeySynthType:
+   * @ATSPI_KEY_PRESS: Emulates the pressing of a hardware keyboard key.
+   * @ATSPI_KEY_RELEASE: Emulates the release of a hardware keyboard key.
+   * @ATSPI_KEY_PRESSRELEASE: Emulates the pressing and immediate releasing
+   * of a hardware keyboard key.
+   * @ATSPI_KEY_SYM: A symbolic key event is generated, without specifying a
+   * hardware key. Note: if the keysym is not present in the current keyboard
+   * map, the #AtspiDeviceEventController instance has a limited ability to
+   * generate such keysyms on-the-fly. Reliability of GenerateKeyboardEvent
+   * calls using out-of-keymap keysyms will vary from system to system, and on
+   * the number of different out-of-keymap keysyms being generated in quick
+   * succession.
+   * In practice this is rarely significant, since the keysyms of interest to
+   * AT clients and keyboard emulators are usually part of the current keymap,
+   * i.e., present on the system keyboard for the current locale (even if a
+   * physical hardware keyboard is not connected).
+   * @ATSPI_KEY_STRING: A string is converted to its equivalent keyboard events
+   * and emitted. If the string consists of complex characters or composed
+   * characters which are not in the current keymap, string emission is
+   * subject to the out-of-keymap limitations described for
+   * @ATSPI_KEY_SYM. In practice this limitation primarily effects
+   * Chinese and Japanese locales.
+   * @ATSPI_KEY_LOCKMODIFIERS: Emulates locking a set of modifiers.
+   * @ATSPI_KEY_UNLOCKMODIFIERS: Emulates unlocking a set of modifiers.
+   *
+   * Enumeration used when synthesizing keyboard input via
+   * #atspi_generate_keyboard_event.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_KEY_PRESS,
     ATSPI_KEY_RELEASE,
     ATSPI_KEY_PRESSRELEASE,
@@ -730,36 +750,37 @@ typedef enum {
     ATSPI_KEY_STRING,
     ATSPI_KEY_LOCKMODIFIERS,
     ATSPI_KEY_UNLOCKMODIFIERS,
-} AtspiKeySynthType;
+  } AtspiKeySynthType;
 
 /**
  * ATSPI_KEYSYNTHTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiKeySynthType.
  **/
-#define ATSPI_KEYSYNTHTYPE_COUNT (4+1)
+#define ATSPI_KEYSYNTHTYPE_COUNT (4 + 1)
 
-/**
- * AtspiModifierType:
- * @ATSPI_MODIFIER_SHIFT: The left or right 'Shift' key.
- * @ATSPI_MODIFIER_SHIFTLOCK: The ShiftLock or CapsLock key.
- * @ATSPI_MODIFIER_CONTROL: 'Control'/'Ctrl'.
- * @ATSPI_MODIFIER_ALT: The Alt key (as opposed to AltGr).
- * @ATSPI_MODIFIER_META: Depending on the platform, this may map to 'Window',
- * 'Function', 'Meta', 'Menu', or 'NumLock'. Such 'Meta keys' will
- * map to one of META, META2, META3. On X Windows platforms these META
- * values map to the modifier masks Mod1Mask, Mod2Mask, Mod3Mask, e.g. an
- * event having @ATSPI_MODIFIER_META2 means that the 'Mod2Mask' bit
- * is set in the corresponding XEvent.
- * @ATSPI_MODIFIER_META2: See @ATSPI_MODIFIER_META.
- * @ATSPI_MODIFIER_META3: See @ATSPI_MODIFIER_META.
- * @ATSPI_MODIFIER_NUMLOCK: A symbolic meta key name that is mapped by AT-SPI
- * to the appropriate META value, for the convenience of the client.
- *
- *
- *
- **/
-typedef enum {
+  /**
+   * AtspiModifierType:
+   * @ATSPI_MODIFIER_SHIFT: The left or right 'Shift' key.
+   * @ATSPI_MODIFIER_SHIFTLOCK: The ShiftLock or CapsLock key.
+   * @ATSPI_MODIFIER_CONTROL: 'Control'/'Ctrl'.
+   * @ATSPI_MODIFIER_ALT: The Alt key (as opposed to AltGr).
+   * @ATSPI_MODIFIER_META: Depending on the platform, this may map to 'Window',
+   * 'Function', 'Meta', 'Menu', or 'NumLock'. Such 'Meta keys' will
+   * map to one of META, META2, META3. On X Windows platforms these META
+   * values map to the modifier masks Mod1Mask, Mod2Mask, Mod3Mask, e.g. an
+   * event having @ATSPI_MODIFIER_META2 means that the 'Mod2Mask' bit
+   * is set in the corresponding XEvent.
+   * @ATSPI_MODIFIER_META2: See @ATSPI_MODIFIER_META.
+   * @ATSPI_MODIFIER_META3: See @ATSPI_MODIFIER_META.
+   * @ATSPI_MODIFIER_NUMLOCK: A symbolic meta key name that is mapped by AT-SPI
+   * to the appropriate META value, for the convenience of the client.
+   *
+   *
+   *
+   **/
+  typedef enum
+  {
     ATSPI_MODIFIER_SHIFT,
     ATSPI_MODIFIER_SHIFTLOCK,
     ATSPI_MODIFIER_CONTROL,
@@ -768,120 +789,121 @@ typedef enum {
     ATSPI_MODIFIER_META2,
     ATSPI_MODIFIER_META3,
     ATSPI_MODIFIER_NUMLOCK = 14,
-} AtspiModifierType;
+  } AtspiModifierType;
 
 /**
  * ATSPI_MODIFIERTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiModifierType.
  **/
-#define ATSPI_MODIFIERTYPE_COUNT (7+1)
+#define ATSPI_MODIFIERTYPE_COUNT (7 + 1)
 
-/**
- * AtspiRelationType:
- * @ATSPI_RELATION_NULL: Not a meaningful relationship; clients should not
- * normally encounter this #AtspiRelationType value.
- * @ATSPI_RELATION_LABEL_FOR: Object is a label for one or more other objects.
- * @ATSPI_RELATION_LABELLED_BY: Object is labelled by one or more other
- * objects.
- * @ATSPI_RELATION_CONTROLLER_FOR: Object is an interactive object which
- * modifies the state, onscreen location, or other attributes of one or more
- * target objects.
- * @ATSPI_RELATION_CONTROLLED_BY: Object state, position, etc. is
- * modified/controlled by user interaction with one or more other objects. 
- * For instance a viewport or scroll pane may be @ATSPI_RELATION_CONTROLLED_BY
- * scrollbars.
- * @ATSPI_RELATION_MEMBER_OF: Object has a grouping relationship (e.g. 'same
- * group as') to one or more other objects.
- * @ATSPI_RELATION_TOOLTIP_FOR: Object is a tooltip associated with another
- * object.
- * @ATSPI_RELATION_NODE_CHILD_OF: Object is a child of the target.
- * @ATSPI_RELATION_NODE_PARENT_OF: Object is a parent of the target.
- * @ATSPI_RELATION_EXTENDED: Used to indicate that a relationship exists, but
- * its type is not specified in the enumeration.
- * @ATSPI_RELATION_FLOWS_TO: Object renders content which flows logically to
- * another object. For instance, text in a paragraph may flow to another
- * object which is not the 'next sibling' in the accessibility hierarchy.
- * @ATSPI_RELATION_FLOWS_FROM: Reciprocal of @ATSPI_RELATION_FLOWS_TO.
- * @ATSPI_RELATION_SUBWINDOW_OF: Object is visually and semantically considered
- * a subwindow of another object, even though it is not the object's child. 
- * Useful when dealing with embedded applications and other cases where the
- * widget hierarchy does not map cleanly to the onscreen presentation.
- * @ATSPI_RELATION_EMBEDS: Similar to @ATSPI_RELATION_SUBWINDOW_OF, but 
- * specifically used for cross-process embedding.
- * @ATSPI_RELATION_EMBEDDED_BY: Reciprocal of @ATSPI_RELATION_EMBEDS. Used to
- * denote content rendered by embedded renderers that live in a separate process
- * space from the embedding context.
- * @ATSPI_RELATION_POPUP_FOR: Denotes that the object is a transient window or
- * frame associated with another onscreen object. Similar to @ATSPI_TOOLTIP_FOR,
- * but more general. Useful for windows which are technically toplevels
- * but which, for one or more reasons, do not explicitly cause their 
- * associated window to lose 'window focus'. Creation of an @ATSPI_ROLE_WINDOW
- * object with the @ATSPI_RELATION_POPUP_FOR relation usually requires 
- * some presentation action on the part
- * of assistive technology clients, even though the previous toplevel
- * @ATSPI_ROLE_FRAME object may still be the active window.
- * @ATSPI_RELATION_PARENT_WINDOW_OF: This is the reciprocal relation to
- * @ATSPI_RELATION_POPUP_FOR.
- * @ATSPI_RELATION_DESCRIBED_BY: Reciprocal of %ATSPI_RELATION_DESCRIPTION_FOR.
- * Indicates that one or more target objects provide descriptive information
- * about this object. This relation type is most appropriate for information
- * that is not essential as its presentation may be user-configurable and/or
- * limited to an on-demand mechanism such as an assistive technology command.
- * For brief, essential information such as can be found in a widget's on-screen
- * label, use %ATSPI_RELATION_LABELLED_BY. For an on-screen error message, use
- * %ATSPI_RELATION_ERROR_MESSAGE. For lengthy extended descriptive information
- * contained in an on-screen object, consider using %ATSPI_RELATION_DETAILS as
- * assistive technologies may provide a means for the user to navigate to
- * objects containing detailed descriptions so that their content can be more
- * closely reviewed.
- * @ATSPI_RELATION_DESCRIPTION_FOR: Reciprocal of %ATSPI_RELATION_DESCRIBED_BY.
- * Indicates that this object provides descriptive information about the target
- * object(s). See also %ATSPI_RELATION_DETAILS_FOR and %ATSPI_RELATION_ERROR_FOR.
- * @ATSPI_RELATION_DETAILS: Reciprocal of %ATSPI_RELATION_DETAILS_FOR. Indicates
- * that this object has a detailed or extended description, the contents of
- * which can be found in the target object(s). This relation type is most
- * appropriate for information that is sufficiently lengthy as to make
- * navigation to the container of that information desirable. For less verbose
- * information suitable for announcement only, see %ATSPI_RELATION_DESCRIBED_BY.
- * If the detailed information describes an error condition,
- * %ATSPI_RELATION_ERROR_FOR should be used instead. @Since: 2.26.
- * @ATSPI_RELATION_DETAILS_FOR: Reciprocal of %ATSPI_RELATION_DETAILS. Indicates
- * that this object provides a detailed or extended description about the target
- * object(s). See also %ATSPI_RELATION_DESCRIPTION_FOR and
- * %ATSPI_RELATION_ERROR_FOR. @Since: 2.26.
- * @ATSPI_RELATION_ERROR_MESSAGE: Reciprocal of %ATSPI_RELATION_ERROR_FOR.
- * Indicates that this object has one or more errors, the nature of which is
- * described in the contents of the target object(s). Objects that have this
- * relation type should also contain %ATSPI_STATE_INVALID_ENTRY in their
- * #AtspiStateSet. @Since: 2.26.
- * @ATSPI_RELATION_ERROR_FOR: Reciprocal of %ATSPI_RELATION_ERROR_MESSAGE.
- * Indicates that this object contains an error message describing an invalid
- * condition in the target object(s). @Since: 2.26.
- * @ATSPI_RELATION_LAST_DEFINED: Do not use as a parameter value, used to
- * determine the size of the enumeration. 
- *
- * #AtspiRelationType specifies a relationship between objects 
- * (possibly one-to-many
- * or many-to-one) outside of the normal parent/child hierarchical
- * relationship. It allows better semantic       identification of how objects
- * are associated with one another.       For instance the 
- * @ATSPI_RELATION_LABELLED_BY
- * relationship may be used to identify labelling information       that should
- * accompany the accessible name property when presenting an object's content or
- * identity       to the end user.  Similarly, 
- * @ATSPI_RELATION_CONTROLLER_FOR can be used
- * to further specify the context in which a valuator is useful, and/or the
- * other UI components which are directly effected by user interactions with
- * the valuator. Common examples include association of scrollbars with the
- * viewport or panel which they control.
- *
- *
- * Enumeration used to specify
- * the type of relation encapsulated in an #AtspiRelation object.
- *
- **/
-typedef enum {
+  /**
+   * AtspiRelationType:
+   * @ATSPI_RELATION_NULL: Not a meaningful relationship; clients should not
+   * normally encounter this #AtspiRelationType value.
+   * @ATSPI_RELATION_LABEL_FOR: Object is a label for one or more other objects.
+   * @ATSPI_RELATION_LABELLED_BY: Object is labelled by one or more other
+   * objects.
+   * @ATSPI_RELATION_CONTROLLER_FOR: Object is an interactive object which
+   * modifies the state, onscreen location, or other attributes of one or more
+   * target objects.
+   * @ATSPI_RELATION_CONTROLLED_BY: Object state, position, etc. is
+   * modified/controlled by user interaction with one or more other objects.
+   * For instance a viewport or scroll pane may be @ATSPI_RELATION_CONTROLLED_BY
+   * scrollbars.
+   * @ATSPI_RELATION_MEMBER_OF: Object has a grouping relationship (e.g. 'same
+   * group as') to one or more other objects.
+   * @ATSPI_RELATION_TOOLTIP_FOR: Object is a tooltip associated with another
+   * object.
+   * @ATSPI_RELATION_NODE_CHILD_OF: Object is a child of the target.
+   * @ATSPI_RELATION_NODE_PARENT_OF: Object is a parent of the target.
+   * @ATSPI_RELATION_EXTENDED: Used to indicate that a relationship exists, but
+   * its type is not specified in the enumeration.
+   * @ATSPI_RELATION_FLOWS_TO: Object renders content which flows logically to
+   * another object. For instance, text in a paragraph may flow to another
+   * object which is not the 'next sibling' in the accessibility hierarchy.
+   * @ATSPI_RELATION_FLOWS_FROM: Reciprocal of @ATSPI_RELATION_FLOWS_TO.
+   * @ATSPI_RELATION_SUBWINDOW_OF: Object is visually and semantically considered
+   * a subwindow of another object, even though it is not the object's child.
+   * Useful when dealing with embedded applications and other cases where the
+   * widget hierarchy does not map cleanly to the onscreen presentation.
+   * @ATSPI_RELATION_EMBEDS: Similar to @ATSPI_RELATION_SUBWINDOW_OF, but
+   * specifically used for cross-process embedding.
+   * @ATSPI_RELATION_EMBEDDED_BY: Reciprocal of @ATSPI_RELATION_EMBEDS. Used to
+   * denote content rendered by embedded renderers that live in a separate process
+   * space from the embedding context.
+   * @ATSPI_RELATION_POPUP_FOR: Denotes that the object is a transient window or
+   * frame associated with another onscreen object. Similar to @ATSPI_TOOLTIP_FOR,
+   * but more general. Useful for windows which are technically toplevels
+   * but which, for one or more reasons, do not explicitly cause their
+   * associated window to lose 'window focus'. Creation of an @ATSPI_ROLE_WINDOW
+   * object with the @ATSPI_RELATION_POPUP_FOR relation usually requires
+   * some presentation action on the part
+   * of assistive technology clients, even though the previous toplevel
+   * @ATSPI_ROLE_FRAME object may still be the active window.
+   * @ATSPI_RELATION_PARENT_WINDOW_OF: This is the reciprocal relation to
+   * @ATSPI_RELATION_POPUP_FOR.
+   * @ATSPI_RELATION_DESCRIPTION_FOR: Reciprocal of %ATSPI_RELATION_DESCRIBED_BY.
+   * Indicates that this object provides descriptive information about the target
+   * object(s). See also %ATSPI_RELATION_DETAILS_FOR and %ATSPI_RELATION_ERROR_FOR.
+   * @ATSPI_RELATION_DESCRIBED_BY: Reciprocal of %ATSPI_RELATION_DESCRIPTION_FOR.
+   * Indicates that one or more target objects provide descriptive information
+   * about this object. This relation type is most appropriate for information
+   * that is not essential as its presentation may be user-configurable and/or
+   * limited to an on-demand mechanism such as an assistive technology command.
+   * For brief, essential information such as can be found in a widget's on-screen
+   * label, use %ATSPI_RELATION_LABELLED_BY. For an on-screen error message, use
+   * %ATSPI_RELATION_ERROR_MESSAGE. For lengthy extended descriptive information
+   * contained in an on-screen object, consider using %ATSPI_RELATION_DETAILS as
+   * assistive technologies may provide a means for the user to navigate to
+   * objects containing detailed descriptions so that their content can be more
+   * closely reviewed.
+   * @ATSPI_RELATION_DETAILS: Reciprocal of %ATSPI_RELATION_DETAILS_FOR. Indicates
+   * that this object has a detailed or extended description, the contents of
+   * which can be found in the target object(s). This relation type is most
+   * appropriate for information that is sufficiently lengthy as to make
+   * navigation to the container of that information desirable. For less verbose
+   * information suitable for announcement only, see %ATSPI_RELATION_DESCRIBED_BY.
+   * If the detailed information describes an error condition,
+   * %ATSPI_RELATION_ERROR_FOR should be used instead. @Since: 2.26.
+   * @ATSPI_RELATION_DETAILS_FOR: Reciprocal of %ATSPI_RELATION_DETAILS. Indicates
+   * that this object provides a detailed or extended description about the target
+   * object(s). See also %ATSPI_RELATION_DESCRIPTION_FOR and
+   * %ATSPI_RELATION_ERROR_FOR. @Since: 2.26.
+   * @ATSPI_RELATION_ERROR_MESSAGE: Reciprocal of %ATSPI_RELATION_ERROR_FOR.
+   * Indicates that this object has one or more errors, the nature of which is
+   * described in the contents of the target object(s). Objects that have this
+   * relation type should also contain %ATSPI_STATE_INVALID_ENTRY in their
+   * #AtspiStateSet. @Since: 2.26.
+   * @ATSPI_RELATION_ERROR_FOR: Reciprocal of %ATSPI_RELATION_ERROR_MESSAGE.
+   * Indicates that this object contains an error message describing an invalid
+   * condition in the target object(s). @Since: 2.26.
+   * @ATSPI_RELATION_LAST_DEFINED: Do not use as a parameter value, used to
+   * determine the size of the enumeration.
+   *
+   * #AtspiRelationType specifies a relationship between objects
+   * (possibly one-to-many
+   * or many-to-one) outside of the normal parent/child hierarchical
+   * relationship. It allows better semantic       identification of how objects
+   * are associated with one another.       For instance the
+   * @ATSPI_RELATION_LABELLED_BY
+   * relationship may be used to identify labelling information       that should
+   * accompany the accessible name property when presenting an object's content or
+   * identity       to the end user.  Similarly,
+   * @ATSPI_RELATION_CONTROLLER_FOR can be used
+   * to further specify the context in which a valuator is useful, and/or the
+   * other UI components which are directly effected by user interactions with
+   * the valuator. Common examples include association of scrollbars with the
+   * viewport or panel which they control.
+   *
+   *
+   * Enumeration used to specify
+   * the type of relation encapsulated in an #AtspiRelation object.
+   *
+   **/
+  typedef enum
+  {
     ATSPI_RELATION_NULL,
     ATSPI_RELATION_LABEL_FOR,
     ATSPI_RELATION_LABELLED_BY,
@@ -906,360 +928,361 @@ typedef enum {
     ATSPI_RELATION_ERROR_MESSAGE,
     ATSPI_RELATION_ERROR_FOR,
     ATSPI_RELATION_LAST_DEFINED,
-} AtspiRelationType;
+  } AtspiRelationType;
 
 /**
  * ATSPI_RELATIONTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiRelationType.
  **/
-#define ATSPI_RELATIONTYPE_COUNT (23+1)
+#define ATSPI_RELATIONTYPE_COUNT (23 + 1)
 
-/**
- * AtspiRole:
- * @ATSPI_ROLE_INVALID: A role indicating an error condition, such as
- * uninitialized Role data.
- * @ATSPI_ROLE_ACCELERATOR_LABEL: Object is a label indicating the keyboard
- * accelerators for the parent.
- * @ATSPI_ROLE_ALERT: Object is used to alert the user about something.
- * @ATSPI_ROLE_ANIMATION: Object contains a dynamic or moving image of some
- * kind.
- * @ATSPI_ROLE_ARROW: Object is a 2d directional indicator.
- * @ATSPI_ROLE_CALENDAR: Object contains one or more dates, usually arranged
- * into a 2d list.
- * @ATSPI_ROLE_CANVAS: Object that can be drawn into and is used to trap
- * events.
- * @ATSPI_ROLE_CHECK_BOX: A choice that can be checked or unchecked and
- * provides a separate       indicator for the current state.
- * @ATSPI_ROLE_CHECK_MENU_ITEM: A menu item that behaves like a check box. See
- * @ATSPI_ROLE_CHECK_BOX.
- * @ATSPI_ROLE_COLOR_CHOOSER: A specialized dialog that lets the user choose a
- * color.
- * @ATSPI_ROLE_COLUMN_HEADER: The header for a column of data.
- * @ATSPI_ROLE_COMBO_BOX: A list of choices the user can select from.
- * @ATSPI_ROLE_DATE_EDITOR: An object which allows entry of a date.
- * @ATSPI_ROLE_DESKTOP_ICON: An inconifed internal frame within a DESKTOP_PANE.
- * @ATSPI_ROLE_DESKTOP_FRAME: A pane that supports internal frames and
- * iconified versions of those internal frames.
- * @ATSPI_ROLE_DIAL: An object that allows a value to be changed via rotating a
- * visual element, or which displays a value via such a rotating element.
- * @ATSPI_ROLE_DIALOG: A top level window with title bar and a border.
- * @ATSPI_ROLE_DIRECTORY_PANE: A pane that allows the user to navigate through
- * and select the contents of a directory.
- * @ATSPI_ROLE_DRAWING_AREA: A specialized dialog that displays the files in
- * the directory and lets the user select a file, browse a different
- * directory, or specify a filename.
- * @ATSPI_ROLE_FILE_CHOOSER: An object used for drawing custom user interface
- * elements.
- * @ATSPI_ROLE_FILLER: A object that fills up space in a user interface.
- * @ATSPI_ROLE_FOCUS_TRAVERSABLE: Don't use, reserved for future use.
- * @ATSPI_ROLE_FONT_CHOOSER: Allows selection of a display font.
- * @ATSPI_ROLE_FRAME: A top level window with a title bar, border, menubar,
- * etc.
- * @ATSPI_ROLE_GLASS_PANE: A pane that is guaranteed to be painted on top of
- * all panes beneath it.
- * @ATSPI_ROLE_HTML_CONTAINER: A document container for HTML, whose children   
- * represent the document content.
- * @ATSPI_ROLE_ICON: A small fixed size picture, typically used to decorate
- * components.
- * @ATSPI_ROLE_IMAGE: An image, typically static.
- * @ATSPI_ROLE_INTERNAL_FRAME: A frame-like object that is clipped by a desktop
- * pane.
- * @ATSPI_ROLE_LABEL: An object used to present an icon or short string in an
- * interface.
- * @ATSPI_ROLE_LAYERED_PANE: A specialized pane that allows its children to be
- * drawn in layers, providing a form of stacking order.
- * @ATSPI_ROLE_LIST: An object that presents a list of objects to the user and
- * allows the user to select one or more of them.
- * @ATSPI_ROLE_LIST_ITEM: An object that represents an element of a list.
- * @ATSPI_ROLE_MENU: An object usually found inside a menu bar that contains a
- * list of actions the user can choose from.
- * @ATSPI_ROLE_MENU_BAR: An object usually drawn at the top of the primary
- * dialog box of an application that contains a list of menus the user can
- * choose from.
- * @ATSPI_ROLE_MENU_ITEM: An object usually contained in a menu that presents
- * an action the user can choose.
- * @ATSPI_ROLE_OPTION_PANE: A specialized pane whose primary use is inside a
- * dialog.
- * @ATSPI_ROLE_PAGE_TAB: An object that is a child of a page tab list.
- * @ATSPI_ROLE_PAGE_TAB_LIST: An object that presents a series of panels (or
- * page tabs), one at a time,through some mechanism provided by the
- * object.
- * @ATSPI_ROLE_PANEL: A generic container that is often used to group objects.
- * @ATSPI_ROLE_PASSWORD_TEXT: A text object uses for passwords, or other places
- * where the text content is not shown visibly to the user.
- * @ATSPI_ROLE_POPUP_MENU: A temporary window that is usually used to offer the
- * user a list of choices, and then hides when the user selects one of those
- * choices.
- * @ATSPI_ROLE_PROGRESS_BAR: An object used to indicate how much of a task has
- * been completed.
- * @ATSPI_ROLE_PUSH_BUTTON: An object the user can manipulate to tell the
- * application to do something.
- * @ATSPI_ROLE_RADIO_BUTTON: A specialized check box that will cause other
- * radio buttons in the same group to become unchecked when this one is
- * checked.
- * @ATSPI_ROLE_RADIO_MENU_ITEM: Object is both a menu item and a "radio button"
- * . See @ATSPI_ROLE_RADIO_BUTTON.
- * @ATSPI_ROLE_ROOT_PANE: A specialized pane that has a glass pane and a
- * layered pane as its children.
- * @ATSPI_ROLE_ROW_HEADER: The header for a row of data.
- * @ATSPI_ROLE_SCROLL_BAR: An object usually used to allow a user to
- * incrementally view a large amount of data by moving the bounds of a
- * viewport along a one-dimensional axis.
- * @ATSPI_ROLE_SCROLL_PANE: An object that allows a user to incrementally view
- * a large amount of information. @ATSPI_ROLE_SCROLL_PANE objects are usually
- * accompanied by @ATSPI_ROLE_SCROLL_BAR controllers, on which the
- * @ATSPI_RELATION_CONTROLLER_FOR and @ATSPI_RELATION_CONTROLLED_BY 
- * reciprocal relations are set. See  #atspi_get_relation_set.
- * @ATSPI_ROLE_SEPARATOR: An object usually contained in a menu to provide a
- * visible and logical separation of the contents in a menu.
- * @ATSPI_ROLE_SLIDER: An object that allows the user to select from a bounded
- * range.
- * @ATSPI_ROLE_SPIN_BUTTON: An object which allows one of a set of choices to
- * be selected, and which displays the current choice.  Unlike
- * @ATSPI_ROLE_SCROLL_BAR, @ATSPI_ROLE_SLIDER objects need not control 
- * 'viewport'-like objects.
- * @ATSPI_ROLE_SPLIT_PANE: A specialized panel that presents two other panels
- * at the same time.
- * @ATSPI_ROLE_STATUS_BAR: Object displays non-quantitative status information
- * (c.f. @ATSPI_ROLE_PROGRESS_BAR)
- * @ATSPI_ROLE_TABLE: An object used to repesent information in terms of rows
- * and columns.
- * @ATSPI_ROLE_TABLE_CELL: A 'cell' or discrete child within a Table. Note:
- * Table cells need not have @ATSPI_ROLE_TABLE_CELL, other 
- * #AtspiRoleType values are valid as well.
- * @ATSPI_ROLE_TABLE_COLUMN_HEADER: An object which labels a particular column
- * in an #AtspiTable.
- * @ATSPI_ROLE_TABLE_ROW_HEADER: An object which labels a particular row in a
- * #AtspiTable. #AtspiTable rows and columns may also be labelled via the
- * @ATSPI_RELATION_LABEL_FOR/@ATSPI_RELATION_LABELLED_BY relationships.
- * See #atspi_get_relation_set.
- * @ATSPI_ROLE_TEAROFF_MENU_ITEM: Object allows menu to be removed from menubar
- * and shown in its own window.
- * @ATSPI_ROLE_TERMINAL: An object that emulates a terminal.
- * @ATSPI_ROLE_TEXT: An interactive widget that supports multiple lines of text
- * and optionally accepts user input, but whose purpose is not to solicit user
- * input. Thus @ATSPI_ROLE_TEXT is appropriate for the text view in a plain text
- * editor but inappropriate for an input field in a dialog box or web form. For
- * widgets whose purpose is to solicit input from the user, see @ATSPI_ROLE_ENTRY
- * and @ATSPI_ROLE_PASSWORD_TEXT. For generic objects which display a brief amount
- * of textual information, see @ATSPI_ROLE_STATIC.
- * @ATSPI_ROLE_TOGGLE_BUTTON: A specialized push button that can be checked or
- * unchecked, but does not procide a separate indicator for the current
- * state.
- * @ATSPI_ROLE_TOOL_BAR: A bar or palette usually composed of push buttons or
- * toggle buttons.
- * @ATSPI_ROLE_TOOL_TIP: An object that provides information about another
- * object.
- * @ATSPI_ROLE_TREE: An object used to repsent hierarchical information to the
- * user.
- * @ATSPI_ROLE_TREE_TABLE: An object that presents both tabular and
- * hierarchical info to the user.
- * @ATSPI_ROLE_UNKNOWN: The object contains some #AtspiAccessible information, 
- * but its role is not known.
- * @ATSPI_ROLE_VIEWPORT: An object usually used in a scroll pane, or to
- * otherwise clip a larger object or content renderer to a specific
- * onscreen viewport.
- * @ATSPI_ROLE_WINDOW: A top level window with no title or border.
- * @ATSPI_ROLE_EXTENDED: means that the role for this item is known, but not
- * included in the core enumeration. Deprecated since 2.24.
- * @ATSPI_ROLE_HEADER: An object that serves as a document header.
- * @ATSPI_ROLE_FOOTER: An object that serves as a document footer.
- * @ATSPI_ROLE_PARAGRAPH: An object which is contains a single paragraph of
- * text content. See also @ATSPI_ROLE_TEXT.
- * @ATSPI_ROLE_RULER: An object which describes margins and tab stops, etc.    
- *    for text objects which it controls (should have 
- * @ATSPI_RELATION_CONTROLLER_FOR relation to such).
- * @ATSPI_ROLE_APPLICATION: An object corresponding to the toplevel accessible
- * of an application, which may contain @ATSPI_ROLE_FRAME objects or other      
- * accessible objects. Children of #AccessibleDesktop objects  are generally
- * @ATSPI_ROLE_APPLICATION objects.
- * @ATSPI_ROLE_AUTOCOMPLETE: The object is a dialog or list containing items
- * for insertion into an entry widget, for instance a list of words for
- * completion of a text entry.
- * @ATSPI_ROLE_EDITBAR: The object is an editable text object in a toolbar.
- * @ATSPI_ROLE_EMBEDDED: The object is an embedded component container.  This
- * role is a "grouping" hint that the contained objects share a context
- * which is different from the container in which this accessible is
- * embedded. In particular, it is used for some kinds of document embedding,
- * and for embedding of out-of-process component, "panel applets", etc.
- * @ATSPI_ROLE_ENTRY: The object is a component whose textual content may be
- * entered or modified by the user, provided @ATSPI_STATE_EDITABLE is present.
- * A readonly @ATSPI_ROLE_ENTRY object (i.e. where @ATSPI_STATE_EDITABLE is 
- * not present) implies a read-only 'text field' in a form, as opposed to a 
- * title, label, or caption.
- * @ATSPI_ROLE_CHART: The object is a graphical depiction of quantitative data.
- * It may contain multiple subelements whose attributes and/or description
- * may be queried to obtain both the  quantitative data and information about
- * how the data is being presented. The @ATSPI_LABELLED_BY relation is 
- * particularly important in interpreting objects of this type, as is the
- * accessible description property. See @ATSPI_ROLE_CAPTION.
- * @ATSPI_ROLE_CAPTION: The object contains descriptive information, usually
- * textual, about another user interface element such as a table, chart, or
- * image.
- * @ATSPI_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which
- * contains a view of document content. #AtspiDocument frames may occur within
- * another #AtspiDocument instance, in which case the second  document may be
- * said to be embedded in the containing instance.  HTML frames are often
- * ATSPI_ROLE_DOCUMENT_FRAME:  Either this object, or a singleton descendant, 
- * should implement the #AtspiDocument interface.
- * @ATSPI_ROLE_HEADING: The object serves as a heading for content which
- * follows it in a document. The 'heading level' of the heading, if
- * availabe,  may be obtained by       querying the object's attributes.
- * @ATSPI_ROLE_PAGE: The object is a containing instance which encapsulates a
- * page of information. @ATSPI_ROLE_PAGE is used in documents and content which
- * support a paginated navigation model.
- * @ATSPI_ROLE_SECTION: The object is a containing instance of document content
- * which constitutes a particular 'logical' section of the document.  The
- * type of content within a section, and the nature of the section division
- * itself, may be obtained by querying the object's attributes.  Sections
- * may be nested.
- * @ATSPI_ROLE_REDUNDANT_OBJECT: The object is redundant with another object in
- * the hierarchy, and is exposed for purely technical reasons.  Objects of
- * this role should be ignored by clients, if they are encountered at all.
- * @ATSPI_ROLE_FORM: The object is a containing instance of document content
- * which has within it components with which the user can interact in order
- * to input information; i.e. the object is a container for pushbuttons,    
- * comboboxes, text input fields, and other 'GUI' components. @ATSPI_ROLE_FORM
- * should not, in general, be used for toplevel GUI containers or dialogs,
- * but should be reserved for 'GUI' containers which occur within document
- * content, for instance within Web documents, presentations, or text
- * documents.  Unlike other GUI containers and dialogs which occur inside      
- * application instances, @ATSPI_ROLE_FORM containers' components are
- * associated with the current document, rather than the current foreground 
- * application or viewer instance.
- * @ATSPI_ROLE_LINK: The object is a hypertext anchor, i.e. a "link" in a      
- * hypertext document.  Such objects are distinct from 'inline'       content
- * which may also use the #AtspiHypertext/#AtspiHyperlink interfacesto indicate
- * the range/location within a text object where an inline or embedded object
- * lies.
- * @ATSPI_ROLE_INPUT_METHOD_WINDOW: The object is a window or similar viewport
- * which is used to allow composition or input of a 'complex character',    
- * in other words it is an "input method window".
- * @ATSPI_ROLE_TABLE_ROW: A row in a table.
- * @ATSPI_ROLE_TREE_ITEM: An object that represents an element of a tree.
- * @ATSPI_ROLE_DOCUMENT_SPREADSHEET: A document frame which contains a
- * spreadsheet.
- * @ATSPI_ROLE_DOCUMENT_PRESENTATION: A document frame which contains a
- * presentation or slide content.
- * @ATSPI_ROLE_DOCUMENT_TEXT: A document frame which contains textual content,
- * such as found in a word processing
- * application.
- * @ATSPI_ROLE_DOCUMENT_WEB: A document frame which contains HTML or other
- * markup suitable for display in a web browser.
- * @ATSPI_ROLE_DOCUMENT_EMAIL: A document frame which contains email content
- * to be displayed or composed either in plain text or
- * HTML.
- * @ATSPI_ROLE_COMMENT: An object found within a document and designed to
- * present a comment, note, or other annotation. In some cases, this object
- * might not be visible until activated.
- * @ATSPI_ROLE_LIST_BOX: A non-collapsible list of choices the user can
- * select from.
- * @ATSPI_ROLE_GROUPING: A group of related widgets. This group typically has
- * a label.
- * @ATSPI_ROLE_IMAGE_MAP: An image map object. Usually a graphic with multiple
- * hotspots, where each hotspot can be activated resulting in the loading of
- * another document or section of a document.
- * @ATSPI_ROLE_NOTIFICATION: A transitory object designed to present a
- * message to the user, typically at the desktop level rather than inside a
- * particular application.
- * @ATSPI_ROLE_INFO_BAR: An object designed to present a message to the user
- * within an existing window.
- * @ATSPI_ROLE_LEVEL_BAR: A bar that serves as a level indicator to, for
- * instance, show the strength of a password or the state of a battery. @Since: 2.8
- * @ATSPI_ROLE_TITLE_BAR: A bar that serves as the title of a window or a
- *  dialog. @Since: 2.12
- * @ATSPI_ROLE_BLOCK_QUOTE: An object which contains a text section
- *  that is quoted from another source.  @Since: 2.12
- * @ATSPI_ROLE_AUDIO: An object which represents an audio
- *  element. @Since: 2.12
- * @ATSPI_ROLE_VIDEO: An object which represents a video
- *  element. @Since: 2.12
- * @ATSPI_ROLE_DEFINITION: A definition of a term or concept. @Since: 2.12
- * @ATSPI_ROLE_ARTICLE: A section of a page that consists of a
- *  composition that forms an independent part of a document, page, or
- *  site. Examples: A blog entry, a news story, a forum post. @Since:
- *  2.12
- * @ATSPI_ROLE_LANDMARK: A region of a web page intended as a
- *  navigational landmark. This is designed to allow Assistive
- *  Technologies to provide quick navigation among key regions within a
- *  document. @Since: 2.12
- * @ATSPI_ROLE_LOG: A text widget or container holding log content, such
- *  as chat history and error logs. In this role there is a
- *  relationship between the arrival of new items in the log and the
- *  reading order. The log contains a meaningful sequence and new
- *  information is added only to the end of the log, not at arbitrary
- *  points. @Since: 2.12
- * @ATSPI_ROLE_MARQUEE: A container where non-essential information
- *  changes frequently. Common usages of marquee include stock tickers
- *  and ad banners. The primary difference between a marquee and a log
- *  is that logs usually have a meaningful order or sequence of
- *  important content changes. @Since: 2.12
- * @ATSPI_ROLE_MATH: A text widget or container that holds a mathematical
- *  expression. @Since: 2.12
- * @ATSPI_ROLE_RATING: A widget whose purpose is to display a rating,
- *  such as the number of stars associated with a song in a media
- *  player. Objects of this role should also implement
- *  AtspiValue. @Since: 2.12
- * @ATSPI_ROLE_TIMER: An object containing a numerical counter which
- *  indicates an amount of elapsed time from a start point, or the time
- *  remaining until an end point. @Since: 2.12
- * @ATSPI_ROLE_STATIC: A generic non-container object whose purpose is to display
- *  a brief amount of information to the user and whose role is known by the
- *  implementor but lacks semantic value for the user. Examples in which
- *  @ATSPI_ROLE_STATIC is appropriate include the message displayed in a message
- *  box and an image used as an alternative means to display text.
- *  @ATSPI_ROLE_STATIC should not be applied to widgets which are traditionally
- *  interactive, objects which display a significant amount of content, or any
- *  object which has an accessible relation pointing to another object. The
- *  displayed information, as a general rule, should be exposed through the
- *  accessible name of the object. For labels which describe another widget, see
- *  @ATSPI_ROLE_LABEL. For text views, see @ATSPI_ROLE_TEXT. For generic
- *  containers, see @ATSPI_ROLE_PANEL. For objects whose role is not known by the
- *  implementor, see @ATSPI_ROLE_UNKNOWN. @Since: 2.16.
- * @ATSPI_ROLE_MATH_FRACTION: An object that represents a mathematical fraction. @Since: 2.16.
- * @ATSPI_ROLE_MATH_ROOT: An object that represents a mathematical expression
- *  displayed with a radical. @Since: 2.16.
- * @ATSPI_ROLE_SUBSCRIPT: An object that contains text that is displayed as a
- *  subscript. @Since: 2.16.
- * @ATSPI_ROLE_SUPERSCRIPT: An object that contains text that is displayed as a
- *  superscript. @Since: 2.16.
- * @ATSPI_ROLE_DESCRIPTION_LIST: An object that represents a list of term-value
- *  groups. A term-value group represents an individual description and consist
- *  of one or more names (@ATSPI_ROLE_DESCRIPTION_TERM) followed by one or more
- *  values (@ATSPI_ROLE_DESCRIPTION_VALUE). For each list, there should not be
- *  more than one group with the same term name. @Since: 2.26.
- * @ATSPI_ROLE_DESCRIPTION_TERM: An object that represents a term or phrase
- *  with a corresponding definition. @Since: 2.26.
- * @ATSPI_ROLE_DESCRIPTION_VALUE: An object that represents the description,
- *  definition, or value of a term. @Since: 2.26.
- * @ATSPI_ROLE_FOOTNOTE: An object that contains the text of a footnote. @Since: 2.26.
- * @ATSPI_ROLE_CONTENT_DELETION: Content previously deleted or proposed to be
- * deleted, e.g. in revision history or a content view providing suggestions
- * from reviewers. @Since: 2.34.
- * @ATSPI_ROLE_CONTENT_INSERTION: Content previously inserted or proposed to be
- * inserted, e.g. in revision history or a content view providing suggestions
- * from reviewers. @Since: 2.34.
- * @ATSPI_ROLE_MARK: A run of content that is marked or highlighted, such as for
- * reference purposes, or to call it out as having a special purpose. If the
- * marked content has an associated section in the document elaborating on the
- * reason for the mark, then %ATSPI_RELATION_DETAILS should be used on the mark
- * to point to that associated section. In addition, the reciprocal relation
- * %ATSPI_RELATION_DETAILS_FOR should be used on the associated content section
- * to point back to the mark. @Since: 2.36.
- * @ATSPI_ROLE_SUGGESTION: A container for content that is called out as a proposed
- * change from the current version of the document, such as by a reviewer of the
- * content. This role should include either %ATSPI_ROLE_CONTENT_DELETION and/or
- * %ATSPI_ROLE_CONTENT_INSERTION children, in any order, to indicate what the
- * actual change is. @Since: 2.36
- *  @ATSPI_ROLE_LAST_DEFINED: Not a valid role, used for finding end of
- *  enumeration.
- *
- * Enumeration used by interface #AtspiAccessible to specify the role
- * of an #AtspiAccessible object.
- *
- */
-typedef enum {
+  /**
+   * AtspiRole:
+   * @ATSPI_ROLE_INVALID: A role indicating an error condition, such as
+   * uninitialized Role data.
+   * @ATSPI_ROLE_ACCELERATOR_LABEL: Object is a label indicating the keyboard
+   * accelerators for the parent.
+   * @ATSPI_ROLE_ALERT: Object is used to alert the user about something.
+   * @ATSPI_ROLE_ANIMATION: Object contains a dynamic or moving image of some
+   * kind.
+   * @ATSPI_ROLE_ARROW: Object is a 2d directional indicator.
+   * @ATSPI_ROLE_CALENDAR: Object contains one or more dates, usually arranged
+   * into a 2d list.
+   * @ATSPI_ROLE_CANVAS: Object that can be drawn into and is used to trap
+   * events.
+   * @ATSPI_ROLE_CHECK_BOX: A choice that can be checked or unchecked and
+   * provides a separate       indicator for the current state.
+   * @ATSPI_ROLE_CHECK_MENU_ITEM: A menu item that behaves like a check box. See
+   * @ATSPI_ROLE_CHECK_BOX.
+   * @ATSPI_ROLE_COLOR_CHOOSER: A specialized dialog that lets the user choose a
+   * color.
+   * @ATSPI_ROLE_COLUMN_HEADER: The header for a column of data.
+   * @ATSPI_ROLE_COMBO_BOX: A list of choices the user can select from.
+   * @ATSPI_ROLE_DATE_EDITOR: An object which allows entry of a date.
+   * @ATSPI_ROLE_DESKTOP_ICON: An inconifed internal frame within a DESKTOP_FRAME.
+   * @ATSPI_ROLE_DESKTOP_FRAME: A pane that supports internal frames and
+   * iconified versions of those internal frames.
+   * @ATSPI_ROLE_DIAL: An object that allows a value to be changed via rotating a
+   * visual element, or which displays a value via such a rotating element.
+   * @ATSPI_ROLE_DIALOG: A top level window with title bar and a border.
+   * @ATSPI_ROLE_DIRECTORY_PANE: A pane that allows the user to navigate through
+   * and select the contents of a directory.
+   * @ATSPI_ROLE_DRAWING_AREA: An object used for drawing custom user interface
+   * elements.
+   * @ATSPI_ROLE_FILE_CHOOSER: A specialized dialog that displays the files in
+   * the directory and lets the user select a file, browse a different
+   * directory, or specify a filename.
+   * @ATSPI_ROLE_FILLER: A object that fills up space in a user interface.
+   * @ATSPI_ROLE_FOCUS_TRAVERSABLE: Don't use, reserved for future use.
+   * @ATSPI_ROLE_FONT_CHOOSER: Allows selection of a display font.
+   * @ATSPI_ROLE_FRAME: A top level window with a title bar, border, menubar,
+   * etc.
+   * @ATSPI_ROLE_GLASS_PANE: A pane that is guaranteed to be painted on top of
+   * all panes beneath it.
+   * @ATSPI_ROLE_HTML_CONTAINER: A document container for HTML, whose children
+   * represent the document content.
+   * @ATSPI_ROLE_ICON: A small fixed size picture, typically used to decorate
+   * components.
+   * @ATSPI_ROLE_IMAGE: An image, typically static.
+   * @ATSPI_ROLE_INTERNAL_FRAME: A frame-like object that is clipped by a desktop
+   * pane.
+   * @ATSPI_ROLE_LABEL: An object used to present an icon or short string in an
+   * interface.
+   * @ATSPI_ROLE_LAYERED_PANE: A specialized pane that allows its children to be
+   * drawn in layers, providing a form of stacking order.
+   * @ATSPI_ROLE_LIST: An object that presents a list of objects to the user and
+   * allows the user to select one or more of them.
+   * @ATSPI_ROLE_LIST_ITEM: An object that represents an element of a list.
+   * @ATSPI_ROLE_MENU: An object usually found inside a menu bar that contains a
+   * list of actions the user can choose from.
+   * @ATSPI_ROLE_MENU_BAR: An object usually drawn at the top of the primary
+   * dialog box of an application that contains a list of menus the user can
+   * choose from.
+   * @ATSPI_ROLE_MENU_ITEM: An object usually contained in a menu that presents
+   * an action the user can choose.
+   * @ATSPI_ROLE_OPTION_PANE: A specialized pane whose primary use is inside a
+   * dialog.
+   * @ATSPI_ROLE_PAGE_TAB: An object that is a child of a page tab list.
+   * @ATSPI_ROLE_PAGE_TAB_LIST: An object that presents a series of panels (or
+   * page tabs), one at a time,through some mechanism provided by the
+   * object.
+   * @ATSPI_ROLE_PANEL: A generic container that is often used to group objects.
+   * @ATSPI_ROLE_PASSWORD_TEXT: A text object uses for passwords, or other places
+   * where the text content is not shown visibly to the user.
+   * @ATSPI_ROLE_POPUP_MENU: A temporary window that is usually used to offer the
+   * user a list of choices, and then hides when the user selects one of those
+   * choices.
+   * @ATSPI_ROLE_PROGRESS_BAR: An object used to indicate how much of a task has
+   * been completed.
+   * @ATSPI_ROLE_PUSH_BUTTON: An object the user can manipulate to tell the
+   * application to do something.
+   * @ATSPI_ROLE_RADIO_BUTTON: A specialized check box that will cause other
+   * radio buttons in the same group to become unchecked when this one is
+   * checked.
+   * @ATSPI_ROLE_RADIO_MENU_ITEM: Object is both a menu item and a "radio button"
+   * . See @ATSPI_ROLE_RADIO_BUTTON.
+   * @ATSPI_ROLE_ROOT_PANE: A specialized pane that has a glass pane and a
+   * layered pane as its children.
+   * @ATSPI_ROLE_ROW_HEADER: The header for a row of data.
+   * @ATSPI_ROLE_SCROLL_BAR: An object usually used to allow a user to
+   * incrementally view a large amount of data by moving the bounds of a
+   * viewport along a one-dimensional axis.
+   * @ATSPI_ROLE_SCROLL_PANE: An object that allows a user to incrementally view
+   * a large amount of information. @ATSPI_ROLE_SCROLL_PANE objects are usually
+   * accompanied by @ATSPI_ROLE_SCROLL_BAR controllers, on which the
+   * @ATSPI_RELATION_CONTROLLER_FOR and @ATSPI_RELATION_CONTROLLED_BY
+   * reciprocal relations are set. See  #atspi_get_relation_set.
+   * @ATSPI_ROLE_SEPARATOR: An object usually contained in a menu to provide a
+   * visible and logical separation of the contents in a menu.
+   * @ATSPI_ROLE_SLIDER: An object that allows the user to select from a bounded
+   * range.  Unlike @ATSPI_ROLE_SCROLL_BAR, @ATSPI_ROLE_SLIDER objects need not control
+   * 'viewport'-like objects.
+   * @ATSPI_ROLE_SPIN_BUTTON: An object which allows one of a set of choices to
+   * be selected, and which displays the current choice.
+   * @ATSPI_ROLE_SPLIT_PANE: A specialized panel that presents two other panels
+   * at the same time.
+   * @ATSPI_ROLE_STATUS_BAR: Object displays non-quantitative status information
+   * (c.f. @ATSPI_ROLE_PROGRESS_BAR)
+   * @ATSPI_ROLE_TABLE: An object used to repesent information in terms of rows
+   * and columns.
+   * @ATSPI_ROLE_TABLE_CELL: A 'cell' or discrete child within a Table. Note:
+   * Table cells need not have @ATSPI_ROLE_TABLE_CELL, other
+   * #AtspiRoleType values are valid as well.
+   * @ATSPI_ROLE_TABLE_COLUMN_HEADER: An object which labels a particular column
+   * in an #AtspiTable.
+   * @ATSPI_ROLE_TABLE_ROW_HEADER: An object which labels a particular row in a
+   * #AtspiTable. #AtspiTable rows and columns may also be labelled via the
+   * @ATSPI_RELATION_LABEL_FOR/@ATSPI_RELATION_LABELLED_BY relationships.
+   * See #atspi_get_relation_set.
+   * @ATSPI_ROLE_TEAROFF_MENU_ITEM: Object allows menu to be removed from menubar
+   * and shown in its own window.
+   * @ATSPI_ROLE_TERMINAL: An object that emulates a terminal.
+   * @ATSPI_ROLE_TEXT: An interactive widget that supports multiple lines of text
+   * and optionally accepts user input, but whose purpose is not to solicit user
+   * input. Thus @ATSPI_ROLE_TEXT is appropriate for the text view in a plain text
+   * editor but inappropriate for an input field in a dialog box or web form. For
+   * widgets whose purpose is to solicit input from the user, see @ATSPI_ROLE_ENTRY
+   * and @ATSPI_ROLE_PASSWORD_TEXT. For generic objects which display a brief amount
+   * of textual information, see @ATSPI_ROLE_STATIC.
+   * @ATSPI_ROLE_TOGGLE_BUTTON: A specialized push button that can be checked or
+   * unchecked, but does not procide a separate indicator for the current
+   * state.
+   * @ATSPI_ROLE_TOOL_BAR: A bar or palette usually composed of push buttons or
+   * toggle buttons.
+   * @ATSPI_ROLE_TOOL_TIP: An object that provides information about another
+   * object.
+   * @ATSPI_ROLE_TREE: An object used to repsent hierarchical information to the
+   * user.
+   * @ATSPI_ROLE_TREE_TABLE: An object that presents both tabular and
+   * hierarchical info to the user.
+   * @ATSPI_ROLE_UNKNOWN: The object contains some #AtspiAccessible information,
+   * but its role is not known.
+   * @ATSPI_ROLE_VIEWPORT: An object usually used in a scroll pane, or to
+   * otherwise clip a larger object or content renderer to a specific
+   * onscreen viewport.
+   * @ATSPI_ROLE_WINDOW: A top level window with no title or border.
+   * @ATSPI_ROLE_EXTENDED: means that the role for this item is known, but not
+   * included in the core enumeration. Deprecated since 2.24.
+   * @ATSPI_ROLE_HEADER: An object that serves as a document header.
+   * @ATSPI_ROLE_FOOTER: An object that serves as a document footer.
+   * @ATSPI_ROLE_PARAGRAPH: An object which is contains a single paragraph of
+   * text content. See also @ATSPI_ROLE_TEXT.
+   * @ATSPI_ROLE_RULER: An object which describes margins and tab stops, etc.
+   *    for text objects which it controls (should have
+   * @ATSPI_RELATION_CONTROLLER_FOR relation to such).
+   * @ATSPI_ROLE_APPLICATION: An object corresponding to the toplevel accessible
+   * of an application, which may contain @ATSPI_ROLE_FRAME objects or other
+   * accessible objects. Children of objects with the #ATSPI_ROLE_DESKTOP_FRAME role are generally
+   * @ATSPI_ROLE_APPLICATION objects.
+   * @ATSPI_ROLE_AUTOCOMPLETE: The object is a dialog or list containing items
+   * for insertion into an entry widget, for instance a list of words for
+   * completion of a text entry.
+   * @ATSPI_ROLE_EDITBAR: The object is an editable text object in a toolbar.
+   * @ATSPI_ROLE_EMBEDDED: The object is an embedded component container.  This
+   * role is a "grouping" hint that the contained objects share a context
+   * which is different from the container in which this accessible is
+   * embedded. In particular, it is used for some kinds of document embedding,
+   * and for embedding of out-of-process component, "panel applets", etc.
+   * @ATSPI_ROLE_ENTRY: The object is a component whose textual content may be
+   * entered or modified by the user, provided @ATSPI_STATE_EDITABLE is present.
+   * A readonly @ATSPI_ROLE_ENTRY object (i.e. where @ATSPI_STATE_EDITABLE is
+   * not present) implies a read-only 'text field' in a form, as opposed to a
+   * title, label, or caption.
+   * @ATSPI_ROLE_CHART: The object is a graphical depiction of quantitative data.
+   * It may contain multiple subelements whose attributes and/or description
+   * may be queried to obtain both the  quantitative data and information about
+   * how the data is being presented. The @ATSPI_LABELLED_BY relation is
+   * particularly important in interpreting objects of this type, as is the
+   * accessible description property. See @ATSPI_ROLE_CAPTION.
+   * @ATSPI_ROLE_CAPTION: The object contains descriptive information, usually
+   * textual, about another user interface element such as a table, chart, or
+   * image.
+   * @ATSPI_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which
+   * contains a view of document content. #AtspiDocument frames may occur within
+   * another #AtspiDocument instance, in which case the second  document may be
+   * said to be embedded in the containing instance.  HTML frames are often
+   * ATSPI_ROLE_DOCUMENT_FRAME:  Either this object, or a singleton descendant,
+   * should implement the #AtspiDocument interface.
+   * @ATSPI_ROLE_HEADING: The object serves as a heading for content which
+   * follows it in a document. The 'heading level' of the heading, if
+   * availabe,  may be obtained by       querying the object's attributes.
+   * @ATSPI_ROLE_PAGE: The object is a containing instance which encapsulates a
+   * page of information. @ATSPI_ROLE_PAGE is used in documents and content which
+   * support a paginated navigation model.
+   * @ATSPI_ROLE_SECTION: The object is a containing instance of document content
+   * which constitutes a particular 'logical' section of the document.  The
+   * type of content within a section, and the nature of the section division
+   * itself, may be obtained by querying the object's attributes.  Sections
+   * may be nested.
+   * @ATSPI_ROLE_REDUNDANT_OBJECT: The object is redundant with another object in
+   * the hierarchy, and is exposed for purely technical reasons.  Objects of
+   * this role should be ignored by clients, if they are encountered at all.
+   * @ATSPI_ROLE_FORM: The object is a containing instance of document content
+   * which has within it components with which the user can interact in order
+   * to input information; i.e. the object is a container for pushbuttons,
+   * comboboxes, text input fields, and other 'GUI' components. @ATSPI_ROLE_FORM
+   * should not, in general, be used for toplevel GUI containers or dialogs,
+   * but should be reserved for 'GUI' containers which occur within document
+   * content, for instance within Web documents, presentations, or text
+   * documents.  Unlike other GUI containers and dialogs which occur inside
+   * application instances, @ATSPI_ROLE_FORM containers' components are
+   * associated with the current document, rather than the current foreground
+   * application or viewer instance.
+   * @ATSPI_ROLE_LINK: The object is a hypertext anchor, i.e. a "link" in a
+   * hypertext document.  Such objects are distinct from 'inline'       content
+   * which may also use the #AtspiHypertext/#AtspiHyperlink interfacesto indicate
+   * the range/location within a text object where an inline or embedded object
+   * lies.
+   * @ATSPI_ROLE_INPUT_METHOD_WINDOW: The object is a window or similar viewport
+   * which is used to allow composition or input of a 'complex character',
+   * in other words it is an "input method window".
+   * @ATSPI_ROLE_TABLE_ROW: A row in a table.
+   * @ATSPI_ROLE_TREE_ITEM: An object that represents an element of a tree.
+   * @ATSPI_ROLE_DOCUMENT_SPREADSHEET: A document frame which contains a
+   * spreadsheet.
+   * @ATSPI_ROLE_DOCUMENT_PRESENTATION: A document frame which contains a
+   * presentation or slide content.
+   * @ATSPI_ROLE_DOCUMENT_TEXT: A document frame which contains textual content,
+   * such as found in a word processing
+   * application.
+   * @ATSPI_ROLE_DOCUMENT_WEB: A document frame which contains HTML or other
+   * markup suitable for display in a web browser.
+   * @ATSPI_ROLE_DOCUMENT_EMAIL: A document frame which contains email content
+   * to be displayed or composed either in plain text or
+   * HTML.
+   * @ATSPI_ROLE_COMMENT: An object found within a document and designed to
+   * present a comment, note, or other annotation. In some cases, this object
+   * might not be visible until activated.
+   * @ATSPI_ROLE_LIST_BOX: A non-collapsible list of choices the user can
+   * select from.
+   * @ATSPI_ROLE_GROUPING: A group of related widgets. This group typically has
+   * a label.
+   * @ATSPI_ROLE_IMAGE_MAP: An image map object. Usually a graphic with multiple
+   * hotspots, where each hotspot can be activated resulting in the loading of
+   * another document or section of a document.
+   * @ATSPI_ROLE_NOTIFICATION: A transitory object designed to present a
+   * message to the user, typically at the desktop level rather than inside a
+   * particular application.
+   * @ATSPI_ROLE_INFO_BAR: An object designed to present a message to the user
+   * within an existing window.
+   * @ATSPI_ROLE_LEVEL_BAR: A bar that serves as a level indicator to, for
+   * instance, show the strength of a password or the state of a battery. @Since: 2.8
+   * @ATSPI_ROLE_TITLE_BAR: A bar that serves as the title of a window or a
+   *  dialog. @Since: 2.12
+   * @ATSPI_ROLE_BLOCK_QUOTE: An object which contains a text section
+   *  that is quoted from another source.  @Since: 2.12
+   * @ATSPI_ROLE_AUDIO: An object which represents an audio
+   *  element. @Since: 2.12
+   * @ATSPI_ROLE_VIDEO: An object which represents a video
+   *  element. @Since: 2.12
+   * @ATSPI_ROLE_DEFINITION: A definition of a term or concept. @Since: 2.12
+   * @ATSPI_ROLE_ARTICLE: A section of a page that consists of a
+   *  composition that forms an independent part of a document, page, or
+   *  site. Examples: A blog entry, a news story, a forum post. @Since:
+   *  2.12
+   * @ATSPI_ROLE_LANDMARK: A region of a web page intended as a
+   *  navigational landmark. This is designed to allow Assistive
+   *  Technologies to provide quick navigation among key regions within a
+   *  document. @Since: 2.12
+   * @ATSPI_ROLE_LOG: A text widget or container holding log content, such
+   *  as chat history and error logs. In this role there is a
+   *  relationship between the arrival of new items in the log and the
+   *  reading order. The log contains a meaningful sequence and new
+   *  information is added only to the end of the log, not at arbitrary
+   *  points. @Since: 2.12
+   * @ATSPI_ROLE_MARQUEE: A container where non-essential information
+   *  changes frequently. Common usages of marquee include stock tickers
+   *  and ad banners. The primary difference between a marquee and a log
+   *  is that logs usually have a meaningful order or sequence of
+   *  important content changes. @Since: 2.12
+   * @ATSPI_ROLE_MATH: A text widget or container that holds a mathematical
+   *  expression. @Since: 2.12
+   * @ATSPI_ROLE_RATING: A widget whose purpose is to display a rating,
+   *  such as the number of stars associated with a song in a media
+   *  player. Objects of this role should also implement
+   *  AtspiValue. @Since: 2.12
+   * @ATSPI_ROLE_TIMER: An object containing a numerical counter which
+   *  indicates an amount of elapsed time from a start point, or the time
+   *  remaining until an end point. @Since: 2.12
+   * @ATSPI_ROLE_STATIC: A generic non-container object whose purpose is to display
+   *  a brief amount of information to the user and whose role is known by the
+   *  implementor but lacks semantic value for the user. Examples in which
+   *  @ATSPI_ROLE_STATIC is appropriate include the message displayed in a message
+   *  box and an image used as an alternative means to display text.
+   *  @ATSPI_ROLE_STATIC should not be applied to widgets which are traditionally
+   *  interactive, objects which display a significant amount of content, or any
+   *  object which has an accessible relation pointing to another object. The
+   *  displayed information, as a general rule, should be exposed through the
+   *  accessible name of the object. For labels which describe another widget, see
+   *  @ATSPI_ROLE_LABEL. For text views, see @ATSPI_ROLE_TEXT. For generic
+   *  containers, see @ATSPI_ROLE_PANEL. For objects whose role is not known by the
+   *  implementor, see @ATSPI_ROLE_UNKNOWN. @Since: 2.16.
+   * @ATSPI_ROLE_MATH_FRACTION: An object that represents a mathematical fraction. @Since: 2.16.
+   * @ATSPI_ROLE_MATH_ROOT: An object that represents a mathematical expression
+   *  displayed with a radical. @Since: 2.16.
+   * @ATSPI_ROLE_SUBSCRIPT: An object that contains text that is displayed as a
+   *  subscript. @Since: 2.16.
+   * @ATSPI_ROLE_SUPERSCRIPT: An object that contains text that is displayed as a
+   *  superscript. @Since: 2.16.
+   * @ATSPI_ROLE_DESCRIPTION_LIST: An object that represents a list of term-value
+   *  groups. A term-value group represents an individual description and consist
+   *  of one or more names (@ATSPI_ROLE_DESCRIPTION_TERM) followed by one or more
+   *  values (@ATSPI_ROLE_DESCRIPTION_VALUE). For each list, there should not be
+   *  more than one group with the same term name. @Since: 2.26.
+   * @ATSPI_ROLE_DESCRIPTION_TERM: An object that represents a term or phrase
+   *  with a corresponding definition. @Since: 2.26.
+   * @ATSPI_ROLE_DESCRIPTION_VALUE: An object that represents the description,
+   *  definition, or value of a term. @Since: 2.26.
+   * @ATSPI_ROLE_FOOTNOTE: An object that contains the text of a footnote. @Since: 2.26.
+   * @ATSPI_ROLE_CONTENT_DELETION: Content previously deleted or proposed to be
+   * deleted, e.g. in revision history or a content view providing suggestions
+   * from reviewers. @Since: 2.34.
+   * @ATSPI_ROLE_CONTENT_INSERTION: Content previously inserted or proposed to be
+   * inserted, e.g. in revision history or a content view providing suggestions
+   * from reviewers. @Since: 2.34.
+   * @ATSPI_ROLE_MARK: A run of content that is marked or highlighted, such as for
+   * reference purposes, or to call it out as having a special purpose. If the
+   * marked content has an associated section in the document elaborating on the
+   * reason for the mark, then %ATSPI_RELATION_DETAILS should be used on the mark
+   * to point to that associated section. In addition, the reciprocal relation
+   * %ATSPI_RELATION_DETAILS_FOR should be used on the associated content section
+   * to point back to the mark. @Since: 2.36.
+   * @ATSPI_ROLE_SUGGESTION: A container for content that is called out as a proposed
+   * change from the current version of the document, such as by a reviewer of the
+   * content. An object with this role should include children with %ATSPI_ROLE_CONTENT_DELETION and/or
+   * %ATSPI_ROLE_CONTENT_INSERTION, in any order, to indicate what the
+   * actual change is. @Since: 2.36
+   * @ATSPI_ROLE_PUSH_BUTTON_MENU: A specialized push button to open a menu. @Since 2.46
+   * @ATSPI_ROLE_LAST_DEFINED: Not a valid role, used for finding end of
+   * enumeration.
+   *
+   * Enumeration used by interface #AtspiAccessible to specify the role
+   * of an #AtspiAccessible object.
+   *
+   */
+  typedef enum
+  {
     ATSPI_ROLE_INVALID,
     ATSPI_ROLE_ACCELERATOR_LABEL,
     ATSPI_ROLE_ALERT,
@@ -1389,68 +1412,88 @@ typedef enum {
     ATSPI_ROLE_CONTENT_INSERTION,
     ATSPI_ROLE_MARK,
     ATSPI_ROLE_SUGGESTION,
+    ATSPI_ROLE_PUSH_BUTTON_MENU,
     ATSPI_ROLE_LAST_DEFINED,
-} AtspiRole;
+  } AtspiRole;
 
 /**
  * ATSPI_ROLE_COUNT:
  *
  * One higher than the highest valid value of #AtspiRole.
  */
-#define ATSPI_ROLE_COUNT (129+1)
+#define ATSPI_ROLE_COUNT (130 + 1)
 
-typedef enum
-{
-     ATSPI_CACHE_NONE     = 0,
-     ATSPI_CACHE_PARENT   = 1 << 0,
-  ATSPI_CACHE_CHILDREN    = 1 << 1,
-  ATSPI_CACHE_NAME        = 1 << 2,
-  ATSPI_CACHE_DESCRIPTION = 1 << 3,
-  ATSPI_CACHE_STATES      = 1 << 4,
-  ATSPI_CACHE_ROLE        = 1 << 5,
-  ATSPI_CACHE_INTERFACES  = 1 << 6,
-  ATSPI_CACHE_ATTRIBUTES = 1 << 7,
-  ATSPI_CACHE_ALL         = 0x3fffffff,
-  ATSPI_CACHE_DEFAULT = ATSPI_CACHE_PARENT | ATSPI_CACHE_CHILDREN | ATSPI_CACHE_NAME | ATSPI_CACHE_DESCRIPTION | ATSPI_CACHE_STATES | ATSPI_CACHE_ROLE | ATSPI_CACHE_INTERFACES,
-  ATSPI_CACHE_UNDEFINED   = 0x40000000,
-} AtspiCache;
+  typedef enum
+  {
+    ATSPI_CACHE_NONE = 0,
+    ATSPI_CACHE_PARENT = 1 << 0,
+    ATSPI_CACHE_CHILDREN = 1 << 1,
+    ATSPI_CACHE_NAME = 1 << 2,
+    ATSPI_CACHE_DESCRIPTION = 1 << 3,
+    ATSPI_CACHE_STATES = 1 << 4,
+    ATSPI_CACHE_ROLE = 1 << 5,
+    ATSPI_CACHE_INTERFACES = 1 << 6,
+    ATSPI_CACHE_ATTRIBUTES = 1 << 7,
+    ATSPI_CACHE_ALL = 0x3fffffff,
+    ATSPI_CACHE_DEFAULT = ATSPI_CACHE_PARENT | ATSPI_CACHE_CHILDREN | ATSPI_CACHE_NAME | ATSPI_CACHE_DESCRIPTION | ATSPI_CACHE_STATES | ATSPI_CACHE_ROLE | ATSPI_CACHE_INTERFACES,
+    ATSPI_CACHE_UNDEFINED = 0x40000000,
+  } AtspiCache;
 
-/**
- * AtspiScrollType:
- * @ATSPI_SCROLL_TOP_LEFT: Scroll the object to the top left corner of the
- * window.
- * @ATSPI_SCROLL_BOTTOM_RIGHT: Scroll the object to the bottom right corner of
- * the window.
- * @ATSPI_SCROLL_TOP_EDGE: Scroll the object to the top edge of the window.
- * @ATSPI_SCROLL_BOTTOM_EDGE: Scroll the object to the bottom edge of the
- * window.
- * @ATSPI_SCROLL_LEFT_EDGE: Scroll the object to the left edge of the
- * window.
- * @ATSPI_SCROLL_RIGHT_EDGE: Scroll the object to the right edge of the
- * window.
- * @ATSPI_SCROLL_ANYWHERE: Scroll the object to application-dependent position
- * on the window.
- *
- * Enumeration used by interface #AtspiAccessible to specify where an
- * #AtspiAccessible object should be placed on the screen when using scroll_to.
- *
- */
-typedef enum {
-  ATSPI_SCROLL_TOP_LEFT,
-  ATSPI_SCROLL_BOTTOM_RIGHT,
-  ATSPI_SCROLL_TOP_EDGE,
-  ATSPI_SCROLL_BOTTOM_EDGE,
-  ATSPI_SCROLL_LEFT_EDGE,
-  ATSPI_SCROLL_RIGHT_EDGE,
-  ATSPI_SCROLL_ANYWHERE
-} AtspiScrollType;
+  /**
+   * AtspiScrollType:
+   * @ATSPI_SCROLL_TOP_LEFT: Scroll the object to the top left corner of the
+   * window.
+   * @ATSPI_SCROLL_BOTTOM_RIGHT: Scroll the object to the bottom right corner of
+   * the window.
+   * @ATSPI_SCROLL_TOP_EDGE: Scroll the object to the top edge of the window.
+   * @ATSPI_SCROLL_BOTTOM_EDGE: Scroll the object to the bottom edge of the
+   * window.
+   * @ATSPI_SCROLL_LEFT_EDGE: Scroll the object to the left edge of the
+   * window.
+   * @ATSPI_SCROLL_RIGHT_EDGE: Scroll the object to the right edge of the
+   * window.
+   * @ATSPI_SCROLL_ANYWHERE: Scroll the object to application-dependent position
+   * on the window.
+   *
+   * Enumeration used by interface #AtspiAccessible to specify where an
+   * #AtspiAccessible object should be placed on the screen when using scroll_to.
+   *
+   */
+  typedef enum
+  {
+    ATSPI_SCROLL_TOP_LEFT,
+    ATSPI_SCROLL_BOTTOM_RIGHT,
+    ATSPI_SCROLL_TOP_EDGE,
+    ATSPI_SCROLL_BOTTOM_EDGE,
+    ATSPI_SCROLL_LEFT_EDGE,
+    ATSPI_SCROLL_RIGHT_EDGE,
+    ATSPI_SCROLL_ANYWHERE
+  } AtspiScrollType;
 
 /**
  * ATSPI_SCROLLTYPE_COUNT:
  *
  * One higher than the highest valid value of #AtspiScrollType.
  */
-#define ATSPI_SCROLLTYPE_COUNT (6+1)
+#define ATSPI_SCROLLTYPE_COUNT (6 + 1)
+
+  /**
+   * AtspiLive:
+   * @ATSPI_LIVE_NONE: No live region.
+   * @ATSPI_LIVE_POLITE: This live region should be considered polite.
+   * @ATSPI_LIVE_ASSERTIVE: This live region should be considered assertive.
+   *
+   * Enumeration used to indicate a type of live region and how assertive it
+   * should be in terms of speaking notifications. Currently, this is only used
+   * for "announcement" events, but it may be used for additional purposes
+   * in the future.
+   */
+  typedef enum
+  {
+    ATSPI_LIVE_NONE,
+    ATSPI_LIVE_POLITE,
+    ATSPI_LIVE_ASSERTIVE
+  } AtspiLive;
 
 #define ATSPI_DBUS_NAME_REGISTRY "org.a11y.atspi.Registry"
 #define ATSPI_DBUS_PATH_REGISTRY "/org/a11y/atspi/registry"
@@ -1490,4 +1533,4 @@ typedef enum {
 #ifdef __cplusplus
 }
 #endif
-#endif /* _ATSPI_CONSTANTS_H_ */
+#endif /* _ATSPI_CONSTANTS_H_ */
index bfb63d4..95d7c7a 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include "atspi-private.h"
 #include "atspi-device-legacy.h"
+#include "atspi-private.h"
 
 #ifdef HAVE_X11
+#include <X11/XKBlib.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/extensions/XInput2.h>
-#include <X11/XKBlib.h>
 #endif
 
 typedef struct
@@ -52,10 +52,7 @@ struct _AtspiDeviceLegacyPrivate
 
 GObjectClass *device_legacy_parent_class;
 
-G_DEFINE_TYPE_WITH_CODE (AtspiDeviceLegacy, atspi_device_legacy,
-                         ATSPI_TYPE_DEVICE,
-                         G_ADD_PRIVATE (AtspiDeviceLegacy))
-
+G_DEFINE_TYPE_WITH_CODE (AtspiDeviceLegacy, atspi_device_legacy, ATSPI_TYPE_DEVICE, G_ADD_PRIVATE (AtspiDeviceLegacy))
 
 static guint
 find_virtual_mapping (AtspiDeviceLegacy *legacy_device, gint keycode)
@@ -64,11 +61,11 @@ find_virtual_mapping (AtspiDeviceLegacy *legacy_device, gint keycode)
   GSList *l;
 
   for (l = priv->modifiers; l; l = l->next)
-  {
-    AtspiLegacyKeyModifier *entry = l->data;
-    if (entry->keycode == keycode)
-      return entry->modifier;
-  }
+    {
+      AtspiLegacyKeyModifier *entry = l->data;
+      if (entry->keycode == keycode)
+        return entry->modifier;
+    }
 
   return 0;
 }
@@ -85,29 +82,30 @@ set_virtual_modifier (AtspiDeviceLegacy *legacy_device, gint keycode, gboolean e
     priv->virtual_mods_enabled &= ~modifier;
 }
 
-
-gboolean
+static gboolean
 key_cb (AtspiDeviceEvent *event, void *user_data)
 {
   AtspiDeviceLegacy *legacy_device = ATSPI_DEVICE_LEGACY (user_data);
   AtspiDeviceLegacyPrivate *priv = atspi_device_legacy_get_instance_private (legacy_device);
   gboolean ret = priv->keyboard_grabbed;
   guint modifiers;
-  
+
+  g_object_ref (legacy_device);
   set_virtual_modifier (legacy_device, event->hw_code,
-                        event->type == (AtspiEventType)ATSPI_KEY_PRESS);
+                        event->type == (AtspiEventType) ATSPI_KEY_PRESS);
 
   modifiers = event->modifiers | priv->virtual_mods_enabled;
   if (modifiers & (1 << ATSPI_MODIFIER_NUMLOCK))
     modifiers &= ~priv->numlock_physical_mask;
 
   ret |= atspi_device_notify_key (ATSPI_DEVICE (legacy_device),
-                                  event->type == (AtspiEventType)ATSPI_KEY_PRESS,
+                                  event->type == (AtspiEventType) ATSPI_KEY_PRESS,
                                   event->hw_code, event->id,
                                   modifiers,
                                   event->event_string);
 
   g_boxed_free (ATSPI_TYPE_DEVICE_EVENT, event);
+  g_object_unref (legacy_device);
   return ret;
 }
 
@@ -137,11 +135,11 @@ check_virtual_modifier (AtspiDeviceLegacy *legacy_device, guint modifier)
     return TRUE;
 
   for (l = priv->modifiers; l; l = l->next)
-  {
-    AtspiLegacyKeyModifier *entry = l->data;
-    if (entry->modifier == modifier)
-      return TRUE;
-  }
+    {
+      AtspiLegacyKeyModifier *entry = l->data;
+      if (entry->modifier == modifier)
+        return TRUE;
+    }
 
   return FALSE;
 }
@@ -152,11 +150,11 @@ get_unused_virtual_modifier (AtspiDeviceLegacy *legacy_device)
   guint ret = 0x1000;
 
   while (ret < 0x10000)
-  {
-    if (!check_virtual_modifier (legacy_device, ret))
-      return ret;
-    ret <<= 1;
-  }
+    {
+      if (!check_virtual_modifier (legacy_device, ret))
+        return ret;
+      ret <<= 1;
+    }
 
   return 0;
 }
@@ -174,11 +172,11 @@ atspi_device_legacy_map_modifier (AtspiDevice *device, gint keycode)
   desc = XkbGetMap (priv->display, XkbModifierMapMask, XkbUseCoreKbd);
 
   if (keycode < desc->min_key_code || keycode >= desc->max_key_code)
-  {
-    XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
-    g_warning ("Passed invalid keycode %d", keycode);
-    return 0;
-  }
+    {
+      XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
+      g_warning ("Passed invalid keycode %d", keycode);
+      return 0;
+    }
 
   ret = desc->map->modmap[keycode];
   XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
@@ -208,15 +206,15 @@ atspi_device_legacy_unmap_modifier (AtspiDevice *device, gint keycode)
   GSList *l;
 
   for (l = priv->modifiers; l; l = l->next)
-  {
-    AtspiLegacyKeyModifier *entry = l->data;
-    if (entry->keycode == keycode)
     {
-      priv->modifiers = g_slist_remove (priv->modifiers, entry);
-      g_free (entry);
-      return;
+      AtspiLegacyKeyModifier *entry = l->data;
+      if (entry->keycode == keycode)
+        {
+          priv->modifiers = g_slist_remove (priv->modifiers, entry);
+          g_free (entry);
+          return;
+        }
     }
-  }
 }
 
 static guint
@@ -231,11 +229,11 @@ atspi_device_legacy_get_modifier (AtspiDevice *device, gint keycode)
   desc = XkbGetMap (priv->display, XkbModifierMapMask, XkbUseCoreKbd);
 
   if (keycode < desc->min_key_code || keycode >= desc->max_key_code)
-  {
-    XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
-    g_warning ("Passed invalid keycode %d", keycode);
-    return 0;
-  }
+    {
+      XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
+      g_warning ("Passed invalid keycode %d", keycode);
+      return 0;
+    }
 
   ret = desc->map->modmap[keycode];
   XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
@@ -266,6 +264,34 @@ atspi_device_legacy_ungrab_keyboard (AtspiDevice *device)
 }
 
 static void
+atspi_device_legacy_generate_mouse_event (AtspiDevice *device, AtspiAccessible *obj, gint x, gint y, const gchar *name, GError **error)
+{
+  AtspiPoint *p;
+
+  p = atspi_component_get_position (ATSPI_COMPONENT (obj), ATSPI_COORD_TYPE_SCREEN, error);
+  if (p->y == -1 && atspi_accessible_get_role (obj, NULL) == ATSPI_ROLE_APPLICATION)
+    {
+      g_clear_error (error);
+      g_free (p);
+      AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+      if (child)
+        {
+          p = atspi_component_get_position (ATSPI_COMPONENT (child), ATSPI_COORD_TYPE_SCREEN, error);
+          g_object_unref (child);
+        }
+    }
+
+  if (p->y == -1 || p->x == -1)
+    return;
+
+  x += p->x;
+  y += p->y;
+  g_free (p);
+
+  atspi_generate_mouse_event (x, y, name, error);
+}
+
+static void
 atspi_device_legacy_init (AtspiDeviceLegacy *device)
 {
   AtspiDeviceLegacyPrivate *priv = atspi_device_legacy_get_instance_private (device);
@@ -276,13 +302,12 @@ atspi_device_legacy_init (AtspiDeviceLegacy *device)
     atspi_register_keystroke_listener (priv->listener, NULL, i, 3, ATSPI_KEYLISTENER_SYNCHRONOUS | ATSPI_KEYLISTENER_CANCONSUME, NULL);
 
 #ifdef HAVE_X11
-  priv->display=XOpenDisplay("");
+  priv->display = XOpenDisplay ("");
   if (priv->display)
-    priv->window = DefaultRootWindow(priv->display);
+    priv->window = DefaultRootWindow (priv->display);
   priv->numlock_physical_mask = XkbKeysymToModifiers (priv->display,
-                                                     XK_Num_Lock);
+                                                      XK_Num_Lock);
 #endif
-
 }
 
 static void
@@ -295,7 +320,6 @@ atspi_device_legacy_finalize (GObject *object)
   device_legacy_parent_class->finalize (object);
 }
 
-
 static void
 atspi_device_legacy_class_init (AtspiDeviceLegacyClass *klass)
 {
@@ -310,6 +334,7 @@ atspi_device_legacy_class_init (AtspiDeviceLegacyClass *klass)
   device_class->get_locked_modifiers = atspi_device_legacy_get_locked_modifiers;
   device_class->grab_keyboard = atspi_device_legacy_grab_keyboard;
   device_class->ungrab_keyboard = atspi_device_legacy_ungrab_keyboard;
+  device_class->generate_mouse_event = atspi_device_legacy_generate_mouse_event;
 }
 
 /**
index 50f777e..4dadaf9 100644 (file)
@@ -3,7 +3,7 @@
  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
  *
  * Copyright 2020 SUSE LLC.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include "glib-object.h"
 
-#include "atspi-types.h"
 #include "atspi-device.h"
+#include "atspi-types.h"
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_DEVICE_LEGACY                        (atspi_device_legacy_get_type ())
-#define ATSPI_DEVICE_LEGACY(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_LEGACY, AtspiDeviceLegacy))
-#define ATSPI_DEVICE_LEGACY_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_LEGACY, AtspiDeviceLegacyClass))
-#define ATSPI_IS_DEVICE_LEGACY(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_LEGACY))
-#define ATSPI_IS_DEVICE_LEGACY_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_LEGACY))
-#define ATSPI_DEVICE_LEGACY_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_LEGACY, AtspiDeviceLegacyClass))
+#define ATSPI_TYPE_DEVICE_LEGACY (atspi_device_legacy_get_type ())
+#define ATSPI_DEVICE_LEGACY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_LEGACY, AtspiDeviceLegacy))
+#define ATSPI_DEVICE_LEGACY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_LEGACY, AtspiDeviceLegacyClass))
+#define ATSPI_IS_DEVICE_LEGACY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_LEGACY))
+#define ATSPI_IS_DEVICE_LEGACY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_LEGACY))
+#define ATSPI_DEVICE_LEGACY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_LEGACY, AtspiDeviceLegacyClass))
 
 typedef struct _AtspiDeviceLegacy AtspiDeviceLegacy;
 struct _AtspiDeviceLegacy
@@ -56,4 +56,4 @@ AtspiDeviceLegacy *atspi_device_legacy_new ();
 
 G_END_DECLS
 
-#endif /* _ATSPI_DEVICE_LEGACY_H_ */
+#endif /* _ATSPI_DEVICE_LEGACY_H_ */
index d8b533c..32694ce 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-DBusHandlerResult _atspi_dbus_handle_DeviceEvent (DBusConnection *bus, DBusMessage *message, void *data);
+DBusHandlerResult _atspi_dbus_handle_DeviceEvent (DBusConnection *bus, DBusMessage *message);
 
 gchar *_atspi_device_listener_get_path (AtspiDeviceListener *listener);
 
 G_END_DECLS
 
-#endif /* _ATSPI_DEVICE_LISTENER_H_ */
+#endif /* _ATSPI_DEVICE_LISTENER_H_ */
index 9776ebd..d575b07 100644 (file)
 #include "atspi-private.h"
 #include <stdio.h>
 
+/**
+ * AtspiDevicelistener:
+ *
+ * An interface for creating and manipulating
+ * device listeners.
+ *
+ * An interface for creating and manipulating
+ * device listeners with callback functions.
+ */
+
 typedef struct
 {
-  AtspiDeviceListenerCB    callback;
+  AtspiDeviceListenerCB callback;
   gpointer user_data;
   GDestroyNotify callback_destroyed;
 } DeviceEventHandler;
@@ -58,7 +68,7 @@ device_remove_datum (AtspiDeviceEvent *event, void *user_data)
   AtspiDeviceListenerSimpleCB cb = user_data;
   return cb (event);
 }
-  
+
 static void
 device_event_handler_free (DeviceEventHandler *eh)
 {
@@ -78,17 +88,17 @@ static GList *
 event_list_remove_by_cb (GList *list, AtspiDeviceListenerCB callback)
 {
   GList *l, *next;
-       
+
   for (l = list; l; l = next)
     {
       DeviceEventHandler *eh = l->data;
       next = l->next;
 
       if (eh->callback == callback)
-      {
-        list = g_list_delete_link (list, l);
-        device_event_handler_free (eh);
-      }
+        {
+          list = g_list_delete_link (list, l);
+          device_event_handler_free (eh);
+        }
     }
 
   return list;
@@ -107,10 +117,11 @@ id_is_free (guint id)
   GList *l;
 
   for (l = device_listeners; l; l = g_list_next (l))
-  {
-    AtspiDeviceListener *listener = l->data;
-    if (listener->id == id) return FALSE;
-  }
+    {
+      AtspiDeviceListener *listener = l->data;
+      if (listener->id == id)
+        return FALSE;
+    }
   return TRUE;
 }
 
@@ -137,12 +148,12 @@ atspi_device_event_free (AtspiDeviceEvent *event)
   g_free (event);
 }
 
-/* 
+/*
  * Device event handler
  */
 static gboolean
-atspi_device_event_dispatch (AtspiDeviceListener               *listener,
-                  const AtspiDeviceEvent *event)
+atspi_device_event_dispatch (AtspiDeviceListener *listener,
+                             const AtspiDeviceEvent *event)
 {
   GList *l;
   gboolean handled = FALSE;
@@ -154,8 +165,8 @@ atspi_device_event_dispatch (AtspiDeviceListener               *listener,
 
       if ((handled = eh->callback (atspi_device_event_copy (event), eh->user_data)))
         {
-         break;
-       }
+          break;
+        }
     }
 
   return handled;
@@ -166,9 +177,10 @@ atspi_device_listener_init (AtspiDeviceListener *listener)
 {
 
   do
-  {
-    listener->id = listener_id++;
-  } while (!id_is_free (listener->id));
+    {
+      listener->id = listener_id++;
+    }
+  while (!id_is_free (listener->id));
   device_listeners = g_list_append (device_listeners, listener);
 }
 
@@ -184,7 +196,7 @@ atspi_device_listener_finalize (GObject *object)
     {
       device_event_handler_free (l->data);
     }
-  
+
   g_list_free (listener->callbacks);
 
   device_listener_parent_class->finalize (object);
@@ -201,8 +213,7 @@ atspi_device_listener_class_init (AtspiDeviceListenerClass *klass)
   klass->device_event = atspi_device_event_dispatch;
 }
 
-G_DEFINE_TYPE (AtspiDeviceListener, atspi_device_listener,
-                         G_TYPE_OBJECT)
+G_DEFINE_TYPE (AtspiDeviceListener, atspi_device_listener, G_TYPE_OBJECT)
 
 /**
  * atspi_device_listener_new:
@@ -227,7 +238,7 @@ atspi_device_listener_new (AtspiDeviceListenerCB callback,
 
   if (callback)
     atspi_device_listener_add_callback (listener, callback, callback_destroyed,
-                                       user_data);
+                                        user_data);
   return listener;
 }
 
@@ -236,7 +247,7 @@ atspi_device_listener_new (AtspiDeviceListenerCB callback,
  * @callback: (scope notified): an #AtspiDeviceListenerCB callback function,
  *            or NULL.
  * @callback_destroyed: A #GDestroyNotify called when the listener is freed
- * and data associated with the callback should be freed.  It an be NULL.
+ * and data associated with the callback should be freed.  It can be NULL.
  *
  * Creates a new #AtspiDeviceListener with a specified callback function.
  * This method is similar to #atspi_device_listener_new, but callback
@@ -247,7 +258,7 @@ atspi_device_listener_new (AtspiDeviceListenerCB callback,
  **/
 AtspiDeviceListener *
 atspi_device_listener_new_simple (AtspiDeviceListenerSimpleCB callback,
-                           GDestroyNotify callback_destroyed)
+                                  GDestroyNotify callback_destroyed)
 {
   return atspi_device_listener_new (device_remove_datum, callback, callback_destroyed);
 }
@@ -259,16 +270,16 @@ atspi_device_listener_new_simple (AtspiDeviceListenerSimpleCB callback,
  * @callback_destroyed: A #GDestroyNotify called when the listener is freed
  * and data associated with the callback should be freed. It can be NULL.
  * @user_data: (closure): a pointer to data which will be passed to the
- *             callback when invoked. 
+ *             callback when invoked.
  *
  * Adds an in-process callback function to an existing #AtspiDeviceListener.
  *
  **/
 void
-atspi_device_listener_add_callback (AtspiDeviceListener  *listener,
-                            AtspiDeviceListenerCB callback,
-                            GDestroyNotify callback_destroyed,
-                            void                      *user_data)
+atspi_device_listener_add_callback (AtspiDeviceListener *listener,
+                                    AtspiDeviceListenerCB callback,
+                                    GDestroyNotify callback_destroyed,
+                                    void *user_data)
 {
   g_return_if_fail (ATSPI_IS_DEVICE_LISTENER (listener));
   DeviceEventHandler *new_handler;
@@ -284,13 +295,13 @@ atspi_device_listener_add_callback (AtspiDeviceListener  *listener,
  * @listener: the #AtspiDeviceListener instance to modify.
  * @callback: (scope call): an #AtspiDeviceListenerCB function pointer.
  *
- * Removes an in-process callback function from an existing 
+ * Removes an in-process callback function from an existing
  * #AtspiDeviceListener.
  *
  **/
 void
-atspi_device_listener_remove_callback (AtspiDeviceListener  *listener,
-                               AtspiDeviceListenerCB callback)
+atspi_device_listener_remove_callback (AtspiDeviceListener *listener,
+                                       AtspiDeviceListenerCB callback)
 {
   g_return_if_fail (ATSPI_IS_DEVICE_LISTENER (listener));
 
@@ -339,12 +350,12 @@ read_device_event_from_iter (DBusMessageIter *iter, AtspiDeviceEvent *event)
 }
 
 DBusHandlerResult
-_atspi_dbus_handle_DeviceEvent (DBusConnection *bus, DBusMessage *message, void *data)
+_atspi_dbus_handle_DeviceEvent (DBusConnection *bus, DBusMessage *message)
 {
   const char *path = dbus_message_get_path (message);
   int id;
   AtspiDeviceEvent event;
-    AtspiDeviceListener *listener;
+  AtspiDeviceListener *listener;
   DBusMessageIter iter;
   AtspiDeviceListenerClass *klass;
   dbus_bool_t retval = FALSE;
@@ -352,47 +363,48 @@ _atspi_dbus_handle_DeviceEvent (DBusConnection *bus, DBusMessage *message, void
   DBusMessage *reply;
 
   if (strcmp (dbus_message_get_signature (message), "(uiuuisb)") != 0)
-  {
-    g_warning ("AT-SPI: Unknown signature for an event");
-    goto done;
-  }
+    {
+      g_warning ("AT-SPI: Unknown signature for an event");
+      goto done;
+    }
 
   if (sscanf (path, "/org/a11y/atspi/listeners/%d", &id) != 1)
-  {
-    g_warning ("AT-SPI: Bad listener path: %s\n", path);
-    goto done;
-  }
+    {
+      g_warning ("AT-SPI: Bad listener path: %s\n", path);
+      goto done;
+    }
 
   for (l = device_listeners; l; l = g_list_next (l))
-  {
-    listener = l->data;
-    if (listener->id == id) break;
-  }
+    {
+      listener = l->data;
+      if (listener->id == id)
+        break;
+    }
 
   if (!l)
-  {
-    goto done;
-  }
+    {
+      goto done;
+    }
   dbus_message_iter_init (message, &iter);
   read_device_event_from_iter (&iter, &event);
   klass = ATSPI_DEVICE_LISTENER_GET_CLASS (listener);
   if (klass->device_event)
-  {
-    retval = (*klass->device_event) (listener, &event);
-    if (retval != 0 && retval != 1)
     {
-      g_warning ("AT-SPI: device event handler returned %d; should be 0 or 1", retval);
-      retval = 0;
+      retval = (*klass->device_event) (listener, &event);
+      if (retval != 0 && retval != 1)
+        {
+          g_warning ("AT-SPI: device event handler returned %d; should be 0 or 1", retval);
+          retval = 0;
+        }
     }
-  }
 done:
   reply = dbus_message_new_method_return (message);
   if (reply)
-  {
-    dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &retval, DBUS_TYPE_INVALID);
-    dbus_connection_send (_atspi_bus(), reply, NULL);
-    dbus_message_unref (reply);
-  }
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &retval, DBUS_TYPE_INVALID);
+      dbus_connection_send (_atspi_bus (), reply, NULL);
+      dbus_message_unref (reply);
+    }
   return DBUS_HANDLER_RESULT_HANDLED;
 }
 
index 718a415..f8d12c1 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -45,8 +45,8 @@ GType atspi_device_event_get_type (void);
  * Returns: #TRUE if the client wishes to consume/preempt the event, preventing it from being
  * relayed to the currently focussed application, #FALSE if the event delivery should proceed as normal.
  **/
-typedef gboolean (*AtspiDeviceListenerCB)    (AtspiDeviceEvent *stroke,
-                                                    void                      *user_data);
+typedef gboolean (*AtspiDeviceListenerCB) (AtspiDeviceEvent *stroke,
+                                           void *user_data);
 
 /**
  * AtspiDeviceListenerSimpleCB:
@@ -58,14 +58,14 @@ typedef gboolean (*AtspiDeviceListenerCB)    (AtspiDeviceEvent *stroke,
  * Returns: #TRUE if the client wishes to consume/preempt the event, preventing it from being
  * relayed to the currently focussed application, #FALSE if the event delivery should proceed as normal.
  **/
-typedef gboolean (*AtspiDeviceListenerSimpleCB)    (const AtspiDeviceEvent *stroke);
+typedef gboolean (*AtspiDeviceListenerSimpleCB) (const AtspiDeviceEvent *stroke);
 
-#define ATSPI_TYPE_DEVICE_LISTENER                        (atspi_device_listener_get_type ())
-#define ATSPI_DEVICE_LISTENER(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_LISTENER, AtspiDeviceListener))
-#define ATSPI_DEVICE_LISTENER_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_LISTENER, AtspiDeviceListenerClass))
-#define ATSPI_IS_DEVICE_LISTENER(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_LISTENER))
-#define ATSPI_IS_DEVICE_LISTENER_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_LISTENER))
-#define ATSPI_DEVICE_LISTENER_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_LISTENER, AtspiDeviceListenerClass))
+#define ATSPI_TYPE_DEVICE_LISTENER (atspi_device_listener_get_type ())
+#define ATSPI_DEVICE_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_LISTENER, AtspiDeviceListener))
+#define ATSPI_DEVICE_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_LISTENER, AtspiDeviceListenerClass))
+#define ATSPI_IS_DEVICE_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_LISTENER))
+#define ATSPI_IS_DEVICE_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_LISTENER))
+#define ATSPI_DEVICE_LISTENER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_LISTENER, AtspiDeviceListenerClass))
 
 typedef struct _AtspiDeviceListener AtspiDeviceListener;
 struct _AtspiDeviceListener
@@ -90,8 +90,8 @@ AtspiDeviceListener *atspi_device_listener_new_simple (AtspiDeviceListenerSimple
 
 void atspi_device_listener_add_callback (AtspiDeviceListener *listener, AtspiDeviceListenerCB callback, GDestroyNotify callback_destroyed, void *user_data);
 
-void atspi_device_listener_remove_callback (AtspiDeviceListener  *listener, AtspiDeviceListenerCB callback);
+void atspi_device_listener_remove_callback (AtspiDeviceListener *listener, AtspiDeviceListenerCB callback);
 
 G_END_DECLS
 
-#endif /* _ATSPI_DEVICE_LISTENER_H_ */
+#endif /* _ATSPI_DEVICE_LISTENER_H_ */
diff --git a/atspi/atspi-device-mutter.c b/atspi/atspi-device-mutter.c
new file mode 100644 (file)
index 0000000..25594df
--- /dev/null
@@ -0,0 +1,1323 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2020 SUSE LLC.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atspi-private.h"
+
+#include "atspi-device-legacy.h"
+#include "atspi-device-mutter.h"
+#ifdef HAVE_X11
+#include "atspi-device-x11.h"
+#endif
+#include "atspi-dbus-mutter-remote-desktop.h"
+#include "atspi-dbus-mutter-screen-cast.h"
+#include "atspi-dbus-shell-introspect.h"
+#include <libei.h>
+
+#include <linux/input-event-codes.h> /* for BTN_LEFT, etc */
+
+#define MUTTER_REMOTE_DESKTOP_BUS_NAME "org.gnome.Mutter.RemoteDesktop"
+#define MUTTER_REMOTE_DESKTOP_OBJECT_PATH "/org/gnome/Mutter/RemoteDesktop"
+#define MUTTER_REMOTE_DESKTOP_INTERFACE "org.gnome.Mutter.RemoteDesktop"
+#define MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE "org.gnome.Mutter.RemoteDesktop.Session"
+#define MUTTER_SCREEN_CAST_BUS_NAME "org.gnome.Mutter.ScreenCast"
+#define MUTTER_SCREEN_CAST_OBJECT_PATH "/org/gnome/Mutter/ScreenCast"
+#define MUTTER_SCREEN_CAST_INTERFACE "org.gnome.Mutter.ScreenCast"
+#define MUTTER_SCREEN_CAST_SESSION_INTERFACE "org.gnome.Mutter.ScreenCast.Session"
+
+typedef struct _AtspiDeviceMutterPrivate AtspiDeviceMutterPrivate;
+struct _AtspiDeviceMutterPrivate
+{
+  AtspiDevice *keyboard_device;
+  GDBusConnection *bus;
+  guint mutter_remote_desktop_watch_name_id;
+  guint mutter_screen_cast_watch_name_id;
+  AtspiDBusMutterRemoteDesktop *mutter_remote_desktop_proxy;
+  AtspiDBusMutterScreenCast *mutter_screen_cast_proxy;
+  guint64 window_id;
+  gchar *window_mapping_id;
+
+  AtspiDBusMutterRemoteDesktopSession *remote_desktop_session;
+  AtspiDBusMutterScreenCastSession *screen_cast_session;
+  AtspiDBusMutterScreenCastStream *stream_proxy;
+  AtspiDBusShellIntrospect *introspect_proxy;
+
+  struct ei *ei;
+  struct ei_seat *ei_seat;
+  struct ei_device *ei_abs_pointer;
+  struct ei_device *ei_keyboard;
+  uint32_t ei_sequence;
+  GSource *ei_source;
+
+  GCancellable *cancellable;
+
+  gboolean started;
+
+  GSList *pending_clicks;
+};
+
+typedef struct _GrdFdSource
+{
+  GSource source;
+
+  GSourceFunc prepare;
+  GSourceFunc dispatch;
+  gpointer user_data;
+
+  GPollFD poll_fd;
+} GrdFdSource;
+
+typedef struct _MouseClickData
+{
+  AtspiAccessible *accessible;
+  AtspiAccessible *root_accessible;
+  gchar *window_name;
+  gint x;
+  gint y;
+  gchar *event;
+} MouseClickData;
+
+GObjectClass *device_mutter_parent_class;
+
+G_DEFINE_TYPE_WITH_CODE (AtspiDeviceMutter, atspi_device_mutter, ATSPI_TYPE_DEVICE, G_ADD_PRIVATE (AtspiDeviceMutter))
+
+enum
+{
+  DEVICE_TYPE_KEYBOARD = 1,
+  DEVICE_TYPE_POINTER = 2,
+  DEVICE_TYPE_TOUCHSCREEN = 4,
+};
+
+static void start_mouse_click (AtspiDeviceMutter *device);
+static void atspi_device_mutter_record_window (AtspiDeviceMutter *device);
+static GQuark window_id_quark;
+
+static guint
+atspi_device_mutter_map_modifier (AtspiDevice *device, gint keycode)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  return atspi_device_map_modifier (priv->keyboard_device, keycode);
+}
+
+static void
+atspi_device_mutter_unmap_modifier (AtspiDevice *device, gint keycode)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  atspi_device_unmap_modifier (priv->keyboard_device, keycode);
+}
+
+static void
+clear_session (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  g_clear_pointer (&priv->ei_abs_pointer, ei_device_unref);
+  g_clear_pointer (&priv->ei_seat, ei_seat_unref);
+  g_clear_pointer (&priv->ei_source, g_source_destroy);
+  g_clear_pointer (&priv->ei, ei_unref);
+
+  g_clear_object (&priv->remote_desktop_session);
+  g_clear_object (&priv->screen_cast_session);
+}
+
+static gboolean
+fd_source_prepare (GSource *source,
+                   int *timeout_ms)
+{
+  GrdFdSource *fd_source = (GrdFdSource *) source;
+
+  *timeout_ms = -1;
+
+  return fd_source->prepare (fd_source->user_data);
+}
+
+static gboolean
+fd_source_check (GSource *source)
+{
+  GrdFdSource *fd_source = (GrdFdSource *) source;
+
+  return !!(fd_source->poll_fd.revents & G_IO_IN);
+}
+
+static gboolean
+fd_source_dispatch (GSource *source,
+                    GSourceFunc callback,
+                    gpointer user_data)
+{
+  GrdFdSource *fd_source = (GrdFdSource *) source;
+
+  return fd_source->dispatch (fd_source->user_data);
+}
+
+static void
+fd_source_finalize (GSource *source)
+{
+  GrdFdSource *fd_source = (GrdFdSource *) source;
+
+  close (fd_source->poll_fd.fd);
+}
+
+static GSourceFuncs fd_source_funcs = {
+  .prepare = fd_source_prepare,
+  .check = fd_source_check,
+  .dispatch = fd_source_dispatch,
+  .finalize = fd_source_finalize,
+};
+
+GSource *
+create_fd_source (int fd,
+                  const char *name,
+                  GSourceFunc prepare,
+                  GSourceFunc dispatch,
+                  gpointer user_data,
+                  GDestroyNotify notify)
+{
+  GSource *source;
+  GrdFdSource *fd_source;
+
+  source = g_source_new (&fd_source_funcs, sizeof (GrdFdSource));
+  g_source_set_name (source, name);
+  fd_source = (GrdFdSource *) source;
+
+  fd_source->poll_fd.fd = fd;
+  fd_source->poll_fd.events = G_IO_IN;
+
+  fd_source->prepare = prepare;
+  fd_source->dispatch = dispatch;
+  fd_source->user_data = user_data;
+
+  g_source_set_callback (source, dispatch, user_data, notify);
+  g_source_add_poll (source, &fd_source->poll_fd);
+
+  return source;
+}
+
+static void
+session_stop (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  if (priv->remote_desktop_session && priv->started)
+    {
+      AtspiDBusMutterRemoteDesktopSession *proxy = priv->remote_desktop_session;
+      g_autoptr (GError) error = NULL;
+
+      if (!atspi_dbus_mutter_remote_desktop_session_call_stop_sync (proxy, NULL, &error))
+        {
+          if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) &&
+              !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT))
+            g_warning ("Failed to stop: %s", error->message);
+        }
+    }
+
+  clear_session (device);
+}
+
+static gboolean
+ei_source_prepare (gpointer user_data)
+{
+  AtspiDeviceMutter *device = ATSPI_DEVICE_MUTTER (user_data);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  return !!ei_peek_event (priv->ei);
+}
+
+static void
+notify_pointer_button (AtspiDeviceMutter *device,
+                       gint button,
+                       gboolean pressed)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  int32_t button_code;
+
+  if (!priv->ei_abs_pointer)
+    return;
+
+  switch (button)
+    {
+    case 1:
+      button_code = BTN_LEFT;
+      break;
+    case 2:
+      button_code = BTN_MIDDLE;
+      break;
+    case 3:
+      button_code = BTN_RIGHT;
+      break;
+    case 8:
+      button_code = BTN_SIDE;
+      break;
+    case 9:
+      button_code = BTN_EXTRA;
+      break;
+    default:
+      g_warning ("Unsupported button number %i", button);
+      button_code = 0;
+    }
+
+  ei_device_button_button (priv->ei_abs_pointer, button_code, pressed);
+  ei_device_frame (priv->ei_abs_pointer, g_get_monotonic_time ());
+}
+
+static void
+notify_pointer_motion_absolute (AtspiDeviceMutter *device,
+                                double x,
+                                double y)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  ei_device_pointer_motion_absolute (priv->ei_abs_pointer, x, y);
+  ei_device_frame (priv->ei_abs_pointer, ei_now (priv->ei));
+}
+
+static void
+notify_pointer_motion_relative (AtspiDeviceMutter *device,
+                                double dx,
+                                double dy)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  ei_device_scroll_delta (priv->ei_abs_pointer, dx, dy);
+  ei_device_frame (priv->ei_abs_pointer, g_get_monotonic_time ());
+}
+
+static MouseClickData *
+get_pending_click (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  if (!priv->pending_clicks)
+    return NULL;
+
+  return priv->pending_clicks->data;
+}
+
+static void
+mouse_click_data_free (MouseClickData *click_data)
+{
+  g_clear_object (&click_data->accessible);
+  g_clear_object (&click_data->root_accessible);
+  g_clear_pointer (&click_data->window_name, g_free);
+  g_clear_pointer (&click_data->event, g_free);
+  g_free (click_data);
+}
+
+static void
+mouse_click_end (AtspiDeviceMutter *device, gboolean do_next)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  MouseClickData *click_data = get_pending_click (device);
+
+  mouse_click_data_free (click_data);
+  priv->pending_clicks = g_slist_remove (priv->pending_clicks, click_data);
+  if (do_next && priv->pending_clicks)
+    start_mouse_click (device);
+  else if (priv->pending_clicks)
+    g_slist_free_full (priv->pending_clicks, (GDestroyNotify) mouse_click_data_free);
+}
+
+static gboolean
+finish_mouse_click (AtspiDeviceMutter *device)
+{
+  MouseClickData *click_data = get_pending_click (device);
+  gint button = 0;
+
+  if (!click_data)
+    return TRUE;
+
+  switch (click_data->event[0])
+    {
+    case 'b':
+      button = click_data->event[1] - '0';
+      if (button < 1 || button > 5)
+        {
+          mouse_click_end (device, TRUE);
+          return FALSE;
+        }
+
+      if (click_data->x != -1 && click_data->y != -1)
+        notify_pointer_motion_absolute (device, click_data->x, click_data->y);
+      switch (click_data->event[2])
+        {
+        case 'p':
+          notify_pointer_button (device, button, TRUE);
+          break;
+        case 'r':
+          notify_pointer_button (device, button, FALSE);
+          break;
+        case 'c':
+          notify_pointer_button (device, button, TRUE);
+          notify_pointer_button (device, button, FALSE);
+          break;
+        case 'd':
+          notify_pointer_button (device, button, TRUE);
+          notify_pointer_button (device, button, FALSE);
+          notify_pointer_button (device, button, TRUE);
+          notify_pointer_button (device, button, FALSE);
+          break;
+        default:
+          mouse_click_end (device, TRUE);
+          return FALSE;
+        }
+      break;
+    case 'a': /* absolute motion */
+      notify_pointer_motion_absolute (device, click_data->x, click_data->y);
+      break;
+    case 'r': /* relative */
+      notify_pointer_motion_relative (device, click_data->x, click_data->y);
+      break;
+    default:
+      mouse_click_end (device, TRUE);
+    }
+
+  mouse_click_end (device, TRUE);
+  return TRUE;
+}
+
+static gboolean
+ei_source_dispatch (gpointer user_data)
+{
+  AtspiDeviceMutter *device = ATSPI_DEVICE_MUTTER (user_data);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  struct ei_event *event;
+
+  ei_dispatch (priv->ei);
+
+  while ((event = ei_get_event (priv->ei)))
+    {
+      switch (ei_event_get_type (event))
+        {
+        case EI_EVENT_CONNECT:
+          break;
+        case EI_EVENT_DISCONNECT:
+          break;
+        case EI_EVENT_SEAT_ADDED:
+          if (priv->ei_seat)
+            break;
+
+          priv->ei_seat = ei_seat_ref (ei_event_get_seat (event));
+          ei_seat_bind_capabilities (priv->ei_seat,
+                                     EI_DEVICE_CAP_POINTER,
+                                     EI_DEVICE_CAP_POINTER_ABSOLUTE,
+                                     EI_DEVICE_CAP_BUTTON,
+                                     EI_DEVICE_CAP_SCROLL,
+                                     NULL);
+          break;
+        case EI_EVENT_SEAT_REMOVED:
+          if (ei_event_get_seat (event) == priv->ei_seat)
+            g_clear_pointer (&priv->ei_seat, ei_seat_unref);
+          break;
+        case EI_EVENT_DEVICE_ADDED:
+          {
+            struct ei_device *ei_device = ei_event_get_device (event);
+
+            if (ei_device_has_capability (ei_device, EI_DEVICE_CAP_POINTER_ABSOLUTE) &&
+                strstr (ei_device_get_name (ei_device), "standalone"))
+              {
+                g_clear_pointer (&priv->ei_abs_pointer, ei_device_unref);
+                priv->ei_abs_pointer = ei_device_ref (ei_device);
+              }
+            break;
+          }
+        case EI_EVENT_DEVICE_RESUMED:
+          if (ei_event_get_device (event) == priv->ei_abs_pointer)
+            ei_device_start_emulating (priv->ei_abs_pointer, ++priv->ei_sequence);
+          if (ei_event_get_device (event) == priv->ei_keyboard)
+            ei_device_start_emulating (priv->ei_keyboard, ++priv->ei_sequence);
+          break;
+        case EI_EVENT_DEVICE_PAUSED:
+          break;
+        case EI_EVENT_DEVICE_REMOVED:
+          if (ei_event_get_device (event) == priv->ei_abs_pointer)
+            g_clear_pointer (&priv->ei_abs_pointer, ei_device_unref);
+          if (ei_event_get_device (event) == priv->ei_keyboard)
+            g_clear_pointer (&priv->ei_keyboard, ei_device_unref);
+          break;
+        default:
+          break;
+        }
+      ei_event_unref (event);
+    }
+
+  return G_SOURCE_CONTINUE;
+}
+
+static void
+on_remote_desktop_session_closed (AtspiDBusMutterRemoteDesktopSession *session_proxy,
+                                  AtspiDeviceMutter *device)
+{
+  g_debug ("Remote desktop session closed, stopping session");
+
+  clear_session (device);
+  session_stop (device);
+}
+
+static void
+on_eis_connected (GObject *object,
+                  GAsyncResult *result,
+                  gpointer user_data)
+{
+  AtspiDBusMutterRemoteDesktopSession *proxy =
+      ATSPI_DBUS_MUTTER_REMOTE_DESKTOP_SESSION (object);
+  g_autoptr (GVariant) fd_variant = NULL;
+  g_autoptr (GUnixFDList) fd_list = NULL;
+  AtspiDeviceMutter *device;
+  AtspiDeviceMutterPrivate *priv;
+  int fd;
+  g_autoptr (GError) error = NULL;
+  int ret;
+
+  if (!atspi_dbus_mutter_remote_desktop_session_call_connect_to_eis_finish (proxy,
+                                                                            &fd_variant,
+                                                                            &fd_list,
+                                                                            result,
+                                                                            &error))
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to connect to EIS: %s",
+                 error->message);
+      session_stop (ATSPI_DEVICE_MUTTER (user_data));
+      return;
+    }
+
+  device = ATSPI_DEVICE_MUTTER (user_data);
+  priv = atspi_device_mutter_get_instance_private (device);
+
+  fd = g_unix_fd_list_get (fd_list, g_variant_get_handle (fd_variant), &error);
+
+  priv->ei = ei_new_sender (device);
+  /* TODO: allow name to be configurable? */
+  ei_configure_name (priv->ei, "at-spi");
+
+  ret = ei_setup_backend_fd (priv->ei, fd);
+  if (ret < 0)
+    {
+      g_warning ("Failed to setup libei backend: %s", g_strerror (-ret));
+
+      session_stop (device);
+      return;
+    }
+
+  priv->ei_source = create_fd_source (ei_get_fd (priv->ei),
+                                      "libei",
+                                      ei_source_prepare,
+                                      ei_source_dispatch,
+                                      device, NULL);
+  g_source_attach (priv->ei_source, NULL);
+  g_source_unref (priv->ei_source);
+
+  g_signal_connect (priv->remote_desktop_session, "closed",
+                    G_CALLBACK (on_remote_desktop_session_closed),
+                    device);
+}
+
+static void
+connect_to_eis (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  GVariantBuilder options_builder;
+  guint device_types = DEVICE_TYPE_POINTER;
+
+  g_variant_builder_init (&options_builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_add (&options_builder,
+                         "{sv}",
+                         "device-types",
+                         g_variant_new_uint32 (device_types));
+
+  atspi_dbus_mutter_remote_desktop_session_call_connect_to_eis (
+      priv->remote_desktop_session,
+      g_variant_builder_end (&options_builder),
+      NULL,
+      priv->cancellable,
+      on_eis_connected,
+      device);
+}
+
+static void
+on_session_start_finished (GObject *object,
+                           GAsyncResult *result,
+                           gpointer user_data)
+{
+  AtspiDBusMutterRemoteDesktopSession *proxy;
+  AtspiDeviceMutter *device;
+  AtspiDeviceMutterPrivate *priv;
+  g_autoptr (GError) error = NULL;
+
+  proxy = ATSPI_DBUS_MUTTER_REMOTE_DESKTOP_SESSION (object);
+  if (!atspi_dbus_mutter_remote_desktop_session_call_start_finish (proxy,
+                                                                   result,
+                                                                   &error))
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to start session: %s", error->message);
+      session_stop (ATSPI_DEVICE_MUTTER (user_data));
+      return;
+    }
+
+  device = ATSPI_DEVICE_MUTTER (user_data);
+  priv = atspi_device_mutter_get_instance_private (device);
+
+  priv->started = TRUE;
+
+  connect_to_eis (device);
+
+  if (priv->pending_clicks)
+    atspi_device_mutter_record_window (device);
+}
+
+static void
+start_session (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  AtspiDBusMutterRemoteDesktopSession *proxy = priv->remote_desktop_session;
+
+  atspi_dbus_mutter_remote_desktop_session_call_start (proxy,
+                                                       priv->cancellable,
+                                                       on_session_start_finished,
+                                                       device);
+}
+
+static void
+on_screen_cast_session_proxy_acquired (GObject *object,
+                                       GAsyncResult *result,
+                                       gpointer user_data)
+{
+  AtspiDBusMutterScreenCastSession *session_proxy;
+  AtspiDeviceMutter *device;
+  AtspiDeviceMutterPrivate *priv;
+  g_autoptr (GError) error = NULL;
+
+  session_proxy =
+      atspi_dbus_mutter_screen_cast_session_proxy_new_finish (result, &error);
+  if (!session_proxy)
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to acquire screen cast session proxy: %s\n",
+                 error->message);
+      session_stop (ATSPI_DEVICE_MUTTER (user_data));
+      return;
+    }
+
+  device = ATSPI_DEVICE_MUTTER (user_data);
+  priv = atspi_device_mutter_get_instance_private (device);
+
+  priv->screen_cast_session = session_proxy;
+
+  start_session (device);
+}
+
+static void
+on_screen_cast_session_created (GObject *source_object,
+                                GAsyncResult *res,
+                                gpointer user_data)
+{
+  AtspiDBusMutterScreenCast *screen_cast_proxy;
+  AtspiDeviceMutter *device;
+  AtspiDeviceMutterPrivate *priv;
+  GDBusConnection *connection;
+  g_autofree char *session_path = NULL;
+  g_autoptr (GError) error = NULL;
+
+  screen_cast_proxy = ATSPI_DBUS_MUTTER_SCREEN_CAST (source_object);
+  if (!atspi_dbus_mutter_screen_cast_call_create_session_finish (screen_cast_proxy,
+                                                                 &session_path,
+                                                                 res,
+                                                                 &error))
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to start screen cast session: %s\n", error->message);
+      session_stop (ATSPI_DEVICE_MUTTER (user_data));
+      return;
+    }
+
+  device = ATSPI_DEVICE_MUTTER (user_data);
+  priv = atspi_device_mutter_get_instance_private (device);
+  connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (screen_cast_proxy));
+
+  atspi_dbus_mutter_screen_cast_session_proxy_new (connection,
+                                                   G_DBUS_PROXY_FLAGS_NONE,
+                                                   MUTTER_SCREEN_CAST_BUS_NAME,
+                                                   session_path,
+                                                   priv->cancellable,
+                                                   on_screen_cast_session_proxy_acquired,
+                                                   device);
+}
+
+static guint
+atspi_device_mutter_get_modifier (AtspiDevice *device, gint keycode)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  return atspi_device_get_modifier (priv->keyboard_device, keycode);
+}
+
+static void
+on_remote_desktop_session_proxy_acquired (GObject *object,
+                                          GAsyncResult *result,
+                                          gpointer user_data)
+{
+  AtspiDBusMutterRemoteDesktopSession *session_proxy;
+  AtspiDeviceMutter *device;
+  AtspiDeviceMutterPrivate *priv;
+  g_autoptr (GError) error = NULL;
+  GVariantBuilder properties_builder;
+  GVariant *properties_variant;
+  const char *remote_desktop_session_id;
+
+  session_proxy =
+      atspi_dbus_mutter_remote_desktop_session_proxy_new_finish (result, &error);
+  if (!session_proxy)
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to acquire remote desktop session proxy: %s",
+                 error->message);
+      session_stop (ATSPI_DEVICE_MUTTER (user_data));
+      return;
+    }
+
+  device = ATSPI_DEVICE_MUTTER (user_data);
+  priv = atspi_device_mutter_get_instance_private (device);
+
+  priv->remote_desktop_session = session_proxy;
+  remote_desktop_session_id =
+      atspi_dbus_mutter_remote_desktop_session_get_session_id (priv->remote_desktop_session);
+
+  g_variant_builder_init (&properties_builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_add (&properties_builder, "{sv}",
+                         "remote-desktop-session-id",
+                         g_variant_new_string (remote_desktop_session_id));
+  g_variant_builder_add (&properties_builder, "{sv}",
+                         "disable-animations",
+                         g_variant_new_boolean (TRUE));
+  properties_variant = g_variant_builder_end (&properties_builder);
+
+  atspi_dbus_mutter_screen_cast_call_create_session (priv->mutter_screen_cast_proxy,
+                                                     properties_variant,
+                                                     priv->cancellable,
+                                                     on_screen_cast_session_created,
+                                                     device);
+}
+
+static void
+on_remote_desktop_session_created (GObject *source_object,
+                                   GAsyncResult *res,
+                                   gpointer user_data)
+{
+  AtspiDBusMutterRemoteDesktop *remote_desktop_proxy;
+  AtspiDeviceMutter *device;
+  AtspiDeviceMutterPrivate *priv;
+  GDBusConnection *connection;
+  g_autofree char *session_path = NULL;
+  g_autoptr (GError) error = NULL;
+
+  remote_desktop_proxy = ATSPI_DBUS_MUTTER_REMOTE_DESKTOP (source_object);
+  if (!atspi_dbus_mutter_remote_desktop_call_create_session_finish (remote_desktop_proxy,
+                                                                    &session_path,
+                                                                    res,
+                                                                    &error))
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to start remote desktop session: %s\n", error->message);
+      session_stop (ATSPI_DEVICE_MUTTER (user_data));
+      return;
+    }
+
+  device = ATSPI_DEVICE_MUTTER (user_data);
+  priv = atspi_device_mutter_get_instance_private (device);
+  connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (remote_desktop_proxy));
+
+  atspi_dbus_mutter_remote_desktop_session_proxy_new (connection,
+                                                      G_DBUS_PROXY_FLAGS_NONE,
+                                                      MUTTER_REMOTE_DESKTOP_BUS_NAME,
+                                                      session_path,
+                                                      priv->cancellable,
+                                                      on_remote_desktop_session_proxy_acquired,
+                                                      device);
+}
+
+static void
+session_start (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  atspi_dbus_mutter_remote_desktop_call_create_session (priv->mutter_remote_desktop_proxy,
+                                                        priv->cancellable,
+                                                        on_remote_desktop_session_created,
+                                                        device);
+}
+
+static void
+on_mutter_remote_desktop_proxy_acquired (GObject *object,
+                                         GAsyncResult *result,
+                                         gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  AtspiDBusMutterRemoteDesktop *proxy;
+  GError *error = NULL;
+
+  proxy = atspi_dbus_mutter_remote_desktop_proxy_new_finish (result, &error);
+  if (!proxy)
+    {
+      g_warning ("Failed to create remote desktop proxy: %s", error->message);
+      g_error_free (error);
+      return;
+    }
+
+  priv->mutter_remote_desktop_proxy = proxy;
+
+  if (priv->pending_clicks)
+    start_mouse_click (device);
+  else
+    session_start (device);
+}
+
+static void
+on_mutter_screen_cast_proxy_acquired (GObject *object,
+                                      GAsyncResult *result,
+                                      gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  AtspiDBusMutterScreenCast *proxy;
+  GError *error = NULL;
+
+  proxy = atspi_dbus_mutter_screen_cast_proxy_new_finish (result, &error);
+  if (!proxy)
+    {
+      g_warning ("Failed to create screen cast proxy: %s", error->message);
+      return;
+    }
+
+  priv->mutter_screen_cast_proxy = proxy;
+}
+
+static void
+on_mutter_remote_desktop_name_appeared (GDBusConnection *connection,
+                                        const char *name,
+                                        const char *name_owner,
+                                        gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  atspi_dbus_mutter_remote_desktop_proxy_new (connection,
+                                              G_DBUS_PROXY_FLAGS_NONE,
+                                              MUTTER_REMOTE_DESKTOP_BUS_NAME,
+                                              MUTTER_REMOTE_DESKTOP_OBJECT_PATH,
+                                              priv->cancellable,
+                                              on_mutter_remote_desktop_proxy_acquired,
+                                              device);
+}
+
+static void
+on_mutter_remote_desktop_name_vanished (GDBusConnection *connection,
+                                        const char *name,
+                                        gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  priv->mutter_remote_desktop_proxy = NULL;
+}
+
+static void
+on_mutter_screen_cast_name_appeared (GDBusConnection *connection,
+                                     const char *name,
+                                     const char *name_owner,
+                                     gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  atspi_dbus_mutter_screen_cast_proxy_new (connection,
+                                           G_DBUS_PROXY_FLAGS_NONE,
+                                           MUTTER_SCREEN_CAST_BUS_NAME,
+                                           MUTTER_SCREEN_CAST_OBJECT_PATH,
+                                           priv->cancellable,
+                                           on_mutter_screen_cast_proxy_acquired,
+                                           device);
+}
+
+static void
+on_mutter_screen_cast_name_vanished (GDBusConnection *connection,
+                                     const char *name,
+                                     gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  priv->mutter_screen_cast_proxy = NULL;
+}
+
+static void
+acquire_mutter_dbus_proxies (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  g_clear_handle_id (&priv->mutter_remote_desktop_watch_name_id, g_bus_unwatch_name);
+  priv->mutter_remote_desktop_watch_name_id =
+      g_bus_watch_name_on_connection (priv->bus,
+                                      MUTTER_REMOTE_DESKTOP_BUS_NAME,
+                                      G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                      on_mutter_remote_desktop_name_appeared,
+                                      on_mutter_remote_desktop_name_vanished,
+                                      g_object_ref (device), NULL);
+
+  g_clear_handle_id (&priv->mutter_screen_cast_watch_name_id, g_bus_unwatch_name);
+  priv->mutter_screen_cast_watch_name_id =
+      g_bus_watch_name_on_connection (priv->bus,
+                                      MUTTER_SCREEN_CAST_BUS_NAME,
+                                      G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                      on_mutter_screen_cast_name_appeared,
+                                      on_mutter_screen_cast_name_vanished,
+                                      device, NULL);
+}
+
+static void
+on_screen_cast_stream_start_finished (GObject *object,
+                                      GAsyncResult *result,
+                                      gpointer user_data)
+{
+  AtspiDBusMutterScreenCastStream *stream_proxy = ATSPI_DBUS_MUTTER_SCREEN_CAST_STREAM (object);
+  g_autoptr (GError) error = NULL;
+  AtspiDeviceMutter *device = user_data;
+
+  if (!atspi_dbus_mutter_screen_cast_stream_call_start_finish (stream_proxy,
+                                                               result,
+                                                               &error))
+    {
+      mouse_click_end (device, FALSE);
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to start screen cast stream: %s", error->message);
+      session_stop (device);
+      return;
+    }
+
+  finish_mouse_click (device);
+}
+
+static void
+on_screen_cast_stream_proxy_acquired (GObject *object,
+                                      GAsyncResult *result,
+                                      gpointer user_data)
+{
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  g_autoptr (AtspiDBusMutterScreenCastStream) stream_proxy = NULL;
+  g_autoptr (GError) error = NULL;
+  GVariant *parameters;
+
+  stream_proxy = atspi_dbus_mutter_screen_cast_stream_proxy_new_finish (result, &error);
+  if (!stream_proxy)
+    {
+      mouse_click_end (device, FALSE);
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to acquire stream proxy: %s", error->message);
+      session_stop (device);
+      return;
+    }
+
+  /* TODO: clear old proxy */
+  priv->stream_proxy = stream_proxy;
+
+  parameters = atspi_dbus_mutter_screen_cast_stream_get_parameters (stream_proxy);
+  g_variant_lookup (parameters, "mapping-id", "s", &priv->window_mapping_id);
+
+  atspi_dbus_mutter_screen_cast_stream_call_start (stream_proxy,
+                                                   priv->cancellable,
+                                                   on_screen_cast_stream_start_finished,
+                                                   device);
+}
+
+static void
+on_record_finished (GObject *object,
+                    GAsyncResult *result,
+                    gpointer user_data)
+{
+  AtspiDBusMutterScreenCastSession *proxy = ATSPI_DBUS_MUTTER_SCREEN_CAST_SESSION (object);
+  AtspiDeviceMutter *device = user_data;
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  GDBusConnection *connection;
+  g_autofree char *stream_path = NULL;
+  g_autoptr (GError) error = NULL;
+  gboolean retval = FALSE;
+
+  retval = atspi_dbus_mutter_screen_cast_session_call_record_window_finish (
+      proxy, &stream_path, result, &error);
+
+  if (!retval)
+    {
+      mouse_click_end (device, TRUE);
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        return;
+
+      g_warning ("Failed to record window: %s",
+                 error->message);
+      session_stop (device);
+      return;
+    }
+
+  connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (proxy));
+
+  atspi_dbus_mutter_screen_cast_stream_proxy_new (connection,
+                                                  G_DBUS_PROXY_FLAGS_NONE,
+                                                  MUTTER_SCREEN_CAST_BUS_NAME,
+                                                  stream_path,
+                                                  priv->cancellable,
+                                                  on_screen_cast_stream_proxy_acquired,
+                                                  device);
+}
+
+static void
+atspi_device_mutter_record_window (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  GVariantBuilder properties_builder;
+
+  g_variant_builder_init (&properties_builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_add (&properties_builder, "{sv}",
+                         "window-id", g_variant_new_uint64 (priv->window_id));
+
+  atspi_dbus_mutter_screen_cast_session_call_record_window (priv->screen_cast_session,
+                                                            g_variant_builder_end (&properties_builder),
+                                                            priv->cancellable,
+                                                            on_record_finished,
+                                                            device);
+}
+
+static void
+key_watcher (AtspiDevice *device, gboolean pressed, guint keycode, guint keysym, guint modifiers, const gchar *keystring, void *user_data)
+{
+  AtspiDevice *my_device = ATSPI_DEVICE (user_data);
+
+  atspi_device_notify_key (my_device, pressed, keycode, keysym, modifiers, keystring);
+}
+
+static void
+atspi_device_mutter_init (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  priv->bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
+  if (!priv->bus)
+    return;
+  /* TODO: Following line is for testing. Remove before commit. */
+  g_bus_own_name (G_BUS_TYPE_SESSION, "org.gnome.orca", 0, NULL, NULL, NULL, NULL, NULL);
+
+  priv->cancellable = g_cancellable_new ();
+
+  acquire_mutter_dbus_proxies (device);
+
+#ifdef HAVE_X11
+  if (!g_getenv ("WAYLAND_DISPLAY"))
+    priv->keyboard_device = ATSPI_DEVICE (atspi_device_x11_new ());
+#endif
+
+  if (!priv->keyboard_device)
+    priv->keyboard_device = ATSPI_DEVICE (atspi_device_legacy_new ());
+  atspi_device_add_key_watcher (priv->keyboard_device, key_watcher, device, NULL);
+}
+
+static void
+atspi_device_mutter_finalize (GObject *object)
+{
+  AtspiDeviceMutter *device = ATSPI_DEVICE_MUTTER (object);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+
+  session_stop (device);
+
+  g_clear_handle_id (&priv->mutter_remote_desktop_watch_name_id, g_bus_unwatch_name);
+  g_clear_handle_id (&priv->mutter_screen_cast_watch_name_id, g_bus_unwatch_name);
+  g_clear_object (&priv->cancellable);
+  g_clear_object (&priv->bus);
+
+  g_clear_object (&priv->keyboard_device);
+
+  g_slist_free_full (priv->pending_clicks, (GDestroyNotify) mouse_click_data_free);
+
+  device_mutter_parent_class->finalize (object);
+}
+
+static gboolean
+atspi_device_mutter_add_key_grab (AtspiDevice *device, AtspiKeyDefinition *kd)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+  guint ret;
+
+  ret = atspi_device_add_key_grab (priv->keyboard_device, kd, NULL, NULL, NULL);
+  return (ret > 0);
+}
+
+static void
+atspi_device_mutter_remove_key_grab (AtspiDevice *device, guint id)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  atspi_device_remove_key_grab (priv->keyboard_device, id);
+}
+
+static guint
+atspi_device_mutter_get_locked_modifiers (AtspiDevice *device)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  return atspi_device_get_locked_modifiers (priv->keyboard_device);
+}
+
+static gboolean
+atspi_device_mutter_grab_keyboard (AtspiDevice *device)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  return atspi_device_grab_keyboard (priv->keyboard_device);
+}
+
+static void
+atspi_device_mutter_ungrab_keyboard (AtspiDevice *device)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+
+  atspi_device_grab_keyboard (priv->keyboard_device);
+}
+
+static void
+on_get_windows_finished (GObject *object,
+                         GAsyncResult *result,
+                         gpointer user_data)
+{
+  AtspiDBusShellIntrospect *proxy = ATSPI_DBUS_SHELL_INTROSPECT (object);
+  AtspiDeviceMutter *device = user_data;
+  MouseClickData *click_data = get_pending_click (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  const char *wm_class;
+  gboolean has_focus;
+  g_autoptr (GVariant) windows = NULL;
+  GVariantIter iter;
+  uint64_t cur_id, window_id = 0;
+  GVariant *params = NULL;
+  GError *error = NULL;
+  gboolean retval = FALSE;
+
+  retval = atspi_dbus_shell_introspect_call_get_windows_finish (
+      proxy, &windows, result, &error);
+
+  if (!retval)
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        {
+          mouse_click_end (device, FALSE);
+          return;
+        }
+
+      g_warning ("Failed to record window: %s",
+                 error->message);
+      session_stop (device);
+      mouse_click_end (device, FALSE);
+      return;
+    }
+
+  g_variant_iter_init (&iter, windows);
+
+  while (g_variant_iter_loop (&iter, "{t@a{sv}}", &cur_id, &params))
+    {
+      g_variant_lookup (params, "wm-class", "s", &wm_class);
+      g_variant_lookup (params, "has-focus", "b", &has_focus);
+      if (wm_class && has_focus)
+        {
+          if ((click_data->window_name && !strcmp (click_data->window_name, wm_class)) || has_focus)
+            {
+              window_id = cur_id;
+              break;
+            }
+          break;
+        }
+    }
+
+  if (!window_id)
+    {
+      mouse_click_end (device, FALSE);
+      return;
+    }
+
+  if (window_id == priv->window_id && priv->screen_cast_session)
+    {
+      finish_mouse_click (device);
+      return;
+    }
+
+  priv->window_id = window_id;
+  g_object_set_qdata (G_OBJECT (click_data->root_accessible), window_id_quark, (gpointer) window_id);
+  if (priv->screen_cast_session)
+    atspi_device_mutter_record_window (device);
+}
+
+static void
+start_mouse_click (AtspiDeviceMutter *device)
+{
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (device);
+  gint i;
+  AtspiAccessible *parent;
+  g_autoptr (GError) error = NULL;
+  MouseClickData *click_data = get_pending_click (device);
+  AtspiAccessible *accessible = click_data->accessible;
+  gulong window_id;
+
+  for (i = 0; accessible; i++)
+    {
+      AtspiRole role = atspi_accessible_get_role (accessible, NULL);
+      if (role == ATSPI_ROLE_APPLICATION)
+        break;
+      parent = atspi_accessible_get_parent (accessible, NULL);
+      if (i)
+        g_object_unref (accessible);
+      accessible = parent;
+    }
+
+  click_data->window_name = atspi_accessible_get_name (accessible, NULL);
+  click_data->root_accessible = accessible;
+  if (!i)
+    g_object_ref (click_data->root_accessible);
+
+  if (!priv->screen_cast_session)
+    session_start (device);
+
+  window_id = (gulong) g_object_get_qdata (G_OBJECT (click_data->root_accessible), window_id_quark);
+  if (window_id)
+    {
+      if (window_id == priv->window_id && priv->screen_cast_session)
+        {
+          finish_mouse_click (device);
+          return;
+        }
+
+      priv->window_id = window_id;
+      if (priv->screen_cast_session)
+        atspi_device_mutter_record_window (device);
+      return;
+    }
+
+  if (!priv->introspect_proxy)
+    priv->introspect_proxy = atspi_dbus_shell_introspect_proxy_new_sync (priv->bus,
+                                                                         G_DBUS_PROXY_FLAGS_NONE,
+                                                                         MUTTER_REMOTE_DESKTOP_BUS_NAME,
+                                                                         "/org/gnome/Shell/Introspect",
+                                                                         priv->cancellable, &error);
+
+  atspi_dbus_shell_introspect_call_get_windows (priv->introspect_proxy,
+                                                priv->cancellable,
+                                                on_get_windows_finished,
+                                                device);
+}
+
+/* TODO: remove bool param */
+static void
+atspi_device_mutter_generate_mouse_event (AtspiDevice *device, AtspiAccessible *obj, gint x, gint y, const gchar *name, GError **error)
+{
+  AtspiDeviceMutter *mutter_device = ATSPI_DEVICE_MUTTER (device);
+  AtspiDeviceMutterPrivate *priv = atspi_device_mutter_get_instance_private (mutter_device);
+  AtspiPoint *p;
+  MouseClickData *click_data;
+  gboolean need_start;
+
+  if (atspi_accessible_get_role (obj, NULL) != ATSPI_ROLE_APPLICATION)
+    {
+      p = atspi_component_get_position (ATSPI_COMPONENT (obj), ATSPI_COORD_TYPE_WINDOW, error);
+      if (!p)
+        return;
+      x += p->x;
+      y += p->y;
+      g_free (p);
+    }
+
+  click_data = g_malloc0 (sizeof (MouseClickData));
+  click_data->x = x;
+  click_data->y = y;
+  click_data->event = g_strdup (name);
+  click_data->accessible = g_object_ref (obj);
+  need_start = (priv->pending_clicks == NULL);
+  priv->pending_clicks = g_slist_append (priv->pending_clicks, click_data);
+  if (need_start && priv->mutter_remote_desktop_proxy)
+    start_mouse_click (mutter_device);
+}
+
+static void
+atspi_device_mutter_class_init (AtspiDeviceMutterClass *klass)
+{
+  AtspiDeviceClass *device_class = ATSPI_DEVICE_CLASS (klass);
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  window_id_quark = g_quark_from_static_string ("mutter-window-id");
+  device_mutter_parent_class = g_type_class_peek_parent (klass);
+  device_class->add_key_grab = atspi_device_mutter_add_key_grab;
+  device_class->map_modifier = atspi_device_mutter_map_modifier;
+  device_class->unmap_modifier = atspi_device_mutter_unmap_modifier;
+  device_class->get_modifier = atspi_device_mutter_get_modifier;
+  device_class->remove_key_grab = atspi_device_mutter_remove_key_grab;
+  device_class->get_locked_modifiers = atspi_device_mutter_get_locked_modifiers;
+  device_class->grab_keyboard = atspi_device_mutter_grab_keyboard;
+  device_class->ungrab_keyboard = atspi_device_mutter_ungrab_keyboard;
+  device_class->generate_mouse_event = atspi_device_mutter_generate_mouse_event;
+
+  object_class->finalize = atspi_device_mutter_finalize;
+}
+
+/**
+ * atspi_device_mutter_new:
+ *
+ * Creates a new #AtspiDeviceMutter.
+ *
+ * Returns: (transfer full): a pointer to a newly-created #AtspiDeviceMutter.
+ *
+ **/
+AtspiDeviceMutter *
+atspi_device_mutter_new ()
+{
+  AtspiDeviceMutter *device = g_object_new (atspi_device_mutter_get_type (), NULL);
+
+  return device;
+}
diff --git a/atspi/atspi-device-mutter.h b/atspi/atspi-device-mutter.h
new file mode 100644 (file)
index 0000000..4fbfa77
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2020 SUSE LLC.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _ATSPI_DEVICE_MUTTER_H_
+#define _ATSPI_DEVICE_MUTTER_H_
+
+#include "glib-object.h"
+
+#include "atspi-device.h"
+#include "atspi-types.h"
+
+G_BEGIN_DECLS
+
+#define ATSPI_TYPE_DEVICE_MUTTER (atspi_device_mutter_get_type ())
+#define ATSPI_DEVICE_MUTTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_MUTTER, AtspiDeviceMutter))
+#define ATSPI_DEVICE_MUTTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_MUTTER, AtspiDeviceMutterClass))
+#define ATSPI_IS_DEVICE_MUTTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_MUTTER))
+#define ATSPI_IS_DEVICE_MUTTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_MUTTER))
+#define ATSPI_DEVICE_MUTTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_MUTTER, AtspiDeviceMutterClass))
+
+typedef struct _AtspiDeviceMutter AtspiDeviceMutter;
+struct _AtspiDeviceMutter
+{
+  AtspiDevice parent;
+};
+
+typedef struct _AtspiDeviceMutterClass AtspiDeviceMutterClass;
+struct _AtspiDeviceMutterClass
+{
+  AtspiDeviceClass parent_class;
+};
+
+GType atspi_device_mutter_get_type (void);
+
+AtspiDeviceMutter *atspi_device_mutter_new ();
+
+G_END_DECLS
+
+#endif /* _ATSPI_DEVICE_MUTTER_H_ */
index eafdba6..8df3c54 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include "atspi-private.h"
 #include "atspi-device-x11.h"
+#include "atspi-private.h"
 
+#include <X11/XKBlib.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/extensions/XInput2.h>
-#include <X11/XKBlib.h>
-
 
 #define ATSPI_VIRTUAL_MODIFIER_MASK 0x0000f000
 
@@ -35,16 +34,16 @@ typedef struct _AtspiDeviceX11Private AtspiDeviceX11Private;
 struct _AtspiDeviceX11Private
 {
   Display *display;
-  Window window;
+  Window root_window;
+  Window focused_window;
   GSource *source;
   int xi_opcode;
-  int device_id;
-  int device_id_alt;
   GSList *modifiers;
   GSList *key_grabs;
   guint virtual_mods_enabled;
   gboolean keyboard_grabbed;
   unsigned int numlock_physical_mask;
+  AtspiEventListener *event_listener;
 };
 
 GObjectClass *device_x11_parent_class;
@@ -52,9 +51,9 @@ GObjectClass *device_x11_parent_class;
 typedef struct _DisplaySource
 {
   GSource source;
-  
+
   Display *display;
-  GPollFD  event_poll_fd;
+  GPollFD event_poll_fd;
 } DisplaySource;
 
 typedef struct
@@ -67,24 +66,25 @@ typedef struct
 {
   AtspiKeyDefinition *kd;
   gboolean enabled;
+  Window window;
 } AtspiX11KeyGrab;
 
-static gboolean  
+static gboolean
 event_prepare (GSource *source, gint *timeout)
 {
-  Display *display = ((DisplaySource *)source)->display;
+  Display *display = ((DisplaySource *) source)->display;
   gboolean retval;
-  
+
   *timeout = -1;
   retval = XPending (display);
-  
+
   return retval;
 }
 
-static gboolean  
-event_check (GSource *source) 
+static gboolean
+event_check (GSource *source)
 {
-  DisplaySource *display_source = (DisplaySource*)source;
+  DisplaySource *display_source = (DisplaySource *) source;
   gboolean retval;
 
   if (display_source->event_poll_fd.revents & G_IO_IN)
@@ -101,16 +101,16 @@ xi2keyevent (XIDeviceEvent *xievent, XEvent *xkeyevent)
   memset (xkeyevent, 0, sizeof (*xkeyevent));
 
   switch (xievent->evtype)
-  {
-  case XI_KeyPress:
-    xkeyevent->type = KeyPress;
-    break;
-  case XI_KeyRelease:
-    xkeyevent->type = KeyRelease;
-    break;
-  default:
-    break;
-  }
+    {
+    case XI_KeyPress:
+      xkeyevent->type = KeyPress;
+      break;
+    case XI_KeyRelease:
+      xkeyevent->type = KeyRelease;
+      break;
+    default:
+      break;
+    }
   xkeyevent->xkey.serial = xievent->serial;
   xkeyevent->xkey.send_event = xievent->send_event;
   xkeyevent->xkey.display = xievent->display;
@@ -127,10 +127,7 @@ xi2keyevent (XIDeviceEvent *xievent, XEvent *xkeyevent)
   xkeyevent->xkey.same_screen = 1;
 }
 
-G_DEFINE_TYPE_WITH_CODE (AtspiDeviceX11, atspi_device_x11,
-                         ATSPI_TYPE_DEVICE,
-                         G_ADD_PRIVATE (AtspiDeviceX11))
-
+G_DEFINE_TYPE_WITH_CODE (AtspiDeviceX11, atspi_device_x11, ATSPI_TYPE_DEVICE, G_ADD_PRIVATE (AtspiDeviceX11))
 
 static guint
 find_virtual_mapping (AtspiDeviceX11 *x11_device, gint keycode)
@@ -139,11 +136,11 @@ find_virtual_mapping (AtspiDeviceX11 *x11_device, gint keycode)
   GSList *l;
 
   for (l = priv->modifiers; l; l = l->next)
-  {
-    AtspiX11KeyModifier *entry = l->data;
-    if (entry->keycode == keycode)
-      return entry->modifier;
-  }
+    {
+      AtspiX11KeyModifier *entry = l->data;
+      if (entry->keycode == keycode)
+        return entry->modifier;
+    }
 
   return 0;
 }
@@ -168,65 +165,75 @@ grab_has_active_duplicate (AtspiDeviceX11 *x11_device, AtspiX11KeyGrab *grab)
   GSList *l;
 
   for (l = priv->key_grabs; l; l = l->next)
-  {
-    AtspiX11KeyGrab *other = l->data;
-    if (other != grab && other->enabled && other->kd->keycode == grab->kd->keycode && (other->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK) == (grab->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK))
-      return TRUE;
-  }
+    {
+      AtspiX11KeyGrab *other = l->data;
+      if (other != grab && other->enabled && other->kd->keycode == grab->kd->keycode && (other->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK) == (grab->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK))
+        return TRUE;
+    }
   return FALSE;
 }
 
-static void
-grab_key_aux (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+static gboolean
+grab_key_aux (AtspiDeviceX11 *x11_device, Window window, int keycode, int modmask)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
   XIGrabModifiers xi_modifiers;
   XIEventMask eventmask;
-                       unsigned char mask[XIMaskLen (XI_LASTEVENT)] = { 0 };
+  unsigned char mask[XIMaskLen (XI_LASTEVENT)] = { 0 };
+  int ret;
 
   xi_modifiers.modifiers = modmask;
   xi_modifiers.status = 0;
 
-                       eventmask.deviceid = XIAllDevices;
-                       eventmask.mask_len = sizeof(mask);
-                       eventmask.mask = mask;
+  eventmask.deviceid = XIAllDevices;
+  eventmask.mask_len = sizeof (mask);
+  eventmask.mask = mask;
 
-                       XISetMask (mask, XI_KeyPress);
-                       XISetMask (mask, XI_KeyRelease);
+  XISetMask (mask, XI_KeyPress);
+  XISetMask (mask, XI_KeyRelease);
 
-  XIGrabKeycode (priv->display, XIAllMasterDevices, keycode, priv->window, XIGrabModeSync, XIGrabModeAsync, False, &eventmask, 1, &xi_modifiers);
+  ret = XIGrabKeycode (priv->display, XIAllMasterDevices, keycode, window, XIGrabModeSync, XIGrabModeAsync, False, &eventmask, 1, &xi_modifiers);
+  return (ret == 0);
 }
 
-static void
-grab_key (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+static gboolean
+grab_key (AtspiDeviceX11 *x11_device, Window window, int keycode, int modmask)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
+  gboolean include_numlock = !_atspi_key_is_on_keypad (keycode);
+  gboolean ret = FALSE;
 
-  grab_key_aux (x11_device, keycode, modmask);
+  ret |= grab_key_aux (x11_device, window, keycode, modmask);
   if (!(modmask & LockMask))
-    grab_key_aux (x11_device, keycode, modmask | LockMask);
-  if (!(modmask & priv->numlock_physical_mask))
-  {
-    grab_key_aux (x11_device, keycode, modmask | priv->numlock_physical_mask);
-    if (!(modmask & LockMask))
-      grab_key_aux (x11_device, keycode, modmask | LockMask | priv->numlock_physical_mask);
-  }
+    ret |= grab_key_aux (x11_device, window, keycode, modmask | LockMask);
+  if (include_numlock && !(modmask & priv->numlock_physical_mask))
+    {
+      ret |= grab_key_aux (x11_device, window, keycode, modmask | priv->numlock_physical_mask);
+      if (!(modmask & LockMask))
+        ret |= grab_key_aux (x11_device, window, keycode, modmask | LockMask | priv->numlock_physical_mask);
+    }
+  return ret;
 }
 
-static void
+static gboolean
 enable_key_grab (AtspiDeviceX11 *x11_device, AtspiX11KeyGrab *grab)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
+  gboolean ret;
 
-  g_return_if_fail (priv->display != NULL);
+  g_return_val_if_fail (priv->display != NULL, FALSE);
 
-  if (!grab_has_active_duplicate (x11_device, grab))
-    grab_key (x11_device, grab->kd->keycode, grab->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK);
+  if (grab_has_active_duplicate (x11_device, grab))
+    ret = TRUE;
+  else
+    ret = grab_key (x11_device, priv->focused_window, grab->kd->keycode, grab->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK);
   grab->enabled = TRUE;
+  grab->window = priv->focused_window;
+  return ret;
 }
 
 static void
-ungrab_key_aux (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+ungrab_key_aux (AtspiDeviceX11 *x11_device, Window window, int keycode, int modmask)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
   XIGrabModifiers xi_modifiers;
@@ -234,23 +241,23 @@ ungrab_key_aux (AtspiDeviceX11 *x11_device, int keycode, int modmask)
   xi_modifiers.modifiers = modmask;
   xi_modifiers.status = 0;
 
-  XIUngrabKeycode (priv->display, XIAllMasterDevices, keycode, priv->window, sizeof(xi_modifiers), &xi_modifiers);
+  XIUngrabKeycode (priv->display, XIAllMasterDevices, keycode, window, 1, &xi_modifiers);
 }
 
 static void
-ungrab_key (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+ungrab_key (AtspiDeviceX11 *x11_device, Window window, int keycode, int modmask)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
 
-  ungrab_key_aux (x11_device, keycode, modmask);
+  ungrab_key_aux (x11_device, window, keycode, modmask);
   if (!(modmask & LockMask))
-    ungrab_key_aux (x11_device, keycode, modmask | LockMask);
+    ungrab_key_aux (x11_device, window, keycode, modmask | LockMask);
   if (!(modmask & priv->numlock_physical_mask))
-  {
-    ungrab_key_aux (x11_device, keycode, modmask | priv->numlock_physical_mask);
-    if (!(modmask & LockMask))
-      ungrab_key_aux (x11_device, keycode, modmask | LockMask | priv->numlock_physical_mask);
-  }
+    {
+      ungrab_key_aux (x11_device, window, keycode, modmask | priv->numlock_physical_mask);
+      if (!(modmask & LockMask))
+        ungrab_key_aux (x11_device, window, keycode, modmask | LockMask | priv->numlock_physical_mask);
+    }
 }
 
 static void
@@ -268,7 +275,7 @@ disable_key_grab (AtspiDeviceX11 *x11_device, AtspiX11KeyGrab *grab)
   if (grab_has_active_duplicate (x11_device, grab))
     return;
 
-  ungrab_key (x11_device, grab->kd->keycode, grab->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK);
+  ungrab_key (x11_device, grab->window, grab->kd->keycode, grab->kd->modifiers & ~ATSPI_VIRTUAL_MODIFIER_MASK);
 }
 
 static void
@@ -276,16 +283,26 @@ refresh_key_grabs (AtspiDeviceX11 *x11_device)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
   GSList *l;
+  int focus_revert;
+
+  XGetInputFocus (priv->display, &priv->focused_window, &focus_revert);
 
   for (l = priv->key_grabs; l; l = l->next)
-  {
-    AtspiX11KeyGrab *grab = l->data;
-    gboolean new_enabled = grab_should_be_enabled (x11_device, grab);
-    if (new_enabled && !grab->enabled)
-      enable_key_grab (x11_device, grab);
-    else if (grab->enabled && !new_enabled)
-      disable_key_grab (x11_device, grab);
-  }
+    {
+      AtspiX11KeyGrab *grab = l->data;
+      if (grab->window != priv->focused_window)
+        disable_key_grab (x11_device, grab);
+    }
+
+  for (l = priv->key_grabs; l; l = l->next)
+    {
+      AtspiX11KeyGrab *grab = l->data;
+      gboolean new_enabled = grab_should_be_enabled (x11_device, grab);
+      if (new_enabled && !grab->enabled)
+        enable_key_grab (x11_device, grab);
+      else if (grab->enabled && !new_enabled)
+        disable_key_grab (x11_device, grab);
+    }
 }
 
 static void
@@ -298,17 +315,17 @@ set_virtual_modifier (AtspiDeviceX11 *x11_device, gint keycode, gboolean enabled
     return;
 
   if (enabled)
-  {
-    if (priv->virtual_mods_enabled & modifier)
-      return;
-    priv->virtual_mods_enabled |= modifier;
-  }
+    {
+      if (priv->virtual_mods_enabled & modifier)
+        return;
+      priv->virtual_mods_enabled |= modifier;
+    }
   else
-  {
-    if (!(priv->virtual_mods_enabled & modifier))
-      return;
-    priv->virtual_mods_enabled &= ~modifier;
-  }
+    {
+      if (!(priv->virtual_mods_enabled & modifier))
+        return;
+      priv->virtual_mods_enabled &= ~modifier;
+    }
 
   refresh_key_grabs (x11_device);
 }
@@ -324,68 +341,69 @@ do_event_dispatch (gpointer user_data)
   KeySym keysym;
   XComposeStatus status;
   guint modifiers;
-  while (XPending (display))
-  {
-    XNextEvent (display, &xevent);
-  XEvent keyevent;
 
-    switch (xevent.type)
+  g_object_ref (device);
+  while (XPending (display))
     {
-    case KeyPress:
-    case KeyRelease:
-      XLookupString(&xevent.xkey, text, sizeof (text), &keysym, &status);
-      modifiers = xevent.xkey.state | priv->virtual_mods_enabled;
-      if (modifiers & priv->numlock_physical_mask)
-      {
-        modifiers |= (1 << ATSPI_MODIFIER_NUMLOCK);
-        modifiers &= ~priv->numlock_physical_mask;
-      }
-      atspi_device_notify_key (ATSPI_DEVICE (device), (xevent.type == KeyPress), xevent.xkey.keycode, keysym, modifiers, text);
-      break;
-    case GenericEvent:
-      if (xevent.xcookie.extension == priv->xi_opcode)
-      {
-        XGetEventData(priv->display, &xevent.xcookie);
-        XIRawEvent *xiRawEv = (XIRawEvent *) xevent.xcookie.data;
-        XIDeviceEvent *xiDevEv = (XIDeviceEvent *) xevent.xcookie.data;
-        switch (xevent.xcookie.evtype)
+      XNextEvent (display, &xevent);
+      XEvent keyevent;
+
+      switch (xevent.type)
         {
-        case XI_KeyPress:
-        case XI_KeyRelease:
-          xi2keyevent (xiDevEv, &keyevent);
-          XLookupString((XKeyEvent *)&keyevent, text, sizeof (text), &keysym, &status);
-          if (text[0] < ' ')
-            text[0] = '\0';
-          /* The deviceid can change. Would be nice to find a better way of
-             handling this */
-          if (priv->device_id && priv->device_id_alt && xiDevEv->deviceid != priv->device_id && xiDevEv->deviceid != priv->device_id_alt)
-            priv->device_id = priv->device_id_alt = 0;
-          else if (priv->device_id && !priv->device_id_alt && xiDevEv->deviceid != priv->device_id)
-            priv->device_id_alt = xiDevEv->deviceid;
-          if (!priv->device_id)
-            priv->device_id = xiDevEv->deviceid;
-          set_virtual_modifier (device, xiRawEv->detail, xevent.xcookie.evtype == XI_KeyPress);
-          modifiers = keyevent.xkey.state | priv->virtual_mods_enabled;
+        case KeyPress:
+        case KeyRelease:
+          XLookupString (&xevent.xkey, text, sizeof (text), &keysym, &status);
+          modifiers = xevent.xkey.state | priv->virtual_mods_enabled;
           if (modifiers & priv->numlock_physical_mask)
-            modifiers |= (1 << ATSPI_MODIFIER_NUMLOCK);
-          if (xiDevEv->deviceid == priv->device_id)
-            atspi_device_notify_key (ATSPI_DEVICE (device), (xevent.xcookie.evtype == XI_KeyPress), xiRawEv->detail, keysym, modifiers, text);
-          /* otherwise it's probably a duplicate event from a key grab */
-          XFreeEventData (priv->display, &xevent.xcookie);
+            {
+              modifiers |= (1 << ATSPI_MODIFIER_NUMLOCK);
+              modifiers &= ~priv->numlock_physical_mask;
+            }
+          atspi_device_notify_key (ATSPI_DEVICE (device), (xevent.type == KeyPress), xevent.xkey.keycode, keysym, modifiers, text);
+          break;
+        case FocusIn:
+          refresh_key_grabs (device);
           break;
+        case GenericEvent:
+          if (xevent.xcookie.extension == priv->xi_opcode)
+            {
+              XGetEventData (priv->display, &xevent.xcookie);
+              XIRawEvent *xiRawEv = (XIRawEvent *) xevent.xcookie.data;
+              XIDeviceEvent *xiDevEv = (XIDeviceEvent *) xevent.xcookie.data;
+              switch (xevent.xcookie.evtype)
+                {
+                case XI_KeyPress:
+                case XI_KeyRelease:
+                  xi2keyevent (xiDevEv, &keyevent);
+                  XLookupString ((XKeyEvent *) &keyevent, text, sizeof (text), &keysym, &status);
+                  if (text[0] < ' ')
+                    text[0] = '\0';
+                  set_virtual_modifier (device, xiRawEv->detail, xevent.xcookie.evtype == XI_KeyPress);
+                  modifiers = keyevent.xkey.state | priv->virtual_mods_enabled;
+                  if (modifiers & priv->numlock_physical_mask)
+                    modifiers |= (1 << ATSPI_MODIFIER_NUMLOCK);
+                  if (xiDevEv->deviceid == xiDevEv->sourceid)
+                    atspi_device_notify_key (ATSPI_DEVICE (device), (xevent.xcookie.evtype == XI_KeyPress), xiRawEv->detail, keysym, modifiers, text);
+                  /* otherwise it's probably a duplicate event from a key grab */
+                  XFreeEventData (priv->display, &xevent.xcookie);
+                  break;
+                case FocusIn:
+                  refresh_key_grabs (device);
+                  break;
+                }
+            }
+        default:
+          if (XFilterEvent (&xevent, None))
+            continue;
         }
-      }
-    default:
-      if (XFilterEvent (&xevent, None))
-        continue;
     }
-  }
+
+  g_object_unref (device);
   return TRUE;
 }
 
-static gboolean  
-event_dispatch (GSource *source, GSourceFunc callback, gpointer  user_data)
+static gboolean
+event_dispatch (GSource *source, GSourceFunc callback, gpointer user_data)
 {
   if (callback)
     callback (user_data);
@@ -405,13 +423,13 @@ display_source_new (Display *display)
   GSource *source = g_source_new (&event_funcs, sizeof (DisplaySource));
   DisplaySource *display_source = (DisplaySource *) source;
   g_source_set_name (source, "[at-spi2-core] display_source_funcs");
-  
+
   display_source->display = display;
-  
+
   return source;
 }
 
-static void 
+static void
 create_event_source (AtspiDeviceX11 *device)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (device);
@@ -420,13 +438,13 @@ create_event_source (AtspiDeviceX11 *device)
   int connection_number = ConnectionNumber (priv->display);
 
   priv->source = display_source_new (priv->display);
-  display_source = (DisplaySource *)priv->source;
+  display_source = (DisplaySource *) priv->source;
 
   g_source_set_priority (priv->source, G_PRIORITY_DEFAULT);
-  
+
   display_source->event_poll_fd.fd = connection_number;
   display_source->event_poll_fd.events = G_IO_IN;
-  
+
   g_source_add_poll (priv->source, &display_source->event_poll_fd);
   g_source_set_can_recurse (priv->source, TRUE);
   g_source_set_callback (priv->source, do_event_dispatch, device, NULL);
@@ -443,11 +461,11 @@ check_virtual_modifier (AtspiDeviceX11 *x11_device, guint modifier)
     return TRUE;
 
   for (l = priv->modifiers; l; l = l->next)
-  {
-    AtspiX11KeyModifier *entry = l->data;
-    if (entry->modifier == modifier)
-      return TRUE;
-  }
+    {
+      AtspiX11KeyModifier *entry = l->data;
+      if (entry->modifier == modifier)
+        return TRUE;
+    }
 
   return FALSE;
 }
@@ -458,11 +476,11 @@ get_unused_virtual_modifier (AtspiDeviceX11 *x11_device)
   guint ret = 0x1000;
 
   while (ret < 0x10000)
-  {
-    if (!check_virtual_modifier (x11_device, ret))
-      return ret;
-    ret <<= 1;
-  }
+    {
+      if (!check_virtual_modifier (x11_device, ret))
+        return ret;
+      ret <<= 1;
+    }
 
   return 0;
 }
@@ -479,11 +497,11 @@ atspi_device_x11_map_modifier (AtspiDevice *device, gint keycode)
   desc = XkbGetMap (priv->display, XkbModifierMapMask, XkbUseCoreKbd);
 
   if (keycode < desc->min_key_code || keycode >= desc->max_key_code)
-  {
-    XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
-    g_warning ("Passed invalid keycode %d", keycode);
-    return 0;
-  }
+    {
+      XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
+      g_warning ("Passed invalid keycode %d", keycode);
+      return 0;
+    }
 
   ret = desc->map->modmap[keycode];
   XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
@@ -512,15 +530,15 @@ atspi_device_x11_unmap_modifier (AtspiDevice *device, gint keycode)
   GSList *l;
 
   for (l = priv->modifiers; l; l = l->next)
-  {
-    AtspiX11KeyModifier *entry = l->data;
-    if (entry->keycode == keycode)
     {
-      priv->modifiers = g_slist_remove (priv->modifiers, entry);
-      g_free (entry);
-      return;
+      AtspiX11KeyModifier *entry = l->data;
+      if (entry->keycode == keycode)
+        {
+          priv->modifiers = g_slist_remove (priv->modifiers, entry);
+          g_free (entry);
+          return;
+        }
     }
-  }
 }
 
 static guint
@@ -534,11 +552,11 @@ atspi_device_x11_get_modifier (AtspiDevice *device, gint keycode)
   desc = XkbGetMap (priv->display, XkbModifierMapMask, XkbUseCoreKbd);
 
   if (keycode < desc->min_key_code || keycode >= desc->max_key_code)
-  {
-    XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
-    g_warning ("Passed invalid keycode %d", keycode);
-    return 0;
-  }
+    {
+      XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
+      g_warning ("Passed invalid keycode %d", keycode);
+      return 0;
+    }
 
   ret = desc->map->modmap[keycode];
   XkbFreeKeyboard (desc, XkbModifierMapMask, TRUE);
@@ -549,40 +567,56 @@ atspi_device_x11_get_modifier (AtspiDevice *device, gint keycode)
 }
 
 static void
+event_listener_cb (AtspiEvent *event, void *user_data)
+{
+  AtspiDeviceX11 *x11_device = user_data;
+
+  refresh_key_grabs (x11_device);
+  g_boxed_free (ATSPI_TYPE_EVENT, event);
+}
+
+static void
 atspi_device_x11_init (AtspiDeviceX11 *device)
 {
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (device);
   int first_event, first_error;
+  int focus_revert;
 
-  priv->display=XOpenDisplay("");
+  priv->display = XOpenDisplay ("");
   g_return_if_fail (priv->display != NULL);
-  priv->window = DefaultRootWindow(priv->display);
+  priv->root_window = DefaultRootWindow (priv->display);
+  XGetInputFocus (priv->display, &priv->focused_window, &focus_revert);
 
-  if (XQueryExtension(priv->display, "XInputExtension", &priv->xi_opcode, &first_event, &first_error)) 
-  {
-    int major = 2;
-    int minor = 1;
-    if (XIQueryVersion(priv->display, &major, &minor) != BadRequest)
+  if (XQueryExtension (priv->display, "XInputExtension", &priv->xi_opcode, &first_event, &first_error))
     {
-      XIEventMask eventmask;
-      unsigned char mask[XIMaskLen (XI_LASTEVENT)] = { 0 };
-
-      eventmask.deviceid = XIAllDevices;
-      eventmask.mask_len = sizeof(mask);
-      eventmask.mask = mask;
-
-      XISetMask (mask, XI_KeyPress);
-      XISetMask (mask, XI_KeyRelease);
-      XISetMask (mask, XI_ButtonPress);
-      XISetMask (mask, XI_ButtonRelease);
-      XISetMask (mask, XI_Motion);
-      XISelectEvents (priv->display, priv->window, &eventmask, 1);
-      create_event_source (device);
+      int major = 2;
+      int minor = 1;
+      if (XIQueryVersion (priv->display, &major, &minor) != BadRequest)
+        {
+          XIEventMask eventmask;
+          unsigned char mask[XIMaskLen (XI_LASTEVENT)] = { 0 };
+
+          eventmask.deviceid = XIAllDevices;
+          eventmask.mask_len = sizeof (mask);
+          eventmask.mask = mask;
+
+          XISetMask (mask, XI_KeyPress);
+          XISetMask (mask, XI_KeyRelease);
+          XISetMask (mask, XI_ButtonPress);
+          XISetMask (mask, XI_ButtonRelease);
+          XISetMask (mask, XI_Motion);
+          XISelectEvents (priv->display, priv->root_window, &eventmask, 1);
+          XSelectInput (priv->display, priv->root_window, FocusChangeMask);
+          create_event_source (device);
+        }
     }
-  }
 
   priv->numlock_physical_mask = XkbKeysymToModifiers (priv->display,
-                                                     XK_Num_Lock);
+                                                      XK_Num_Lock);
+
+  priv->event_listener = atspi_event_listener_new (event_listener_cb, device, NULL);
+  atspi_event_listener_register (priv->event_listener, "window:activate", NULL);
+  atspi_event_listener_register (priv->event_listener, "window:deactivate", NULL);
 }
 
 static void
@@ -590,45 +624,59 @@ atspi_device_x11_finalize (GObject *object)
 {
   AtspiDeviceX11 *device = ATSPI_DEVICE_X11 (object);
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (device);
-  GSList *l;
 
-  for (l = priv->key_grabs; l; l = l->next)
-  {
-    AtspiX11KeyGrab *grab = l->data;
-    disable_key_grab (device, grab);
-    g_boxed_free (ATSPI_TYPE_KEY_DEFINITION, grab->kd);
-    g_free (grab);
-  }
-  g_slist_free (priv->key_grabs);
-  priv->key_grabs = NULL;
+  while (priv->key_grabs)
+    {
+      AtspiX11KeyGrab *grab = priv->key_grabs->data;
+      disable_key_grab (device, grab);
+      g_boxed_free (ATSPI_TYPE_KEY_DEFINITION, grab->kd);
+      g_free (grab);
+      priv->key_grabs = g_slist_remove (priv->key_grabs, grab);
+    }
 
   g_slist_free_full (priv->modifiers, g_free);
   priv->modifiers = NULL;
 
   if (priv->source)
-  {
-    g_source_destroy ((GSource *) priv->source);
-    g_source_unref ((GSource *) priv->source);
-    priv->source = NULL;
+    {
+      g_source_destroy ((GSource *) priv->source);
+      g_source_unref ((GSource *) priv->source);
+      priv->source = NULL;
     }
 
+  /* TODO: deregister event listeners automatically when the listener is finalized */
+  atspi_event_listener_deregister (priv->event_listener, "window:deactivate", NULL);
+  atspi_event_listener_deregister (priv->event_listener, "window:activate", NULL);
+  g_object_unref (priv->event_listener);
+
   device_x11_parent_class->finalize (object);
 }
 
-
-static void
+static gboolean
 atspi_device_x11_add_key_grab (AtspiDevice *device, AtspiKeyDefinition *kd)
 {
   AtspiDeviceX11 *x11_device = ATSPI_DEVICE_X11 (device);
   AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
   AtspiX11KeyGrab *grab;
+  gboolean ret;
 
-  grab = g_new (AtspiX11KeyGrab, 1);
+  grab = g_new0 (AtspiX11KeyGrab, 1);
   grab->kd = g_boxed_copy (ATSPI_TYPE_KEY_DEFINITION, kd);
   grab->enabled = FALSE;
-  priv->key_grabs = g_slist_append (priv->key_grabs, grab);
   if (grab_should_be_enabled (x11_device, grab))
-    enable_key_grab (x11_device, grab);
+    ret = enable_key_grab (x11_device, grab);
+  else
+    ret = TRUE;
+
+  if (ret)
+    priv->key_grabs = g_slist_append (priv->key_grabs, grab);
+  else
+    {
+      g_boxed_free (ATSPI_TYPE_KEY_DEFINITION, grab->kd);
+      g_free (grab);
+    }
+
+  return ret;
 }
 
 static void
@@ -642,15 +690,15 @@ atspi_device_x11_remove_key_grab (AtspiDevice *device, guint id)
   kd = atspi_device_get_grab_by_id (device, id);
 
   for (l = priv->key_grabs; l; l = g_slist_next (l))
-  {
-    AtspiX11KeyGrab *other = l->data;
-    if (other->kd->keycode == kd->keycode && other->kd->modifiers == kd->modifiers)
     {
-      disable_key_grab (x11_device, other);
-      priv->key_grabs = g_slist_remove (priv->key_grabs, other);
-      return;
+      AtspiX11KeyGrab *other = l->data;
+      if (other->kd->keycode == kd->keycode && other->kd->modifiers == kd->modifiers)
+        {
+          disable_key_grab (x11_device, other);
+          priv->key_grabs = g_slist_remove (priv->key_grabs, other);
+          return;
+        }
     }
-  }
 }
 
 static guint
@@ -688,7 +736,7 @@ atspi_device_x11_grab_keyboard (AtspiDevice *device)
   g_return_val_if_fail (priv->display != NULL, FALSE);
 #if 0
   /* THis seems like the right thing to do, but it fails for me */
-  return (XGrabKeyboard (priv->display, priv->window, TRUE, GrabModeAsync, GrabModeSync, CurrentTime)) == 0;
+  return (XGrabKeyboard (priv->display, priv->focused_window, TRUE, GrabModeAsync, GrabModeSync, CurrentTime)) == 0;
 #else
   if (priv->keyboard_grabbed)
     return TRUE;
@@ -697,7 +745,7 @@ atspi_device_x11_grab_keyboard (AtspiDevice *device)
 
   get_keycode_range (x11_device, &min, &max);
   for (i = min; i < max; i++)
-    grab_key (x11_device, i, 0);
+    grab_key (x11_device, priv->focused_window, i, 0);
   return TRUE;
 #endif
 }
@@ -720,13 +768,42 @@ atspi_device_x11_ungrab_keyboard (AtspiDevice *device)
 
   get_keycode_range (x11_device, &min, &max);
   for (i = min; i < max; i++)
-    ungrab_key (x11_device, i, 0);
+    ungrab_key (x11_device, priv->focused_window, i, 0);
 
   refresh_key_grabs (x11_device);
 #endif
 }
 
 static void
+atspi_device_x11_generate_mouse_event (AtspiDevice *device, AtspiAccessible *obj, gint x, gint y, const gchar *name, GError **error)
+{
+  AtspiPoint *p;
+
+  p = atspi_component_get_position (ATSPI_COMPONENT (obj), ATSPI_COORD_TYPE_SCREEN, error);
+  if (p->y == -1 && atspi_accessible_get_role (obj, NULL) == ATSPI_ROLE_APPLICATION)
+    {
+      g_clear_error (error);
+      g_free (p);
+      AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+      if (child)
+        {
+          p = atspi_component_get_position (ATSPI_COMPONENT (child), ATSPI_COORD_TYPE_SCREEN, error);
+          g_object_unref (child);
+        }
+    }
+
+  if (p->y == -1 || p->x == -1)
+    return;
+
+  x += p->x;
+  y += p->y;
+  g_free (p);
+
+  /* TODO: do this in process */
+  atspi_generate_mouse_event (x, y, name, error);
+}
+
+static void
 atspi_device_x11_class_init (AtspiDeviceX11Class *klass)
 {
   AtspiDeviceClass *device_class = ATSPI_DEVICE_CLASS (klass);
@@ -741,6 +818,7 @@ atspi_device_x11_class_init (AtspiDeviceX11Class *klass)
   device_class->get_locked_modifiers = atspi_device_x11_get_locked_modifiers;
   device_class->grab_keyboard = atspi_device_x11_grab_keyboard;
   device_class->ungrab_keyboard = atspi_device_x11_ungrab_keyboard;
+  device_class->generate_mouse_event = atspi_device_x11_generate_mouse_event;
   object_class->finalize = atspi_device_x11_finalize;
 }
 
index 3a91edc..4affc5a 100644 (file)
@@ -3,7 +3,7 @@
  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
  *
  * Copyright 2020 SUSE LLC.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include "glib-object.h"
 
-#include "atspi-types.h"
 #include "atspi-device.h"
+#include "atspi-types.h"
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_DEVICE_X11                        (atspi_device_x11_get_type ())
-#define ATSPI_DEVICE_X11(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_X11, AtspiDeviceX11))
-#define ATSPI_DEVICE_X11_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_X11, AtspiDeviceX11Class))
-#define ATSPI_IS_DEVICE_X11(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_X11))
-#define ATSPI_IS_DEVICE_X11_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_X11))
-#define ATSPI_DEVICE_X11_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_X11, AtspiDeviceX11Class))
+#define ATSPI_TYPE_DEVICE_X11 (atspi_device_x11_get_type ())
+#define ATSPI_DEVICE_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE_X11, AtspiDeviceX11))
+#define ATSPI_DEVICE_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE_X11, AtspiDeviceX11Class))
+#define ATSPI_IS_DEVICE_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE_X11))
+#define ATSPI_IS_DEVICE_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE_X11))
+#define ATSPI_DEVICE_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE_X11, AtspiDeviceX11Class))
 
 typedef struct _AtspiDeviceX11 AtspiDeviceX11;
 struct _AtspiDeviceX11
@@ -56,4 +56,4 @@ AtspiDeviceX11 *atspi_device_x11_new ();
 
 G_END_DECLS
 
-#endif /* _ATSPI_DEVICE_X11_H_ */
+#endif /* _ATSPI_DEVICE_X11_H_ */
index e4a564c..49ac70d 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include "atspi-private.h"
 #include "atspi-device.h"
 #include "atspi-device-legacy.h"
+#include "atspi-device-mutter.h"
 #include "atspi-device-x11.h"
+#include "atspi-private.h"
 
 typedef struct
 {
@@ -51,9 +52,7 @@ atspi_device_init (AtspiDevice *device)
 {
 }
 
-G_DEFINE_TYPE_WITH_CODE (AtspiDevice, atspi_device,
-                        G_TYPE_OBJECT,
-                        G_ADD_PRIVATE (AtspiDevice))
+G_DEFINE_TYPE_WITH_CODE (AtspiDevice, atspi_device, G_TYPE_OBJECT, G_ADD_PRIVATE (AtspiDevice))
 
 static void
 atspi_device_finalize (GObject *object)
@@ -67,9 +66,10 @@ atspi_device_finalize (GObject *object)
   device_parent_class->finalize (object);
 }
 
-static void
+static gboolean
 atspi_device_real_add_key_grab (AtspiDevice *device, AtspiKeyDefinition *kd)
 {
+  return TRUE;
 }
 
 static void
@@ -99,16 +99,27 @@ atspi_device_class_init (AtspiDeviceClass *klass)
 AtspiDevice *
 atspi_device_new ()
 {
+  AtspiDevice *device;
+  const gchar *desktop;
+
 #ifdef HAVE_X11
   if (!g_getenv ("WAYLAND_DISPLAY") && !g_getenv ("ATSPI_USE_LEGACY_DEVICE"))
     return ATSPI_DEVICE (atspi_device_x11_new ());
 #endif
 
+  desktop = g_getenv ("XDG_CURRENT_DESKTOP");
+  if (desktop && !strcmp (desktop, "GNOME"))
+    {
+      device = ATSPI_DEVICE (atspi_device_mutter_new ());
+      if (device)
+        return device;
+    }
+
   return ATSPI_DEVICE (atspi_device_legacy_new ());
 }
 
 static gboolean
-key_matches_modifiers (guint key_mods, guint grab_mods)
+key_matches_modifiers (gint keycode, guint key_mods, guint grab_mods)
 {
   /* The presence or lack thereof of locking modifiers should make no
      difference when testing, but other modifiers should match. If the
@@ -116,33 +127,36 @@ key_matches_modifiers (guint key_mods, guint grab_mods)
      not lock modifiers, then we reject the match. Alt + left arrow should not
      match a grab on left arrow, for instance, but whether numlock is on or
      off would be irrelevant. */
-  key_mods &= ~((1 << ATSPI_MODIFIER_SHIFTLOCK) | (1 << ATSPI_MODIFIER_NUMLOCK));
+  if (_atspi_key_is_on_keypad (keycode))
+    key_mods &= ~((1 << ATSPI_MODIFIER_SHIFTLOCK));
+  else
+    key_mods &= ~((1 << ATSPI_MODIFIER_SHIFTLOCK) | (1 << ATSPI_MODIFIER_NUMLOCK));
   return (key_mods == grab_mods);
 }
 
 gboolean
-atspi_device_notify_key (AtspiDevice *device, gboolean pressed, int keycode, int keysym, gint state, gchar *text)
+atspi_device_notify_key (AtspiDevice *device, gboolean pressed, int keycode, int keysym, gint state, const gchar *text)
 {
   AtspiDevicePrivate *priv = atspi_device_get_instance_private (device);
   GSList *l;
   gboolean ret = FALSE;
 
   for (l = priv->key_watchers; l; l = l->next)
-  {
-    AtspiKeyGrab *grab = l->data;
-    grab->callback (device, pressed, keycode, keysym, state, text, grab->callback_data);
-  }
+    {
+      AtspiKeyGrab *grab = l->data;
+      grab->callback (device, pressed, keycode, keysym, state, text, grab->callback_data);
+    }
 
   for (l = priv->keygrabs; l; l = l->next)
-  {
-    AtspiKeyGrab *grab = l->data;
-    if (keycode == grab->keycode && key_matches_modifiers (state, grab->modifiers))
     {
-      if (grab->callback)
-        grab->callback (device, pressed, keycode, keysym, state, text, grab->callback_data);
-      ret = TRUE;
+      AtspiKeyGrab *grab = l->data;
+      if (keycode == grab->keycode && key_matches_modifiers (keycode, state, grab->modifiers))
+        {
+          if (grab->callback)
+            grab->callback (device, pressed, keycode, keysym, state, text, grab->callback_data);
+          ret = TRUE;
+        }
     }
-  }
 
   return ret;
 }
@@ -154,18 +168,18 @@ is_id_used (AtspiDevice *device, guint id)
   GSList *l;
 
   for (l = priv->key_watchers; l; l = l->next)
-  {
-    AtspiKeyGrab *grab = l->data;
-    if (grab->id == id)
-      return TRUE;
-  }
+    {
+      AtspiKeyGrab *grab = l->data;
+      if (grab->id == id)
+        return TRUE;
+    }
 
   for (l = priv->keygrabs; l; l = l->next)
-  {
-    AtspiKeyGrab *grab = l->data;
-    if (grab->id == id)
-      return TRUE;
-  }
+    {
+      AtspiKeyGrab *grab = l->data;
+      if (grab->id == id)
+        return TRUE;
+    }
 
   return FALSE;
 }
@@ -175,29 +189,14 @@ get_grab_id (AtspiDevice *device)
 {
   AtspiDevicePrivate *priv = atspi_device_get_instance_private (device);
 
-  while (is_id_used (device, priv->last_grab_id)) priv->last_grab_id++;
+  while (is_id_used (device, priv->last_grab_id))
+    priv->last_grab_id++;
   return priv->last_grab_id++;
 }
 
-static gboolean
-grab_has_duplicate (AtspiDevice *device, AtspiKeyGrab *grab)
-{
-  AtspiDevicePrivate *priv = atspi_device_get_instance_private (device);
-  GSList *l;
-
-  for (l = priv->keygrabs; l; l = l->next)
-  {
-    AtspiKeyGrab *other_grab = l->data;
-    if (other_grab->id != grab->id && other_grab->keycode == grab->keycode && other_grab->modifiers == grab->modifiers)
-      return TRUE;
-  }
-
-  return FALSE;
-}
-
 /**
  *atspi_device_add_key_grab:
-* @device: the device.
+ * @device: the device.
  * @kd: a #AtspiKeyDefinition specifying the key code to grab.
  * @callback: (scope notified) (allow-none): the function to call when the
  *            given key is pressed.
@@ -205,14 +204,20 @@ grab_has_duplicate (AtspiDevice *device, AtspiKeyGrab *grab)
  * @callback_destroyed: callback function to be called when @callback is
  *                      destroyed.
  *
- * Returns: an identifier that can be later used to remove the grab.
+ * Returns: an identifier that can be later used to remove the grab, or 0
+ * if the key/modifier combination could not be grabbed.
  * Add a key grab for the given key/modifier combination.
  */
 guint
 atspi_device_add_key_grab (AtspiDevice *device, AtspiKeyDefinition *kd, AtspiKeyCallback callback, void *user_data, GDestroyNotify callback_destroyed)
 {
   AtspiDevicePrivate *priv = atspi_device_get_instance_private (device);
-  AtspiKeyGrab *grab = g_new (AtspiKeyGrab, 1);
+  AtspiKeyGrab *grab;
+
+  if (!ATSPI_DEVICE_GET_CLASS (device)->add_key_grab (device, kd))
+    return 0;
+
+  grab = g_new (AtspiKeyGrab, 1);
   grab->keycode = kd->keycode;
   grab->keysym = kd->keysym;
   grab->modifiers = kd->modifiers;
@@ -222,8 +227,6 @@ atspi_device_add_key_grab (AtspiDevice *device, AtspiKeyDefinition *kd, AtspiKey
   grab->id = get_grab_id (device);
   priv->keygrabs = g_slist_append (priv->keygrabs, grab);
 
-  if (!grab_has_duplicate (device, grab))
-    ATSPI_DEVICE_GET_CLASS (device)->add_key_grab (device, kd);
   return grab->id;
 }
 
@@ -241,24 +244,23 @@ atspi_device_remove_key_grab (AtspiDevice *device, guint id)
   GSList *l;
 
   for (l = priv->keygrabs; l; l = l->next)
-  {
-    AtspiKeyGrab *grab = l->data;
-    if (grab->id == id)
     {
-      if (!grab_has_duplicate (device, grab))
-        ATSPI_DEVICE_GET_CLASS (device)->remove_key_grab (device, id);
-      priv->keygrabs = g_slist_remove (priv->keygrabs, grab);
-      if (grab->callback_destroyed)
-        (*grab->callback_destroyed) (grab->callback);
-      g_free (grab);
-      return;
+      AtspiKeyGrab *grab = l->data;
+      if (grab->id == id)
+        {
+          ATSPI_DEVICE_GET_CLASS (device)->remove_key_grab (device, id);
+          priv->keygrabs = g_slist_remove (priv->keygrabs, grab);
+          if (grab->callback_destroyed)
+            (*grab->callback_destroyed) (grab->callback);
+          g_free (grab);
+          return;
+        }
     }
-  }
 }
 
 /**
  *atspi_device_add_key_watcher:
-* @device: the device.
+ * @device: the device.
  * @callback: (scope notified): the function to call when the given key is
  *            pressed.
  * @user_data: (closure callback): Data to be passed to @callback.
@@ -287,16 +289,16 @@ atspi_device_get_grab_by_id (AtspiDevice *device, guint id)
   GSList *l;
 
   for (l = priv->keygrabs; l; l = l->next)
-  {
-    AtspiKeyGrab *grab = l->data;
-    if (grab->id == id)
     {
-      AtspiKeyDefinition *kd = g_new0 (AtspiKeyDefinition, 1);
-      kd->keycode = grab->keycode;\
-      kd->modifiers = grab->modifiers;
-      return kd;
+      AtspiKeyGrab *grab = l->data;
+      if (grab->id == id)
+        {
+          AtspiKeyDefinition *kd = g_new0 (AtspiKeyDefinition, 1);
+          kd->keycode = grab->keycode;
+          kd->modifiers = grab->modifiers;
+          return kd;
+        }
     }
-  }
   return NULL;
 }
 
@@ -345,7 +347,7 @@ atspi_device_unmap_modifier (AtspiDevice *device, gint keycode)
  * @device: the device.
  * @keycode: the keycode to map.
  *
- * Gets the modifier for a given keycode, if one exists. Does not creatt a new
+ * Gets the modifier for a given keycode, if one exists. Does not create a new
  * mapping. This function should be used when the intention is to query a
  * locking modifier such as num lock via atspi_device_get_locked_modifiers,
  * rather than to add key grabs.
@@ -409,3 +411,30 @@ atspi_device_ungrab_keyboard (AtspiDevice *device)
     ATSPI_DEVICE_GET_CLASS (device)->ungrab_keyboard (device);
 }
 
+/**
+ * atspi_device_generate_mouse_event:
+ * @device: the device.
+ * @obj: The #AtspiAccessible that should receive the click.
+ * @x: a #gint indicating the x coordinate of the mouse event, relative to
+ *     @obj..
+ * @y: a #gint indicating the y coordinate of the mouse event, relative to
+ *     @obj..
+ * @name: a string indicating which mouse event to be synthesized
+ *        (e.g. "b1p", "b1c", "b2r", "rel", "abs").
+ * @error: (allow-none): a pointer to a %NULL #GError pointer, or %NULL
+ *
+ * Synthesizes a mouse event at a specific screen coordinate.
+ * Most AT clients should use the #AccessibleAction interface when
+ * tempted to generate mouse events, rather than this method.
+ * Event names: b1p = button 1 press; b2r = button 2 release;
+ *              b3c = button 3 click; b2d = button 2 double-click;
+ *              abs = absolute motion; rel = relative motion.
+ *
+ * Since: 2.52
+ **/
+void
+atspi_device_generate_mouse_event (AtspiDevice *device, AtspiAccessible *obj, gint x, gint y, const gchar *name, GError **error)
+{
+  if (ATSPI_DEVICE_GET_CLASS (device)->generate_mouse_event)
+    ATSPI_DEVICE_GET_CLASS (device)->generate_mouse_event (device, obj, x, y, name, error);
+}
index a246842..3730a43 100644 (file)
@@ -3,7 +3,7 @@
  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
  *
  * Copyright 2020 SUSE LLC.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_DEVICE                        (atspi_device_get_type ())
-#define ATSPI_DEVICE(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE, AtspiDevice))
-#define ATSPI_DEVICE_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE, AtspiDeviceClass))
-#define ATSPI_IS_DEVICE(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE))
-#define ATSPI_IS_DEVICE_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE))
-#define ATSPI_DEVICE_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE, AtspiDeviceClass))
+#define ATSPI_TYPE_DEVICE (atspi_device_get_type ())
+#define ATSPI_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DEVICE, AtspiDevice))
+#define ATSPI_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_DEVICE, AtspiDeviceClass))
+#define ATSPI_IS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DEVICE))
+#define ATSPI_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_DEVICE))
+#define ATSPI_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_DEVICE, AtspiDeviceClass))
 
 typedef struct _AtspiDevice AtspiDevice;
 struct _AtspiDevice
@@ -48,7 +48,7 @@ struct _AtspiDeviceClass
 {
   GObjectClass parent_class;
 
-  void (*add_key_grab) (AtspiDevice *device, AtspiKeyDefinition *kd);
+  gboolean (*add_key_grab) (AtspiDevice *device, AtspiKeyDefinition *kd);
   void (*remove_key_grab) (AtspiDevice *device, guint id);
   guint (*map_modifier) (AtspiDevice *device, gint keycode);
   void (*unmap_modifier) (AtspiDevice *device, gint keycode);
@@ -56,6 +56,7 @@ struct _AtspiDeviceClass
   gboolean (*grab_keyboard) (AtspiDevice *device);
   void (*ungrab_keyboard) (AtspiDevice *device);
   guint (*get_locked_modifiers) (AtspiDevice *device);
+  void (*generate_mouse_event) (AtspiDevice *device, AtspiAccessible *obj, gint x, gint y, const gchar *name, GError **error);
 };
 
 GType atspi_device_get_type (void);
@@ -76,7 +77,7 @@ typedef void (*AtspiKeyCallback) (AtspiDevice *device, gboolean pressed, guint k
 
 AtspiDevice *atspi_device_new ();
 
-gboolean atspi_device_notify_key (AtspiDevice *device, gboolean pressed, int keycode, int keysym, gint state, gchar *text);
+gboolean atspi_device_notify_key (AtspiDevice *device, gboolean pressed, int keycode, int keysym, gint state, const gchar *text);
 
 guint atspi_device_add_key_grab (AtspiDevice *device, AtspiKeyDefinition *kd, AtspiKeyCallback callback, void *user_data, GDestroyNotify callback_destroyed);
 
@@ -98,6 +99,8 @@ gboolean atspi_device_grab_keyboard (AtspiDevice *device);
 
 void atspi_device_ungrab_keyboard (AtspiDevice *device);
 
+void atspi_device_generate_mouse_event (AtspiDevice *device, AtspiAccessible *obj, gint x, gint y, const gchar *name, GError **error);
+
 G_END_DECLS
 
-#endif /* _ATSPI_DEVICE_H_ */
+#endif /* _ATSPI_DEVICE_H_ */
index a92c0e2..defd0cf 100644 (file)
@@ -27,7 +27,7 @@
  * atspi_document_get_locale:
  * @obj: a pointer to the #AtspiDocument object on which to operate.
  *
- * Gets the locale associated with the document's content, 
+ * Gets the locale associated with the document's content,
  * e.g. the locale for LOCALE_TYPE_MESSAGES.
  *
  * Returns: a string compliant with the POSIX standard for locale description.
@@ -58,12 +58,12 @@ atspi_document_get_locale (AtspiDocument *obj, GError **error)
  **/
 gchar *
 atspi_document_get_attribute_value (AtspiDocument *obj,
-                                     gchar *attribute,
-                                     GError **error)
+                                    const gchar *attribute,
+                                    GError **error)
 {
   return atspi_document_get_document_attribute_value (obj, attribute, error);
 }
-                                     
+
 /**
  * atspi_document_get_document_attribute_value:
  * @obj: a pointer to the #AtspiDocument object on which to operate.
@@ -76,8 +76,8 @@ atspi_document_get_attribute_value (AtspiDocument *obj,
  **/
 gchar *
 atspi_document_get_document_attribute_value (AtspiDocument *obj,
-                                            gchar *attribute,
-                                            GError **error)
+                                             const gchar *attribute,
+                                             GError **error)
 {
   gchar *retval = NULL;
 
@@ -90,15 +90,14 @@ atspi_document_get_document_attribute_value (AtspiDocument *obj,
 
   return retval;
 }
-                                     
 
 /**
  * atspi_document_get_attributes: (rename-to atspi_document_get_document_attributes)
  * @obj: a pointer to the #AtspiDocument object on which to operate.
- * 
+ *
  * Gets all constant attributes for the document as a whole. For attributes
  * that change within the document content, see @atspi_text_get_attribute_run instead.
- * 
+ *
  * Returns: (element-type gchar* gchar*) (transfer full): a #GHashTable
  *          containing the constant attributes of the document, as name-value pairs.
  *
@@ -113,10 +112,10 @@ atspi_document_get_attributes (AtspiDocument *obj, GError **error)
 /**
  * atspi_document_get_document_attributes:
  * @obj: a pointer to the #AtspiDocument object on which to operate.
- * 
+ *
  * Gets all constant attributes for the document as a whole. For attributes
  * that change within the document content, see @atspi_text_get_attribute_run instead.
- * 
+ *
  * Returns: (element-type gchar* gchar*) (transfer full): a #GHashTable
  *          containing the constant attributes of the document, as name-value pairs.
  **/
@@ -125,7 +124,7 @@ atspi_document_get_document_attributes (AtspiDocument *obj, GError **error)
 {
   DBusMessage *message;
 
-    g_return_val_if_fail (obj != NULL, NULL);
+  g_return_val_if_fail (obj != NULL, NULL);
 
   message = _atspi_dbus_call_partial (obj, atspi_interface_document, "GetAttributes", error, "");
   return _atspi_dbus_return_hash_from_message (message);
@@ -174,6 +173,139 @@ atspi_document_get_current_page_number (AtspiDocument *obj, GError **error)
 }
 
 static void
+clear_text_selection (void *data)
+{
+  AtspiTextSelection *selection = data;
+
+  g_clear_object (&selection->start_object);
+  g_clear_object (&selection->end_object);
+}
+
+/**
+ * atspi_document_get_text_selections:
+ * @document: an #AtspiDocument
+ *
+ * Returns an array of AtspiTextSelections within this document.
+ *
+ * Returns: (element-type AtspiTextSelection) (transfer full): a GArray of
+ * AtspiTextSelection structures representing the selection.
+ *
+ * Since: 2.52
+ */
+GArray *
+atspi_document_get_text_selections (AtspiDocument *obj, GError **error)
+{
+  DBusMessage *message;
+  GArray *selections;
+  DBusMessageIter iter, iter_array, iter_struct;
+
+  g_return_val_if_fail (obj != NULL, NULL);
+
+  message = _atspi_dbus_call_partial (obj, atspi_interface_document, "GetTextSelections", error, "");
+  if (!message)
+    return NULL;
+
+  if (strcmp (dbus_message_get_signature (message), "a((so)i(so)ib)") != 0)
+    {
+      dbus_message_unref (message);
+      return NULL;
+    }
+
+  selections = g_array_new (FALSE, TRUE, sizeof (AtspiTextSelection));
+  g_array_set_clear_func (selections, clear_text_selection);
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      AtspiTextSelection selection;
+      dbus_message_iter_recurse (&iter_array, &iter_struct);
+      selection.start_object = _atspi_dbus_consume_accessible (&iter_struct);
+      dbus_message_iter_get_basic (&iter_struct, &selection.start_offset);
+      dbus_message_iter_next (&iter_struct);
+      selection.end_object = _atspi_dbus_consume_accessible (&iter_struct);
+      dbus_message_iter_get_basic (&iter_struct, &selection.end_offset);
+      dbus_message_iter_next (&iter_struct);
+      dbus_message_iter_get_basic (&iter_struct, &selection.start_is_active);
+      g_array_append_val (selections, selection);
+      dbus_message_iter_next (&iter_array);
+    }
+
+  dbus_message_unref (message);
+  return selections;
+}
+
+static void
+append_accessible_to_iter (DBusMessageIter *iter, AtspiAccessible *accessible)
+{
+  DBusMessageIter iter_struct;
+  dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL, &iter_struct);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &accessible->parent.app->bus_name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &accessible->parent.path);
+  dbus_message_iter_close_container (iter, &iter_struct);
+}
+
+/**
+ * atspi_document_set_text_selections:
+ * @document: an #AtspiDocument.
+ * @selections: (element-type AtspiTextSelection): a GArray of AtspiTextSelections
+ *              to be selected.
+ *
+ * Makes 1 or more selections within this document denoted by the given
+ * array of AtspiTextSelections. Any existing physical selection (inside or
+ * outside this document) is replaced by the new selections. All objects within
+ * the given selection ranges must be descendants of this document. Otherwise
+ * FALSE will be returned.
+ *
+ * Returns TRUE if the selection was made successfully; FALSE otherwise.
+ *
+ * Since: 2.52
+ */
+gboolean
+atspi_document_set_text_selections (AtspiDocument *obj,
+                                    GArray *selections,
+                                    GError **error)
+{
+  DBusMessage *message, *reply;
+  AtspiAccessible *accessible;
+  DBusMessageIter iter, iter_struct, iter_array;
+  gint i, count;
+  dbus_bool_t ret = FALSE;
+
+  g_return_val_if_fail (obj != NULL, FALSE);
+  accessible = ATSPI_ACCESSIBLE (obj);
+
+  message = dbus_message_new_method_call (accessible->parent.app->bus_name,
+                                          accessible->parent.path,
+                                          atspi_interface_document,
+                                          "SetTextSelections");
+  count = (selections ? selections->len : 0);
+
+  dbus_message_iter_init_append (message, &iter);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "((so)i(so)ib)", &iter_array);
+  for (i = 0; i < count; i++)
+    {
+      dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
+      AtspiTextSelection *item = &g_array_index (selections, AtspiTextSelection, i);
+      append_accessible_to_iter (&iter_struct, item->start_object);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &item->start_offset);
+      append_accessible_to_iter (&iter_struct, item->end_object);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &item->end_offset);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_BOOLEAN, &item->start_is_active);
+      dbus_message_iter_close_container (&iter_array, &iter_struct);
+    }
+  dbus_message_iter_close_container (&iter, &iter_array);
+
+  reply = _atspi_dbus_send_with_reply_and_block (message, error);
+  if (reply)
+    {
+      dbus_message_get_args (reply, NULL, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
+      dbus_message_unref (reply);
+    }
+  return ret;
+}
+
+static void
 atspi_document_base_init (AtspiDocument *klass)
 {
 }
@@ -183,16 +315,15 @@ atspi_document_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiDocument),
-      (GBaseInitFunc) atspi_document_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiDocument", &tinfo, 0);
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiDocument),
+        (GBaseInitFunc) atspi_document_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
 
-  }
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiDocument", &tinfo, 0);
+    }
   return type;
 }
index 429b8c6..592ac8f 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_DOCUMENT                    (atspi_document_get_type ())
-#define ATSPI_IS_DOCUMENT(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DOCUMENT)
-#define ATSPI_DOCUMENT(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DOCUMENT, AtspiDocument)
-#define ATSPI_DOCUMENT_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_DOCUMENT, AtspiDocument))
+#define ATSPI_TYPE_DOCUMENT (atspi_document_get_type ())
+#define ATSPI_IS_DOCUMENT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_DOCUMENT)
+#define ATSPI_DOCUMENT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_DOCUMENT, AtspiDocument)
+#define ATSPI_DOCUMENT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_DOCUMENT, AtspiDocument))
 
 GType atspi_document_get_type ();
 
+/**
+ * AtspiTextSelection:
+ * @start_object: the AtspiAccessible containing the start of the selection.
+ * @start_offset: the text offset of the beginning of the selection within
+ *                @start_object.
+ * @end_object: the AtspiAccessible containing the end of the selection.
+ * @end_offset: the text offset of the end of the selection within @end_object.
+ * @start_is_active: a gboolean indicating whether the start of the selection
+ *                  is the active point.
+ *
+ * This structure represents a single  text selection within a document. This
+ * selection is defined by two points in the content, where each one is defined
+ * by an AtkObject supporting the AtkText interface and a character offset
+ * relative to it.
+ *
+ * The end object must appear after the start object in the accessibility tree,
+ * i.e. the end object must be reachable from the start object by navigating
+ * forward (next, first child etc).
+ *
+ * This struct also contains a @start_is_active boolean, to communicate if the
+ * start of the selection is the active point or not.
+ *
+ * The active point corresponds to the user's focus or point of interest. The
+ * user moves the active point to expand or collapse the range. The anchor
+ * point is the other point of the range and typically remains constant. In
+ * most cases, anchor is the start of the range and active is the end. However,
+ * when selecting backwards (e.g. pressing shift+left arrow in a text field),
+ * the start of the range is the active point, as the user moves this to
+ * manipulate the selection.
+ */
+typedef struct _AtspiTextSelection AtspiTextSelection;
+struct _AtspiTextSelection
+{
+  AtspiAccessible *start_object;
+  gint start_offset;
+  AtspiAccessible *end_object;
+  gint end_offset;
+  gboolean start_is_active;
+};
+
 struct _AtspiDocument
 {
   GTypeInterface parent;
 };
 
-gchar * atspi_document_get_locale (AtspiDocument *obj, GError **error);
+gchar *atspi_document_get_locale (AtspiDocument *obj, GError **error);
 
 #ifndef ATSPI_DISABLE_DEPRECATED
-gchar * atspi_document_get_attribute_value (AtspiDocument *obj, gchar *attribute, GError **error);
+gchar *atspi_document_get_attribute_value (AtspiDocument *obj, const gchar *attribute, GError **error);
 #endif
 
-gchar * atspi_document_get_document_attribute_value (AtspiDocument *obj, gchar *attribute, GError **error);
+gchar *atspi_document_get_document_attribute_value (AtspiDocument *obj, const gchar *attribute, GError **error);
 
 #ifndef ATSPI_DISABLE_DEPRECATED
-GHashTable * atspi_document_get_attributes (AtspiDocument *obj, GError **error);
+GHashTable *atspi_document_get_attributes (AtspiDocument *obj, GError **error);
 #endif
 
-GHashTable * atspi_document_get_document_attributes (AtspiDocument *obj, GError **error);
+GHashTable *atspi_document_get_document_attributes (AtspiDocument *obj, GError **error);
 
 gint atspi_document_get_page_count (AtspiDocument *obj, GError **error);
 gint atspi_document_get_current_page_number (AtspiDocument *obj, GError **error);
 
+GArray *atspi_document_get_text_selections (AtspiDocument *document, GError **error);
 
+gboolean atspi_document_set_text_selections (AtspiDocument *document, GArray *selections, GError **error);
 G_END_DECLS
 
-#endif /* _ATSPI_DOCUMENT_H_ */
+#endif /* _ATSPI_DOCUMENT_H_ */
index 350617e..a9b8c39 100644 (file)
 
 #include "atspi-private.h"
 
+/**
+ * AtspiEditabletext:
+ *
+ * An interface that provides methods for modifying textual content
+ * of components which support editing.
+ *
+ * Derived from atspi-text, the atspi-editabletext interface
+ * provides methods for modifying textual content of components
+ * which support editing. EditableText also interacts with the
+ * system clipboard via copy, cut, and paste methods.
+ */
+
 #if 0
 /* TODO: implement */
 /**
@@ -84,7 +96,7 @@ atspi_editable_text_set_text_contents (AtspiEditableText *obj,
  * atspi_editable_text_insert_text:
  * @obj: a pointer to the #AtspiEditableText object to modify.
  * @position: a #gint indicating the character offset at which to insert
- *       the new text.  
+ *       the new text.
  * @text: a string representing the text to insert, in UTF-8 encoding.
  * @length:  the number of characters of text to insert, in bytes. If the
  * byte count of text is less than or equal to length, the entire contents
@@ -124,7 +136,7 @@ atspi_editable_text_insert_text (AtspiEditableText *obj,
  *
  * Copies text from an #AtspiEditableText object into the system clipboard.
  *
- * see: #atspi_editable_text_paste_text 
+ * see: #atspi_editable_text_paste_text
  *
  * Returns: #TRUE if the operation was successful, otherwise #FALSE.
  **/
@@ -209,7 +221,7 @@ atspi_editable_text_delete_text (AtspiEditableText *obj,
  * atspi_editable_text_paste_text:
  * @obj: a pointer to the #AtspiEditableText object to modify.
  * @position: a #gint indicating the character offset at which to insert
- *       the new text.  
+ *       the new text.
  *
  * Inserts text from the system clipboard into an #AtspiEditableText object.
  * As with all character offsets, the specified @position may not be the
@@ -243,16 +255,15 @@ atspi_editable_text_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiEditableText),
-      (GBaseInitFunc) atspi_editable_text_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiEditableText", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiEditableText),
+        (GBaseInitFunc) atspi_editable_text_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiEditableText", &tinfo, 0);
+    }
   return type;
 }
index efa5630..ae015a4 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_EDITABLE_TEXT                    (atspi_editable_text_get_type ())
-#define ATSPI_IS_EDITABLE_TEXT(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_EDITABLE_TEXT)
-#define ATSPI_EDITABLE_TEXT(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_EDITABLE_TEXT, AtspiEditableText)
-#define ATSPI_EDITABLE_TEXT_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_EDITABLE_TEXT, AtspiEditableText))
+#define ATSPI_TYPE_EDITABLE_TEXT (atspi_editable_text_get_type ())
+#define ATSPI_IS_EDITABLE_TEXT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_EDITABLE_TEXT)
+#define ATSPI_EDITABLE_TEXT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_EDITABLE_TEXT, AtspiEditableText)
+#define ATSPI_EDITABLE_TEXT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_EDITABLE_TEXT, AtspiEditableText))
 
 GType atspi_editable_text_get_type ();
 
@@ -63,4 +63,4 @@ gboolean atspi_editable_text_paste_text (AtspiEditableText *obj, gint position,
 
 G_END_DECLS
 
-#endif /* _ATSPI_EDITABLE_TEXT_H_ */
+#endif /* _ATSPI_EDITABLE_TEXT_H_ */
index 5a1a872..de49f30 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-DBusHandlerResult _atspi_dbus_handle_Event (DBusConnection *bus, DBusMessage *message, void *data);
-
 void _atspi_send_event (AtspiEvent *e);
 
-DBusHandlerResult _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data);
-
-void
-_atspi_reregister_event_listeners ();
+void _atspi_dbus_handle_event (DBusMessage *message);
+void _atspi_reregister_event_listeners ();
 
 G_END_DECLS
 
-#endif /* _ATSPI_EVENT_LISTENER_H_ */
+#endif /* _ATSPI_EVENT_LISTENER_H_ */
index 5cdc806..a5e3148 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include "atspi-private.h"
 #include "atspi-accessible-private.h"
+#include "atspi-private.h"
+#include <ctype.h>
 #include <string.h>
 #include <strings.h>
-#include <ctype.h>
+
+/**
+ * AtspiEventListener:
+ *
+ * A generic interface implemented by objects for the receipt of event
+ * notifications.
+ *
+ * A generic interface implemented by objects for the receipt of event
+ * notifications. atspi-event-listener is the interface via which clients of
+ * the atspi-registry receive notification of changes to an application's user
+ * interface and content.
+ */
 
 typedef struct
 {
@@ -38,6 +50,7 @@ typedef struct
   char *name;
   char *detail;
   GArray *properties;
+  AtspiAccessible *app;
 } EventListenerEntry;
 
 G_DEFINE_TYPE (AtspiEventListener, atspi_event_listener, G_TYPE_OBJECT)
@@ -73,21 +86,21 @@ callback_ref (void *callback, GDestroyNotify callback_destroyed)
   CallbackInfo *info;
 
   if (!callbacks)
-  {
-    callbacks = g_hash_table_new (g_direct_hash, g_direct_equal);
-    if (!callbacks)
-      return;
-  }
+    {
+      callbacks = g_hash_table_new (g_direct_hash, g_direct_equal);
+      if (!callbacks)
+        return;
+    }
 
   info = g_hash_table_lookup (callbacks, callback);
   if (!info)
-  {
-    info = g_new (CallbackInfo, 1);
-    info->callback = callback;
-    info->callback_destroyed = callback_destroyed;
-    info->ref_count = 1;
-    g_hash_table_insert (callbacks, callback, info);
-  }
+    {
+      info = g_new (CallbackInfo, 1);
+      info->callback = callback;
+      info->callback_destroyed = callback_destroyed;
+      info->ref_count = 1;
+      g_hash_table_insert (callbacks, callback, info);
+    }
   else
     info->ref_count++;
 }
@@ -101,21 +114,21 @@ callback_unref (gpointer callback)
     return;
   info = g_hash_table_lookup (callbacks, callback);
   if (!info)
-  {
-    g_warning ("AT-SPI: Dereferencing invalid callback %p\n", callback);
-    return;
-  }
+    {
+      g_warning ("AT-SPI: Dereferencing invalid callback %p\n", callback);
+      return;
+    }
   info->ref_count--;
   if (info->ref_count == 0)
-  {
+    {
 #if 0
     /* TODO: Figure out why this seg faults from Python */
     if (info->callback_destroyed)
       (*info->callback_destroyed) (info->callback);
 #endif
-    g_free (info);
-    g_hash_table_remove (callbacks, callback);
-  }
+      g_free (info);
+      g_hash_table_remove (callbacks, callback);
+    }
 }
 
 /**
@@ -132,8 +145,8 @@ callback_unref (gpointer callback)
  */
 AtspiEventListener *
 atspi_event_listener_new (AtspiEventListenerCB callback,
-                                 gpointer user_data,
-                                 GDestroyNotify callback_destroyed)
+                          gpointer user_data,
+                          GDestroyNotify callback_destroyed)
 {
   AtspiEventListener *listener = g_object_new (ATSPI_TYPE_EVENT_LISTENER, NULL);
   listener->callback = callback;
@@ -169,7 +182,6 @@ static GList *event_listeners = NULL;
 static GList *pending_removals = NULL;
 static int in_send = 0;
 
-
 static gchar *
 convert_name_from_dbus (const char *name, gboolean path_hack)
 {
@@ -180,25 +192,25 @@ convert_name_from_dbus (const char *name, gboolean path_hack)
   if (!name)
     return g_strdup ("");
 
- ret = g_malloc (g_utf8_strlen (name, -1) * 2 + 1);
 ret = g_malloc (g_utf8_strlen (name, -1) * 2 + 1);
   q = ret;
 
   while (*p)
-  {
-    if (isupper (*p))
-    {
-      if (q > ret)
-        *q++ = '-';
-      *q++ = tolower (*p++);
-    }
-    else if (path_hack && *p == '/')
     {
-      *q++ = ':';
-      p++;
+      if (isupper (*p))
+        {
+          if (q > ret)
+            *q++ = '-';
+          *q++ = tolower (*p++);
+        }
+      else if (path_hack && *p == '/')
+        {
+          *q++ = ':';
+          p++;
+        }
+      else
+        *q++ = *p++;
     }
-    else
-      *q++ = *p++;
-  }
   *q = '\0';
   return ret;
 }
@@ -218,88 +230,88 @@ cache_process_children_changed (AtspiEvent *event)
     return;
 
   if (!strncmp (event->type, "object:children-changed:add", 27))
-  {
-    g_ptr_array_remove (event->source->children, child); /* just to be safe */
-    if (event->detail1 < 0 || event->detail1 > event->source->children->len)
     {
-      event->source->cached_properties &= ~ATSPI_CACHE_CHILDREN;
-      return;
+      g_ptr_array_remove (event->source->children, child); /* just to be safe */
+      if (event->detail1 < 0 || event->detail1 > event->source->children->len)
+        {
+          event->source->cached_properties &= ~ATSPI_CACHE_CHILDREN;
+          return;
+        }
+      /* Unfortunately, there's no g_ptr_array_insert or similar */
+      g_ptr_array_add (event->source->children, NULL);
+      memmove (event->source->children->pdata + event->detail1 + 1,
+               event->source->children->pdata + event->detail1,
+               (event->source->children->len - event->detail1 - 1) * sizeof (gpointer));
+      g_ptr_array_index (event->source->children, event->detail1) = g_object_ref (child);
     }
-    /* Unfortunately, there's no g_ptr_array_insert or similar */
-    g_ptr_array_add (event->source->children, NULL);
-    memmove (event->source->children->pdata + event->detail1 + 1,
-             event->source->children->pdata + event->detail1,
-             (event->source->children->len - event->detail1 - 1) * sizeof (gpointer));
-    g_ptr_array_index (event->source->children, event->detail1) = g_object_ref (child);
-  }
   else
-  {
-    g_ptr_array_remove (event->source->children, child);
-    if (child == child->parent.app->root)
-      g_object_run_dispose (G_OBJECT (child->parent.app));
-  }
+    {
+      g_ptr_array_remove (event->source->children, child);
+      if (child == child->parent.app->root)
+        g_object_run_dispose (G_OBJECT (child->parent.app));
+    }
 }
 
 static void
 cache_process_property_change (AtspiEvent *event)
 {
   if (!strcmp (event->type, "object:property-change:accessible-parent"))
-  {
-    if (event->source->accessible_parent)
-      g_object_unref (event->source->accessible_parent);
-    if (G_VALUE_HOLDS (&event->any_data, ATSPI_TYPE_ACCESSIBLE))
     {
-      event->source->accessible_parent = g_value_dup_object (&event->any_data);
-      _atspi_accessible_add_cache (event->source, ATSPI_CACHE_PARENT);
-    }
-    else
-    {
-      event->source->accessible_parent = NULL;
-      event->source->cached_properties &= ~ATSPI_CACHE_PARENT;
+      if (event->source->accessible_parent)
+        g_object_unref (event->source->accessible_parent);
+      if (G_VALUE_HOLDS (&event->any_data, ATSPI_TYPE_ACCESSIBLE))
+        {
+          event->source->accessible_parent = g_value_dup_object (&event->any_data);
+          _atspi_accessible_add_cache (event->source, ATSPI_CACHE_PARENT);
+        }
+      else
+        {
+          event->source->accessible_parent = NULL;
+          event->source->cached_properties &= ~ATSPI_CACHE_PARENT;
+        }
     }
-  }
   else if (!strcmp (event->type, "object:property-change:accessible-name"))
-  {
-    if (event->source->name)
-      g_free (event->source->name);
-    if (G_VALUE_HOLDS_STRING (&event->any_data))
     {
-      event->source->name = g_value_dup_string (&event->any_data);
-      _atspi_accessible_add_cache (event->source, ATSPI_CACHE_NAME);
-    }
-    else
-    {
-      event->source->name = NULL;
-      event->source->cached_properties &= ~ATSPI_CACHE_NAME;
+      if (event->source->name)
+        g_free (event->source->name);
+      if (G_VALUE_HOLDS_STRING (&event->any_data))
+        {
+          event->source->name = g_value_dup_string (&event->any_data);
+          _atspi_accessible_add_cache (event->source, ATSPI_CACHE_NAME);
+        }
+      else
+        {
+          event->source->name = NULL;
+          event->source->cached_properties &= ~ATSPI_CACHE_NAME;
+        }
     }
-  }
   else if (!strcmp (event->type, "object:property-change:accessible-description"))
-  {
-    if (event->source->description)
-      g_free (event->source->description);
-    if (G_VALUE_HOLDS_STRING (&event->any_data))
     {
-      event->source->description = g_value_dup_string (&event->any_data);
-      _atspi_accessible_add_cache (event->source, ATSPI_CACHE_DESCRIPTION);
-    }
-    else
-    {
-      event->source->description = NULL;
-      event->source->cached_properties &= ~ATSPI_CACHE_DESCRIPTION;
+      if (event->source->description)
+        g_free (event->source->description);
+      if (G_VALUE_HOLDS_STRING (&event->any_data))
+        {
+          event->source->description = g_value_dup_string (&event->any_data);
+          _atspi_accessible_add_cache (event->source, ATSPI_CACHE_DESCRIPTION);
+        }
+      else
+        {
+          event->source->description = NULL;
+          event->source->cached_properties &= ~ATSPI_CACHE_DESCRIPTION;
+        }
     }
-  }
   else if (!strcmp (event->type, "object:property-change:accessible-role"))
-  {
-    if (G_VALUE_HOLDS_INT (&event->any_data))
-    {
-      event->source->role = g_value_get_int (&event->any_data);
-      _atspi_accessible_add_cache (event->source, ATSPI_CACHE_ROLE);
-    }
-    else
     {
-      event->source->cached_properties &= ~ATSPI_CACHE_ROLE;
+      if (G_VALUE_HOLDS_INT (&event->any_data))
+        {
+          event->source->role = g_value_get_int (&event->any_data);
+          _atspi_accessible_add_cache (event->source, ATSPI_CACHE_ROLE);
+        }
+      else
+        {
+          event->source->cached_properties &= ~ATSPI_CACHE_ROLE;
+        }
     }
-  }
 }
 
 static void
@@ -310,6 +322,30 @@ cache_process_state_changed (AtspiEvent *event)
                                  event->detail1);
 }
 
+static void
+cache_process_attributes_changed (AtspiEvent *event)
+{
+  const gchar *name = NULL, *value;
+
+  if (!event->source->attributes)
+    return;
+
+  if (event->type[25] == ':')
+    name = event->type + 26;
+  value = g_value_get_string (&event->any_data);
+
+  if (name && name[0] && value && value[0])
+    {
+      g_hash_table_remove (event->source->attributes, name);
+      g_hash_table_insert (event->source->attributes, g_strdup (name), g_strdup (value));
+    }
+  else
+    {
+      g_clear_pointer (&event->source->attributes, g_hash_table_unref);
+      event->source->attributes = NULL;
+    }
+}
+
 static dbus_bool_t
 demarshal_rect (DBusMessageIter *iter, AtspiRect *rect)
 {
@@ -317,16 +353,20 @@ demarshal_rect (DBusMessageIter *iter, AtspiRect *rect)
   DBusMessageIter iter_struct;
 
   dbus_message_iter_recurse (iter, &iter_struct);
-  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32) return FALSE;
+  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32)
+    return FALSE;
   dbus_message_iter_get_basic (&iter_struct, &x);
   dbus_message_iter_next (&iter_struct);
-  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32) return FALSE;
+  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32)
+    return FALSE;
   dbus_message_iter_get_basic (&iter_struct, &y);
   dbus_message_iter_next (&iter_struct);
-  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32) return FALSE;
+  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32)
+    return FALSE;
   dbus_message_iter_get_basic (&iter_struct, &width);
   dbus_message_iter_next (&iter_struct);
-  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32) return FALSE;
+  if (dbus_message_iter_get_arg_type (&iter_struct) != DBUS_TYPE_INT32)
+    return FALSE;
   dbus_message_iter_get_basic (&iter_struct, &height);
   rect->x = x;
   rect->y = y;
@@ -336,50 +376,67 @@ demarshal_rect (DBusMessageIter *iter, AtspiRect *rect)
 }
 
 static gboolean
-convert_event_type_to_dbus (const char *eventType, char **categoryp, char **namep, char **detailp, GPtrArray **matchrule_array)
+convert_event_type_to_dbus (const char *eventType, char **categoryp, char **namep, char **detailp, AtspiAccessible *app, GPtrArray **matchrule_array)
 {
   gchar *tmp = _atspi_strdup_and_adjust_for_dbus (eventType);
   char *category = NULL, *name = NULL, *detail = NULL;
   char *saveptr = NULL;
 
-  if (tmp == NULL) return FALSE;
+  if (tmp == NULL)
+    return FALSE;
   category = strtok_r (tmp, ":", &saveptr);
-  if (category) category = g_strdup (category);
+  if (category)
+    category = g_strdup (category);
   name = strtok_r (NULL, ":", &saveptr);
   if (name)
-  {
-    name = g_strdup (name);
-    detail = strtok_r (NULL, ":", &saveptr);
-    if (detail) detail = g_strdup (detail);
-  }
-  if (matchrule_array)
-  {
-    gchar *matchrule;
-    (*matchrule_array) = g_ptr_array_new ();
-    matchrule = g_strdup_printf ("type='signal',interface='org.a11y.atspi.Event.%s'", category);
-    if (name && name [0])
     {
-             gchar *new_str = g_strconcat (matchrule, ",member='", name, "'", NULL);
-             g_free (matchrule);
-             matchrule = new_str;
+      name = g_strdup (name);
+      detail = strtok_r (NULL, ":", &saveptr);
+      if (detail)
+        detail = g_strdup (detail);
     }
-    if (detail && detail [0])
+  if (matchrule_array)
     {
-      gchar *new_str = g_strconcat (matchrule, ",arg0='", detail, "'", NULL);
-      g_ptr_array_add (*matchrule_array, new_str);
-      new_str = g_strconcat (matchrule, ",arg0path='", detail, "/'", NULL);
-      g_ptr_array_add (*matchrule_array, new_str);
-      g_free (matchrule);
+      gchar *matchrule;
+      (*matchrule_array) = g_ptr_array_new ();
+      matchrule = g_strdup_printf ("type='signal',interface='org.a11y.atspi.Event.%s'", category);
+      if (app)
+        {
+          gchar *new_str = g_strconcat (matchrule, ",sender='",
+                                        app->parent.app->bus_name, "'",
+                                        NULL);
+          g_free (matchrule);
+          matchrule = new_str;
+        }
+      if (name && name[0])
+        {
+          gchar *new_str = g_strconcat (matchrule, ",member='", name, "'", NULL);
+          g_free (matchrule);
+          matchrule = new_str;
+        }
+      if (detail && detail[0])
+        {
+          gchar *new_str = g_strconcat (matchrule, ",arg0='", detail, "'", NULL);
+          g_ptr_array_add (*matchrule_array, new_str);
+          new_str = g_strconcat (matchrule, ",arg0path='", detail, "/'", NULL);
+          g_ptr_array_add (*matchrule_array, new_str);
+          g_free (matchrule);
+        }
+      else
+        g_ptr_array_add (*matchrule_array, matchrule);
     }
-    else
-      g_ptr_array_add (*matchrule_array, matchrule);
-  }
-  if (categoryp) *categoryp = category;
-  else g_free (category);
-  if (namep) *namep = name;
-  else if (name) g_free (name);
-  if (detailp) *detailp = detail;
-  else if (detail) g_free (detail);
+  if (categoryp)
+    *categoryp = category;
+  else
+    g_free (category);
+  if (namep)
+    *namep = name;
+  else if (name)
+    g_free (name);
+  if (detailp)
+    *detailp = detail;
+  else if (detail)
+    g_free (detail);
   g_free (tmp);
   return TRUE;
 }
@@ -387,18 +444,22 @@ convert_event_type_to_dbus (const char *eventType, char **categoryp, char **name
 static void
 listener_entry_free (EventListenerEntry *e)
 {
-  gpointer callback = (e->callback == remove_datum ? (gpointer)e->user_data : (gpointer)e->callback);
+  gpointer callback = (e->callback == remove_datum ? (gpointer) e->user_data : (gpointer) e->callback);
   g_free (e->event_type);
   g_free (e->category);
   g_free (e->name);
-  if (e->detail) g_free (e->detail);
+  if (e->detail)
+    g_free (e->detail);
   callback_unref (callback);
 
-  for (int i=0; i < e->properties->len; i++)
-    g_free (g_array_index (e->properties, char*, i));
+  for (int i = 0; i < e->properties->len; i++)
+    g_free (g_array_index (e->properties, char *, i));
 
   g_array_free (e->properties, TRUE);
 
+  if (e->app)
+    g_object_unref (e->app);
+
   g_free (e);
 }
 
@@ -434,7 +495,7 @@ listener_entry_free (EventListenerEntry *e)
  *
  *    (other object events)
  *
- *            object:state-changed 
+ *            object:state-changed
  *            object:children-changed
  *            object:visible-data-changed
  *            object:selection-changed
@@ -449,9 +510,10 @@ listener_entry_free (EventListenerEntry *e)
  *            object:column-deleted
  *            object:model-changed
  *            object:active-descendant-changed
+ *            object:announcement
  *
  *  (screen reader events)
-*             screen-reader:region-changed
+ *             screen-reader:region-changed
  *
  *  (window events)
  *
@@ -485,7 +547,7 @@ listener_entry_free (EventListenerEntry *e)
  *            mouse:b3p
  *            mouse:b3r
  *
- * NOTE: this character string may be UTF-8, but should not contain byte 
+ * NOTE: this character string may be UTF-8, but should not contain byte
  * value 56
  *            (ascii ':'), except as a delimiter, since non-UTF-8 string
  *            delimiting functions are used internally.
@@ -500,11 +562,11 @@ listener_entry_free (EventListenerEntry *e)
  **/
 gboolean
 atspi_event_listener_register (AtspiEventListener *listener,
-                                            const gchar              *event_type,
-                                            GError **error)
+                               const gchar *event_type,
+                               GError **error)
 {
   /* TODO: Keep track of which events have been registered, so that we
- * deregister all of them when the event listener is destroyed */
  * deregister all of them when the event listener is destroyed */
 
   return atspi_event_listener_register_from_callback (listener->callback,
                                                       listener->user_data,
@@ -518,9 +580,9 @@ atspi_event_listener_register (AtspiEventListener *listener,
  * @event_type: a character string indicating the type of events for which
  *            notification is requested.  See #atspi_event_listener_register
  * for a description of the format and legal event types.
-* @properties: (element-type gchar*) (transfer none) (allow-none): a list of
+ * @properties: (element-type gchar*) (transfer none) (allow-none): a list of
  *             properties that should be sent along with the event. The
- *             properties are valued for the duration of the event callback.k
+ *             properties are valued for the duration of the event callback.
  *             TODO: Document.
  *
  * Adds an in-process callback function to an existing #AtspiEventListener.
@@ -529,12 +591,12 @@ atspi_event_listener_register (AtspiEventListener *listener,
  **/
 gboolean
 atspi_event_listener_register_full (AtspiEventListener *listener,
-                                            const gchar              *event_type,
-                                            GArray *properties,
-                                            GError **error)
+                                    const gchar *event_type,
+                                    GArray *properties,
+                                    GError **error)
 {
   /* TODO: Keep track of which events have been registered, so that we
- * deregister all of them when the event listener is destroyed */
  * deregister all of them when the event listener is destroyed */
 
   return atspi_event_listener_register_from_callback_full (listener->callback,
                                                            listener->user_data,
@@ -544,37 +606,63 @@ atspi_event_listener_register_full (AtspiEventListener *listener,
                                                            error);
 }
 
+/**
+ * atspi_event_listener_register_with_app:
+ * @listener: The #AtspiEventListener to register against an event type.
+ * @event_type: a character string indicating the type of events for which
+ *            notification is requested.  See #atspi_event_listener_register
+ * for a description of the format and legal event types.
+ * @properties: (element-type gchar*) (transfer none) (allow-none): a list of
+ *             properties that should be sent along with the event. The
+ *             properties are valued for the duration of the event callback.
+ * @app: (allow-none): the application whose events should be reported, or
+ *      %null for all applications.
+ *
+ * Adds an in-process callback function to an existing #AtspiEventListener.
+ *
+ * Returns: #TRUE if successful, otherwise #FALSE.
+ **/
+gboolean
+atspi_event_listener_register_with_app (AtspiEventListener *listener,
+                                        const gchar *event_type,
+                                        GArray *properties,
+                                        AtspiAccessible *app,
+                                        GError **error)
+{
+  return atspi_event_listener_register_from_callback_with_app (listener->callback,
+                                                               listener->user_data,
+                                                               listener->cb_destroyed,
+                                                               event_type,
+                                                               properties,
+                                                               app,
+                                                               error);
+}
+
 static gboolean
 notify_event_registered (EventListenerEntry *e)
 {
+  const char *app_path = (e->app ? e->app->parent.app->bus_name : "");
 
-  if (e->properties)
-    dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
-                                atspi_path_registry,
-                                atspi_interface_registry,
-                                "RegisterEvent",
-                                NULL, "sas", e->event_type,
-                                 e->properties);
-  else
-    dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
-                                atspi_path_registry,
-                                atspi_interface_registry,
-                                "RegisterEvent",
-                                NULL, "s", e->event_type);
+  dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
+                               atspi_path_registry,
+                               atspi_interface_registry,
+                               "RegisterEvent",
+                               NULL, "sass", e->event_type,
+                               e->properties, app_path);
 
   return TRUE;
 }
 
 /**
  * atspi_event_listener_register_from_callback:
- * @callback: (scope notified): the #AtspiEventListenerCB to be registered 
+ * @callback: (scope notified): the #AtspiEventListenerCB to be registered
  * against an event type.
  * @user_data: (closure): User data to be passed to the callback.
  * @callback_destroyed: A #GDestroyNotify called when the callback is destroyed.
  * @event_type: a character string indicating the type of events for which
  *            notification is requested.  See #atspi_event_listener_register
  * for a description of the format.
- * 
+ *
  * Registers an #AtspiEventListenerCB against an @event_type.
  *
  * Returns: #TRUE if successfull, otherwise #FALSE.
@@ -582,16 +670,16 @@ notify_event_registered (EventListenerEntry *e)
  **/
 gboolean
 atspi_event_listener_register_from_callback (AtspiEventListenerCB callback,
-                                            void *user_data,
-                                            GDestroyNotify callback_destroyed,
-                                            const gchar              *event_type,
-                                            GError **error)
+                                             void *user_data,
+                                             GDestroyNotify callback_destroyed,
+                                             const gchar *event_type,
+                                             GError **error)
 {
-  return atspi_event_listener_register_from_callback_full (callback,
-                                                           user_data,
-                                                           callback_destroyed,
-                                                           event_type, NULL,
-                                                           error);
+  return atspi_event_listener_register_from_callback_with_app (callback,
+                                                               user_data,
+                                                               callback_destroyed,
+                                                               event_type, NULL,
+                                                               NULL, error);
 }
 
 static GArray *
@@ -625,11 +713,40 @@ copy_event_properties (GArray *src)
  **/
 gboolean
 atspi_event_listener_register_from_callback_full (AtspiEventListenerCB callback,
-                                                 void *user_data,
-                                                 GDestroyNotify callback_destroyed,
-                                                 const gchar              *event_type,
-                                                 GArray *properties,
-                                                 GError **error)
+                                                  void *user_data,
+                                                  GDestroyNotify callback_destroyed,
+                                                  const gchar *event_type,
+                                                  GArray *properties,
+                                                  GError **error)
+{
+  return atspi_event_listener_register_from_callback_with_app (callback,
+                                                               user_data,
+                                                               callback_destroyed,
+                                                               event_type, NULL,
+                                                               NULL, error);
+}
+
+/**
+ * atspi_event_listener_register_from_callback_with_app:
+ * @callback: (scope async): an #AtspiEventListenerCB function pointer.
+ * @user_data: (closure callback)
+ * @callback_destroyed: (destroy callback)
+ * @event_type:
+ * @properties: (element-type utf8)
+ * @app: (allow-none)
+ * @error:
+ *
+ * Returns: #TRUE if successful, otherwise #FALSE.
+ *
+ **/
+gboolean
+atspi_event_listener_register_from_callback_with_app (AtspiEventListenerCB callback,
+                                                      void *user_data,
+                                                      GDestroyNotify callback_destroyed,
+                                                      const gchar *event_type,
+                                                      GArray *properties,
+                                                      AtspiAccessible *app,
+                                                      GError **error)
 {
   EventListenerEntry *e;
   DBusError d_error;
@@ -642,40 +759,42 @@ atspi_event_listener_register_from_callback_full (AtspiEventListenerCB callback,
     }
 
   if (!event_type)
-  {
-    g_warning ("called atspi_event_listener_register_from_callback with a NULL event_type");
-    return FALSE;
-  }
+    {
+      g_warning ("called atspi_event_listener_register_from_callback with a NULL event_type");
+      return FALSE;
+    }
 
-  e = g_new (EventListenerEntry, 1);
+  e = g_new0 (EventListenerEntry, 1);
   e->event_type = g_strdup (event_type);
   e->callback = callback;
   e->user_data = user_data;
   e->callback_destroyed = callback_destroyed;
-  callback_ref (callback == remove_datum ? (gpointer)user_data : (gpointer)callback,
+  callback_ref (callback == remove_datum ? (gpointer) user_data : (gpointer) callback,
                 callback_destroyed);
-  if (!convert_event_type_to_dbus (event_type, &e->category, &e->name, &e->detail, &matchrule_array))
-  {
-    g_free (e->event_type);
-    g_free (e);
-    return FALSE;
-  }
+  if (!convert_event_type_to_dbus (event_type, &e->category, &e->name, &e->detail, app, &matchrule_array))
+    {
+      g_free (e->event_type);
+      g_free (e);
+      return FALSE;
+    }
+  if (app)
+    e->app = g_object_ref (app);
   e->properties = copy_event_properties (properties);
   event_listeners = g_list_prepend (event_listeners, e);
   for (i = 0; i < matchrule_array->len; i++)
-  {
-    char *matchrule = g_ptr_array_index (matchrule_array, i);
-    dbus_error_init (&d_error);
-    dbus_bus_add_match (_atspi_bus(), matchrule, &d_error);
-    if (dbus_error_is_set (&d_error))
-      {
-        g_warning ("AT-SPI: Adding match: %s", d_error.message);
-        dbus_error_free (&d_error);
-        /* TODO: Set error */
-      }
+    {
+      char *matchrule = g_ptr_array_index (matchrule_array, i);
+      dbus_error_init (&d_error);
+      dbus_bus_add_match (_atspi_bus (), matchrule, &d_error);
+      if (dbus_error_is_set (&d_error))
+        {
+          g_warning ("AT-SPI: Adding match: %s", d_error.message);
+          dbus_error_free (&d_error);
+          /* TODO: Set error */
+        }
 
-    g_free (matchrule);
-  }
+      g_free (matchrule);
+    }
   g_ptr_array_free (matchrule_array, TRUE);
 
   notify_event_registered (e);
@@ -708,16 +827,16 @@ _atspi_reregister_event_listeners ()
  *            and toolkit events (e.g. "Gtk", "AWT").
  *            Examples: "focus:", "Gtk:GtkWidget:button_press_event".
  *
- * Registers an #AtspiEventListenetSimpleCB. The method is similar to 
+ * Registers an #AtspiEventListenetSimpleCB. The method is similar to
  * #atspi_event_listener_register, but @callback takes no user_data.
  *
  * Returns: #TRUE if successfull, otherwise #FALSE.
  **/
 gboolean
 atspi_event_listener_register_no_data (AtspiEventListenerSimpleCB callback,
-                                GDestroyNotify callback_destroyed,
-                                const gchar              *event_type,
-                                GError **error)
+                                       GDestroyNotify callback_destroyed,
+                                       const gchar *event_type,
+                                       GError **error)
 {
   return atspi_event_listener_register_from_callback (remove_datum, callback,
                                                       callback_destroyed,
@@ -727,8 +846,10 @@ atspi_event_listener_register_no_data (AtspiEventListenerSimpleCB callback,
 static gboolean
 is_superset (const gchar *super, const gchar *sub)
 {
-  if (!super || !super [0])
+  if (!super || !super[0])
     return TRUE;
+  if (!sub || !sub[0])
+    return FALSE;
   return (strcmp (super, sub) == 0);
 }
 
@@ -745,8 +866,8 @@ is_superset (const gchar *super, const gchar *sub)
  **/
 gboolean
 atspi_event_listener_deregister (AtspiEventListener *listener,
-                                              const gchar              *event_type,
-                                              GError **error)
+                                 const gchar *event_type,
+                                 GError **error)
 {
   return atspi_event_listener_deregister_from_callback (listener->callback,
                                                         listener->user_data,
@@ -768,67 +889,68 @@ atspi_event_listener_deregister (AtspiEventListener *listener,
  **/
 gboolean
 atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
-                                              void *user_data,
-                                              const gchar              *event_type,
-                                              GError **error)
+                                               void *user_data,
+                                               const gchar *event_type,
+                                               GError **error)
 {
   char *category, *name, *detail;
   GPtrArray *matchrule_array;
   gint i;
   GList *l;
 
-  if (!convert_event_type_to_dbus (event_type, &category, &name, &detail, &matchrule_array))
-  {
-    return FALSE;
-  }
+  if (!convert_event_type_to_dbus (event_type, &category, &name, &detail, NULL, &matchrule_array))
+    {
+      return FALSE;
+    }
   if (!callback)
     {
       return FALSE;
     }
 
   for (l = event_listeners; l;)
-  {
-    EventListenerEntry *e = l->data;
-    if (e->callback == callback &&
-        e->user_data == user_data &&
-        is_superset (category, e->category) &&
-        is_superset (name, e->name) &&
-        is_superset (detail, e->detail))
     {
-      DBusMessage *message, *reply;
-      l = g_list_next (l);
-      if (in_send)
-      {
-        pending_removals = g_list_remove (pending_removals, e);
-        pending_removals = g_list_append (pending_removals, e);
-      }
+      EventListenerEntry *e = l->data;
+      if (e->callback == callback &&
+          e->user_data == user_data &&
+          is_superset (category, e->category) &&
+          is_superset (name, e->name) &&
+          is_superset (detail, e->detail))
+        {
+          DBusMessage *message, *reply;
+          l = g_list_next (l);
+          if (in_send)
+            {
+              pending_removals = g_list_remove (pending_removals, e);
+              pending_removals = g_list_append (pending_removals, e);
+            }
+          else
+            event_listeners = g_list_remove (event_listeners, e);
+          for (i = 0; i < matchrule_array->len; i++)
+            {
+              char *matchrule = g_ptr_array_index (matchrule_array, i);
+              dbus_bus_remove_match (_atspi_bus (), matchrule, NULL);
+            }
+          message = dbus_message_new_method_call (atspi_bus_registry,
+                                                  atspi_path_registry,
+                                                  atspi_interface_registry,
+                                                  "DeregisterEvent");
+          if (!message)
+            return FALSE;
+          dbus_message_append_args (message, DBUS_TYPE_STRING, &event_type, DBUS_TYPE_INVALID);
+          reply = _atspi_dbus_send_with_reply_and_block (message, error);
+          if (reply)
+            dbus_message_unref (reply);
+
+          if (!in_send)
+            listener_entry_free (e);
+        }
       else
-        event_listeners = g_list_remove (event_listeners, e);
-      for (i = 0; i < matchrule_array->len; i++)
-      {
-       char *matchrule = g_ptr_array_index (matchrule_array, i);
-       dbus_bus_remove_match (_atspi_bus(), matchrule, NULL);
-      }
-      message = dbus_message_new_method_call (atspi_bus_registry,
-           atspi_path_registry,
-           atspi_interface_registry,
-           "DeregisterEvent");
-      if (!message)
-      return FALSE;
-      dbus_message_append_args (message, DBUS_TYPE_STRING, &event_type, DBUS_TYPE_INVALID);
-      reply = _atspi_dbus_send_with_reply_and_block (message, error);
-      if (reply)
-        dbus_message_unref (reply);
-
-      if (!in_send)
-        listener_entry_free (e);
+        l = g_list_next (l);
     }
-    else
-      l = g_list_next (l);
-  }
   g_free (category);
   g_free (name);
-  if (detail) g_free (detail);
+  if (detail)
+    g_free (detail);
   for (i = 0; i < matchrule_array->len; i++)
     g_free (g_ptr_array_index (matchrule_array, i));
   g_ptr_array_free (matchrule_array, TRUE);
@@ -849,8 +971,8 @@ atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
  **/
 gboolean
 atspi_event_listener_deregister_no_data (AtspiEventListenerSimpleCB callback,
-                                  const gchar              *event_type,
-                                  GError **error)
+                                         const gchar *event_type,
+                                         GError **error)
 {
   return atspi_event_listener_deregister_from_callback (remove_datum, callback,
                                                         event_type,
@@ -891,7 +1013,7 @@ detail_matches_listener (const char *event_detail, const char *listener_detail)
   if (!event_detail)
     return (listener_detail ? FALSE : TRUE);
 
-  return !(listener_detail [strcspn (listener_detail, ":")] == '\0'
+  return !(listener_detail[strcspn (listener_detail, ":")] == '\0'
                ? strncmp (listener_detail, event_detail,
                           strcspn (event_detail, ":"))
                : strcmp (listener_detail, event_detail));
@@ -914,48 +1036,52 @@ _atspi_send_event (AtspiEvent *e)
   /* Ensure that the value is set to avoid a Python exception */
   /* TODO: Figure out how to do this without using a private field */
   if (e->any_data.g_type == 0)
-  {
-    g_value_init (&e->any_data, G_TYPE_INT);
-    g_value_set_int (&e->any_data, 0);
-  }
-
-  if (!convert_event_type_to_dbus (e->type, &category, &name, &detail, NULL))
-  {
-    g_warning ("AT-SPI: Couldn't parse event: %s\n", e->type);
-    return;
-  }
+    {
+      g_value_init (&e->any_data, G_TYPE_INT);
+      g_value_set_int (&e->any_data, 0);
+    }
+
+  if (!convert_event_type_to_dbus (e->type, &category, &name, &detail, NULL,
+                                   NULL))
+    {
+      g_warning ("AT-SPI: Couldn't parse event: %s\n", e->type);
+      return;
+    }
   in_send++;
   for (l = event_listeners; l; l = g_list_next (l))
-  {
-    EventListenerEntry *entry = l->data;
-    if (!strcmp (category, entry->category) &&
-        (entry->name == NULL || !strcmp (name, entry->name)) &&
-        detail_matches_listener (detail, entry->detail))
     {
-      GList *l2;
-      for (l2 = called_listeners; l2; l2 = l2->next)
-      {
-        EventListenerEntry *e2 = l2->data;
-        if (entry->callback == e2->callback && entry->user_data == e2->user_data)
-          break;
-      }
-      if (!l2)
-      {
-        for (l2 = pending_removals; l2; l2 = l2->next)
+      EventListenerEntry *entry = l->data;
+      if (!strcmp (category, entry->category) &&
+          (entry->name == NULL || !strcmp (name, entry->name)) &&
+          detail_matches_listener (detail, entry->detail) &&
+          (entry->app == NULL || !strcmp (entry->app->parent.app->bus_name,
+                                          e->source->parent.app->bus_name)))
         {
-        if (l2->data == entry)
-          break;
+          GList *l2;
+          for (l2 = called_listeners; l2; l2 = l2->next)
+            {
+              EventListenerEntry *e2 = l2->data;
+              if (entry->callback == e2->callback && entry->user_data == e2->user_data)
+                break;
+            }
+          if (!l2)
+            {
+              for (l2 = pending_removals; l2; l2 = l2->next)
+                {
+                  if (l2->data == entry)
+                    break;
+                }
+            }
+          if (!l2)
+            {
+              entry->callback (atspi_event_copy (e), entry->user_data);
+              called_listeners = g_list_prepend (called_listeners, entry);
+            }
         }
-      }
-      if (!l2)
-      {
-        entry->callback (atspi_event_copy (e), entry->user_data);
-        called_listeners = g_list_prepend (called_listeners, entry);
-      }
     }
-  }
   in_send--;
-  if (detail) g_free (detail);
+  if (detail)
+    g_free (detail);
   g_free (name);
   g_free (category);
   g_list_free (called_listeners);
@@ -964,8 +1090,8 @@ _atspi_send_event (AtspiEvent *e)
   pending_removals = NULL;
 }
 
-DBusHandlerResult
-_atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
+void
+_atspi_dbus_handle_event (DBusMessage *message)
 {
   char *detail = NULL;
   const char *category = dbus_message_get_interface (message);
@@ -981,32 +1107,22 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
   char *p;
   GHashTable *cache = NULL;
 
+  g_assert (strncmp (category, "org.a11y.atspi.Event.", 21) == 0);
+
   if (strcmp (signature, "siiv(so)") != 0 &&
       strcmp (signature, "siiva{sv}") != 0)
-  {
-   g_warning ("Got invalid signature %s for signal %s from interface %s\n", signature, member, category);
-    return DBUS_HANDLER_RESULT_HANDLED;
-  }
+    {
+      g_warning ("Got invalid signature %s for signal %s from interface %s\n", signature, member, category);
+      return;
+    }
 
   memset (&e, 0, sizeof (e));
 
-  if (category)
-  {
-    category = g_utf8_strrchr (category, -1, '.');
-    if (category == NULL)
-    {
-      // TODO: Error
-      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-    }
-    category++;
-  }
-  else
-  {
-    // TODO: Error
-    // Note that the single caller of this function, process_deferred_message(), ignores the return value.
-    // We should probably free the message if we aren't going to process it after all.
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-  }
+  /* Find the plain interface name, e.g. "org.a11y.atspi.Event.ScreenReader" -> "ScreenReader" */
+  category = g_utf8_strrchr (category, -1, '.');
+  g_assert (category != NULL);
+  category++;
+
   dbus_message_iter_get_basic (&iter, &detail);
   dbus_message_iter_next (&iter);
   dbus_message_iter_get_basic (&iter, &detail1);
@@ -1020,108 +1136,112 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
   name = convert_name_from_dbus (member, FALSE);
   detail = convert_name_from_dbus (detail, TRUE);
 
-  if (strcasecmp  (category, name) != 0)
-  {
-    p = g_strconcat (converted_type, ":", name, NULL);
-    g_free (converted_type);
-    converted_type = p;
-  }
-  else if (detail [0] == '\0')
-  {
-    p = g_strconcat (converted_type, ":",  NULL);
-    g_free (converted_type);
-    converted_type = p;
-  }
+  if (strcasecmp (category, name) != 0)
+    {
+      p = g_strconcat (converted_type, ":", name, NULL);
+      g_free (converted_type);
+      converted_type = p;
+    }
+  else if (detail[0] == '\0')
+    {
+      p = g_strconcat (converted_type, ":", NULL);
+      g_free (converted_type);
+      converted_type = p;
+    }
 
   if (detail[0] != '\0')
-  {
-    p = g_strconcat (converted_type, ":", detail, NULL);
-    g_free (converted_type);
-    converted_type = p;
-  }
+    {
+      p = g_strconcat (converted_type, ":", detail, NULL);
+      g_free (converted_type);
+      converted_type = p;
+    }
   e.type = converted_type;
   if (strcmp (category, "ScreenReader") != 0)
-  {
-    e.source = _atspi_ref_accessible (sender, dbus_message_get_path (message));
-    if (e.source == NULL)
     {
-      g_warning ("Got no valid source accessible for signal %s from interface %s\n", member, category);
-      g_free (converted_type);
-      g_free (name);
-      g_free (detail);
-      return DBUS_HANDLER_RESULT_HANDLED;
+      e.source = _atspi_ref_accessible (sender, dbus_message_get_path (message));
+      if (e.source == NULL)
+        {
+          g_warning ("Got no valid source accessible for signal %s from interface %s\n", member, category);
+          g_free (converted_type);
+          g_free (name);
+          g_free (detail);
+          return;
+        }
     }
-  }
 
   dbus_message_iter_recurse (&iter, &iter_variant);
   switch (dbus_message_iter_get_arg_type (&iter_variant))
-  {
-    case DBUS_TYPE_STRUCT:
     {
-      AtspiRect rect;
-      if (demarshal_rect (&iter_variant, &rect))
-      {
-        g_value_init (&e.any_data, ATSPI_TYPE_RECT);
-        g_value_set_boxed (&e.any_data, &rect);
-      }
-      else
+    case DBUS_TYPE_STRUCT:
       {
-        AtspiAccessible *accessible;
-       accessible = _atspi_dbus_return_accessible_from_iter (&iter_variant);
-        if (!strcmp (category, "ScreenReader"))
-        {
-          g_object_unref (e.source);
-          e.source = accessible;
-        }
+        AtspiRect rect;
+        if (demarshal_rect (&iter_variant, &rect))
+          {
+            g_value_init (&e.any_data, ATSPI_TYPE_RECT);
+            g_value_set_boxed (&e.any_data, &rect);
+          }
         else
-        {
-          g_value_init (&e.any_data, ATSPI_TYPE_ACCESSIBLE);
-          g_value_set_instance (&e.any_data, accessible);
-          if (accessible)
-            g_object_unref (accessible);       /* value now owns it */
-        }
+          {
+            AtspiAccessible *accessible;
+            accessible = _atspi_dbus_consume_accessible (&iter_variant);
+            if (!strcmp (category, "ScreenReader"))
+              {
+                g_object_unref (e.source);
+                e.source = accessible;
+              }
+            else
+              {
+                g_value_init (&e.any_data, ATSPI_TYPE_ACCESSIBLE);
+                g_value_set_instance (&e.any_data, accessible);
+                if (accessible)
+                  g_object_unref (accessible); /* value now owns it */
+              }
+          }
+        break;
       }
-      break;
-    }
     case DBUS_TYPE_STRING:
-    {
-      dbus_message_iter_get_basic (&iter_variant, &p);
-      g_value_init (&e.any_data, G_TYPE_STRING);
-      g_value_set_string (&e.any_data, p);
+      {
+        dbus_message_iter_get_basic (&iter_variant, &p);
+        g_value_init (&e.any_data, G_TYPE_STRING);
+        g_value_set_string (&e.any_data, p);
+        break;
+      }
+    default:
       break;
     }
-  default:
-    break;
-  }
 
   g_assert (e.source != NULL);
 
   dbus_message_iter_next (&iter);
   if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY)
-  {
-    /* new form -- parse properties sent with event */
-    cache = _atspi_dbus_update_cache_from_dict (e.source, &iter);
-  }
+    {
+      /* new form -- parse properties sent with event */
+      cache = _atspi_dbus_update_cache_from_dict (e.source, &iter);
+    }
 
   e.sender = _atspi_ref_accessible (sender, ATSPI_DBUS_PATH_ROOT);
 
   if (!strncmp (e.type, "object:children-changed", 23))
-  {
-    cache_process_children_changed (&e);
-  }
+    {
+      cache_process_children_changed (&e);
+    }
   else if (!strncmp (e.type, "object:property-change", 22))
-  {
-    cache_process_property_change (&e);
-  }
+    {
+      cache_process_property_change (&e);
+    }
   else if (!strncmp (e.type, "object:state-changed", 20))
-  {
-    cache_process_state_changed (&e);
-  }
+    {
+      cache_process_state_changed (&e);
+    }
+  else if (!strncmp (e.type, "object:attributes-changed", 25))
+    {
+      cache_process_attributes_changed (&e);
+    }
   else if (!strncmp (e.type, "focus", 5))
-  {
-    /* BGO#663992 - TODO: figure out the real problem */
-    e.source->cached_properties &= ~(ATSPI_CACHE_STATES);
-  }
+    {
+      /* BGO#663992 - TODO: figure out the real problem */
+      e.source->cached_properties &= ~(ATSPI_CACHE_STATES);
+    }
 
   _atspi_send_event (&e);
 
@@ -1134,7 +1254,6 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
   g_object_unref (e.source);
   g_object_unref (e.sender);
   g_value_unset (&e.any_data);
-  return DBUS_HANDLER_RESULT_HANDLED;
 }
 
 G_DEFINE_BOXED_TYPE (AtspiEvent, atspi_event, atspi_event_copy, atspi_event_free)
index b7ad327..b294525 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -40,26 +40,26 @@ GType atspi_event_get_type (void);
  * @user_data: User data which is passed to the callback each time a notification takes place.
  *
  * A function prototype for callbacks via which clients are notified of AT-SPI events.
- * 
+ *
  **/
-typedef void       (*AtspiEventListenerCB)     (AtspiEvent     *event,
-                                                    void                      *user_data);
+typedef void (*AtspiEventListenerCB) (AtspiEvent *event,
+                                      void *user_data);
 
 /**
  * AtspiEventListenerSimpleCB:
  * @event: (transfer full): The event for which notification is sent.
  *
  * Like #AtspiEventlistenerCB, but with no user_data.
- * 
+ *
  **/
-typedef void       (*AtspiEventListenerSimpleCB)     (const AtspiEvent     *event);
+typedef void (*AtspiEventListenerSimpleCB) (const AtspiEvent *event);
 
-#define ATSPI_TYPE_EVENT_LISTENER                        (atspi_event_listener_get_type ())
-#define ATSPI_EVENT_LISTENER(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_EVENT_LISTENER, AtspiEventListener))
-#define ATSPI_EVENT_LISTENER_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_EVENT_LISTENER, AtspiEventListenerClass))
-#define ATSPI_IS_EVENT_LISTENER(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_EVENT_LISTENER))
-#define ATSPI_IS_EVENT_LISTENER_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_EVENT_LISTENER))
-#define ATSPI_EVENT_LISTENER_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_EVENT_LISTENER, AtspiEventListenerClass))
+#define ATSPI_TYPE_EVENT_LISTENER (atspi_event_listener_get_type ())
+#define ATSPI_EVENT_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_EVENT_LISTENER, AtspiEventListener))
+#define ATSPI_EVENT_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_EVENT_LISTENER, AtspiEventListenerClass))
+#define ATSPI_IS_EVENT_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_EVENT_LISTENER))
+#define ATSPI_IS_EVENT_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_EVENT_LISTENER))
+#define ATSPI_EVENT_LISTENER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_EVENT_LISTENER, AtspiEventListenerClass))
 
 typedef struct _AtspiEventListener AtspiEventListener;
 struct _AtspiEventListener
@@ -80,8 +80,8 @@ GType atspi_event_listener_get_type (void);
 
 AtspiEventListener *
 atspi_event_listener_new (AtspiEventListenerCB callback,
-                                 gpointer user_data,
-                                 GDestroyNotify callback_destroyed);
+                          gpointer user_data,
+                          GDestroyNotify callback_destroyed);
 
 AtspiEventListener *
 atspi_event_listener_new_simple (AtspiEventListenerSimpleCB callback,
@@ -89,52 +89,68 @@ atspi_event_listener_new_simple (AtspiEventListenerSimpleCB callback,
 
 gboolean
 atspi_event_listener_register (AtspiEventListener *listener,
-                                const gchar              *event_type,
-                                GError **error);
+                               const gchar *event_type,
+                               GError **error);
 
 gboolean
 atspi_event_listener_register_full (AtspiEventListener *listener,
-                                     const gchar              *event_type,
-                                      GArray *properties,
-                                     GError **error);
+                                    const gchar *event_type,
+                                    GArray *properties,
+                                    GError **error);
+
+gboolean
+atspi_event_listener_register_with_app (AtspiEventListener *listener,
+                                        const gchar *event_type,
+                                        GArray *properties,
+                                        AtspiAccessible *app,
+                                        GError **error);
 
 gboolean
 atspi_event_listener_register_from_callback (AtspiEventListenerCB callback,
-                                            void *user_data,
-                                            GDestroyNotify callback_destroyed,
-                                            const gchar              *event_type,
-                                            GError **error);
+                                             void *user_data,
+                                             GDestroyNotify callback_destroyed,
+                                             const gchar *event_type,
+                                             GError **error);
 
 gboolean
 atspi_event_listener_register_from_callback_full (AtspiEventListenerCB callback,
-                                                 void *user_data,
-                                                 GDestroyNotify callback_destroyed,
-                                                 const gchar              *event_type,
+                                                  void *user_data,
+                                                  GDestroyNotify callback_destroyed,
+                                                  const gchar *event_type,
                                                   GArray *properties,
-                                                 GError **error);
+                                                  GError **error);
+
+gboolean
+atspi_event_listener_register_from_callback_with_app (AtspiEventListenerCB callback,
+                                                      void *user_data,
+                                                      GDestroyNotify callback_destroyed,
+                                                      const gchar *event_type,
+                                                      GArray *properties,
+                                                      AtspiAccessible *app,
+                                                      GError **error);
 
 gboolean
 atspi_event_listener_register_no_data (AtspiEventListenerSimpleCB callback,
-                                GDestroyNotify callback_destroyed,
-                                const gchar              *event_type,
-                                GError **error);
+                                       GDestroyNotify callback_destroyed,
+                                       const gchar *event_type,
+                                       GError **error);
 
 gboolean
 atspi_event_listener_deregister (AtspiEventListener *listener,
-                                const gchar              *event_type,
-                                GError **error);
+                                 const gchar *event_type,
+                                 GError **error);
 
 gboolean
 atspi_event_listener_deregister_from_callback (AtspiEventListenerCB callback,
-                                              void *user_data,
-                                              const gchar              *event_type,
-                                              GError **error);
+                                               void *user_data,
+                                               const gchar *event_type,
+                                               GError **error);
 
 gboolean
 atspi_event_listener_deregister_no_data (AtspiEventListenerSimpleCB callback,
-                                  const gchar              *event_type,
-                                  GError **error);
+                                         const gchar *event_type,
+                                         GError **error);
 
 G_END_DECLS
 
-#endif /* _ATSPI_EVENT_LISTENER_H_ */
+#endif /* _ATSPI_EVENT_LISTENER_H_ */
index 8d74442..941fee8 100644 (file)
@@ -5,17 +5,17 @@
  * Copyright (C) 2005 Red Hat, Inc.
  *
  * Licensed under the Academic Free License version 2.1
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
+ * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
@@ -24,9 +24,9 @@
  * and unnecessary code removed.
  */
 
+#include "glib.h"
 #include <config.h>
 #include <dbus/dbus.h>
-#include "glib.h"
 #include <string.h>
 
 #include <libintl.h>
  */
 typedef struct
 {
-  GSource source; /* the parent GSource */
+  GSource source;             /* the parent GSource */
   DBusConnection *connection; /* the connection to dispatch */
 } DBusGMessageQueue;
 
-static gboolean message_queue_prepare  (GSource     *source,
-                                        gint        *timeout);
-static gboolean message_queue_check    (GSource     *source);
-static gboolean message_queue_dispatch (GSource     *source,
-                                        GSourceFunc  callback,
-                                        gpointer     user_data);
+static gboolean message_queue_prepare (GSource *source,
+                                       gint *timeout);
+static gboolean message_queue_check (GSource *source);
+static gboolean message_queue_dispatch (GSource *source,
+                                        GSourceFunc callback,
+                                        gpointer user_data);
 
 static const GSourceFuncs message_queue_funcs = {
   message_queue_prepare,
@@ -61,13 +61,13 @@ static const GSourceFuncs message_queue_funcs = {
 
 static gboolean
 message_queue_prepare (GSource *source,
-                       gint    *timeout)
+                       gint *timeout)
 {
-  DBusConnection *connection = ((DBusGMessageQueue *)source)->connection;
-  
+  DBusConnection *connection = ((DBusGMessageQueue *) source)->connection;
+
   *timeout = -1;
 
-  return (dbus_connection_get_dispatch_status (connection) == DBUS_DISPATCH_DATA_REMAINS);  
+  return (dbus_connection_get_dispatch_status (connection) == DBUS_DISPATCH_DATA_REMAINS);
 }
 
 static gboolean
@@ -77,17 +77,17 @@ message_queue_check (GSource *source)
 }
 
 static gboolean
-message_queue_dispatch (GSource     *source,
-                        GSourceFunc  callback,
-                        gpointer     user_data)
+message_queue_dispatch (GSource *source,
+                        GSourceFunc callback,
+                        gpointer user_data)
 {
-  DBusConnection *connection = ((DBusGMessageQueue *)source)->connection;
+  DBusConnection *connection = ((DBusGMessageQueue *) source)->connection;
 
   dbus_connection_ref (connection);
 
   /* Only dispatch once - we don't want to starve other GSource */
   dbus_connection_dispatch (connection);
-  
+
   dbus_connection_unref (connection);
 
   return TRUE;
@@ -95,14 +95,13 @@ message_queue_dispatch (GSource     *source,
 
 typedef struct
 {
-  GMainContext *context;      /* the main context */
-  GSList *ios;                /* all IOHandler */
-  GSList *timeouts;           /* all TimeoutHandler */
-  DBusConnection *connection; /* NULL if this is really for a server not a connection */
+  GMainContext *context;         /* the main context */
+  GSList *ios;                   /* all IOHandler */
+  GSList *timeouts;              /* all TimeoutHandler */
+  DBusConnection *connection;    /* NULL if this is really for a server not a connection */
   GSource *message_queue_source; /* DBusGMessageQueue */
 } ConnectionSetup;
 
-
 typedef struct
 {
   ConnectionSetup *cs;
@@ -120,8 +119,8 @@ typedef struct
 dbus_int32_t _dbus_gmain_connection_slot = -1;
 static dbus_int32_t server_slot = -1;
 
-static ConnectionSetup*
-connection_setup_new (GMainContext   *context,
+static ConnectionSetup *
+connection_setup_new (GMainContext *context,
                       DBusConnection *connection)
 {
   ConnectionSetup *cs;
@@ -129,9 +128,9 @@ connection_setup_new (GMainContext   *context,
   cs = g_new0 (ConnectionSetup, 1);
 
   g_assert (context != NULL);
-  
+
   cs->context = context;
-  g_main_context_ref (cs->context);  
+  g_main_context_ref (cs->context);
 
   if (connection)
     {
@@ -139,10 +138,10 @@ connection_setup_new (GMainContext   *context,
 
       cs->message_queue_source = g_source_new ((GSourceFuncs *) &message_queue_funcs,
                                                sizeof (DBusGMessageQueue));
-      ((DBusGMessageQueue*)cs->message_queue_source)->connection = connection;
+      ((DBusGMessageQueue *) cs->message_queue_source)->connection = connection;
       g_source_attach (cs->message_queue_source, cs->context);
     }
-  
+
   return cs;
 }
 
@@ -155,7 +154,7 @@ io_handler_source_finalized (gpointer data)
 
   if (handler->watch)
     dbus_watch_set_data (handler->watch, NULL, NULL);
-  
+
   g_free (handler);
 }
 
@@ -189,9 +188,9 @@ io_handler_watch_freed (void *data)
 }
 
 static gboolean
-io_handler_dispatch (GIOChannel   *source,
-                     GIOCondition  condition,
-                     gpointer      data)
+io_handler_dispatch (GIOChannel *source,
+                     GIOCondition condition,
+                     gpointer data)
 {
   IOHandler *handler;
   guint dbus_condition = 0;
@@ -200,10 +199,10 @@ io_handler_dispatch (GIOChannel   *source,
   handler = data;
 
   connection = handler->cs->connection;
-  
+
   if (connection)
     dbus_connection_ref (connection);
-  
+
   if (condition & G_IO_IN)
     dbus_condition |= DBUS_WATCH_READABLE;
   if (condition & G_IO_OUT)
@@ -222,7 +221,7 @@ io_handler_dispatch (GIOChannel   *source,
 
   if (connection)
     dbus_connection_unref (connection);
-  
+
   return TRUE;
 }
 
@@ -231,16 +230,16 @@ io_handler_dispatch (GIOChannel   *source,
  */
 static void
 connection_setup_add_watch (ConnectionSetup *cs,
-                            DBusWatch       *watch)
+                            DBusWatch *watch)
 {
   guint flags;
   GIOCondition condition;
   GIOChannel *channel;
   IOHandler *handler;
-  
+
   if (!dbus_watch_get_enabled (watch))
     return;
-  
+
   flags = dbus_watch_get_flags (watch);
 
   condition = G_IO_ERR | G_IO_HUP;
@@ -252,23 +251,23 @@ connection_setup_add_watch (ConnectionSetup *cs,
   handler = g_new0 (IOHandler, 1);
   handler->cs = cs;
   handler->watch = watch;
-  
+
   channel = g_io_channel_unix_new (dbus_watch_get_unix_fd (watch));
-  
+
   handler->source = g_io_create_watch (channel, condition);
   g_source_set_callback (handler->source, (GSourceFunc) io_handler_dispatch, handler,
                          io_handler_source_finalized);
   g_source_attach (handler->source, cs->context);
 
   cs->ios = g_slist_prepend (cs->ios, handler);
-  
+
   dbus_watch_set_data (watch, handler, io_handler_watch_freed);
   g_io_channel_unref (channel);
 }
 
 static void
 connection_setup_remove_watch (ConnectionSetup *cs,
-                               DBusWatch       *watch)
+                               DBusWatch *watch)
 {
   IOHandler *handler;
 
@@ -276,7 +275,7 @@ connection_setup_remove_watch (ConnectionSetup *cs,
 
   if (handler == NULL || handler->cs != cs)
     return;
-  
+
   io_handler_destroy_source (handler);
 }
 
@@ -289,7 +288,7 @@ timeout_handler_source_finalized (gpointer data)
 
   if (handler->timeout)
     dbus_timeout_set_data (handler->timeout, NULL, NULL);
-  
+
   g_free (handler);
 }
 
@@ -323,26 +322,26 @@ timeout_handler_timeout_freed (void *data)
 }
 
 static gboolean
-timeout_handler_dispatch (gpointer      data)
+timeout_handler_dispatch (gpointer data)
 {
   TimeoutHandler *handler;
 
   handler = data;
 
   dbus_timeout_handle (handler->timeout);
-  
+
   return TRUE;
 }
 
 static void
 connection_setup_add_timeout (ConnectionSetup *cs,
-                              DBusTimeout     *timeout)
+                              DBusTimeout *timeout)
 {
   TimeoutHandler *handler;
-  
+
   if (!dbus_timeout_get_enabled (timeout))
     return;
-  
+
   handler = g_new0 (TimeoutHandler, 1);
   handler->cs = cs;
   handler->timeout = timeout;
@@ -359,15 +358,15 @@ connection_setup_add_timeout (ConnectionSetup *cs,
 
 static void
 connection_setup_remove_timeout (ConnectionSetup *cs,
-                                 DBusTimeout       *timeout)
+                                 DBusTimeout *timeout)
 {
   TimeoutHandler *handler;
-  
+
   handler = dbus_timeout_get_data (timeout);
 
   if (handler == NULL)
     return;
-  
+
   timeout_handler_destroy_source (handler);
 }
 
@@ -390,27 +389,27 @@ connection_setup_free (ConnectionSetup *cs)
       g_source_destroy (source);
       g_source_unref (source);
     }
-  
+
   g_main_context_unref (cs->context);
   g_free (cs);
 }
 
 static dbus_bool_t
 add_watch (DBusWatch *watch,
-          gpointer   data)
+           gpointer data)
 {
   ConnectionSetup *cs;
 
   cs = data;
 
   connection_setup_add_watch (cs, watch);
-  
+
   return TRUE;
 }
 
 static void
 remove_watch (DBusWatch *watch,
-             gpointer   data)
+              gpointer data)
 {
   ConnectionSetup *cs;
 
@@ -421,7 +420,7 @@ remove_watch (DBusWatch *watch,
 
 static void
 watch_toggled (DBusWatch *watch,
-               void      *data)
+               void *data)
 {
   /* Because we just exit on OOM, enable/disable is
    * no different from add/remove
@@ -434,12 +433,12 @@ watch_toggled (DBusWatch *watch,
 
 static dbus_bool_t
 add_timeout (DBusTimeout *timeout,
-            void        *data)
+             void *data)
 {
   ConnectionSetup *cs;
 
   cs = data;
-  
+
   if (!dbus_timeout_get_enabled (timeout))
     return TRUE;
 
@@ -450,7 +449,7 @@ add_timeout (DBusTimeout *timeout,
 
 static void
 remove_timeout (DBusTimeout *timeout,
-               void        *data)
+                void *data)
 {
   ConnectionSetup *cs;
 
@@ -461,7 +460,7 @@ remove_timeout (DBusTimeout *timeout,
 
 static void
 timeout_toggled (DBusTimeout *timeout,
-                 void        *data)
+                 void *data)
 {
   /* Because we just exit on OOM, enable/disable is
    * no different from add/remove
@@ -480,18 +479,17 @@ wakeup_main (void *data)
   g_main_context_wakeup (cs->context);
 }
 
-
 /* Move to a new context */
-static ConnectionSetup*
-connection_setup_new_from_old (GMainContext    *context,
+static ConnectionSetup *
+connection_setup_new_from_old (GMainContext *context,
                                ConnectionSetup *old)
 {
   ConnectionSetup *cs;
 
   g_assert (old->context != context);
-  
+
   cs = connection_setup_new (context, old->connection);
-  
+
   while (old->ios != NULL)
     {
       IOHandler *handler = old->ios->data;
@@ -529,11 +527,11 @@ connection_setup_new_from_old (GMainContext    *context,
  */
 void
 atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
-                                  GMainContext   *context)
+                                         GMainContext *context)
 {
   ConnectionSetup *old_setup;
   ConnectionSetup *cs;
-  
+
   /* FIXME we never free the slot, so its refcount just keeps growing,
    * which is kind of broken.
    */
@@ -545,7 +543,7 @@ atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
     context = g_main_context_default ();
 
   cs = NULL;
-  
+
   old_setup = dbus_connection_get_data (connection, _dbus_gmain_connection_slot);
   if (old_setup != NULL)
     {
@@ -553,7 +551,7 @@ atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
         return; /* nothing to do */
 
       cs = connection_setup_new_from_old (context, old_setup);
-      
+
       /* Nuke the old setup */
       dbus_connection_set_data (connection, _dbus_gmain_connection_slot, NULL, NULL);
       old_setup = NULL;
@@ -563,9 +561,9 @@ atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
     cs = connection_setup_new (context, connection);
 
   if (!dbus_connection_set_data (connection, _dbus_gmain_connection_slot, cs,
-                                 (DBusFreeFunction)connection_setup_free))
+                                 (DBusFreeFunction) connection_setup_free))
     goto nomem;
-  
+
   if (!dbus_connection_set_watch_functions (connection,
                                             add_watch,
                                             remove_watch,
@@ -579,14 +577,14 @@ atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
                                               timeout_toggled,
                                               cs, NULL))
     goto nomem;
-    
+
   dbus_connection_set_wakeup_main_function (connection,
-                                           wakeup_main,
-                                           cs, NULL);
-      
+                                            wakeup_main,
+                                            cs, NULL);
+
   return;
 
- nomem:
+nomem:
   g_error ("Not enough memory to set up DBusConnection for use with GLib");
 }
 
@@ -605,12 +603,12 @@ atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
  * connection.
  */
 void
-atspi_dbus_server_setup_with_g_main (DBusServer   *server,
-                               GMainContext *context)
+atspi_dbus_server_setup_with_g_main (DBusServer *server,
+                                     GMainContext *context)
 {
   ConnectionSetup *old_setup;
   ConnectionSetup *cs;
-  
+
   /* FIXME we never free the slot, so its refcount just keeps growing,
    * which is kind of broken.
    */
@@ -622,7 +620,7 @@ atspi_dbus_server_setup_with_g_main (DBusServer   *server,
     context = g_main_context_default ();
 
   cs = NULL;
-  
+
   old_setup = dbus_server_get_data (server, server_slot);
   if (old_setup != NULL)
     {
@@ -630,7 +628,7 @@ atspi_dbus_server_setup_with_g_main (DBusServer   *server,
         return; /* nothing to do */
 
       cs = connection_setup_new_from_old (context, old_setup);
-      
+
       /* Nuke the old setup */
       if (!dbus_server_set_data (server, server_slot, NULL, NULL))
         goto nomem;
@@ -641,9 +639,9 @@ atspi_dbus_server_setup_with_g_main (DBusServer   *server,
     cs = connection_setup_new (context, NULL);
 
   if (!dbus_server_set_data (server, server_slot, cs,
-                             (DBusFreeFunction)connection_setup_free))
+                             (DBusFreeFunction) connection_setup_free))
     goto nomem;
-  
+
   if (!dbus_server_set_watch_functions (server,
                                         add_watch,
                                         remove_watch,
@@ -657,9 +655,9 @@ atspi_dbus_server_setup_with_g_main (DBusServer   *server,
                                           timeout_toggled,
                                           cs, NULL))
     goto nomem;
-      
+
   return;
 
- nomem:
+nomem:
   g_error ("Not enough memory to set up DBusServer for use with GLib");
 }
index 9efbe5e..1fc3fb4 100644 (file)
@@ -2,7 +2,7 @@
 /* atspi-gmain.h atspi dbus gmain prototypes
  *
  * Licensed under the Academic Free License version 2.1
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2.1 of the License, or
@@ -12,7 +12,7 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 #ifndef _ATSPI_GMAIN_H
 #define _ATSPI_GMAIN_H
 
+#include <dbus/dbus.h>
+#include <glib.h>
+
 G_BEGIN_DECLS
 
 void
 atspi_dbus_connection_setup_with_g_main (DBusConnection *connection,
-                                  GMainContext   *context);
+                                         GMainContext *context);
 
 void
-atspi_dbus_server_setup_with_g_main (DBusServer   *server,
-                               GMainContext *context);
+atspi_dbus_server_setup_with_g_main (DBusServer *server,
+                                     GMainContext *context);
 
 G_END_DECLS
 
index c01f547..af09175 100644 (file)
 
 #include "atspi-private.h"
 
+/**
+ * AtspiHyperlink:
+ *
+ * Instances of atspi-hyperlink are the means by which end users
+ * and clients interact with linked content.
+ *
+ *  Instances of atspi-hyperlink are returned by
+ * atspi-hypertext objects, and are the means by
+ * which end users and clients interact with linked,
+ * and in some cases embedded, content. These instances
+ * may have multiple "anchors", where an anchor corresponds to a
+ * reference to a particular resource with a corresponding resource
+ * identified (URI).
+ */
+
 G_DEFINE_TYPE (AtspiHyperlink, atspi_hyperlink, ATSPI_TYPE_OBJECT)
 
 static void
@@ -40,7 +55,7 @@ AtspiHyperlink *
 _atspi_hyperlink_new (AtspiApplication *app, const gchar *path)
 {
   AtspiHyperlink *hyperlink;
-  
+
   hyperlink = g_object_new (ATSPI_TYPE_HYPERLINK, NULL);
   hyperlink->parent.app = g_object_ref (app);
   hyperlink->parent.path = g_strdup (path);
@@ -109,7 +124,7 @@ atspi_hyperlink_get_uri (AtspiHyperlink *obj, int i, GError **error)
  * Returns: (transfer full): an #AtspiAccessible that represents the object
  *        associated with the @ith anchor of the specified #AtspiHyperlink.
  **/
-AtspiAccessible*
+AtspiAccessible *
 atspi_hyperlink_get_object (AtspiHyperlink *obj, gint i, GError **error)
 {
   dbus_int32_t d_i = i;
@@ -192,7 +207,6 @@ atspi_hyperlink_get_end_index (AtspiHyperlink *obj, GError **error)
   return d_end_offset;
 }
 
-
 /**
  * atspi_hyperlink_is_valid:
  * @obj: a pointer to the #AtspiHyperlink on which to operate.
index 7caea90..ebfb4e2 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include "atspi-constants.h"
 
-#include "atspi-text.h"        /* for AtspiRange */
+#include "atspi-text.h" /* for AtspiRange */
 #include "atspi-types.h"
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_HYPERLINK                        (atspi_hyperlink_get_type ())
-#define ATSPI_HYPERLINK(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_HYPERLINK, AtspiHyperlink))
-#define ATSPI_HYPERLINK_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_HYPERLINK, AtspiHyperlinkClass))
-#define ATSPI_IS_HYPERLINK(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_HYPERLINK))
-#define ATSPI_IS_HYPERLINK_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_HYPERLINK))
-#define ATSPI_HYPERLINK_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_HYPERLINK, AtspiHyperlinkClass))
+#define ATSPI_TYPE_HYPERLINK (atspi_hyperlink_get_type ())
+#define ATSPI_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_HYPERLINK, AtspiHyperlink))
+#define ATSPI_HYPERLINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_HYPERLINK, AtspiHyperlinkClass))
+#define ATSPI_IS_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_HYPERLINK))
+#define ATSPI_IS_HYPERLINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_HYPERLINK))
+#define ATSPI_HYPERLINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_HYPERLINK, AtspiHyperlinkClass))
 
 struct _AtspiHyperlink
 {
@@ -53,18 +53,18 @@ struct _AtspiHyperlinkClass
   AtspiObjectClass parent_class;
 };
 
-GType atspi_hyperlink_get_type (void); 
+GType atspi_hyperlink_get_type (void);
 
 AtspiHyperlink *
 _atspi_hyperlink_new (AtspiApplication *app, const gchar *path);
 
 gint atspi_hyperlink_get_n_anchors (AtspiHyperlink *obj, GError **error);
 
-gchar * atspi_hyperlink_get_uri (AtspiHyperlink *obj, int i, GError **error);
+gchar *atspi_hyperlink_get_uri (AtspiHyperlink *obj, int i, GError **error);
 
-AtspiAccessibleatspi_hyperlink_get_object (AtspiHyperlink *obj, gint i, GError **error);
+AtspiAccessible *atspi_hyperlink_get_object (AtspiHyperlink *obj, gint i, GError **error);
 
-AtspiRange * atspi_hyperlink_get_index_range (AtspiHyperlink *obj, GError **error);
+AtspiRange *atspi_hyperlink_get_index_range (AtspiHyperlink *obj, GError **error);
 
 gint atspi_hyperlink_get_start_index (AtspiHyperlink *obj, GError **error);
 
@@ -74,4 +74,4 @@ gboolean atspi_hyperlink_is_valid (AtspiHyperlink *obj, GError **error);
 
 G_END_DECLS
 
-#endif /* _ATSPI_HYPERLINK_H_ */
+#endif /* _ATSPI_HYPERLINK_H_ */
index 7ddaab6..24bb757 100644 (file)
 #include "atspi-private.h"
 
 /**
+ * AtspiHypertext:
+ *
+ * An interface used for objects which implement linking between
+ * multiple resource locations.
+ *
+ * An interface used for objects which implement linking between
+ * multiple resource or content locations, or multiple 'markers'
+ * within a single document. A hypertext instance is associated
+ * with one or more hyperlinks which are associated with particular
+ * offsets within the hypertext's content.
+ */
+
+/**
  * atspi_hypertext_get_n_links:
  * @obj: a pointer to the #AtspiHypertext implementor on which to operate.
  *
@@ -64,7 +77,7 @@ atspi_hypertext_get_link (AtspiHypertext *obj, gint link_index, GError **error)
 {
   dbus_int32_t d_link_index = link_index;
   DBusMessage *reply;
-       
+
   g_return_val_if_fail (obj != NULL, NULL);
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_hypertext, "GetLink", error, "i", d_link_index);
@@ -86,7 +99,7 @@ atspi_hypertext_get_link (AtspiHypertext *obj, gint link_index, GError **error)
  **/
 int
 atspi_hypertext_get_link_index (AtspiHypertext *obj,
-                                gint             character_offset,
+                                gint character_offset,
                                 GError **error)
 {
   dbus_int32_t d_character_offset = character_offset;
@@ -109,16 +122,15 @@ atspi_hypertext_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiHypertext),
-      (GBaseInitFunc) atspi_hypertext_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiHypertext", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiHypertext),
+        (GBaseInitFunc) atspi_hypertext_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiHypertext", &tinfo, 0);
+    }
   return type;
 }
index 891fd3a..83e7add 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_HYPERTEXT                    (atspi_hypertext_get_type ())
-#define ATSPI_IS_HYPERTEXT(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_HYPERTEXT)
-#define ATSPI_HYPERTEXT(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_HYPERTEXT, AtspiHypertext)
-#define ATSPI_HYPERTEXT_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_HYPERTEXT, AtspiHypertext))
+#define ATSPI_TYPE_HYPERTEXT (atspi_hypertext_get_type ())
+#define ATSPI_IS_HYPERTEXT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_HYPERTEXT)
+#define ATSPI_HYPERTEXT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_HYPERTEXT, AtspiHypertext)
+#define ATSPI_HYPERTEXT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_HYPERTEXT, AtspiHypertext))
 
 GType atspi_hypertext_get_type ();
 
@@ -48,10 +48,10 @@ struct _AtspiHypertext
 
 gint atspi_hypertext_get_n_links (AtspiHypertext *obj, GError **error);
 
-AtspiHyperlink * atspi_hypertext_get_link (AtspiHypertext *obj, gint link_index, GError **error);
+AtspiHyperlink *atspi_hypertext_get_link (AtspiHypertext *obj, gint link_index, GError **error);
 
-gint atspi_hypertext_get_link_index (AtspiHypertext *obj, gint             character_offset, GError **error);
+gint atspi_hypertext_get_link_index (AtspiHypertext *obj, gint character_offset, GError **error);
 
 G_END_DECLS
 
-#endif /* _ATSPI_HYPERTEXT_H_ */
+#endif /* _ATSPI_HYPERTEXT_H_ */
index 4fd5ae7..40737ab 100644 (file)
@@ -84,8 +84,8 @@ atspi_image_get_image_size (AtspiImage *obj, GError **error)
  * STATE_VISIBLE and STATE_SHOWING.
  *
  * Returns: a pointer to an #AtspiPoint where x and y correspond to the
- * minimum coordinates of the displayed image. 
- * 
+ * minimum coordinates of the displayed image.
+ *
  **/
 AtspiPoint *
 atspi_image_get_image_position (AtspiImage *obj,
@@ -119,13 +119,13 @@ atspi_image_get_image_position (AtspiImage *obj,
  * The returned values are meaningful only if the Image has both
  * STATE_VISIBLE and STATE_SHOWING.
  *
- * Returns: a pointer to an #AtspiRect corresponding to the image's bounding box. The minimum x and y coordinates, 
+ * Returns: a pointer to an #AtspiRect corresponding to the image's bounding box. The minimum x and y coordinates,
  * width, and height are specified.
  **/
 AtspiRect *
 atspi_image_get_image_extents (AtspiImage *obj,
-                              AtspiCoordType ctype,
-                              GError **error)
+                               AtspiCoordType ctype,
+                               GError **error)
 {
   dbus_uint32_t d_ctype = ctype;
   AtspiRect bbox;
@@ -147,7 +147,7 @@ atspi_image_get_image_extents (AtspiImage *obj,
  * Returns: A POSIX LC_MESSAGES-style locale value for image description and text.
  **/
 gchar *
-atspi_image_get_image_locale  (AtspiImage *obj, GError **error)
+atspi_image_get_image_locale (AtspiImage *obj, GError **error)
 {
   gchar *retval = NULL;
 
@@ -168,16 +168,15 @@ atspi_image_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiImage),
-      (GBaseInitFunc) atspi_image_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiImage", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiImage),
+        (GBaseInitFunc) atspi_image_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiImage", &tinfo, 0);
+    }
   return type;
 }
index 57fe3a1..c101223 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_IMAGE                    (atspi_image_get_type ())
-#define ATSPI_IS_IMAGE(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_IMAGE)
-#define ATSPI_IMAGE(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_IMAGE, AtspiImage)
-#define ATSPI_IMAGE_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_IMAGE, AtspiImage))
+#define ATSPI_TYPE_IMAGE (atspi_image_get_type ())
+#define ATSPI_IS_IMAGE(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_IMAGE)
+#define ATSPI_IMAGE(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_IMAGE, AtspiImage)
+#define ATSPI_IMAGE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_IMAGE, AtspiImage))
 
 GType atspi_image_get_type ();
 
@@ -46,16 +46,16 @@ struct _AtspiImage
   GTypeInterface parent;
 };
 
-gchar * atspi_image_get_image_description (AtspiImage *obj, GError **error);
+gchar *atspi_image_get_image_description (AtspiImage *obj, GError **error);
 
-AtspiPoint * atspi_image_get_image_size (AtspiImage *obj, GError **error);
+AtspiPoint *atspi_image_get_image_size (AtspiImage *obj, GError **error);
 
-AtspiPoint * atspi_image_get_image_position (AtspiImage *obj, AtspiCoordType ctype, GError **error);
+AtspiPoint *atspi_image_get_image_position (AtspiImage *obj, AtspiCoordType ctype, GError **error);
 
-AtspiRect * atspi_image_get_image_extents (AtspiImage *obj, AtspiCoordType ctype, GError **error);
+AtspiRect *atspi_image_get_image_extents (AtspiImage *obj, AtspiCoordType ctype, GError **error);
 
-gchar * atspi_image_get_image_locale  (AtspiImage *obj, GError **error);
+gchar *atspi_image_get_image_locale (AtspiImage *obj, GError **error);
 
 G_END_DECLS
 
-#endif /* _ATSPI_IMAGE_H_ */
+#endif /* _ATSPI_IMAGE_H_ */
index a8b579a..df12ba4 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -38,4 +38,4 @@ _atspi_match_rule_marshal (AtspiMatchRule *rule, DBusMessageIter *iter);
 
 G_END_DECLS
 
-#endif /* _ATSPI_MATCH_RULE_PRIVATE_H_ */
+#endif /* _ATSPI_MATCH_RULE_PRIVATE_H_ */
index 6fb4210..a068043 100644 (file)
 
 #include "atspi-private.h"
 
+/**
+ * AtspiMatchRule:
+ *
+ * An interface that allows the definition of match rules
+ * for accessible objects.
+ */
+
 G_DEFINE_TYPE (AtspiMatchRule, atspi_match_rule, G_TYPE_OBJECT)
 
 static void
@@ -37,16 +44,16 @@ atspi_match_rule_dispose (GObject *object)
   AtspiMatchRule *rule = ATSPI_MATCH_RULE (object);
 
   if (rule->states)
-  {
-    g_object_unref (rule->states);
-    rule->states = NULL;
-  }
+    {
+      g_object_unref (rule->states);
+      rule->states = NULL;
+    }
 
   if (rule->attributes)
-  {
-    g_hash_table_unref (rule->attributes);
-    rule->attributes = NULL;
-  }
+    {
+      g_hash_table_unref (rule->attributes);
+      rule->attributes = NULL;
+    }
 
   G_OBJECT_CLASS (atspi_match_rule_parent_class)->dispose (object);
 }
@@ -58,11 +65,11 @@ atspi_match_rule_finalize (GObject *object)
   gint i;
 
   if (rule->interfaces)
-  {
-    for (i = 0; i < rule->interfaces->len; i++)
-      g_free (g_array_index (rule->interfaces, gchar *, i));
-    g_array_free (rule->interfaces, TRUE);
-  }
+    {
+      for (i = 0; i < rule->interfaces->len; i++)
+        g_free (g_array_index (rule->interfaces, gchar *, i));
+      g_array_free (rule->interfaces, TRUE);
+    }
 
   if (rule->attributes)
     g_hash_table_unref (rule->attributes);
@@ -93,8 +100,8 @@ atspi_match_rule_class_init (AtspiMatchRuleClass *klass)
  *          interpret @attributes.
  * @interfaces: (element-type gchar*): An array of interfaces to match, or
  *          NULL if not applicable.  Interface names should be specified
- *          by their DBus names (org.a11y.Atspi.Accessible,
- *          org.a11y.Atspi.Component, etc).
+ *          by the final component of their DBus names (Accessible,
+ *          Component, etc).
  * @interfacematchtype: An #AtspiCollectionMatchType specifying how to
  *          interpret @interfaces.
  * @roles: (element-type AtspiRole): A #GArray of roles to match, or NULL if
@@ -107,7 +114,7 @@ atspi_match_rule_class_init (AtspiMatchRuleClass *klass)
  *          inverting it would match all objects that are not of ROLE_HEADING,
  *          focusable and clickable at the same time.
  *
- * Creates a new #AtspiMatchRule with specified @states, @attributes, 
+ * Creates a new #AtspiMatchRule with specified @states, @attributes,
  * @interfaces, and @roles.
  *
  * Returns: (transfer full): A new #AtspiMatchRule.
@@ -131,44 +138,45 @@ atspi_match_rule_new (AtspiStateSet *states,
   rule->statematchtype = statematchtype;
 
   if (attributes)
-  {
-    GHashTableIter hash_table_iter;
-    gchar *key, *value;
-    rule->attributes = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                              (GDestroyNotify) g_free,
-                                              (GDestroyNotify) g_free);
-    g_hash_table_iter_init (&hash_table_iter, attributes);
-            while (g_hash_table_iter_next (&hash_table_iter, (gpointer *)&key,
-                   (gpointer *)&value))
-      g_hash_table_insert (rule->attributes, g_strdup (key), g_strdup (value));
-  } else
+    {
+      GHashTableIter hash_table_iter;
+      gchar *key, *value;
+      rule->attributes = g_hash_table_new_full (g_str_hash, g_str_equal,
+                                                (GDestroyNotify) g_free,
+                                                (GDestroyNotify) g_free);
+      g_hash_table_iter_init (&hash_table_iter, attributes);
+      while (g_hash_table_iter_next (&hash_table_iter, (gpointer *) &key,
+                                     (gpointer *) &value))
+        g_hash_table_insert (rule->attributes, g_strdup (key), g_strdup (value));
+    }
+  else
     rule->attributes = NULL;
   rule->attributematchtype = attributematchtype;
 
   if (interfaces)
-  {
-    rule->interfaces = g_array_new (TRUE, TRUE, sizeof (gchar *));
-    for (i = 0; i < interfaces->len; i++)
     {
-      gchar *val = g_strdup (g_array_index (interfaces, gchar *, i));
-      rule->interfaces = g_array_append_val (rule->interfaces, val);
+      rule->interfaces = g_array_new (TRUE, TRUE, sizeof (gchar *));
+      for (i = 0; i < interfaces->len; i++)
+        {
+          gchar *val = g_strdup (g_array_index (interfaces, gchar *, i));
+          rule->interfaces = g_array_append_val (rule->interfaces, val);
+        }
     }
-  }
   rule->interfacematchtype = interfacematchtype;
 
   if (roles)
-  {
-    for (i = 0; i < roles->len; i++)
     {
-      AtspiRole role = g_array_index (roles, AtspiRole, i);
-      if (role < 128)
-        rule->roles [role / 32] |= (1 << (role % 32));
-      else
-        g_warning ("AT-SPI: unexpected role %d\n", role);
+      for (i = 0; i < roles->len; i++)
+        {
+          AtspiRole role = g_array_index (roles, AtspiRole, i);
+          if (role < 128)
+            rule->roles[role / 32] |= (1 << (role % 32));
+          else
+            g_warning ("AT-SPI: unexpected role %d\n", role);
+        }
     }
-  }
   else
-    rule->roles [0] = rule->roles [1] = 0;
+    rule->roles[0] = rule->roles[1] = 0;
   rule->rolematchtype = rolematchtype;
 
   rule->invert = invert;
@@ -183,7 +191,7 @@ append_entry (gpointer key, gpointer val, gpointer data)
   DBusMessageIter iter_entry;
 
   if (!dbus_message_iter_open_container (iter, DBUS_TYPE_DICT_ENTRY, NULL,
-                                        &iter_entry))
+                                         &iter_entry))
     return;
   dbus_message_iter_append_basic (&iter_entry, DBUS_TYPE_STRING, &key);
   dbus_message_iter_append_basic (&iter_entry, DBUS_TYPE_STRING, &val);
@@ -194,7 +202,7 @@ gboolean
 _atspi_match_rule_marshal (AtspiMatchRule *rule, DBusMessageIter *iter)
 {
   DBusMessageIter iter_struct, iter_array, iter_dict;
-  dbus_int32_t states [2];
+  dbus_int32_t states[2];
   dbus_int32_t d_statematchtype = rule->statematchtype;
   dbus_int32_t d_attributematchtype = rule->attributematchtype;
   dbus_int32_t d_interfacematchtype = rule->interfacematchtype;
@@ -209,17 +217,17 @@ _atspi_match_rule_marshal (AtspiMatchRule *rule, DBusMessageIter *iter)
 
   /* states */
   if (rule->states)
-  {
-    states [0] = rule->states->states & 0xffffffff;
-    states [1] = rule->states->states >> 32;
-  }
+    {
+      states[0] = rule->states->states & 0xffffffff;
+      states[1] = rule->states->states >> 32;
+    }
   else
-  {
-    states [0] = states [1] = 0;
-  }
+    {
+      states[0] = states[1] = 0;
+    }
   dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "i", &iter_array);
-  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &states [0]);
-  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &states [1]);
+  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &states[0]);
+  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &states[1]);
   dbus_message_iter_close_container (&iter_struct, &iter_array);
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_statematchtype);
 
@@ -233,15 +241,15 @@ _atspi_match_rule_marshal (AtspiMatchRule *rule, DBusMessageIter *iter)
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_attributematchtype);
 
   if (!dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "i",
-      &iter_array))
+                                         &iter_array))
     return FALSE;
-  d_role = rule->roles [0];
+  d_role = rule->roles[0];
   dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &d_role);
-  d_role = rule->roles [1];
+  d_role = rule->roles[1];
   dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &d_role);
-  d_role = rule->roles [2];
+  d_role = rule->roles[2];
   dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &d_role);
-  d_role = rule->roles [3];
+  d_role = rule->roles[3];
   dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_INT32, &d_role);
   dbus_message_iter_close_container (&iter_struct, &iter_array);
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32,
@@ -249,16 +257,16 @@ _atspi_match_rule_marshal (AtspiMatchRule *rule, DBusMessageIter *iter)
 
   /* interfaces */
   if (!dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "s",
-      &iter_array))
+                                         &iter_array))
     return FALSE;
   if (rule->interfaces)
-  {
-    for (i = 0; i < rule->interfaces->len; i++)
     {
-      char *val = g_array_index (rule->interfaces, gchar *, i);
-      dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &val);
+      for (i = 0; i < rule->interfaces->len; i++)
+        {
+          char *val = g_array_index (rule->interfaces, gchar *, i);
+          dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &val);
+        }
     }
-  }
   dbus_message_iter_close_container (&iter_struct, &iter_array);
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_interfacematchtype);
 
index ddcb0d6..09ae1ec 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include "glib-object.h"
 
-#include "atspi-stateset.h"
 #include "atspi-constants.h"
+#include "atspi-stateset.h"
 #include "atspi-types.h"
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_MATCH_RULE                        (atspi_match_rule_get_type ())
-#define ATSPI_MATCH_RULE(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_MATCH_RULE, AtspiMatchRule))
-#define ATSPI_MATCH_RULE_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_MATCH_RULE, AtspiMatchRuleClass))
-#define ATSPI_IS_MATCH_RULE(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_MATCH_RULE))
-#define ATSPI_IS_MATCH_RULE_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_MATCH_RULE))
-#define ATSPI_MATCH_RULE_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_MATCH_RULE, AtspiMatchRuleClass))
+#define ATSPI_TYPE_MATCH_RULE (atspi_match_rule_get_type ())
+#define ATSPI_MATCH_RULE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_MATCH_RULE, AtspiMatchRule))
+#define ATSPI_MATCH_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_MATCH_RULE, AtspiMatchRuleClass))
+#define ATSPI_IS_MATCH_RULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_MATCH_RULE))
+#define ATSPI_IS_MATCH_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_MATCH_RULE))
+#define ATSPI_MATCH_RULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_MATCH_RULE, AtspiMatchRuleClass))
 
 typedef struct _AtspiMatchRule AtspiMatchRule;
 struct _AtspiMatchRule
@@ -51,7 +51,7 @@ struct _AtspiMatchRule
   AtspiCollectionMatchType attributematchtype;
   GArray *interfaces;
   AtspiCollectionMatchType interfacematchtype;
-  gint roles [4];
+  gint roles[4];
   AtspiCollectionMatchType rolematchtype;
   gboolean invert;
 };
@@ -77,4 +77,4 @@ atspi_match_rule_new (AtspiStateSet *states,
 
 G_END_DECLS
 
-#endif /* _ATSPI_MATCH_RULE_H_ */
+#endif /* _ATSPI_MATCH_RULE_H_ */
index fb78b02..89b900b 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -73,15 +73,15 @@ extern const char *atspi_interface_value;
 /* function prototypes */
 gint _atspi_get_iface_num (const char *iface);
 
-DBusConnection * _atspi_bus ();
+DBusConnection *_atspi_bus ();
 
-AtspiAccessible * _atspi_ref_accessible (const char *app, const char *path);
+AtspiAccessible *_atspi_ref_accessible (const char *app, const char *path);
 
 AtspiAccessible *
 _atspi_dbus_return_accessible_from_message (DBusMessage *message);
 
 AtspiAccessible *
-_atspi_dbus_return_accessible_from_iter (DBusMessageIter *iter);
+_atspi_dbus_consume_accessible (DBusMessageIter *iter);
 
 AtspiHyperlink *
 _atspi_dbus_return_hyperlink_from_message (DBusMessage *message);
@@ -93,11 +93,9 @@ dbus_bool_t _atspi_dbus_call (gpointer obj, const char *interface, const char *m
 
 DBusMessage *_atspi_dbus_call_partial (gpointer obj, const char *interface, const char *method, GError **error, const char *type, ...);
 
-DBusMessage *_atspi_dbus_call_partial_va (gpointer obj, const char *interface, const char *method, GError **error, const char *type, va_list args);
-
 dbus_bool_t _atspi_dbus_get_property (gpointer obj, const char *interface, const char *name, GError **error, const char *type, void *data);
 
-DBusMessage * _atspi_dbus_send_with_reply_and_block (DBusMessage *message, GError **error);
+DBusMessage *_atspi_dbus_send_with_reply_and_block (DBusMessage *message, GError **error);
 
 GHashTable *_atspi_dbus_return_hash_from_message (DBusMessage *message);
 
@@ -111,25 +109,24 @@ void _atspi_dbus_set_interfaces (AtspiAccessible *accessible, DBusMessageIter *i
 
 void _atspi_dbus_set_state (AtspiAccessible *accessible, DBusMessageIter *iter);
 
-#define _ATSPI_DBUS_CHECK_SIG(message, type, error, ret) \
-  if (!message) \
-    return (ret); \
-  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) \
-  { \
-    const char *err; \
-    dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &err, DBUS_TYPE_INVALID); \
-    if (err) \
-      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err); \
-    dbus_message_unref (message); \
-    return ret; \
-  } \
-  if (strcmp (dbus_message_get_signature (message), type) != 0) \
-  { \
-    g_warning ("AT-SPI: Expected message signature %s but got %s at %s line %d", type, dbus_message_get_signature (message), __FILE__, __LINE__); \
-    dbus_message_unref (message); \
-    return (ret); \
-  }
-
+#define _ATSPI_DBUS_CHECK_SIG(message, type, error, ret)                                                                                            \
+  if (!message)                                                                                                                                     \
+    return (ret);                                                                                                                                   \
+  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)                                                                                   \
+    {                                                                                                                                               \
+      const char *err;                                                                                                                              \
+      dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &err, DBUS_TYPE_INVALID);                                                             \
+      if (err)                                                                                                                                      \
+        g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err);                                                                             \
+      dbus_message_unref (message);                                                                                                                 \
+      return ret;                                                                                                                                   \
+    }                                                                                                                                               \
+  if (strcmp (dbus_message_get_signature (message), type) != 0)                                                                                     \
+    {                                                                                                                                               \
+      g_warning ("AT-SPI: Expected message signature %s but got %s at %s line %d", type, dbus_message_get_signature (message), __FILE__, __LINE__); \
+      dbus_message_unref (message);                                                                                                                 \
+      return (ret);                                                                                                                                 \
+    }
 
 /**
  * ATSPI_ERROR:
@@ -138,7 +135,7 @@ void _atspi_dbus_set_state (AtspiAccessible *accessible, DBusMessageIter *iter);
  * be from the #ATSPIAtspiError enumeration. See #GError for information on
  * error domains.
  */
-#define ATSPI_ERROR _atspi_error_quark()
+#define ATSPI_ERROR _atspi_error_quark ()
 GQuark _atspi_error_quark (void);
 
 /**
@@ -149,7 +146,6 @@ typedef enum
 {
   ATSPI_ERROR_APPLICATION_GONE,
   ATSPI_ERROR_IPC,
-  ATSPI_ERROR_SYNC_NOT_ALLOWED,
 } AtspiError;
 
 extern GMainLoop *atspi_main_loop;
@@ -161,15 +157,11 @@ gchar *_atspi_name_compat (gchar *in);
 
 GHashTable *_atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter *iter);
 
-gboolean _atspi_get_allow_sync ();
-
-gboolean _atspi_set_allow_sync (gboolean val);
-
-void _atspi_set_error_no_sync (GError **error);
-
 gboolean _atspi_prepare_screen_reader_interface ();
 
-gchar * _atspi_strdup_and_adjust_for_dbus (const char *s);
+gchar *_atspi_strdup_and_adjust_for_dbus (const char *s);
+
+gboolean _atspi_key_is_on_keypad (gint keycode);
 G_END_DECLS
 
-#endif /* _ATSPI_MISC_PRIVATE_H_ */
+#endif /* _ATSPI_MISC_PRIVATE_H_ */
index d896afb..5813d0a 100644 (file)
 #include "X11/Xlib.h"
 #endif
 #include "atspi-gmain.h"
+#include <ctype.h>
+#include <locale.h>
 #include <stdio.h>
 #include <string.h>
-#include <ctype.h>
+
+/**
+ * AtspiMisc:
+ *
+ * Miscellaneous methods for using AT-SPI services.
+ */
+
+/* These are listed here for extraction by intltool */
+#if 0
+  N_("invalid")
+  N_("accelerator label")
+  N_("alert")
+  N_("animation")
+  N_("arrow")
+  N_("calendar")
+  N_("canvas")
+  N_("check box")
+  N_("check menu item")
+  N_("color chooser")
+  N_("column header")
+  N_("combo box")
+  N_("dateeditor")
+  N_("desktop icon")
+  N_("desktop frame")
+  N_("dial")
+  N_("dialog")
+  N_("directory pane")
+  N_("drawing area")
+  N_("file chooser")
+  N_("filler")
+  /* I know it looks wrong but that is what Java returns */
+  N_("fontchooser")
+  N_("frame")
+  N_("glass pane")
+  N_("html container")
+  N_("icon")
+  N_("image")
+  N_("internal frame")
+  N_("label")
+  N_("layered pane")
+  N_("list")
+  N_("list item")
+  N_("menu")
+  N_("menu bar")
+  N_("menu button")
+  N_("menu item")
+  N_("option pane")
+  N_("page tab")
+  N_("page tab list")
+  N_("panel")
+  N_("password text")
+  N_("popup menu")
+  N_("progress bar")
+  N_("push button")
+  N_("radio button")
+  N_("radio menu item")
+  N_("root pane")
+  N_("row header")
+  N_("scroll bar")
+  N_("scroll pane")
+  N_("separator")
+  N_("slider")
+  N_("split pane")
+  N_("spin button")
+  N_("statusbar")
+  N_("table")
+  N_("table cell")
+  N_("table column header")
+  N_("table row header")
+  N_("tear off menu item")
+  N_("terminal")
+  N_("text")
+  N_("toggle button")
+  N_("tool bar")
+  N_("tool tip")
+  N_("tree")
+  N_("tree table")
+  N_("unknown")
+  N_("viewport")
+  N_("window")
+  N_("header")
+  N_("footer")
+  N_("paragraph")
+  N_("ruler")
+  N_("application")
+  N_("autocomplete")
+  N_("edit bar")
+  N_("embedded component")
+  N_("entry")
+  N_("chart")
+  N_("caption")
+  N_("document frame")
+  N_("heading")
+  N_("page")
+  N_("section")
+  N_("redundant object")
+  N_("form")
+  N_("link")
+  N_("input method window")
+  N_("table row")
+  N_("tree item")
+  N_("document spreadsheet")
+  N_("document presentation")
+  N_("document text")
+  N_("document web")
+  N_("document email")
+  N_("comment")
+  N_("list box")
+  N_("grouping")
+  N_("image map")
+  N_("notification")
+  N_("info bar")
+  N_("level bar")
+  N_("title bar")
+  N_("block quote")
+  N_("audio")
+  N_("video")
+  N_("definition")
+  N_("article")
+  N_("landmark")
+  N_("log")
+  N_("marquee")
+  N_("math")
+  N_("rating")
+  N_("timer")
+  N_("description list")
+  N_("description term")
+  N_("description value")
+#endif /* 0 */
+
+static void
+_gettext_initialization (void)
+{
+  static gboolean gettext_initialized = FALSE;
+
+  if (!gettext_initialized)
+    {
+      gettext_initialized = TRUE;
+      setlocale (LC_ALL, "");
+      bindtextdomain (GETTEXT_PACKAGE, ATSPI_LOCALEDIR);
+      bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+    }
+}
 
 static void handle_get_items (DBusPendingCall *pending, void *user_data);
 
@@ -43,7 +187,6 @@ static DBusConnection *bus = NULL;
 static GHashTable *live_refs = NULL;
 static gint method_call_timeout = 800;
 static gint app_startup_time = 15000;
-static gboolean allow_sync = TRUE;
 
 GMainLoop *atspi_main_loop;
 GMainContext *atspi_main_context;
@@ -74,8 +217,7 @@ const char *atspi_interface_text = ATSPI_DBUS_INTERFACE_TEXT;
 const char *atspi_interface_cache = ATSPI_DBUS_INTERFACE_CACHE;
 const char *atspi_interface_value = ATSPI_DBUS_INTERFACE_VALUE;
 
-static const char *interfaces[] =
-{
+static const char *interfaces[] = {
   ATSPI_DBUS_INTERFACE_ACCESSIBLE,
   ATSPI_DBUS_INTERFACE_ACTION,
   ATSPI_DBUS_INTERFACE_APPLICATION,
@@ -86,8 +228,8 @@ static const char *interfaces[] =
   ATSPI_DBUS_INTERFACE_HYPERLINK,
   ATSPI_DBUS_INTERFACE_HYPERTEXT,
   ATSPI_DBUS_INTERFACE_IMAGE,
-  "org.a11y.atspi.LoginHelper",
   ATSPI_DBUS_INTERFACE_SELECTION,
+  ATSPI_DBUS_INTERFACE_SOCKET,
   ATSPI_DBUS_INTERFACE_TABLE,
   ATSPI_DBUS_INTERFACE_TABLE_CELL,
   ATSPI_DBUS_INTERFACE_TEXT,
@@ -95,6 +237,27 @@ static const char *interfaces[] =
   NULL
 };
 
+/* Holds a dbus object reference as a pair of app_name/path.  These have the lifetime
+ * of the DBusMessage that is being processed.
+ */
+typedef struct
+{
+  const char *app_name;
+  const char *path;
+} ReferenceFromMessage;
+
+static void
+get_reference_from_iter (DBusMessageIter *iter, ReferenceFromMessage *ref)
+{
+  DBusMessageIter iter_struct;
+
+  dbus_message_iter_recurse (iter, &iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &ref->app_name);
+  dbus_message_iter_next (&iter_struct);
+  dbus_message_iter_get_basic (&iter_struct, &ref->path);
+  dbus_message_iter_next (iter);
+}
+
 gint
 _atspi_get_iface_num (const char *iface)
 {
@@ -102,16 +265,17 @@ _atspi_get_iface_num (const char *iface)
   int i;
 
   for (i = 0; interfaces[i]; i++)
-  {
-    if (!strcmp(iface, interfaces[i])) return i;
-  }
+    {
+      if (!strcmp (iface, interfaces[i]))
+        return i;
+    }
   return -1;
 }
 
 GHashTable *
 _atspi_get_live_refs (void)
 {
-  if (!live_refs) 
+  if (!live_refs)
     {
       live_refs = g_hash_table_new (g_direct_hash, g_direct_equal);
     }
@@ -153,12 +317,12 @@ cleanup ()
 
   /* TODO: Do we need this code, or should we just dispose the desktop? */
   for (i = desktop->children->len - 1; i >= 0; i--)
-  {
-    AtspiAccessible *child = g_ptr_array_index (desktop->children, i);
-    if (child->parent.app)
-      g_object_run_dispose (G_OBJECT (child->parent.app));
-    g_object_run_dispose (G_OBJECT (child));
-  }
+    {
+      AtspiAccessible *child = g_ptr_array_index (desktop->children, i);
+      if (child->parent.app)
+        g_object_run_dispose (G_OBJECT (child->parent.app));
+      g_object_run_dispose (G_OBJECT (child));
+    }
 
   g_object_run_dispose (G_OBJECT (desktop->parent.app));
   g_object_unref (desktop);
@@ -171,6 +335,8 @@ end:
       dbus_connection_unref (bus);
       bus = NULL;
     }
+
+  cleanup_deferred_message ();
 }
 
 static gboolean atspi_inited = FALSE;
@@ -187,32 +353,34 @@ handle_get_bus_address (DBusPendingCall *pending, void *user_data)
   DBusPendingCall *new_pending;
 
   if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_METHOD_RETURN)
-  {
-    if (dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &address,
-                               DBUS_TYPE_INVALID) && address [0])
     {
-      DBusError error;
-      DBusConnection *bus;
+      if (dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &address,
+                                 DBUS_TYPE_INVALID) &&
+          address[0])
+        {
+          DBusError error;
+          DBusConnection *bus;
 
-      dbus_error_init (&error);
-      bus = dbus_connection_open_private (address, &error);
-      if (bus)
-      {
-        if (app->bus)
-          {
-            dbus_connection_unref (app->bus);
-          }
-        app->bus = bus;
-        atspi_dbus_connection_setup_with_g_main(bus, g_main_context_default());
-      }
-      else
-      {
-        if (!strcmp (error.name, DBUS_ERROR_FILE_NOT_FOUND))
-          g_warning ("AT-SPI: Unable to open bus connection: %s", error.message);
-        dbus_error_free (&error);
-      }
+          dbus_error_init (&error);
+          bus = dbus_connection_open_private (address, &error);
+          if (bus)
+            {
+              if (app->bus)
+                {
+                  dbus_connection_unref (app->bus);
+                }
+              app->bus = bus;
+              atspi_dbus_connection_setup_with_g_main (bus, g_main_context_default ());
+            }
+          else
+            {
+              if (!strcmp (error.name, DBUS_ERROR_FILE_NOT_FOUND) &&
+                  !g_getenv ("ATSPI_IN_TESTS"))
+                g_warning ("AT-SPI: Unable to open bus connection: %s", error.message);
+              dbus_error_free (&error);
+            }
+        }
     }
-  }
   dbus_message_unref (reply);
   dbus_pending_call_unref (pending);
 
@@ -239,17 +407,16 @@ get_application (const char *bus_name)
   DBusPendingCall *pending = NULL;
 
   if (!app_hash)
-  {
-    app_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_object_unref);
-    if (!app_hash) return NULL;
-  }
+    {
+      app_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref);
+    }
   app = g_hash_table_lookup (app_hash, bus_name);
-  if (app) return app;
+  if (app)
+    return app;
   bus_name_dup = g_strdup (bus_name);
-  if (!bus_name_dup) return NULL;
+
   // TODO: change below to something that will send state-change:defunct notification if necessary */
   app = _atspi_application_new (bus_name);
-  app->hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
   app->bus = dbus_connection_ref (_atspi_bus ());
   gettimeofday (&app->time_added, NULL);
   app->cache = ATSPI_CACHE_UNDEFINED;
@@ -260,44 +427,42 @@ get_application (const char *bus_name)
   dbus_connection_send_with_reply (app->bus, message, &pending, 2000);
   dbus_message_unref (message);
   if (!pending)
-  {
-    g_hash_table_remove (app_hash, bus_name_dup);
-    return NULL;
-  }
+    {
+      g_hash_table_remove (app_hash, bus_name_dup);
+      return NULL;
+    }
   dbus_pending_call_set_notify (pending, handle_get_bus_address, app, NULL);
   return app;
 }
 
 static AtspiAccessible *
-ref_accessible (const char *app_name, const char *path)
+ref_accessible (ReferenceFromMessage *ref)
 {
   AtspiApplication *app;
   AtspiAccessible *a;
 
-  if (!strcmp (path, ATSPI_DBUS_PATH_NULL))
+  if (!strcmp (ref->path, ATSPI_DBUS_PATH_NULL))
     return NULL;
 
-  app = get_application (app_name);
+  app = get_application (ref->app_name);
 
-  if (!strcmp (path, "/org/a11y/atspi/accessible/root"))
-  {
-    if (!app->root)
+  if (!strcmp (ref->path, "/org/a11y/atspi/accessible/root"))
     {
-      app->root = _atspi_accessible_new (app, atspi_path_root);
-      app->root->accessible_parent = atspi_get_desktop (0);
-      g_ptr_array_add (app->root->accessible_parent->children, g_object_ref (app->root));
+      if (!app->root)
+        {
+          app->root = _atspi_accessible_new (app, atspi_path_root);
+          app->root->accessible_parent = atspi_get_desktop (0);
+          g_ptr_array_add (app->root->accessible_parent->children, g_object_ref (app->root));
+        }
+      return g_object_ref (app->root);
     }
-    return g_object_ref (app->root);
-  }
 
-  a = g_hash_table_lookup (app->hash, path);
+  a = g_hash_table_lookup (app->hash, ref->path);
   if (a)
-  {
-    return g_object_ref (a);
-  }
-  a = _atspi_accessible_new (app, path);
-  if (!a)
-    return NULL;
+    {
+      return g_object_ref (a);
+    }
+  a = _atspi_accessible_new (app, ref->path);
   g_hash_table_insert (app->hash, g_strdup (a->parent.path), g_object_ref (a));
   return a;
 }
@@ -313,13 +478,13 @@ ref_hyperlink (const char *app_name, const char *path)
 
   hyperlink = g_hash_table_lookup (app->hash, path);
   if (hyperlink)
-  {
-    return g_object_ref (hyperlink);
-  }
+    {
+      return g_object_ref (hyperlink);
+    }
   hyperlink = _atspi_hyperlink_new (app, path);
   g_hash_table_insert (app->hash, g_strdup (hyperlink->parent.path), hyperlink);
   /* TODO: This should be a weak ref */
-  g_object_ref (hyperlink);    /* for the hash */
+  g_object_ref (hyperlink); /* for the hash */
   return hyperlink;
 }
 
@@ -336,38 +501,35 @@ typedef struct
 } CACHE_ADDITION;
 
 static DBusHandlerResult
-handle_remove_accessible (DBusConnection *bus, DBusMessage *message, void *user_data)
+handle_remove_accessible (DBusConnection *bus, DBusMessage *message)
 {
-  const char *sender = dbus_message_get_sender (message);
+  ReferenceFromMessage ref;
   AtspiApplication *app;
-  const char *path;
-  DBusMessageIter iter, iter_struct;
+  DBusMessageIter iter;
   const char *signature = dbus_message_get_signature (message);
   AtspiAccessible *a;
 
   if (strcmp (signature, "(so)") != 0)
-  {
-    g_warning ("AT-SPI: Unknown signature %s for RemoveAccessible", signature);
-    return DBUS_HANDLER_RESULT_HANDLED;
-  }
+    {
+      g_warning ("AT-SPI: Unknown signature %s for RemoveAccessible", signature);
+      return DBUS_HANDLER_RESULT_HANDLED;
+    }
 
   dbus_message_iter_init (message, &iter);
-  dbus_message_iter_recurse (&iter, &iter_struct);
-  dbus_message_iter_get_basic (&iter_struct, &sender);
-  dbus_message_iter_next (&iter_struct);
-  dbus_message_iter_get_basic (&iter_struct, &path);
-  app = get_application (sender);
-  a = ref_accessible (sender, path);
+
+  get_reference_from_iter (&iter, &ref);
+  app = get_application (ref.app_name);
+  a = ref_accessible (&ref);
   if (!a)
     return DBUS_HANDLER_RESULT_HANDLED;
   g_object_run_dispose (G_OBJECT (a));
   g_hash_table_remove (app->hash, a->parent.path);
-  g_object_unref (a);  /* unref our own ref */
+  g_object_unref (a); /* unref our own ref */
   return DBUS_HANDLER_RESULT_HANDLED;
 }
 
 static DBusHandlerResult
-handle_name_owner_changed (DBusConnection *bus, DBusMessage *message, void *user_data)
+handle_name_owner_changed (DBusConnection *bus, DBusMessage *message)
 {
   const char *name, *new, *old;
   static gboolean registry_lost = FALSE;
@@ -377,58 +539,50 @@ handle_name_owner_changed (DBusConnection *bus, DBusMessage *message, void *user
                               DBUS_TYPE_STRING, &old,
                               DBUS_TYPE_STRING, &new,
                               DBUS_TYPE_INVALID))
-  {
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-  }
+    {
+      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
 
   if (!strcmp (name, "org.a11y.atspi.Registry"))
-  {
-    if (registry_lost && !old[0])
     {
-      _atspi_reregister_event_listeners ();
-      _atspi_reregister_device_listeners ();
-      registry_lost = FALSE;
+      if (registry_lost && !old[0])
+        {
+          _atspi_reregister_event_listeners ();
+          _atspi_reregister_device_listeners ();
+          registry_lost = FALSE;
+        }
+      else if (!new[0])
+        registry_lost = TRUE;
     }
-    else if (!new[0])
-      registry_lost = TRUE;
-  }
   else if (app_hash)
-  {
-    AtspiApplication *app = g_hash_table_lookup (app_hash, old);
-    if (app && !strcmp (app->bus_name, old))
-      g_object_run_dispose (G_OBJECT (app));
-  }
+    {
+      AtspiApplication *app = g_hash_table_lookup (app_hash, old);
+      if (app && !strcmp (app->bus_name, old))
+        g_object_run_dispose (G_OBJECT (app));
+    }
   return DBUS_HANDLER_RESULT_HANDLED;
 }
 
 static gboolean
 add_app_to_desktop (AtspiAccessible *a, const char *bus_name)
 {
-  AtspiAccessible *obj = ref_accessible (bus_name, atspi_path_root);
+  ReferenceFromMessage ref = {
+    .app_name = bus_name,
+    .path = atspi_path_root,
+  };
+  AtspiAccessible *obj = ref_accessible (&ref);
   /* The app will be added to the desktop as a side-effect of calling
    * ref_accessible */
   g_object_unref (obj);
   return (obj != NULL);
 }
 
-void
-get_reference_from_iter (DBusMessageIter *iter, const char **app_name, const char **path)
-{
-  DBusMessageIter iter_struct;
-
-  dbus_message_iter_recurse (iter, &iter_struct);
-  dbus_message_iter_get_basic (&iter_struct, app_name);
-  dbus_message_iter_next (&iter_struct);
-  dbus_message_iter_get_basic (&iter_struct, path);
-  dbus_message_iter_next (iter);
-}
-
 static void
 add_accessible_from_iter (DBusMessageIter *iter)
 {
   DBusMessageIter iter_struct, iter_array;
-  const char *app_name, *path;
   AtspiAccessible *accessible;
+  AtspiAccessible *parent;
   const char *name, *description;
   dbus_uint32_t role;
   gboolean children_cached = FALSE;
@@ -437,8 +591,7 @@ add_accessible_from_iter (DBusMessageIter *iter)
   dbus_message_iter_recurse (iter, &iter_struct);
 
   /* get accessible */
-  get_reference_from_iter (&iter_struct, &app_name, &path);
-  accessible = ref_accessible (app_name, path);
+  accessible = _atspi_dbus_consume_accessible (&iter_struct);
   if (!accessible)
     return;
 
@@ -446,55 +599,62 @@ add_accessible_from_iter (DBusMessageIter *iter)
   dbus_message_iter_next (&iter_struct);
 
   /* get parent */
-  get_reference_from_iter (&iter_struct, &app_name, &path);
+  parent = _atspi_dbus_consume_accessible (&iter_struct);
   if (accessible->accessible_parent)
     g_object_unref (accessible->accessible_parent);
-  accessible->accessible_parent = ref_accessible (app_name, path);
+  if (parent == accessible)
+    {
+      guint pid = atspi_accessible_get_process_id (accessible, NULL);
+      if (!g_getenv ("ATSPI_IN_TESTS"))
+        g_warning ("Process %d sent an accessible with itself as its parent. This shouldn't happen.", pid);
+      accessible->accessible_parent = NULL;
+    }
+  else
+    accessible->accessible_parent = parent;
 
   if (dbus_message_iter_get_arg_type (&iter_struct) == 'i')
-  {
-    /* Get index in parent */
-    dbus_message_iter_get_basic (&iter_struct, &index);
-    if (index >= 0 && accessible->accessible_parent)
     {
-      if (index >= accessible->accessible_parent->children->len)
-      {
-        /* There is no room for this object */
-        g_ptr_array_set_size (accessible->accessible_parent->children, index + 1);
-      }
-      else
-      {
-        /* This place is already taken - let's free this place with dignity */
-        if (g_ptr_array_index (accessible->accessible_parent->children, index))
-          g_object_unref (g_ptr_array_index (accessible->accessible_parent->children, index));
-      }
-      g_ptr_array_index (accessible->accessible_parent->children, index) = g_object_ref (accessible);
-    }
+      /* Get index in parent */
+      dbus_message_iter_get_basic (&iter_struct, &index);
+      if (index >= 0 && accessible->accessible_parent)
+        {
+          if (index >= accessible->accessible_parent->children->len)
+            {
+              /* There is no room for this object */
+              g_ptr_array_set_size (accessible->accessible_parent->children, index + 1);
+            }
+          else
+            {
+              /* This place is already taken - let's free this place with dignity */
+              if (g_ptr_array_index (accessible->accessible_parent->children, index))
+                g_object_unref (g_ptr_array_index (accessible->accessible_parent->children, index));
+            }
+          g_ptr_array_index (accessible->accessible_parent->children, index) = g_object_ref (accessible);
+        }
 
-    /* get child count */
-    dbus_message_iter_next (&iter_struct);
-    dbus_message_iter_get_basic (&iter_struct, &count);
-    if (count >= 0)
+      /* get child count */
+      dbus_message_iter_next (&iter_struct);
+      dbus_message_iter_get_basic (&iter_struct, &count);
+      if (count >= 0)
+        {
+          g_ptr_array_set_size (accessible->children, count);
+          children_cached = TRUE;
+        }
+    }
+  else if (dbus_message_iter_get_arg_type (&iter_struct) == 'a')
     {
-      g_ptr_array_set_size (accessible->children, count);
+      /* It's the old API with a list of children */
+      /* TODO: Perhaps remove this code eventually */
+      dbus_message_iter_recurse (&iter_struct, &iter_array);
+      while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+        {
+          AtspiAccessible *child;
+          child = _atspi_dbus_consume_accessible (&iter_array);
+          g_ptr_array_remove (accessible->children, child);
+          g_ptr_array_add (accessible->children, child);
+        }
       children_cached = TRUE;
     }
-  }
-  else if (dbus_message_iter_get_arg_type (&iter_struct) == 'a')
-  {
-    /* It's the old API with a list of children */
-    /* TODO: Perhaps remove this code eventually */
-    dbus_message_iter_recurse (&iter_struct, &iter_array);
-    while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-    {
-      AtspiAccessible *child;
-      get_reference_from_iter (&iter_array, &app_name, &path);
-      child = ref_accessible (app_name, path);
-      g_ptr_array_remove (accessible->children, child);
-      g_ptr_array_add (accessible->children, child);
-    }
-    children_cached = TRUE;
-  }
 
   /* interfaces */
   dbus_message_iter_next (&iter_struct);
@@ -524,10 +684,10 @@ add_accessible_from_iter (DBusMessageIter *iter)
   dbus_message_iter_next (&iter_struct);
 
   _atspi_accessible_add_cache (accessible, ATSPI_CACHE_NAME | ATSPI_CACHE_ROLE |
-                               ATSPI_CACHE_PARENT | ATSPI_CACHE_DESCRIPTION);
+                                               ATSPI_CACHE_PARENT | ATSPI_CACHE_DESCRIPTION);
   if (!atspi_state_set_contains (accessible->states,
-                                       ATSPI_STATE_MANAGES_DESCENDANTS) &&
-                                       children_cached)
+                                 ATSPI_STATE_MANAGES_DESCENDANTS) &&
+      children_cached)
     _atspi_accessible_add_cache (accessible, ATSPI_CACHE_CHILDREN);
 
   /* This is a bit of a hack since the cache holds a ref, so we don't need
@@ -542,32 +702,31 @@ handle_get_items (DBusPendingCall *pending, void *user_data)
   DBusMessageIter iter, iter_array;
 
   if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
-  {
-    const char *sender = dbus_message_get_sender (reply);
-    const char *error = NULL;
-    const char *error_name = dbus_message_get_error_name (reply);
-    if (!strcmp (error_name, DBUS_ERROR_SERVICE_UNKNOWN)
-     || !strcmp (error_name, DBUS_ERROR_NO_REPLY))
     {
+      const char *sender = dbus_message_get_sender (reply);
+      const char *error = NULL;
+      const char *error_name = dbus_message_get_error_name (reply);
+      if (!strcmp (error_name, DBUS_ERROR_SERVICE_UNKNOWN) || !strcmp (error_name, DBUS_ERROR_NO_REPLY))
+        {
+        }
+      else
+        {
+          dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &error,
+                                 DBUS_TYPE_INVALID);
+          g_warning ("AT-SPI: Error in GetItems, sender=%s, error=%s", sender, error);
+        }
+      dbus_message_unref (reply);
+      dbus_pending_call_unref (pending);
+      return;
     }
-    else
-    {
-      dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &error,
-                             DBUS_TYPE_INVALID);
-      g_warning ("AT-SPI: Error in GetItems, sender=%s, error=%s", sender, error);
-    }
-    dbus_message_unref (reply);
-    dbus_pending_call_unref (pending);
-    return;
-  }
 
   dbus_message_iter_init (reply, &iter);
   dbus_message_iter_recurse (&iter, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    add_accessible_from_iter (&iter_array);
-    dbus_message_iter_next (&iter_array);
-  }
+    {
+      add_accessible_from_iter (&iter_array);
+      dbus_message_iter_next (&iter_array);
+    }
   dbus_message_unref (reply);
   dbus_pending_call_unref (pending);
 }
@@ -582,46 +741,43 @@ ref_accessible_desktop (AtspiApplication *app)
   gchar *bus_name_dup;
 
   if (desktop)
-  {
-    g_object_ref (desktop);
-    return desktop;
-  }
+    {
+      g_object_ref (desktop);
+      return desktop;
+    }
   desktop = _atspi_accessible_new (app, atspi_path_root);
-  if (!desktop)
-  {
-    return NULL;
-  }
   g_hash_table_insert (app->hash, g_strdup (desktop->parent.path),
                        g_object_ref (desktop));
   app->root = g_object_ref (desktop);
   desktop->name = g_strdup ("main");
   message = dbus_message_new_method_call (atspi_bus_registry,
-       atspi_path_root,
-       atspi_interface_accessible,
-       "GetChildren");
+                                          atspi_path_root,
+                                          atspi_interface_accessible,
+                                          "GetChildren");
   if (!message)
     return NULL;
   error = NULL;
   reply = _atspi_dbus_send_with_reply_and_block (message, &error);
   if (!reply || strcmp (dbus_message_get_signature (reply), "a(so)") != 0)
-  {
-    if (error != NULL)
     {
-      g_warning ("Couldn't get application list: %s", error->message);
-      g_clear_error (&error);
+      if (error != NULL)
+        {
+          g_warning ("Couldn't get application list: %s", error->message);
+          g_clear_error (&error);
+        }
+      if (reply)
+        dbus_message_unref (reply);
+      return NULL;
     }
-    if (reply)
-      dbus_message_unref (reply);
-    return NULL;
-  }
   dbus_message_iter_init (reply, &iter);
   dbus_message_iter_recurse (&iter, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    const char *app_name, *path;
-    get_reference_from_iter (&iter_array, &app_name, &path);
-    add_app_to_desktop (desktop, app_name);
-  }
+    {
+      ReferenceFromMessage ref;
+
+      get_reference_from_iter (&iter_array, &ref);
+      add_app_to_desktop (desktop, ref.app_name);
+    }
 
   /* Record the alternate name as an alias for org.a11y.atspi.Registry */
   bus_name_dup = g_strdup (dbus_message_get_sender (reply));
@@ -636,16 +792,20 @@ ref_accessible_desktop (AtspiApplication *app)
 AtspiAccessible *
 _atspi_ref_accessible (const char *app, const char *path)
 {
+  ReferenceFromMessage ref = {
+    .app_name = app,
+    .path = path,
+  };
   AtspiApplication *a = get_application (app);
   if (!a)
     return NULL;
-  if ( APP_IS_REGISTRY(a))
-  {
-    if (!a->root)
-      g_object_unref (ref_accessible_desktop (a));     /* sets a->root */
-    return g_object_ref (a->root);
-  }
-  return ref_accessible (app, path);
+  if (APP_IS_REGISTRY (a))
+    {
+      if (!a->root)
+        g_object_unref (ref_accessible_desktop (a)); /* sets a->root */
+      return g_object_ref (a->root);
+    }
+  return ref_accessible (&ref);
 }
 
 AtspiAccessible *
@@ -660,25 +820,26 @@ _atspi_dbus_return_accessible_from_message (DBusMessage *message)
 
   signature = dbus_message_get_signature (message);
   if (!strcmp (signature, "(so)"))
-  {
-    dbus_message_iter_init (message, &iter);
-    retval =  _atspi_dbus_return_accessible_from_iter (&iter);
-  }
+    {
+      dbus_message_iter_init (message, &iter);
+      retval = _atspi_dbus_consume_accessible (&iter);
+    }
   else
-  {
-    g_warning ("AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange signature %s", signature);
-  }
+    {
+      g_warning ("AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange signature %s", signature);
+    }
   dbus_message_unref (message);
   return retval;
 }
 
+/* Enters an iter which must be already pointing to a (so) and returns the accessible for it */
 AtspiAccessible *
-_atspi_dbus_return_accessible_from_iter (DBusMessageIter *iter)
+_atspi_dbus_consume_accessible (DBusMessageIter *iter)
 {
-  const char *app_name, *path;
+  ReferenceFromMessage ref;
 
-  get_reference_from_iter (iter, &app_name, &path);
-  return ref_accessible (app_name, path);
+  get_reference_from_iter (iter, &ref);
+  return ref_accessible (&ref);
 }
 
 AtspiHyperlink *
@@ -687,20 +848,20 @@ _atspi_dbus_return_hyperlink_from_message (DBusMessage *message)
   DBusMessageIter iter;
   AtspiHyperlink *retval = NULL;
   const char *signature;
-   
+
   if (!message)
     return NULL;
 
   signature = dbus_message_get_signature (message);
   if (!strcmp (signature, "(so)"))
-  {
-    dbus_message_iter_init (message, &iter);
-    retval =  _atspi_dbus_return_hyperlink_from_iter (&iter);
-  }
+    {
+      dbus_message_iter_init (message, &iter);
+      retval = _atspi_dbus_return_hyperlink_from_iter (&iter);
+    }
   else
-  {
-    g_warning ("AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange signature %s", signature);
-  }
+    {
+      g_warning ("AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange signature %s", signature);
+    }
   dbus_message_unref (message);
   return retval;
 }
@@ -708,27 +869,27 @@ _atspi_dbus_return_hyperlink_from_message (DBusMessage *message)
 AtspiHyperlink *
 _atspi_dbus_return_hyperlink_from_iter (DBusMessageIter *iter)
 {
-  const char *app_name, *path;
+  ReferenceFromMessage ref;
 
-  get_reference_from_iter (iter, &app_name, &path);
-  return ref_hyperlink (app_name, path);
+  get_reference_from_iter (iter, &ref);
+  return ref_hyperlink (ref.app_name, ref.path);
 }
 
 const char *cache_signal_type = "((so)(so)(so)iiassusau)";
 const char *old_cache_signal_type = "((so)(so)(so)a(so)assusau)";
 
 static DBusHandlerResult
-handle_add_accessible (DBusConnection *bus, DBusMessage *message, void *user_data)
+handle_add_accessible (DBusConnection *bus, DBusMessage *message)
 {
   DBusMessageIter iter;
   const char *signature = dbus_message_get_signature (message);
 
   if (strcmp (signature, cache_signal_type) != 0 &&
       strcmp (signature, old_cache_signal_type) != 0)
-  {
-    g_warning ("AT-SPI: AddAccessible with unknown signature %s\n", signature);
-    return DBUS_HANDLER_RESULT_HANDLED;
-  }
+    {
+      g_warning ("AT-SPI: AddAccessible with unknown signature %s\n", signature);
+      return DBUS_HANDLER_RESULT_HANDLED;
+    }
 
   dbus_message_iter_init (message, &iter);
   add_accessible_from_iter (&iter);
@@ -739,7 +900,6 @@ typedef struct
 {
   DBusConnection *bus;
   DBusMessage *message;
-  void *data;
 } BusDataClosure;
 
 static GSource *process_deferred_messages_source = NULL;
@@ -752,34 +912,32 @@ process_deferred_message (BusDataClosure *closure)
 
   if (type == DBUS_MESSAGE_TYPE_SIGNAL &&
       !strncmp (interface, "org.a11y.atspi.Event.", 21))
-  {
-    _atspi_dbus_handle_event (closure->bus, closure->message, closure->data);
-  }
-  if (dbus_message_is_method_call (closure->message, atspi_interface_device_event_listener, "NotifyEvent"))
-  {
-    _atspi_dbus_handle_DeviceEvent (closure->bus,
-                                   closure->message, closure->data);
-  }
-  if (dbus_message_is_signal (closure->message, atspi_interface_cache, "AddAccessible"))
-  {
-    handle_add_accessible (closure->bus, closure->message, closure->data);
-  }
-  if (dbus_message_is_signal (closure->message, atspi_interface_cache, "RemoveAccessible"))
-  {
-    handle_remove_accessible (closure->bus, closure->message, closure->data);
-  }
-  if (dbus_message_is_signal (closure->message, "org.freedesktop.DBus", "NameOwnerChanged"))
-  {
-    handle_name_owner_changed (closure->bus, closure->message, closure->data);
-  }
+    {
+      _atspi_dbus_handle_event (closure->message);
+    }
+  else if (dbus_message_is_method_call (closure->message, atspi_interface_device_event_listener, "NotifyEvent"))
+    {
+      _atspi_dbus_handle_DeviceEvent (closure->bus, closure->message);
+    }
+  else if (dbus_message_is_signal (closure->message, atspi_interface_cache, "AddAccessible"))
+    {
+      handle_add_accessible (closure->bus, closure->message);
+    }
+  else if (dbus_message_is_signal (closure->message, atspi_interface_cache, "RemoveAccessible"))
+    {
+      handle_remove_accessible (closure->bus, closure->message);
+    }
+  else if (dbus_message_is_signal (closure->message, "org.freedesktop.DBus", "NameOwnerChanged"))
+    {
+      handle_name_owner_changed (closure->bus, closure->message);
+    }
 }
 
 static GQueue *deferred_messages = NULL;
 
 static void
-destroy_deferred_message_item(gpointer ptr)
+destroy_deferred_message_item (gpointer ptr)
 {
-  /* TODO this is still memory leak on c->data */
   BusDataClosure *c = ptr;
   dbus_message_unref (c->message);
   dbus_connection_unref (c->bus);
@@ -787,10 +945,13 @@ destroy_deferred_message_item(gpointer ptr)
 }
 
 static void
-cleanup_deferred_message(void)
+cleanup_deferred_message (void)
 {
-  g_queue_free_full (deferred_messages, destroy_deferred_message_item);
-  deferred_messages = NULL;
+  if (deferred_messages)
+    {
+      g_queue_free_full (deferred_messages, destroy_deferred_message_item);
+      deferred_messages = NULL;
+    }
 }
 
 static gboolean
@@ -803,12 +964,10 @@ process_deferred_messages (void)
     return TRUE;
   in_process_deferred_messages = 1;
   while ((closure = g_queue_pop_head (deferred_messages)))
-  {
-    process_deferred_message (closure);
-    dbus_message_unref (closure->message);
-    dbus_connection_unref (closure->bus);
-    g_free (closure);
-  }
+    {
+      process_deferred_message (closure);
+      destroy_deferred_message_item (closure);
+    }
   in_process_deferred_messages = 0;
   return FALSE;
 }
@@ -824,24 +983,23 @@ process_deferred_messages_callback (gpointer data)
 }
 
 static DBusHandlerResult
-defer_message (DBusConnection *connection, DBusMessage *message, void *user_data)
+defer_message (DBusConnection *connection, DBusMessage *message)
 {
   BusDataClosure *closure = g_new (BusDataClosure, 1);
 
   closure->bus = dbus_connection_ref (bus);
   closure->message = dbus_message_ref (message);
-  closure->data = user_data;
 
   g_queue_push_tail (deferred_messages, closure);
 
   if (process_deferred_messages_source == NULL)
-  {
-    process_deferred_messages_source = g_idle_source_new ();
-    g_source_set_callback (process_deferred_messages_source,
-                           process_deferred_messages_callback, NULL, NULL);
-    g_source_attach (process_deferred_messages_source, atspi_main_context);
-    g_source_unref (process_deferred_messages_source);
-  }
+    {
+      process_deferred_messages_source = g_idle_source_new ();
+      g_source_set_callback (process_deferred_messages_source,
+                             process_deferred_messages_callback, NULL, NULL);
+      g_source_attach (process_deferred_messages_source, atspi_main_context);
+      g_source_unref (process_deferred_messages_source);
+    }
 
   return DBUS_HANDLER_RESULT_HANDLED;
 }
@@ -849,31 +1007,34 @@ defer_message (DBusConnection *connection, DBusMessage *message, void *user_data
 static DBusHandlerResult
 atspi_dbus_filter (DBusConnection *bus, DBusMessage *message, void *data)
 {
+  /* Check that we don't start passing stuff from whatever calls dbus_connection_add_filter() */
+  g_assert (data == NULL);
+
   int type = dbus_message_get_type (message);
   const char *interface = dbus_message_get_interface (message);
 
   if (type == DBUS_MESSAGE_TYPE_SIGNAL &&
       !strncmp (interface, "org.a11y.atspi.Event.", 21))
-  {
-    return defer_message (bus, message, data);
-  }
+    {
+      return defer_message (bus, message);
+    }
   if (dbus_message_is_method_call (message, atspi_interface_device_event_listener, "NotifyEvent"))
-  {
-    return defer_message (bus, message, data);
-  }
+    {
+      return defer_message (bus, message);
+    }
   if (dbus_message_is_signal (message, atspi_interface_cache, "AddAccessible"))
-  {
-    return defer_message (bus, message, data);
-  }
+    {
+      return defer_message (bus, message);
+    }
   if (dbus_message_is_signal (message, atspi_interface_cache, "RemoveAccessible"))
-  {
-    return defer_message (bus, message, data);
-  }
+    {
+      return defer_message (bus, message);
+    }
   if (dbus_message_is_signal (message, "org.freedesktop.DBus", "NameOwnerChanged"))
-  {
-    defer_message (bus, message, data);
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-  }
+    {
+      defer_message (bus, message);
+      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
   return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
@@ -882,7 +1043,7 @@ atspi_dbus_filter (DBusConnection *bus, DBusMessage *message, void *data)
  *
  * Connects to the accessibility registry and initializes the SPI.
  *
- * Returns: 0 on success, 1 if already initialized, or an integer error code.  
+ * Returns: 0 on success, 1 if already initialized, or an integer error code.
  **/
 int
 atspi_init (void)
@@ -897,13 +1058,13 @@ atspi_init (void)
 
   atspi_inited = TRUE;
 
-  _atspi_get_live_refs();
+  _atspi_get_live_refs ();
 
   bus = atspi_get_a11y_bus ();
   if (!bus)
     return 2;
   dbus_bus_register (bus, NULL);
-  atspi_dbus_connection_setup_with_g_main(bus, g_main_context_default());
+  atspi_dbus_connection_setup_with_g_main (bus, g_main_context_default ());
   dbus_connection_add_filter (bus, atspi_dbus_filter, NULL, NULL);
   match = g_strdup_printf ("type='signal',interface='%s',member='AddAccessible'", atspi_interface_cache);
   dbus_bus_add_match (bus, match, NULL);
@@ -961,6 +1122,7 @@ atspi_event_main (void)
 {
   atspi_main_loop = g_main_loop_new (NULL, FALSE);
   g_main_loop_run (atspi_main_loop);
+  g_main_loop_unref (atspi_main_loop);
   atspi_main_loop = NULL;
 }
 
@@ -979,7 +1141,7 @@ atspi_event_quit (void)
 /**
  * atspi_exit:
  *
- * Disconnects from #AtspiRegistry instances and releases 
+ * Disconnects from #AtspiRegistry instances and releases
  * any floating resources. Call only once at exit.
  *
  * Returns: 0 if there were no leaks, otherwise other integer values.
@@ -1025,27 +1187,27 @@ check_for_hang (DBusMessage *message, DBusError *error, DBusConnection *bus, con
 {
   if (!message && error->name &&
       !strcmp (error->name, "org.freedesktop.DBus.Error.NoReply"))
-  {
-    GSList *l;
-    DBusMessage *message;
-    gchar *bus_name_dup;
-    DBusPendingCall *pending = NULL;
-    for (l = hung_processes; l; l = l->next)
-      if (!strcmp (l->data, bus_name))
+    {
+      GSList *l;
+      DBusMessage *message;
+      gchar *bus_name_dup;
+      DBusPendingCall *pending = NULL;
+      for (l = hung_processes; l; l = l->next)
+        if (!strcmp (l->data, bus_name))
+          return;
+      message = dbus_message_new_method_call (bus_name, "/",
+                                              "org.freedesktop.DBus.Peer",
+                                              "Ping");
+      if (!message)
         return;
-    message = dbus_message_new_method_call (bus_name, "/",
-                                            "org.freedesktop.DBus.Peer",
-                                            "Ping");
-    if (!message)
-      return;
-    dbus_connection_send_with_reply (bus, message, &pending, -1);
-    dbus_message_unref (message);
-    if (!pending)
-      return;
-    bus_name_dup = g_strdup (bus_name);
-    hung_processes = g_slist_append (hung_processes, bus_name_dup);
-    dbus_pending_call_set_notify (pending, remove_hung_process, bus_name_dup, NULL);
-  }
+      dbus_connection_send_with_reply (bus, message, &pending, -1);
+      dbus_message_unref (message);
+      if (!pending)
+        return;
+      bus_name_dup = g_strdup (bus_name);
+      hung_processes = g_slist_append (hung_processes, bus_name_dup);
+      dbus_pending_call_set_notify (pending, remove_hung_process, bus_name_dup, NULL);
+    }
 }
 
 static gboolean
@@ -1063,18 +1225,18 @@ static gboolean
 check_app (AtspiApplication *app, GError **error)
 {
   if (!app || !app->bus)
-  {
-    g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
-                          _("The application no longer exists"));
-    return FALSE;
-  }
+    {
+      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
+                           _ ("The application no longer exists"));
+      return FALSE;
+    }
 
   if (atspi_main_loop && connection_is_hung (app->bus_name))
-  {
+    {
       g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC,
                            "The process appears to be hung.");
-    return FALSE;
-  }
+      return FALSE;
+    }
 
   return TRUE;
 }
@@ -1086,15 +1248,19 @@ set_timeout (AtspiApplication *app)
   int diff;
 
   if (app && app_startup_time > 0)
-  {
-    gettimeofday (&tv, NULL);
-    diff = (tv.tv_sec - app->time_added.tv_sec) * 1000 + (tv.tv_usec - app->time_added.tv_usec) / 1000;
-    dbind_set_timeout (MAX(method_call_timeout, app_startup_time - diff));
-  }
+    {
+      gettimeofday (&tv, NULL);
+      diff = (tv.tv_sec - app->time_added.tv_sec) * 1000 + (tv.tv_usec - app->time_added.tv_usec) / 1000;
+      dbind_set_timeout (MAX (method_call_timeout, app_startup_time - diff));
+    }
   else
     dbind_set_timeout (method_call_timeout);
 }
 
+/* Makes a DBus call and returns a success value.  Simple return values can be demarshaled automatically
+ * by passing their types after a "=>" marker in the @type argument (e.g. s=>i for a call that takes a string
+ * and returns an int).
+ */
 dbus_bool_t
 _atspi_dbus_call (gpointer obj, const char *interface, const char *method, GError **error, const char *type, ...)
 {
@@ -1106,12 +1272,6 @@ _atspi_dbus_call (gpointer obj, const char *interface, const char *method, GErro
   if (!check_app (aobj->app, error))
     return FALSE;
 
-  if (!allow_sync)
-  {
-    _atspi_set_error_no_sync (error);
-    return FALSE;
-  }
-
   va_start (args, type);
   dbus_error_init (&err);
   set_timeout (aobj->app);
@@ -1122,40 +1282,26 @@ _atspi_dbus_call (gpointer obj, const char *interface, const char *method, GErro
   check_for_hang (NULL, &err, aobj->app->bus, aobj->app->bus_name);
   process_deferred_messages ();
   if (dbus_error_is_set (&err))
-  {
-    g_set_error(error, ATSPI_ERROR, ATSPI_ERROR_IPC, "%s", err.message);
-    dbus_error_free (&err);
-  }
+    {
+      g_set_error (error, ATSPI_ERROR, ATSPI_ERROR_IPC, "%s", err.message);
+      dbus_error_free (&err);
+    }
   return retval;
 }
 
-DBusMessage *
-_atspi_dbus_call_partial (gpointer obj,
-                          const char *interface,
-                          const char *method,
-                          GError **error,
-                          const char *type, ...)
-{
-  va_list args;
-
-  va_start (args, type);
-  return _atspi_dbus_call_partial_va (obj, interface, method, error, type, args);
-}
-
-
-DBusMessage *
+static DBusMessage *
 _atspi_dbus_call_partial_va (gpointer obj,
-                          const char *interface,
-                          const char *method,
-                          GError **error,
-                          const char *type,
-                          va_list args)
+                             const char *interface,
+                             const char *method,
+                             GError **error,
+                             const char *type,
+                             va_list args)
 {
   AtspiObject *aobj = ATSPI_OBJECT (obj);
   DBusError err;
-    DBusMessage *msg = NULL, *reply = NULL;
-    DBusMessageIter iter;
-    const char *p;
+  DBusMessage *msg = NULL, *reply = NULL;
+  DBusMessageIter iter;
+  const char *p;
 
   dbus_error_init (&err);
 
@@ -1174,29 +1320,50 @@ _atspi_dbus_call_partial_va (gpointer obj,
   reply = dbind_send_and_allow_reentry (aobj->app->bus, msg, &err);
   check_for_hang (reply, &err, aobj->app->bus, aobj->app->bus_name);
 out:
-  va_end (args);
   if (msg)
     dbus_message_unref (msg);
   process_deferred_messages ();
   if (dbus_error_is_set (&err))
-  {
-    /* TODO: Set gerror */
-    dbus_error_free (&err);
-  }
+    {
+      /* TODO: Set gerror */
+      dbus_error_free (&err);
+    }
 
   if (reply && dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
-  {
-    const char *err_str = NULL;
-    dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &err_str, DBUS_TYPE_INVALID);
-    if (err_str)
-      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err_str);
-    dbus_message_unref (reply);
-    return NULL;
-  }
+    {
+      const char *err_str = NULL;
+      dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &err_str, DBUS_TYPE_INVALID);
+      if (err_str)
+        g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err_str);
+      dbus_message_unref (reply);
+      return NULL;
+    }
 
   return reply;
 }
 
+/* Makes a DBus call but returns the raw DBusMessage reply.  Use this
+ * when you need to demarshal complex return values by hand.  Remember
+ * to dbus_message_unref() the return value when you are done.
+ */
+DBusMessage *
+_atspi_dbus_call_partial (gpointer obj,
+                          const char *interface,
+                          const char *method,
+                          GError **error,
+                          const char *type,
+                          ...)
+{
+  DBusMessage *ret;
+  va_list args;
+
+  va_start (args, type);
+  ret = _atspi_dbus_call_partial_va (obj, interface, method, error, type, args);
+  va_end (args);
+
+  return ret;
+}
+
 dbus_bool_t
 _atspi_dbus_get_property (gpointer obj, const char *interface, const char *name, GError **error, const char *type, void *data)
 {
@@ -1205,7 +1372,7 @@ _atspi_dbus_get_property (gpointer obj, const char *interface, const char *name,
   DBusError err;
   dbus_bool_t retval = FALSE;
   AtspiObject *aobj = ATSPI_OBJECT (obj);
-  char expected_type = (type [0] == '(' ? 'r' : type [0]);
+  char expected_type = (type[0] == '(' ? 'r' : type[0]);
 
   if (!aobj)
     return FALSE;
@@ -1213,21 +1380,15 @@ _atspi_dbus_get_property (gpointer obj, const char *interface, const char *name,
   if (!check_app (aobj->app, error))
     return FALSE;
 
-  if (!allow_sync)
-  {
-    _atspi_set_error_no_sync (error);
-    return FALSE;
-  }
-
   message = dbus_message_new_method_call (aobj->app->bus_name,
                                           aobj->path,
                                           "org.freedesktop.DBus.Properties",
                                           "Get");
   if (!message)
-  {
-    // TODO: throw exception
-    return FALSE;
-  }
+    {
+      // TODO: throw exception
+      return FALSE;
+    }
   dbus_message_append_args (message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
   dbus_error_init (&err);
   set_timeout (aobj->app);
@@ -1236,47 +1397,47 @@ _atspi_dbus_get_property (gpointer obj, const char *interface, const char *name,
   dbus_message_unref (message);
   process_deferred_messages ();
   if (!reply)
-  {
-    /* TODO: throw exception */
-    goto done;
-  }
+    {
+      /* TODO: throw exception */
+      goto done;
+    }
 
   if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
-  {
-    const char *err_str = NULL;
-    dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &err_str, DBUS_TYPE_INVALID);
-    if (err_str)
-      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err_str);
-    goto done;
-  }
+    {
+      const char *err_str = NULL;
+      dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &err_str, DBUS_TYPE_INVALID);
+      if (err_str)
+        g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err_str);
+      goto done;
+    }
 
   dbus_message_iter_init (reply, &iter);
   if (dbus_message_iter_get_arg_type (&iter) != 'v')
-  {
-    g_warning ("atspi_dbus_get_property: expected a variant when fetching %s from interface %s; got %s\n", name, interface, dbus_message_get_signature (reply));
-    goto done;
-  }
+    {
+      g_warning ("atspi_dbus_get_property: expected a variant when fetching %s from interface %s; got %s\n", name, interface, dbus_message_get_signature (reply));
+      goto done;
+    }
   dbus_message_iter_recurse (&iter, &iter_variant);
   if (dbus_message_iter_get_arg_type (&iter_variant) != expected_type)
-  {
-    g_warning ("atspi_dbus_get_property: Wrong type: expected %s, got %c\n", type, dbus_message_iter_get_arg_type (&iter_variant));
-    goto done;
-  }
+    {
+      g_warning ("atspi_dbus_get_property: Wrong type: expected %s, got %c\n", type, dbus_message_iter_get_arg_type (&iter_variant));
+      goto done;
+    }
   if (!strcmp (type, "(so)"))
-  {
-    *((AtspiAccessible **)data) = _atspi_dbus_return_accessible_from_iter (&iter_variant);
-  }
-  else
-  {
-    if (type [0] == 's')
     {
-      *(char**) data = NULL;
+      *((AtspiAccessible **) data) = _atspi_dbus_consume_accessible (&iter_variant);
     }
+  else
+    {
+      if (type[0] == 's')
+        {
+          *(char **) data = NULL;
+        }
 
-    dbus_message_iter_get_basic (&iter_variant, data);
-    if (type [0] == 's')
-      *(char **)data = g_strdup (*(char **)data);
-  }
+      dbus_message_iter_get_basic (&iter_variant, data);
+      if (type[0] == 's')
+        *(char **) data = g_strdup (*(char **) data);
+    }
   retval = TRUE;
 done:
   dbus_error_free (&err);
@@ -1296,20 +1457,20 @@ _atspi_dbus_send_with_reply_and_block (DBusMessage *message, GError **error)
   app = get_application (dbus_message_get_destination (message));
 
   if (app && !app->bus)
-    return NULL;       /* will fail anyway; app has been disposed */
+    return NULL; /* will fail anyway; app has been disposed */
 
-  bus = (app ? app->bus : _atspi_bus());
+  bus = (app ? app->bus : _atspi_bus ());
   dbus_error_init (&err);
   set_timeout (app);
   reply = dbind_send_and_allow_reentry (bus, message, &err);
   process_deferred_messages ();
   dbus_message_unref (message);
   if (dbus_error_is_set (&err))
-  {
-    if (error)
-      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err.message);
-    dbus_error_free (&err);
-  }
+    {
+      if (error)
+        g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_IPC, err.message);
+      dbus_error_free (&err);
+    }
   return reply;
 }
 
@@ -1340,15 +1501,15 @@ _atspi_dbus_hash_from_iter (DBusMessageIter *iter)
 
   dbus_message_iter_recurse (iter, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    const char *name, *value;
-    dbus_message_iter_recurse (&iter_array, &iter_dict);
-    dbus_message_iter_get_basic (&iter_dict, &name);
-    dbus_message_iter_next (&iter_dict);
-    dbus_message_iter_get_basic (&iter_dict, &value);
-    g_hash_table_insert (hash, g_strdup (name), g_strdup (value));
-    dbus_message_iter_next (&iter_array);
-  }
+    {
+      const char *name, *value;
+      dbus_message_iter_recurse (&iter_array, &iter_dict);
+      dbus_message_iter_get_basic (&iter_dict, &name);
+      dbus_message_iter_next (&iter_dict);
+      dbus_message_iter_get_basic (&iter_dict, &value);
+      g_hash_table_insert (hash, g_strdup (name), g_strdup (value));
+      dbus_message_iter_next (&iter_array);
+    }
   return hash;
 }
 
@@ -1378,50 +1539,115 @@ _atspi_dbus_attribute_array_from_iter (DBusMessageIter *iter)
 
   dbus_message_iter_recurse (iter, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    const char *name, *value;
-    gchar *str;
-    dbus_message_iter_recurse (&iter_array, &iter_dict);
-    dbus_message_iter_get_basic (&iter_dict, &name);
-    dbus_message_iter_next (&iter_dict);
-    dbus_message_iter_get_basic (&iter_dict, &value);
-    str = g_strdup_printf ("%s:%s", name, value);
-    array = g_array_append_val (array, str);
-    dbus_message_iter_next (&iter_array);;
-  }
+    {
+      const char *name, *value;
+      gchar *str;
+      dbus_message_iter_recurse (&iter_array, &iter_dict);
+      dbus_message_iter_get_basic (&iter_dict, &name);
+      dbus_message_iter_next (&iter_dict);
+      dbus_message_iter_get_basic (&iter_dict, &value);
+      str = g_strdup_printf ("%s:%s", name, value);
+      array = g_array_append_val (array, str);
+      dbus_message_iter_next (&iter_array);
+      ;
+    }
   return array;
 }
 
+typedef enum
+{
+  DEMARSHAL_STATUS_SUCCESS,
+  DEMARSHAL_STATUS_INVALID_SIGNATURE,
+  DEMARSHAL_STATUS_INVALID_VALUE,
+} DemarshalStatus;
+
+typedef struct
+{
+  /* array of (char *) */
+  GPtrArray *names;
+} InterfaceNames;
+
+static DemarshalStatus
+interface_names_demarshal (DBusMessageIter *iter, InterfaceNames **out_interfaces)
+{
+  char *sig = dbus_message_iter_get_signature (iter);
+  gboolean matches = strcmp (sig, "as") == 0;
+  dbus_free (sig);
+
+  *out_interfaces = NULL;
+
+  GPtrArray *names = g_ptr_array_new_with_free_func (g_free);
+
+  if (!matches)
+    {
+      return DEMARSHAL_STATUS_INVALID_SIGNATURE;
+    }
+
+  DBusMessageIter iter_array;
+  dbus_message_iter_recurse (iter, &iter_array);
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+    {
+      const char *iface;
+      dbus_message_iter_get_basic (&iter_array, &iface);
+      g_ptr_array_add (names, g_strdup (iface));
+      dbus_message_iter_next (&iter_array);
+    }
+
+  InterfaceNames *ifaces = g_new0 (InterfaceNames, 1);
+  ifaces->names = names;
+  *out_interfaces = ifaces;
+  return DEMARSHAL_STATUS_SUCCESS;
+}
+
+/* Converts an array of interface names to a value suitable for AtspiAccessible.interfaces */
+static gint
+interface_names_to_bitmask (const InterfaceNames *ifaces)
+{
+  gint val = 0;
+  guint i;
+
+  g_assert (ifaces->names != NULL);
+
+  for (i = 0; i < ifaces->names->len; i++)
+    {
+      const char *name = g_ptr_array_index (ifaces->names, i);
+      gint iface_num = _atspi_get_iface_num (name);
+      if (iface_num == -1)
+        {
+          g_warning ("AT-SPI: Unknown interface %s", name);
+        }
+      else
+        {
+          val |= (1 << iface_num);
+        }
+    }
+
+  return val;
+}
+
+static void
+interface_names_free (InterfaceNames *ifaces)
+{
+  g_ptr_array_free (ifaces->names, TRUE);
+  g_free (ifaces);
+}
+
 void
 _atspi_dbus_set_interfaces (AtspiAccessible *accessible, DBusMessageIter *iter)
 {
-  DBusMessageIter iter_array;
-  char *iter_sig = dbus_message_iter_get_signature (iter);
+  InterfaceNames *ifaces;
 
   accessible->interfaces = 0;
-  if (strcmp (iter_sig, "as") != 0)
-  {
-    g_warning ("_atspi_dbus_set_interfaces: Passed iterator with invalid signature %s", iter_sig);
-    dbus_free (iter_sig);
-    return;
-  }
-  dbus_free (iter_sig);
-  dbus_message_iter_recurse (iter, &iter_array);
-  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    const char *iface;
-    gint n;
-    dbus_message_iter_get_basic (&iter_array, &iface);
-    if (!strcmp (iface, "org.freedesktop.DBus.Introspectable")) continue;
-    n = _atspi_get_iface_num (iface);
-    if (n == -1)
-    {
-      g_warning ("AT-SPI: Unknown interface %s", iface);
-    }
-    else
-      accessible->interfaces |= (1 << n);
-    dbus_message_iter_next (&iter_array);
-  }
+
+  if (interface_names_demarshal (iter, &ifaces) != DEMARSHAL_STATUS_SUCCESS)
+    {
+      g_warning ("Passed iterator with invalid signature");
+      return;
+    }
+
+  accessible->interfaces = interface_names_to_bitmask (ifaces);
+  interface_names_free (ifaces);
+
   _atspi_accessible_add_cache (accessible, ATSPI_CACHE_INTERFACES);
 }
 
@@ -1435,20 +1661,20 @@ _atspi_dbus_set_state (AtspiAccessible *accessible, DBusMessageIter *iter)
   dbus_message_iter_recurse (iter, &iter_array);
   dbus_message_iter_get_fixed_array (&iter_array, &states, &count);
   if (count != 2)
-  {
-    g_warning ("AT-SPI: expected 2 values in states array; got %d\n", count);
-    if (!accessible->states)
-      accessible->states = _atspi_state_set_new_internal (accessible, 0);
-  }
+    {
+      g_warning ("AT-SPI: expected 2 values in states array; got %d\n", count);
+      if (!accessible->states)
+        accessible->states = _atspi_state_set_new_internal (accessible, 0);
+    }
   else
-  {
-    guint64 val = ((guint64)states [1]) << 32;
-    val += states [0];
-    if (!accessible->states)
-      accessible->states = _atspi_state_set_new_internal (accessible, val);
-    else
-      accessible->states->states = val;
-  }
+    {
+      guint64 val = ((guint64) states[1]) << 32;
+      val += states[0];
+      if (!accessible->states)
+        accessible->states = _atspi_state_set_new_internal (accessible, val);
+      else
+        accessible->states->states = val;
+    }
   _atspi_accessible_add_cache (accessible, ATSPI_CACHE_STATES);
 }
 
@@ -1524,17 +1750,17 @@ get_accessibility_bus_address_x11 (void)
       g_warning ("Could not open X display");
       return NULL;
     }
-      
+
   AT_SPI_BUS = XInternAtom (bridge_display, "AT_SPI_BUS", False);
   XGetWindowProperty (bridge_display,
-                     XDefaultRootWindow (bridge_display),
-                     AT_SPI_BUS, 0L,
-                     (long) BUFSIZ, False,
-                     (Atom) 31, &actual_type, &actual_format,
-                     &nitems, &leftover, &data_x11);
+                      XDefaultRootWindow (bridge_display),
+                      AT_SPI_BUS, 0L,
+                      (long) BUFSIZ, False,
+                      (Atom) 31, &actual_type, &actual_format,
+                      &nitems, &leftover, &data_x11);
   XCloseDisplay (bridge_display);
 
-  data = g_strdup ((gchar *)data_x11);
+  data = g_strdup ((gchar *) data_x11);
   XFree (data_x11);
   return data;
 }
@@ -1554,34 +1780,34 @@ get_accessibility_bus_address_dbus (void)
     return NULL;
 
   message = dbus_message_new_method_call ("org.a11y.Bus",
-                                         "/org/a11y/bus",
-                                         "org.a11y.Bus",
-                                         "GetAddress");
+                                          "/org/a11y/bus",
+                                          "org.a11y.Bus",
+                                          "GetAddress");
 
   dbus_error_init (&error);
   reply = dbus_connection_send_with_reply_and_block (session_bus,
-                                                    message,
-                                                    -1,
-                                                    &error);
+                                                     message,
+                                                     -1,
+                                                     &error);
   dbus_message_unref (message);
 
   if (!reply)
-  {
-    g_warning ("AT-SPI: Error retrieving accessibility bus address: %s: %s",
-               error.name, error.message);
-    dbus_error_free (&error);
-    goto out;
-  }
-  
+    {
+      g_warning ("AT-SPI: Error retrieving accessibility bus address: %s: %s",
+                 error.name, error.message);
+      dbus_error_free (&error);
+      goto out;
+    }
+
   {
     const char *tmp_address;
     if (!dbus_message_get_args (reply,
-                               NULL,
-                               DBUS_TYPE_STRING,
-                               &tmp_address,
-                               DBUS_TYPE_INVALID))
+                                NULL,
+                                DBUS_TYPE_STRING,
+                                &tmp_address,
+                                DBUS_TYPE_INVALID))
       {
-       dbus_message_unref (reply);
+        dbus_message_unref (reply);
         goto out;
       }
     address = g_strdup (tmp_address);
@@ -1642,7 +1868,7 @@ atspi_get_a11y_bus (void)
 
   if (!a11y_bus)
     {
-      if (!g_getenv("SSH_CONNECTION"))
+      if (!g_getenv ("SSH_CONNECTION"))
         g_warning ("Couldn't connect to accessibility bus: %s", error.message);
       dbus_error_free (&error);
       return NULL;
@@ -1650,16 +1876,16 @@ atspi_get_a11y_bus (void)
   else
     {
       if (!dbus_bus_register (a11y_bus, &error))
-       {
-         g_warning ("Couldn't register with accessibility bus: %s", error.message);
+        {
+          g_warning ("Couldn't register with accessibility bus: %s", error.message);
           dbus_error_free (&error);
           dbus_connection_close (a11y_bus);
           dbus_connection_unref (a11y_bus);
           a11y_bus = NULL;
-         return NULL;
-       }
+          return NULL;
+        }
     }
-  
+
   /* Simulate a weak ref on the bus */
   dbus_connection_set_data (a11y_bus, a11y_dbus_slot, a11y_bus, a11y_bus_free);
 
@@ -1676,7 +1902,7 @@ atspi_get_a11y_bus (void)
  * behavior.
  *
  * Set the timeout used for method calls. If this is not set explicitly,
- * a default of 0.8 ms is used.
+ * a default of 800 ms is used.
  * Note that at-spi2-registryd currently uses a timeout of 3 seconds when
  * sending a keyboard event notification. This means that, if an AT makes
  * a call in response to the keyboard notification and the application
@@ -1711,27 +1937,27 @@ atspi_set_main_context (GMainContext *cnx)
   if (atspi_main_context == cnx)
     return;
   if (process_deferred_messages_source != NULL)
-  {
-    g_source_destroy (process_deferred_messages_source);
-    process_deferred_messages_source = g_idle_source_new ();
-    g_source_set_callback (process_deferred_messages_source,
-                           process_deferred_messages_callback, NULL, NULL);
-    g_source_attach (process_deferred_messages_source, cnx);
-    g_source_unref (process_deferred_messages_source);
-  }
+    {
+      g_source_destroy (process_deferred_messages_source);
+      process_deferred_messages_source = g_idle_source_new ();
+      g_source_set_callback (process_deferred_messages_source,
+                             process_deferred_messages_callback, NULL, NULL);
+      g_source_attach (process_deferred_messages_source, cnx);
+      g_source_unref (process_deferred_messages_source);
+    }
   atspi_main_context = cnx;
   atspi_dbus_connection_setup_with_g_main (atspi_get_a11y_bus (), cnx);
 
   if (desktop)
-  {
-    gint i;
-    for (i = desktop->children->len - 1; i >= 0; i--)
     {
-      AtspiAccessible *child = g_ptr_array_index (desktop->children, i);
-      if (child->parent.app && child->parent.app->bus)
-        atspi_dbus_connection_setup_with_g_main (child->parent.app->bus, cnx);
+      gint i;
+      for (i = desktop->children->len - 1; i >= 0; i--)
+        {
+          AtspiAccessible *child = g_ptr_array_index (desktop->children, i);
+          if (child->parent.app && child->parent.app->bus)
+            atspi_dbus_connection_setup_with_g_main (child->parent.app->bus, cnx);
+        }
     }
-  }
 }
 
 #ifdef DEBUG_REF_COUNTS
@@ -1757,11 +1983,11 @@ _atspi_name_compat (gchar *name)
   gchar *p = name;
 
   while (*p)
-  {
-    if (*p == '-')
-      *p = ' ';
-    p++;
-  }
+    {
+      if (*p == '-')
+        *p = ' ';
+      p++;
+    }
   return name;
 }
 
@@ -1770,7 +1996,6 @@ _atspi_name_compat (gchar *name)
  * @role: an #AtspiRole object to query.
  *
  * Gets a localizable string that indicates the name of an #AtspiRole.
- * <em>DEPRECATED.</em>
  *
  * Returns: a localizable string name for an #AtspiRole enumerated type.
  **/
@@ -1799,6 +2024,33 @@ atspi_role_get_name (AtspiRole role)
   return NULL;
 }
 
+/**
+ * atspi_role_get_localized_name:
+ * @role: an #AtspiRole object to query.
+ *
+ * Gets the localized description string describing the #AtspiRole @role.
+ *
+ * Returns: the localized string describing the AtspiRole
+ **/
+gchar *
+atspi_role_get_localized_name (AtspiRole role)
+{
+  gchar *raw_name = NULL;
+  const char *translated_name;
+
+  _gettext_initialization ();
+
+  raw_name = atspi_role_get_name (role);
+  translated_name = dgettext (GETTEXT_PACKAGE, raw_name);
+  if (translated_name != raw_name)
+    {
+      g_free (raw_name);
+      return g_strdup (translated_name);
+    }
+  else
+    return raw_name;
+}
+
 GHashTable *
 _atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter *iter)
 {
@@ -1807,111 +2059,91 @@ _atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter
 
   dbus_message_iter_recurse (iter, &iter_dict);
   while (dbus_message_iter_get_arg_type (&iter_dict) != DBUS_TYPE_INVALID)
-  {
-    const char *key;
-    GValue *val = NULL;
-    dbus_message_iter_recurse (&iter_dict, &iter_dict_entry);
-    dbus_message_iter_get_basic (&iter_dict_entry, &key);
-    dbus_message_iter_next (&iter_dict_entry);
-    dbus_message_iter_recurse (&iter_dict_entry, &iter_variant);
-    if (!strcmp (key, "interfaces"))
-    {
-      _atspi_dbus_set_interfaces (accessible, &iter_variant);
-    }
-    else if (!strcmp (key, "Attributes"))
-    {
-      char *iter_sig = dbus_message_iter_get_signature (&iter_variant);
-      val = g_new0 (GValue, 1);;
-      g_value_init (val, G_TYPE_HASH_TABLE);
-      if (strcmp (iter_sig, "a{ss}") != 0)
-      {
-        dbus_free (iter_sig);
-        break;
-      }
-      dbus_free (iter_sig);
-      g_value_take_boxed (val, _atspi_dbus_hash_from_iter (&iter_variant));
-    }
-    else if (!strcmp (key, "Component.ScreenExtents"))
     {
-      dbus_int32_t d_int;
-      AtspiRect extents;
-      char *iter_sig = dbus_message_iter_get_signature (&iter_variant);
-      val = g_new0 (GValue, 1);;
-      g_value_init (val, ATSPI_TYPE_RECT);
-      if (strcmp (iter_sig, "(iiii)") != 0)
-      {
-        dbus_free (iter_sig);
-        break;
-      }
-      dbus_free (iter_sig);
-      dbus_message_iter_recurse (&iter_variant, &iter_struct);
-      dbus_message_iter_get_basic (&iter_struct, &d_int);
-      extents.x = d_int;
-      dbus_message_iter_next (&iter_struct);
-      dbus_message_iter_get_basic (&iter_struct, &d_int);
-      extents.y = d_int;
-      dbus_message_iter_next (&iter_struct);
-      dbus_message_iter_get_basic (&iter_struct, &d_int);
-      extents.width = d_int;
-      dbus_message_iter_next (&iter_struct);
-      dbus_message_iter_get_basic (&iter_struct, &d_int);
-      extents.height = d_int;
-      g_value_set_boxed (val, &extents);
+      const char *key;
+      GValue *val = NULL;
+      dbus_message_iter_recurse (&iter_dict, &iter_dict_entry);
+      dbus_message_iter_get_basic (&iter_dict_entry, &key);
+      dbus_message_iter_next (&iter_dict_entry);
+      dbus_message_iter_recurse (&iter_dict_entry, &iter_variant);
+      if (!strcmp (key, "interfaces"))
+        {
+          _atspi_dbus_set_interfaces (accessible, &iter_variant);
+        }
+      else if (!strcmp (key, "Attributes"))
+        {
+          char *iter_sig = dbus_message_iter_get_signature (&iter_variant);
+          val = g_new0 (GValue, 1);
+          ;
+          g_value_init (val, G_TYPE_HASH_TABLE);
+          if (strcmp (iter_sig, "a{ss}") != 0)
+            {
+              dbus_free (iter_sig);
+              break;
+            }
+          dbus_free (iter_sig);
+          g_value_take_boxed (val, _atspi_dbus_hash_from_iter (&iter_variant));
+        }
+      else if (!strcmp (key, "Component.ScreenExtents"))
+        {
+          dbus_int32_t d_int;
+          AtspiRect extents;
+          char *iter_sig = dbus_message_iter_get_signature (&iter_variant);
+          val = g_new0 (GValue, 1);
+          ;
+          g_value_init (val, ATSPI_TYPE_RECT);
+          if (strcmp (iter_sig, "(iiii)") != 0)
+            {
+              dbus_free (iter_sig);
+              break;
+            }
+          dbus_free (iter_sig);
+          dbus_message_iter_recurse (&iter_variant, &iter_struct);
+          dbus_message_iter_get_basic (&iter_struct, &d_int);
+          extents.x = d_int;
+          dbus_message_iter_next (&iter_struct);
+          dbus_message_iter_get_basic (&iter_struct, &d_int);
+          extents.y = d_int;
+          dbus_message_iter_next (&iter_struct);
+          dbus_message_iter_get_basic (&iter_struct, &d_int);
+          extents.width = d_int;
+          dbus_message_iter_next (&iter_struct);
+          dbus_message_iter_get_basic (&iter_struct, &d_int);
+          extents.height = d_int;
+          g_value_set_boxed (val, &extents);
+        }
+      if (val)
+        g_hash_table_insert (cache, g_strdup (key), val);
+      dbus_message_iter_next (&iter_dict);
     }
-    if (val)
-      g_hash_table_insert (cache, g_strdup (key), val); 
-    dbus_message_iter_next (&iter_dict);
-  }
 
   return cache;
 }
 
-gboolean
-_atspi_get_allow_sync ()
-{
-  return allow_sync;
-}
-
-gboolean
-_atspi_set_allow_sync (gboolean val)
-{
-  gboolean ret = allow_sync;
-
-  allow_sync = val;
-  return ret;
-}
-
-void
-_atspi_set_error_no_sync (GError **error)
-{
-  g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_SYNC_NOT_ALLOWED,
-                        _("Attempted synchronous call where prohibited"));
-}
-
 static const char *sr_introspection = "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
-"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
-"<node name=\"/org/a11y/atspi/screenreader\">\n"
-"  <interface name=\"org.a11y.Atspi.ScreenReader\">\n"
-"    <signal name=\"ReadingPosition\">\n"
-"      <arg type=\"i\"/>\n"
-"      <arg type=\"i\"/>\n"
-"    </signal>\n"
-"  </interface>\n"
-"</node>";
+                                      "\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
+                                      "<node name=\"/org/a11y/atspi/screenreader\">\n"
+                                      "  <interface name=\"org.a11y.Atspi.ScreenReader\">\n"
+                                      "    <signal name=\"ReadingPosition\">\n"
+                                      "      <arg type=\"i\"/>\n"
+                                      "      <arg type=\"i\"/>\n"
+                                      "    </signal>\n"
+                                      "  </interface>\n"
+                                      "</node>";
 
 static DBusHandlerResult
 screen_reader_filter (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
   if (dbus_message_is_method_call (message, DBUS_INTERFACE_INTROSPECTABLE,
-      "Introspect"))
-  {
-    DBusMessage *reply = dbus_message_new_method_return (message);
-    dbus_message_append_args (reply, DBUS_TYPE_STRING, &sr_introspection,
-                              DBUS_TYPE_INVALID);
-    dbus_connection_send (bus, reply, NULL);
-    dbus_message_unref (reply);
-    return DBUS_HANDLER_RESULT_HANDLED;
-  }
+                                   "Introspect"))
+    {
+      DBusMessage *reply = dbus_message_new_method_return (message);
+      dbus_message_append_args (reply, DBUS_TYPE_STRING, &sr_introspection,
+                                DBUS_TYPE_INVALID);
+      dbus_connection_send (bus, reply, NULL);
+      dbus_message_unref (reply);
+      return DBUS_HANDLER_RESULT_HANDLED;
+    }
   return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
@@ -1925,10 +2157,10 @@ _atspi_prepare_screen_reader_interface ()
     return (initialized > 0);
 
   if (dbus_bus_request_name (a11y_bus, "org.a11y.Atspi.ScreenReader", 0, NULL) < 0)
-  {
-    initialized = -1;
-    return FALSE;
-  }
+    {
+      initialized = -1;
+      return FALSE;
+    }
 
   initialized = 1;
   dbus_connection_add_filter (a11y_bus, screen_reader_filter, NULL, NULL);
@@ -1946,21 +2178,69 @@ _atspi_strdup_and_adjust_for_dbus (const char *s)
     return NULL;
 
   for (p = d; *p; p++)
-  {
-    if (*p == '-')
     {
-      memmove (p, p + 1, g_utf8_strlen (p, -1));
-      *p = toupper (*p);
-    }
-    else if (*p == ':')
-    {
-      parts++;
-      if (parts == 2)
-        break;
-      p [1] = toupper (p [1]);
+      if (*p == '-')
+        {
+          memmove (p, p + 1, g_utf8_strlen (p, -1));
+          *p = toupper (*p);
+        }
+      else if (*p == ':')
+        {
+          parts++;
+          if (parts == 2)
+            break;
+          p[1] = toupper (p[1]);
+        }
     }
-  }
 
-  d [0] = toupper (d [0]);
+  d[0] = toupper (d[0]);
   return d;
 }
+
+/**
+ * atspi_get_version:
+ * @major: (out): the major version.
+ * @minor: (out): the minor version.
+ * @micro: (out): the micro/patch version.
+ *
+ * Returns the version of the AT-SPI library being used at runtime.
+
+* Since: 2.50
+ */
+void
+atspi_get_version (gint *major, gint *minor, gint *micro)
+{
+  if (major)
+    *major = ATSPI_MAJOR_VERSION;
+  if (minor)
+    *minor = ATSPI_MINOR_VERSION;
+  if (micro)
+    *micro = ATSPI_MICRO_VERSION;
+}
+
+gboolean
+_atspi_key_is_on_keypad (gint keycode)
+{
+  switch (keycode)
+    {
+    case 106: /* / */
+    case 63:  /* * */
+    case 82:  /* - */
+    case 79:  /* 7 */
+    case 80:  /* 8 */
+    case 91:  /* 9 */
+    case 86:  /* + */
+    case 83:  /* 4 */
+    case 84:  /* 5 */
+    case 85:  /* 6 */
+    case 87:  /* 1 */
+    case 88:  /* 2 */
+    case 89:  /* 3 */
+    case 104: /* enter */
+    case 90:  /* 0 */
+    case 81:  /* . */
+      return TRUE;
+    default:
+      return FALSE;
+    }
+}
index 0461728..19f8dbe 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -46,7 +46,11 @@ atspi_set_timeout (gint val, gint startup_time);
 void
 atspi_set_main_context (GMainContext *cnx);
 
-gchar * atspi_role_get_name (AtspiRole role);
+gchar *atspi_role_get_name (AtspiRole role);
+
+gchar *atspi_role_get_localized_name (AtspiRole role);
+
+void atspi_get_version (gint *major, gint *minor, gint *micro);
 G_END_DECLS
 
-#endif /* _ATSPI_MISC_H_ */
+#endif /* _ATSPI_MISC_H_ */
diff --git a/atspi/atspi-mutter.c b/atspi/atspi-mutter.c
deleted file mode 100644 (file)
index 4445c18..0000000
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * AT-SPI - Assistive Technology Service Provider Interface
- * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
- *
- * Copyright 2019 SUSE LLC.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-/* atspi-mutter.c: support for keyboard/mouse handling using the
- * mutter/gnome-shell remote desktop interfaces
- *
- * This functionality is analogous to the X11-based code in
- * device-event-controller-x11.c. Placing the code here, rather than in the
- * registry daemon, allows the relevant dbus calls to come directly from the
- * AT-SPI client, rather than at-spi2-registryd being an intermediary,
- * which may be useful if a distribution wishes to lock down access to the
- * remote desktop interfaces.
- */
-
-#include "atspi-private.h"
-
-typedef struct
-{
-  DBusConnection *bus;
-  const char *rd_session_id;
-  const char *rd_session_path;
-  const char *sc_session_id;
-  const char *sc_session_path;
-  const char *sc_stream_path;
-  dbus_uint64_t window_id;
-  gboolean window_id_is_explicit;
-} ATSPI_MUTTER_DATA;
-
-static ATSPI_MUTTER_DATA data;
-
-#define MUTTER_REMOTE_DESKTOP_BUS_NAME "org.gnome.Mutter.RemoteDesktop"
-#define MUTTER_REMOTE_DESKTOP_OBJECT_PATH "/org/gnome/Mutter/RemoteDesktop"
-#define MUTTER_REMOTE_DESKTOP_INTERFACE "org.gnome.Mutter.RemoteDesktop"
-#define MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE "org.gnome.Mutter.RemoteDesktop.Session"
-#define MUTTER_SCREEN_CAST_BUS_NAME "org.gnome.Mutter.ScreenCast"
-#define MUTTER_SCREEN_CAST_OBJECT_PATH "/org/gnome/Mutter/ScreenCast"
-#define MUTTER_SCREEN_CAST_INTERFACE "org.gnome.Mutter.ScreenCast"
-#define MUTTER_SCREEN_CAST_SESSION_INTERFACE "org.gnome.Mutter.ScreenCast.Session"
-
-/* TODO: consider porting this to gdbus */
-
-static void
-ensure_bus ()
-{
-  if (data.bus)
-    return;
-  data.bus = dbus_bus_get (DBUS_BUS_SESSION, NULL);
-}
-
-static gboolean
-ensure_rd_session_path (GError **error)
-{
-  char *session_path;
-  DBusError d_error;
-
-  if (data.rd_session_path)
-    return (data.rd_session_path[0] != '\0');
-  ensure_bus ();
-
-  dbus_error_init (&d_error);
-  dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, MUTTER_REMOTE_DESKTOP_OBJECT_PATH, MUTTER_REMOTE_DESKTOP_INTERFACE, "CreateSession", &d_error, "=>o", &session_path);
-
-  data.rd_session_path = g_strdup (session_path);
-  if (!data.rd_session_path[0])
-    return FALSE;
-
-  dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "Start", &d_error, "");
-  return TRUE;
-}
-
-static dbus_uint64_t
-get_window_id (const char *name)
-{
-  DBusMessage *message, *reply;
-  DBusError d_error;
-  dbus_uint64_t window_id;
-  DBusMessageIter iter, iter_array, iter_dict, iter_sub_array, iter_sub_dict;
-  const char *prop_name;
-  const char *cur_name;
-  dbus_bool_t cur_focus;
-  gboolean have_focus;
-
-  dbus_error_init (&d_error);
-  message = dbus_message_new_method_call (MUTTER_REMOTE_DESKTOP_BUS_NAME, "/org/gnome/Shell/Introspect", "org.gnome.Shell.Introspect", "GetWindows");
-  reply = dbus_connection_send_with_reply_and_block (data.bus, message, -1, &d_error);
-  dbus_message_unref (message);
-
-  if (!reply)
-    return FALSE;
-  if (strcmp (dbus_message_get_signature (reply), "a{ta{sv}}") != 0)
-  {
-    dbus_message_unref (reply);
-    return FALSE;
-  }
-
-  dbus_message_iter_init (reply, &iter);
-  dbus_message_iter_recurse (&iter, &iter_array);
-  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    dbus_message_iter_recurse (&iter_array, &iter_dict);
-    dbus_message_iter_get_basic (&iter_dict, &window_id);
-    dbus_message_iter_next (&iter_dict);
-    dbus_message_iter_recurse (&iter_dict, &iter_sub_array);
-    cur_name = NULL;
-    have_focus = FALSE;
-    while (dbus_message_iter_get_arg_type (&iter_sub_array) != DBUS_TYPE_INVALID)
-    {
-      dbus_message_iter_recurse (&iter_sub_array, &iter_sub_dict);
-      dbus_message_iter_get_basic (&iter_sub_dict, &prop_name);
-      if (!strcmp (prop_name, "wm-class"))
-      {
-        DBusMessageIter iter_variant;
-        dbus_message_iter_next (&iter_sub_dict);
-        dbus_message_iter_recurse (&iter_sub_dict, &iter_variant);
-        dbus_message_iter_get_basic (&iter_variant, &cur_name);
-      }
-      if (!strcmp (prop_name, "has-focus"))
-      {
-        DBusMessageIter iter_variant;
-        dbus_message_iter_next (&iter_sub_dict);
-        dbus_message_iter_recurse (&iter_sub_dict, &iter_variant);
-        dbus_message_iter_get_basic (&iter_variant, &cur_focus);
-        have_focus = TRUE;
-      }
-      if (cur_name && have_focus)
-      {
-        if ((name && !strcmp (name, cur_name)) || cur_focus)
-        {
-          dbus_message_unref (reply);
-          return window_id;
-        }
-        break;
-      }
-      dbus_message_iter_next (&iter_sub_array);
-    }
-    dbus_message_iter_next (&iter_array);
-  }
-
-  dbus_message_unref (reply);
-  return 0;
-}
-
-static gboolean
-ensure_rd_session_id (GError **error)
-{
-  DBusMessage *message, *reply;
-  DBusError d_error;
-  const char *interface = "org.gnome.Mutter.RemoteDesktop.Session";
-  const char *prop_name = "SessionId";
-  DBusMessageIter iter, iter_variant;
-  const char *session_id;
-
-  if (data.rd_session_id)
-    return (data.rd_session_id[0] != '\0');
-
-  if (!ensure_rd_session_path (error))
-    return FALSE;
-
-  message = dbus_message_new_method_call (MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, "org.freedesktop.DBus.Properties", "Get");
-  dbus_message_append_args (message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &prop_name, DBUS_TYPE_INVALID);
-
-  dbus_error_init (&d_error);
-  reply = dbus_connection_send_with_reply_and_block (data.bus, message, -1, &d_error);
-  dbus_message_unref (message);
-  if (!reply)
-    return FALSE;
-  if (strcmp (dbus_message_get_signature (reply), "v") != 0)
-  {
-    dbus_message_unref (reply);
-    return FALSE;
-  }
-  dbus_message_iter_init (reply, &iter);
-  dbus_message_iter_recurse (&iter, &iter_variant);
-  dbus_message_iter_get_basic (&iter_variant, &session_id);
-  data.rd_session_id = g_strdup (session_id);
-  dbus_message_unref (reply);
-  return TRUE;
-}
-
-static gboolean
-ensure_sc_session (GError **error)
-{
-  DBusMessage *message, *reply;
-  DBusError d_error;
-  DBusMessageIter iter, iter_array, iter_dict_entry, iter_variant;
-  const char *prop_name = "remote-desktop-session-id";
-  const char *sc_session_path;
-
-  if (!ensure_rd_session_id (error))
-    return FALSE;
-
-  if (data.sc_session_path)
-    return (data.sc_session_path[0] != '\0');
-
-  message = dbus_message_new_method_call (MUTTER_SCREEN_CAST_BUS_NAME, MUTTER_SCREEN_CAST_OBJECT_PATH, MUTTER_SCREEN_CAST_INTERFACE, "CreateSession");
-  dbus_message_iter_init_append (message, &iter);
-  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_array);
-  dbus_message_iter_open_container (&iter_array, DBUS_TYPE_DICT_ENTRY, NULL, &iter_dict_entry);
-  dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &prop_name);
-  dbus_message_iter_open_container (&iter_dict_entry, DBUS_TYPE_VARIANT, "s", &iter_variant);
-  dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_STRING, &data.rd_session_id);
-  dbus_message_iter_close_container (&iter_dict_entry, &iter_variant);
-  dbus_message_iter_close_container (&iter_array, &iter_dict_entry);
-  dbus_message_iter_close_container (&iter, &iter_array);
-  dbus_error_init (&d_error);
-  reply = dbus_connection_send_with_reply_and_block (data.bus, message, -1, &d_error);
-  dbus_message_unref (message);
-  if (!reply)
-    return FALSE;
-  if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_OBJECT_PATH, &sc_session_path, DBUS_TYPE_INVALID))
-  {
-    dbus_message_unref (reply);
-    return FALSE;
-  }
-
-  data.sc_session_path = g_strdup (sc_session_path);
-  dbus_message_unref (reply);
-  return TRUE;
-}
-
-static gboolean
-init_mutter (gboolean need_window, GError **error)
-{
-  dbus_uint64_t window_id;
-  const char *prop_name = "window-id";
-  DBusError d_error;
-  DBusMessageIter iter, iter_array, iter_dict_entry, iter_variant;
-  DBusMessage *message, *reply;
-  const char *sc_stream_path;
-
-  if (!ensure_rd_session_path (error))
-    return FALSE;
-
-  if (!need_window)
-    return TRUE;
-
-  window_id = (data.window_id_is_explicit) ? data.window_id
-              : get_window_id (NULL);
-  if (!window_id)
-    return FALSE;
-
-  if (!ensure_sc_session (error))
-    return FALSE;
-
-  if (window_id == data.window_id)
-    return TRUE;
-
-  message = dbus_message_new_method_call (MUTTER_SCREEN_CAST_BUS_NAME, data.sc_session_path, MUTTER_SCREEN_CAST_SESSION_INTERFACE, "RecordWindow");
-  dbus_message_iter_init_append (message, &iter);
-  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_array);
-  dbus_message_iter_open_container (&iter_array, DBUS_TYPE_DICT_ENTRY, NULL, &iter_dict_entry);
-  dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, &prop_name);
-  dbus_message_iter_open_container (&iter_dict_entry, DBUS_TYPE_VARIANT, "t", &iter_variant);
-  dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_UINT64, &window_id);
-  dbus_message_iter_close_container (&iter_dict_entry, &iter_variant);
-  dbus_message_iter_close_container (&iter_array, &iter_dict_entry);
-  dbus_message_iter_close_container (&iter, &iter_array);
-  dbus_error_init (&d_error);
-  reply = dbus_connection_send_with_reply_and_block (data.bus, message, -1, &d_error);
-  dbus_message_unref (message);
-  if (!reply)
-    return FALSE;
-  if (!dbus_message_get_args (reply, NULL, DBUS_TYPE_OBJECT_PATH, &sc_stream_path, DBUS_TYPE_INVALID))
-  {
-    dbus_message_unref (reply);
-    return FALSE;
-  }
-
-  data.sc_stream_path = g_strdup (sc_stream_path);
-  dbus_message_unref (reply);
-  data.window_id = window_id;
-  return TRUE;
-}
-
-gboolean
-_atspi_mutter_generate_keyboard_event (glong keyval,
-                                      const gchar *keystring,
-                                      AtspiKeySynthType synth_type, GError **error)
-{
-  DBusError d_error;
-  dbus_uint32_t d_keyval = keyval;
-
-  if (!init_mutter (FALSE, error))
-    return FALSE;
-
-  dbus_error_init (&d_error);
-  switch (synth_type)
-  {
-  case ATSPI_KEY_PRESS:
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyKeyboardKeycode", &d_error, "ub", d_keyval, TRUE);
-    break;
-  case ATSPI_KEY_RELEASE:
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyKeyboardKeycode", &d_error, "ub", d_keyval, FALSE);
-    break;
-  case ATSPI_KEY_PRESSRELEASE:
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyKeyboardKeycode", &d_error, "ub", d_keyval, TRUE);
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyKeyboardKeycode", &d_error, "ub", d_keyval, FALSE);
-    break;
-  case ATSPI_KEY_SYM:
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyKeyboardKeysyme", &d_error, "ub", d_keyval, TRUE);
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyKeyboardKeysyme", &d_error, "ub", d_keyval, FALSE);
-    break;
-  default:
-    /* TODO: set error */
-    g_warning ("%s: unsupported type", __func__);
-    return FALSE;
-  }
-  if (dbus_error_is_set (&d_error))
-    {
-      g_warning ("GenerateKeyboardEvent failed: %s", d_error.message);
-      dbus_error_free (&d_error);
-         return FALSE;
-    }
-
-  return TRUE;
-}
-
-gboolean
-_atspi_mutter_generate_mouse_event (glong x, glong y, const gchar *name, GError **error)
-{
-  gint button = 0;
-  double d_x = x, d_y = y;
-  DBusError d_error;
-
-  if (!init_mutter (TRUE, error))
-    return FALSE;
-
-  dbus_error_init (&d_error);
-  switch (name[0])
-  {
-  case 'b':
-    button = name[1] - '1';
-    if (button < 0 || button > 4)
-      return FALSE;
-    if (x != -1 && y != -1)
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerMotionAbsolute", &d_error, "sdd", data.sc_stream_path, d_x, d_y);
-    switch (name[2])
-    {
-    case 'p':
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, TRUE);
-      break;
-    case 'r':
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, FALSE);
-      break;
-    case 'c':
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, TRUE);
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, FALSE);
-      break;
-    case 'd':
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, TRUE);
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, FALSE);
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, TRUE);
-      dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerButton", &d_error, "ib", button, FALSE);
-      break;
-    default:
-      return FALSE;
-    }
-    break;
-  case 'a': /* absolute motion */
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerMotionAbsolute", &d_error, "sdd", data.sc_stream_path, d_x, d_y);
-    break;
-  case 'r': /* relative */
-    dbind_method_call_reentrant (data.bus, MUTTER_REMOTE_DESKTOP_BUS_NAME, data.rd_session_path, MUTTER_REMOTE_DESKTOP_SESSION_INTERFACE, "NotifyPointerMotionRelative", &d_error, "dd", d_x, d_y);
-    break;
-  default:
-    return FALSE;
-  }
-  return TRUE;
-}
-
-void
-_atspi_mutter_set_reference_window (AtspiAccessible *accessible)
-{
-  if (accessible)
-  {
-    AtspiRole role = atspi_accessible_get_role (accessible, NULL);
-    gchar *name;
-    g_return_if_fail (role != ATSPI_ROLE_APPLICATION);
-    name = atspi_accessible_get_name (accessible, NULL);
-    data.window_id = get_window_id (name);
-    data.window_id_is_explicit = TRUE;
-  }
-
-  else
-  {
-    data.window_id_is_explicit = FALSE;
-  }
-}
index a838ba0..2e9a6d0 100644 (file)
@@ -36,10 +36,10 @@ atspi_object_dispose (GObject *object)
   AtspiObject *aobj = ATSPI_OBJECT (object);
 
   if (aobj->app)
-  {
-    g_object_unref (aobj->app);
-    aobj->app = NULL;
-  }
+    {
+      g_object_unref (aobj->app);
+      aobj->app = NULL;
+    }
 
   G_OBJECT_CLASS (atspi_object_parent_class)->dispose (object);
 }
index 5acbde8..3bb0bc5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_OBJECT                        (atspi_object_get_type ())
-#define ATSPI_OBJECT(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_OBJECT, AtspiObject))
-#define ATSPI_OBJECT_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_OBJECT, AtspiObjectClass))
-#define ATSPI_IS_OBJECT(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_OBJECT))
-#define ATSPI_IS_OBJECT_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_OBJECT))
-#define ATSPI_OBJECT_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_OBJECT, AtspiObjectClass))
+#define ATSPI_TYPE_OBJECT (atspi_object_get_type ())
+#define ATSPI_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_OBJECT, AtspiObject))
+#define ATSPI_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_OBJECT, AtspiObjectClass))
+#define ATSPI_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_OBJECT))
+#define ATSPI_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_OBJECT))
+#define ATSPI_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_OBJECT, AtspiObjectClass))
 
 typedef struct _AtspiObject AtspiObject;
 struct _AtspiObject
@@ -53,8 +53,8 @@ struct _AtspiObjectClass
   GObjectClass parent_class;
 };
 
-GType atspi_object_get_type (void); 
+GType atspi_object_get_type (void);
 
 G_END_DECLS
 
-#endif /* _ATSPI_OBJECT_H_ */
+#endif /* _ATSPI_OBJECT_H_ */
index 9ddc600..b744c22 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 #ifndef _ATSPI_PRIVATE_H_
 #define _ATSPI_PRIVATE_H_
 
-#include <config.h>
 #include "atspi-device-listener-private.h"
 #include "atspi-event-listener-private.h"
 #include "atspi-matchrule-private.h"
 #include "atspi-misc-private.h"
-#include "atspi-mutter-private.h"
+#include <config.h>
 
 #include "glib/gi18n.h"
 
-#include "atspi.h"
 #include "atspi-accessible-private.h"
+#include "atspi.h"
 
 G_BEGIN_DECLS
 void _atspi_reregister_device_listeners ();
 G_END_DECLS
 
-#endif /* _ATSPI_PRIVATE_H_ */
+#endif /* _ATSPI_PRIVATE_H_ */
index 382308f..a1c9325 100644 (file)
 
 #include "atspi-private.h"
 
+/**
+ * AtspiRegistry:
+ *
+ * A service through which applications providing accessibility services
+ * can rendezvous with consumers of those services.
+ *
+ * A service through which applications providing accessibility services (servers)
+ * can rendezvous with consumers of those services (Assistive Technologies). The
+ * atspi-registry is the first "port of call" for accessible applications and for
+ * assistive technologies wishing to query and interact with those applications.
+ */
+
 typedef struct
 {
   AtspiDeviceListener *listener;
-  GArray             *key_set;
-  AtspiKeyMaskType         modmask;
-  AtspiKeyEventMask        event_types;
+  GArray *key_set;
+  AtspiKeyMaskType modmask;
+  AtspiKeyEventMask event_types;
   gint sync_type;
 } DeviceListenerEntry;
 
+typedef struct
+{
+  AtspiGenerateMouseEventCB callback;
+  void *callback_data;
+} AtspiGenerateMouseEventClosure;
+
 static GList *device_listeners;
 
 /**
  * atspi_get_desktop_count:
  *
  * Gets the number of virtual desktops.
- * NOTE: multiple virtual desktops are not implemented yet; as a 
+ * NOTE: multiple virtual desktops are not implemented yet; as a
  * consequence, this function always returns 1.
  *
  * Returns: a #gint indicating the number of active virtual desktops.
@@ -64,10 +82,11 @@ atspi_get_desktop_count ()
  * Returns: (transfer full): a pointer to the @i-th virtual desktop's
  * #AtspiAccessible representation.
  **/
-AtspiAccessible*
+AtspiAccessible *
 atspi_get_desktop (gint i)
 {
-  if (i != 0) return NULL;
+  if (i != 0)
+    return NULL;
   return _atspi_ref_accessible (atspi_bus_registry, atspi_path_root);
 }
 
@@ -104,29 +123,22 @@ notify_keystroke_listener (DeviceListenerEntry *e)
   gchar *path = _atspi_device_listener_get_path (e->listener);
   dbus_uint32_t d_modmask = e->modmask;
   dbus_uint32_t d_event_types = e->event_types;
-  AtspiEventListenerMode     listener_mode;
-  gboolean                          retval = FALSE;
-  DBusError d_error;
+  AtspiEventListenerMode listener_mode;
+  gboolean retval = FALSE;
 
   listener_mode.synchronous =
-         (dbus_bool_t) ((e->sync_type & ATSPI_KEYLISTENER_SYNCHRONOUS)!=0);
+      (dbus_bool_t) ((e->sync_type & ATSPI_KEYLISTENER_SYNCHRONOUS) != 0);
   listener_mode.preemptive =
-         (dbus_bool_t) ((e->sync_type & ATSPI_KEYLISTENER_CANCONSUME)!=0);
+      (dbus_bool_t) ((e->sync_type & ATSPI_KEYLISTENER_CANCONSUME) != 0);
   listener_mode.global =
-         (dbus_bool_t) ((e->sync_type & ATSPI_KEYLISTENER_ALL_WINDOWS)!=0);
+      (dbus_bool_t) ((e->sync_type & ATSPI_KEYLISTENER_ALL_WINDOWS) != 0);
 
-  dbus_error_init (&d_error);
-  dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry,
-                               atspi_path_dec, atspi_interface_dec,
-                               "RegisterKeystrokeListener", &d_error,
-                               "oa(iisi)uu(bbb)=>b", path, e->key_set,
-                               d_modmask, d_event_types, &listener_mode,
-                               &retval);
-  if (dbus_error_is_set (&d_error))
-    {
-      g_warning ("RegisterKeystrokeListener failed: %s", d_error.message);
-      dbus_error_free (&d_error);
-    }
+  dbind_method_call (_atspi_bus (), atspi_bus_registry,
+                     atspi_path_dec, atspi_interface_dec,
+                     "RegisterKeystrokeListener",
+                     "oa(iisi)uu(bbb)=>b", path, e->key_set,
+                     d_modmask, d_event_types, &listener_mode,
+                     &retval);
 
   g_free (path);
 
@@ -182,24 +194,24 @@ unregister_listener (gpointer data, GObject *object)
  * @sync_type: an #AtspiKeyListenerSyncType parameter indicating
  *             the behavior of the notification/listener transaction.
  * @error: (allow-none): a pointer to a %NULL #GError pointer, or %NULL
- *             
+ *
  * Registers a listener for keystroke events, either pre-emptively for
  *             all windows (%ATSPI_KEYLISTENER_ALL_WINDOWS),
  *             non-preemptively (%ATSPI_KEYLISTENER_NOSYNC), or
  *             pre-emptively at the toolkit level (%ATSPI_KEYLISTENER_CANCONSUME).
  *             If ALL_WINDOWS or CANCONSUME are used, the event is consumed
- *             upon receipt if one of @listener's callbacks returns %TRUE 
+ *             upon receipt if one of @listener's callbacks returns %TRUE
  *             (other sync_type values may be available in the future).
  *
  * Returns: %TRUE if successful, otherwise %FALSE.
  **/
 gboolean
-atspi_register_keystroke_listener (AtspiDeviceListener  *listener,
-                                        GArray             *key_set,
-                                        AtspiKeyMaskType         modmask,
-                                        AtspiKeyEventMask        event_types,
-                                        AtspiKeyListenerSyncType sync_type,
-                                         GError **error)
+atspi_register_keystroke_listener (AtspiDeviceListener *listener,
+                                   GArray *key_set,
+                                   AtspiKeyMaskType modmask,
+                                   AtspiKeyEventMask event_types,
+                                   AtspiKeyListenerSyncType sync_type,
+                                   GError **error)
 {
   DeviceListenerEntry *e;
 
@@ -218,18 +230,18 @@ atspi_register_keystroke_listener (AtspiDeviceListener  *listener,
       e->key_set->len = key_set->len;
       for (i = 0; i < key_set->len; i++)
         {
-         AtspiKeyDefinition *kd =  ((AtspiKeyDefinition *) key_set->data) + i;
-         AtspiKeyDefinition *d_kd =  ((AtspiKeyDefinition *) e->key_set->data) + i;
+          AtspiKeyDefinition *kd = ((AtspiKeyDefinition *) key_set->data) + i;
+          AtspiKeyDefinition *d_kd = ((AtspiKeyDefinition *) e->key_set->data) + i;
           d_kd->keycode = kd->keycode;
-         d_kd->keysym = kd->keysym;
-         if (kd->keystring)
-           {
-             d_kd->keystring = kd->keystring;
-           } 
-          else 
+          d_kd->keysym = kd->keysym;
+          if (kd->keystring)
             {
-             d_kd->keystring = "";
-           }
+              d_kd->keystring = kd->keystring;
+            }
+          else
+            {
+              d_kd->keystring = "";
+            }
         }
     }
   else
@@ -264,17 +276,16 @@ atspi_register_keystroke_listener (AtspiDeviceListener  *listener,
  **/
 gboolean
 atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
-                                     GArray              *key_set,
-                                     AtspiKeyMaskType     modmask,
-                                     AtspiKeyEventMask    event_types,
-                                     GError             **error)
+                                     GArray *key_set,
+                                     AtspiKeyMaskType modmask,
+                                     AtspiKeyEventMask event_types,
+                                     GError **error)
 {
   GArray *d_key_set;
   gchar *path;
   gint i;
   dbus_uint32_t d_modmask = modmask;
   dbus_uint32_t d_event_types = event_types;
-  DBusError d_error;
   GList *l;
 
   if (!listener)
@@ -282,8 +293,6 @@ atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
       return FALSE;
     }
 
-  dbus_error_init (&d_error);
-
   path = _atspi_device_listener_get_path (listener);
 
   /* copy the keyval filter values from the C api into the DBind KeySet */
@@ -293,18 +302,18 @@ atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
       d_key_set->len = key_set->len;
       for (i = 0; i < key_set->len; ++i)
         {
-         AtspiKeyDefinition *kd =  ((AtspiKeyDefinition *) key_set->data) + i;
-         AtspiKeyDefinition *d_kd =  ((AtspiKeyDefinition *) d_key_set->data) + i;
+          AtspiKeyDefinition *kd = ((AtspiKeyDefinition *) key_set->data) + i;
+          AtspiKeyDefinition *d_kd = ((AtspiKeyDefinition *) d_key_set->data) + i;
           d_kd->keycode = kd->keycode;
-         d_kd->keysym = kd->keysym;
-         if (kd->keystring)
-           {
-             d_kd->keystring = kd->keystring;
-           } 
-          else 
+          d_kd->keysym = kd->keysym;
+          if (kd->keystring)
+            {
+              d_kd->keystring = kd->keystring;
+            }
+          else
             {
-             d_kd->keystring = "";
-           }
+              d_kd->keystring = "";
+            }
         }
     }
   else
@@ -312,24 +321,19 @@ atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
       d_key_set = g_array_sized_new (FALSE, TRUE, sizeof (AtspiKeyDefinition), 0);
     }
 
-  dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry,
-                               atspi_path_dec, atspi_interface_dec,
-                               "DeregisterKeystrokeListener", &d_error,
-                               "oa(iisi)uu", path, d_key_set, d_modmask,
-                               d_event_types);
-  if (dbus_error_is_set (&d_error))
-    {
-      g_warning ("DeregisterKeystrokeListener failed: %s", d_error.message);
-      dbus_error_free (&d_error);
-    }
+  dbind_method_call (_atspi_bus (), atspi_bus_registry,
+                     atspi_path_dec, atspi_interface_dec,
+                     "DeregisterKeystrokeListener",
+                     "oa(iisi)uu", path, d_key_set, d_modmask,
+                     d_event_types);
 
   unregister_listener (listener, NULL);
   for (l = device_listeners; l;)
     {
       /* TODO: This code is all wrong / doesn't match what is in
- *       deviceeventcontroller.c. It would be nice to deprecate these methods
- *       in favor of methods that return an ID for the registration that can
- *       be passed to a deregister function, for instance. */
      *       deviceeventcontroller.c. It would be nice to deprecate these methods
      *       in favor of methods that return an ID for the registration that can
      *       be passed to a deregister function, for instance. */
       DeviceListenerEntry *e = l->data;
       if (e->modmask == modmask && e->event_types == event_types)
         {
@@ -348,45 +352,19 @@ atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
 
 /**
  * atspi_register_device_event_listener:
- * @listener:  a pointer to the #AtspiDeviceListener which requests
- *             the events.
- * @event_types: an #AtspiDeviceEventMask mask indicating which
- *             types of key events are requested (%ATSPI_KEY_PRESSED, etc.).
- * @filter: (allow-none): Unused parameter.
- * @error: (allow-none): a pointer to a %NULL #GError pointer, or %NULL
- *             
- * Registers a listener for device events, for instance button events.
  *
- * Returns: %TRUE if successful, otherwise %FALSE.
+ * This function does nothing and should not be called.
+ *
+ * Returns: Always returns %FALSE.
  **/
 gboolean
-atspi_register_device_event_listener (AtspiDeviceListener  *listener,
-                                AtspiDeviceEventMask  event_types,
-                                void                      *filter, GError **error)
+atspi_register_device_event_listener (AtspiDeviceListener *listener,
+                                      AtspiDeviceEventMask event_types,
+                                      void *filter,
+                                      GError **error)
 {
-  gboolean                          retval = FALSE;
-  dbus_uint32_t d_event_types = event_types;
-  gchar *path;
-  DBusError d_error;
-
-  if (!listener)
-    {
-      return retval;
-    }
-
-  dbus_error_init (&d_error);
-
-  path = _atspi_device_listener_get_path (listener);
-
-    dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "RegisterDeviceEventListener", &d_error, "ou=>b", path, d_event_types, &retval);
-    if (dbus_error_is_set (&d_error))
-      {
-        g_warning ("RegisterDeviceEventListener failed: %s", d_error.message);
-        dbus_error_free (&d_error);
-      }
-
-  g_free (path);
-  return retval;
+  /* See https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/94 for why this code is removed */
+  return FALSE;
 }
 
 /**
@@ -403,39 +381,11 @@ atspi_register_device_event_listener (AtspiDeviceListener  *listener,
  **/
 gboolean
 atspi_deregister_device_event_listener (AtspiDeviceListener *listener,
-                                  void                     *filter, GError **error)
+                                        void *filter,
+                                        GError **error)
 {
-  dbus_uint32_t event_types = 0;
-  gchar *path;
-  DBusError d_error;
-
-  if (!listener)
-    {
-      return FALSE;
-    }
-
-  dbus_error_init (&d_error);
-
-  path = _atspi_device_listener_get_path (listener);
-
-  event_types |= (1 << ATSPI_BUTTON_PRESSED_EVENT);
-  event_types |= (1 << ATSPI_BUTTON_RELEASED_EVENT);
-
-  dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "DeregisterDeviceEventListener", &d_error, "ou", path, event_types);
-  if (dbus_error_is_set (&d_error))
-    {
-      g_warning ("DeregisterDeviceEventListener failed: %s", d_error.message);
-      dbus_error_free (&d_error);
-    }
-
-  g_free (path);
-  return TRUE;
-}
-
-static gboolean
-using_mutter ()
-{
-  return (g_getenv ("WAYLAND_DISPLAY") != NULL);
+  /* See https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/94 for why this code is removed */
+  return FALSE;
 }
 
 /**
@@ -463,23 +413,18 @@ using_mutter ()
  **/
 gboolean
 atspi_generate_keyboard_event (glong keyval,
-                          const gchar *keystring,
-                          AtspiKeySynthType synth_type, GError **error)
+                               const gchar *keystring,
+                               AtspiKeySynthType synth_type,
+                               GError **error)
 {
   dbus_uint32_t d_synth_type = synth_type;
   dbus_int32_t d_keyval = keyval;
   DBusError d_error;
 
-  if (using_mutter ())
-  {
-    if (_atspi_mutter_generate_keyboard_event (keyval, keystring, synth_type, error))
-      return TRUE;
-  }
-
   dbus_error_init (&d_error);
   if (!keystring)
     keystring = "";
-  dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "GenerateKeyboardEvent", &d_error, "isu", d_keyval, keystring, d_synth_type);
+  dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry, atspi_path_dec, atspi_interface_dec, "GenerateKeyboardEvent", &d_error, "isu", d_keyval, keystring, d_synth_type);
   if (dbus_error_is_set (&d_error))
     {
       g_warning ("GenerateKeyboardEvent failed: %s", d_error.message);
@@ -514,14 +459,8 @@ atspi_generate_mouse_event (glong x, glong y, const gchar *name, GError **error)
 
   g_return_val_if_fail (name != NULL, FALSE);
 
-  if (using_mutter ())
-  {
-    if (_atspi_mutter_generate_mouse_event (x, y, name, error))
-      return TRUE;
-  }
-
   dbus_error_init (&d_error);
-  dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry,
+  dbind_method_call_reentrant (_atspi_bus (), atspi_bus_registry,
                                atspi_path_dec, atspi_interface_dec,
                                "GenerateMouseEvent", &d_error, "iis",
                                d_x, d_y, name);
@@ -534,24 +473,72 @@ atspi_generate_mouse_event (glong x, glong y, const gchar *name, GError **error)
   return TRUE;
 }
 
+static void
+atspi_generate_mouse_event_cb (DBusPendingCall *pending, void *user_data)
+{
+  AtspiGenerateMouseEventClosure *closure = user_data;
+
+  closure->callback (closure->callback_data);
+  dbus_pending_call_unref (pending);
+}
+
+/**
+ * atspi_generate_mouse_event_async:
+ * @x: a #glong indicating the screen x coordinate of the mouse event.
+ * @y: a #glong indicating the screen y coordinate of the mouse event.
+ * @name: a string indicating which mouse event to be synthesized
+ *        (e.g. "b1p", "b1c", "b2r", "rel", "abs").
+ * @callback: (scope notified) (allow-none): a callback to be called when a
+ * reply is received. May be NULL.
+ * @callback_data: (closure) (allow-none): data to be passed to @callback.
+ * @error: (allow-none): a pointer to a %NULL #GError pointer, or %NULL
+ *
+ * Like atspi_generate_mouse_event, but asynchronous.
+ **/
+void
+atspi_generate_mouse_event_async (glong x, glong y, const gchar *name, AtspiGenerateMouseEventCB callback, void *callback_data, GError **error)
+{
+  dbus_int32_t d_x = x, d_y = y;
+  DBusMessage *message;
+  DBusPendingCall *pending = NULL;
+  AtspiGenerateMouseEventClosure *closure = NULL;
+
+  g_return_if_fail (name != NULL);
+
+  message = dbus_message_new_method_call (atspi_bus_registry,
+                                          atspi_path_dec, atspi_interface_dec,
+                                          "GenerateMouseEvent");
+  dbus_message_append_args (message, DBUS_TYPE_INT32, &d_x, DBUS_TYPE_INT32, &d_y, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
+
+  if (!callback)
+    {
+      dbus_connection_send (_atspi_bus (), message, NULL);
+      dbus_message_unref (message);
+      return;
+    }
+
+  dbus_connection_send_with_reply (_atspi_bus (), message, &pending, -1);
+  dbus_message_unref (message);
+  if (pending)
+    {
+      closure = g_new0 (AtspiGenerateMouseEventClosure, 1);
+      closure->callback = callback;
+      closure->callback_data = callback_data;
+      dbus_pending_call_set_notify (pending, atspi_generate_mouse_event_cb, closure, g_free);
+    }
+}
+
 /**
  * atspi_set_reference_window:
  * @accessible: the #AtspiAccessible corresponding to the window to select.
  *              should be a top-level window with a role of
  *              ATSPI_ROLE_APPLICATION.
  *
- * Sets the reference window that will be used when atspi_generate_mouse_event
- * is called. Coordinates will be assumed to be relative to this window. This
- * is needed because, due to Wayland's security model, it is not currently
- * possible to retrieve global coordinates.
- * If NULL is passed, then AT-SPI will use the window that has focus at the
- * time that atspi_generate_mouse_event is called.
+ * Deprecated. This function no longer does anything and should not be used.
  */
 void
 atspi_set_reference_window (AtspiAccessible *accessible)
 {
-  if (using_mutter ())
-    _atspi_mutter_set_reference_window (accessible);
 }
 
 AtspiKeyDefinition *
index 43150c2..18d5524 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 #define _ATSPI_REGISTRY_H_
 
 #include "atspi-accessible.h"
-#include "atspi-types.h"
 #include "atspi-device-listener.h"
+#include "atspi-types.h"
 
 G_BEGIN_DECLS
 
+typedef void (*AtspiGenerateMouseEventCB) (void *user_data);
+
 GType atspi_key_definition_get_type ();
 
 gint atspi_get_desktop_count ();
 
-AtspiAccessibleatspi_get_desktop (gint i);
+AtspiAccessible *atspi_get_desktop (gint i);
 
 GArray *atspi_get_desktop_list ();
 
 gboolean
-atspi_register_keystroke_listener (AtspiDeviceListener  *listener,
-                                        GArray *key_set,
-                                        AtspiKeyMaskType         modmask,
-                                        AtspiKeyEventMask        event_types,
-                                        AtspiKeyListenerSyncType sync_type,
-                                         GError **error);
+atspi_register_keystroke_listener (AtspiDeviceListener *listener,
+                                   GArray *key_set,
+                                   AtspiKeyMaskType modmask,
+                                   AtspiKeyEventMask event_types,
+                                   AtspiKeyListenerSyncType sync_type,
+                                   GError **error);
 
 gboolean
 atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
-                            GArray              *key_set,
-                                               AtspiKeyMaskType         modmask,
-                                               AtspiKeyEventMask        event_types,
-                                               GError **error);
+                                     GArray *key_set,
+                                     AtspiKeyMaskType modmask,
+                                     AtspiKeyEventMask event_types,
+                                     GError **error);
 
 gboolean
-atspi_register_device_event_listener (AtspiDeviceListener  *listener,
-                                AtspiDeviceEventMask  event_types,
-                                void                      *filter, GError **error);
+atspi_register_device_event_listener (AtspiDeviceListener *listener,
+                                      AtspiDeviceEventMask event_types,
+                                      void *filter,
+                                      GError **error);
 
 gboolean
 atspi_deregister_device_event_listener (AtspiDeviceListener *listener,
-                                  void                     *filter, GError **error);
+                                        void *filter,
+                                        GError **error);
 
 gboolean
 atspi_generate_keyboard_event (glong keyval,
-                          const gchar *keystring,
-                          AtspiKeySynthType synth_type, GError **error);
+                               const gchar *keystring,
+                               AtspiKeySynthType synth_type,
+                               GError **error);
 
 gboolean
 atspi_generate_mouse_event (glong x, glong y, const gchar *name, GError **error);
 
 void
+atspi_generate_mouse_event_async (glong x, glong y, const gchar *name, AtspiGenerateMouseEventCB callback, void *callback_data, GError **error);
+
+void
 atspi_set_reference_window (AtspiAccessible *accessible);
 G_END_DECLS
 
-#endif /* _ATSPI_REGISTRY_H_ */
+#endif /* _ATSPI_REGISTRY_H_ */
index c441f2b..5d166fd 100644 (file)
 #include "atspi-private.h"
 
 /**
+ * AtspiRelation:
+ *
+ * An interface via which non-hierarchical relationships
+ * are indicated.
+ *
+ * An interface via which non-hierarchical relationships
+ * are indicated. An instance of this interface represents
+ * a "one-to-many" correspondence.
+ */
+
+/**
  * atspi_relation_get_relation_type:
  * @obj: a pointer to the #AtspiRelation object to query.
  *
@@ -97,12 +108,12 @@ _atspi_relation_new_from_iter (DBusMessageIter *iter)
   relation->targets = g_array_new (TRUE, TRUE, sizeof (AtspiAccessible *));
   dbus_message_iter_recurse (&iter_struct, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    AtspiAccessible *accessible;
-    accessible = _atspi_dbus_return_accessible_from_iter (&iter_array);
-    relation->targets = g_array_append_val (relation->targets, accessible);
-    /* Iter was moved already, so no need to call dbus_message_iter_next */
-  }
+    {
+      AtspiAccessible *accessible;
+      accessible = _atspi_dbus_consume_accessible (&iter_array);
+      relation->targets = g_array_append_val (relation->targets, accessible);
+      /* Iter was moved already, so no need to call dbus_message_iter_next */
+    }
   return relation;
 }
 
@@ -120,7 +131,7 @@ atspi_relation_finalize (GObject *object)
   gint i;
 
   for (i = 0; i < relation->targets->len; i++)
-  g_object_unref (g_array_index (relation->targets, AtspiAccessible *, i));
+    g_object_unref (g_array_index (relation->targets, AtspiAccessible *, i));
   g_array_free (relation->targets, TRUE);
 
   G_OBJECT_CLASS (atspi_relation_parent_class)->finalize (object);
index 0c32d6a..0a8da57 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_RELATION                    (atspi_relation_get_type ())
-#define ATSPI_IS_RELATION(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_RELATION)
-#define ATSPI_RELATION(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_RELATION, AtspiRelation)
-#define ATSPI_RELATION_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_RELATION, AtspiRelation))
+#define ATSPI_TYPE_RELATION (atspi_relation_get_type ())
+#define ATSPI_IS_RELATION(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_RELATION)
+#define ATSPI_RELATION(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_RELATION, AtspiRelation)
+#define ATSPI_RELATION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_RELATION, AtspiRelation))
 
 GType atspi_relation_get_type ();
 
@@ -57,11 +57,11 @@ AtspiRelationType atspi_relation_get_relation_type (AtspiRelation *obj);
 
 gint atspi_relation_get_n_targets (AtspiRelation *obj);
 
-AtspiAccessible * atspi_relation_get_target (AtspiRelation *obj, gint i);
+AtspiAccessible *atspi_relation_get_target (AtspiRelation *obj, gint i);
 
 /* private */
-AtspiRelation * _atspi_relation_new_from_iter (DBusMessageIter *iter);
+AtspiRelation *_atspi_relation_new_from_iter (DBusMessageIter *iter);
 
 G_END_DECLS
 
-#endif /* _ATSPI_RELATION_H_ */
+#endif /* _ATSPI_RELATION_H_ */
index 0e72845..0c74783 100644 (file)
 #include "atspi-private.h"
 
 /**
+ * AtspiSelection:
+ *
+ * An interface which indicates that an object exposes a 'selection' model,
+ * allowing the selection of one or more of its children.
+ *
+ * An interface which indicates that an object exposes a 'selection'
+ * model, allowing the selection of one or more of its children.
+ * Read-only Selection instances are possible, in which case the
+ * interface is used to programmatically determine the selected-ness
+ * of its children.
+ */
+
+/**
  * atspi_selection_get_n_selected_children:
  * @obj: a pointer to the #AtspiSelection implementor on which to operate.
  *
@@ -54,7 +67,7 @@ atspi_selection_get_n_selected_children (AtspiSelection *obj, GError **error)
  *      children is specified.
  *
  * Gets the i-th selected #AtspiAccessible child of an #AtspiSelection.
- *      Note that @selected_child_index refers to the index in the list 
+ *      Note that @selected_child_index refers to the index in the list
  *      of 'selected'
  *      children and generally differs from that used in
  *      #atspi_accessible_get_child_at_index or returned by
@@ -68,13 +81,14 @@ atspi_selection_get_n_selected_children (AtspiSelection *obj, GError **error)
  **/
 AtspiAccessible *
 atspi_selection_get_selected_child (AtspiSelection *obj,
-                                      gint selected_child_index, GError **error)
+                                    gint selected_child_index,
+                                    GError **error)
 {
   dbus_int32_t d_selected_child_index = selected_child_index;
   DBusMessage *reply;
 
   g_return_val_if_fail (obj != NULL, NULL);
-  
+
   reply = _atspi_dbus_call_partial (obj, atspi_interface_selection,
                                     "GetSelectedChild", error, "i",
                                     d_selected_child_index);
@@ -148,15 +162,15 @@ atspi_selection_deselect_selected_child (AtspiSelection *obj,
  * Deselects a specific child of an #AtspiSelection.
  *          Note that @child_index is the index of the child
  *          in the parent container.
- * 
+ *
  * See #atspi_selection_deselect_selected_child
- * 
+ *
  * Returns: #TRUE if the child was successfully deselected, #FALSE otherwise.
  **/
 gboolean
 atspi_selection_deselect_child (AtspiSelection *obj,
-                               gint child_index,
-                               GError **error)
+                                gint child_index,
+                                GError **error)
 {
   dbus_int32_t d_child_index = child_index;
   dbus_bool_t retval = FALSE;
@@ -209,7 +223,7 @@ gboolean
 atspi_selection_select_all (AtspiSelection *obj, GError **error)
 {
   dbus_bool_t retval = FALSE;
-  
+
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_selection, "SelectAll", error, "=>b", &retval);
@@ -231,7 +245,7 @@ gboolean
 atspi_selection_clear_selection (AtspiSelection *obj, GError **error)
 {
   dbus_bool_t retval = FALSE;
-  
+
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_selection, "ClearSelection", error, "=>b", &retval);
@@ -249,16 +263,15 @@ atspi_selection_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiSelection),
-      (GBaseInitFunc) atspi_selection_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiSelection", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiSelection),
+        (GBaseInitFunc) atspi_selection_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiSelection", &tinfo, 0);
+    }
   return type;
 }
index dda225a..651ca61 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_SELECTION                    (atspi_selection_get_type ())
-#define ATSPI_IS_SELECTION(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_SELECTION)
-#define ATSPI_SELECTION(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_SELECTION, AtspiSelection)
-#define ATSPI_SELECTION_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_SELECTION, AtspiSelection))
+#define ATSPI_TYPE_SELECTION (atspi_selection_get_type ())
+#define ATSPI_IS_SELECTION(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_SELECTION)
+#define ATSPI_SELECTION(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_SELECTION, AtspiSelection)
+#define ATSPI_SELECTION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_SELECTION, AtspiSelection))
 
 GType atspi_selection_get_type ();
 
@@ -48,7 +48,7 @@ struct _AtspiSelection
 
 gint atspi_selection_get_n_selected_children (AtspiSelection *obj, GError **error);
 
-AtspiAccessible * atspi_selection_get_selected_child (AtspiSelection *obj, gint selected_child_index, GError **error);
+AtspiAccessible *atspi_selection_get_selected_child (AtspiSelection *obj, gint selected_child_index, GError **error);
 
 gboolean atspi_selection_select_child (AtspiSelection *obj, gint child_index, GError **error);
 
@@ -58,7 +58,8 @@ gboolean atspi_selection_deselect_child (AtspiSelection *obj, gint child_index,
 
 gboolean
 atspi_selection_is_child_selected (AtspiSelection *obj,
-                                   gint child_index, GError **error);
+                                   gint child_index,
+                                   GError **error);
 
 gboolean atspi_selection_select_all (AtspiSelection *obj, GError **error);
 
@@ -66,4 +67,4 @@ gboolean atspi_selection_clear_selection (AtspiSelection *obj, GError **error);
 
 G_END_DECLS
 
-#endif /* _ATSPI_SELECTION_H_ */
+#endif /* _ATSPI_SELECTION_H_ */
index dd99d91..be71aae 100644 (file)
 
 #include "atspi-private.h"
 
+/**
+ * AtspiStateSet:
+ *
+ * The atspi-stateset objects implement wrappers around a
+ * bitmap of accessible states.
+ */
+
 static void atspi_state_set_class_init (AtspiStateSetClass *klass);
 
 G_DEFINE_TYPE (AtspiStateSet, atspi_state_set, G_TYPE_OBJECT)
@@ -35,7 +42,7 @@ atspi_state_set_init (AtspiStateSet *set)
 }
 
 static void
-atspi_state_set_class_init (AtspiStateSetClassklass)
+atspi_state_set_class_init (AtspiStateSetClass *klass)
 {
 }
 
@@ -66,7 +73,7 @@ AtspiStateSet *
 _atspi_state_set_new_internal (AtspiAccessible *accessible, gint64 states)
 {
   AtspiStateSet *set;
-  
+
   set = g_object_new (ATSPI_TYPE_STATE_SET, NULL);
   g_return_val_if_fail (set != NULL, NULL);
 
@@ -99,14 +106,13 @@ atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean ena
   value = g_enum_get_value_by_nick (G_ENUM_CLASS (type_class), name);
 
   if (!value)
-  {
-    g_warning ("AT-SPI: Attempt to set unknown state '%s'", name);
-  }
+    {
+      g_warning ("AT-SPI: Attempt to set unknown state '%s'", name);
+    }
+  else if (enabled)
+    set->states |= ((gint64) 1 << value->value);
   else
-    if (enabled)
-      set->states |= ((gint64)1 << value->value);
-    else
-      set->states &= ~((gint64)1 << value->value);
+    set->states &= ~((gint64) 1 << value->value);
 
   g_type_class_unref (type_class);
 }
@@ -126,8 +132,8 @@ refresh_states (AtspiStateSet *set)
 
   states = (dbus_uint32_t *) state_array->data;
 
-  set->states = ((gint64)states [1]) << 32;
-  set->states |= (gint64) states [0];
+  set->states = ((gint64) states[1]) << 32;
+  set->states |= (gint64) states[0];
   g_array_free (state_array, TRUE);
 }
 
@@ -144,7 +150,7 @@ void
 atspi_state_set_add (AtspiStateSet *set, AtspiStateType state)
 {
   g_return_if_fail (set != NULL);
-  set->states |= (((gint64)1) << state);
+  set->states |= (((gint64) 1) << state);
 }
 
 /**
@@ -185,12 +191,12 @@ atspi_state_set_compare (AtspiStateSet *set,
  **/
 gboolean
 atspi_state_set_contains (AtspiStateSet *set,
-                            AtspiStateType state)
+                          AtspiStateType state)
 {
   if (!set)
     return FALSE;
   refresh_states (set);
-  return (set->states & ((gint64)1 << state)) ? TRUE : FALSE;
+  return (set->states & ((gint64) 1 << state)) ? TRUE : FALSE;
 }
 
 /**
@@ -210,7 +216,7 @@ atspi_state_set_contains (AtspiStateSet *set,
  **/
 gboolean
 atspi_state_set_equals (AtspiStateSet *set,
-                           AtspiStateSet *set2)
+                        AtspiStateSet *set2)
 {
   if (set == set2)
     return TRUE;
@@ -241,11 +247,11 @@ atspi_state_set_get_states (AtspiStateSet *set)
   if (!ret)
     return NULL;
   for (i = 0; i < 64; i++)
-  {
-    if (set->states & val)
-      ret = g_array_append_val (ret, i);
-    val <<= 1;
-  }
+    {
+      if (set->states & val)
+        ret = g_array_append_val (ret, i);
+      val <<= 1;
+    }
   return ret;
 }
 
@@ -274,5 +280,5 @@ void
 atspi_state_set_remove (AtspiStateSet *set, AtspiStateType state)
 {
   g_return_if_fail (set != NULL);
-  set->states &= ~((gint64)1 << state);
+  set->states &= ~((gint64) 1 << state);
 }
index e9e261e..f00296c 100644 (file)
 #ifndef _ATSPI_STATE_SET_H_
 #define _ATSPI_STATE_SET_H_
 
-#define ATSPI_TYPE_STATE_SET                        (atspi_state_set_get_type ())
-#define ATSPI_STATE_SET(obj)                        (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_STATE_SET, AtspiStateSet))
-#define ATSPI_STATE_SET_CLASS(klass)                (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_STATE_SET, AtspiStateSetClass))
-#define ATSPI_IS_STATE_SET(obj)                     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_STATE_SET))
-#define ATSPI_IS_STATE_SET_CLASS(klass)             (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_STATE_SET))
-#define ATSPI_STATE_SET_GET_CLASS(obj)              (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_STATE_SET, AtspiStateSetClass))
+#define ATSPI_TYPE_STATE_SET (atspi_state_set_get_type ())
+#define ATSPI_STATE_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_STATE_SET, AtspiStateSet))
+#define ATSPI_STATE_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATSPI_TYPE_STATE_SET, AtspiStateSetClass))
+#define ATSPI_IS_STATE_SET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_STATE_SET))
+#define ATSPI_IS_STATE_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATSPI_TYPE_STATE_SET))
+#define ATSPI_STATE_SET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATSPI_TYPE_STATE_SET, AtspiStateSetClass))
 
 G_BEGIN_DECLS
 
@@ -50,26 +50,26 @@ struct _AtspiStateSetClass
 
 GType atspi_state_set_get_type (void);
 
-AtspiStateSet * atspi_state_set_new (GArray *states);
+AtspiStateSet *atspi_state_set_new (GArray *states);
 
 void atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean enabled);
 
 void atspi_state_set_add (AtspiStateSet *set, AtspiStateType state);
 
-AtspiStateSet * atspi_state_set_compare (AtspiStateSet *set, AtspiStateSet *set2);
+AtspiStateSet *atspi_state_set_compare (AtspiStateSet *set, AtspiStateSet *set2);
 
 gboolean atspi_state_set_contains (AtspiStateSet *set, AtspiStateType state);
 
 gboolean atspi_state_set_equals (AtspiStateSet *set, AtspiStateSet *set2);
 
-GArray * atspi_state_set_get_states (AtspiStateSet *set);
+GArray *atspi_state_set_get_states (AtspiStateSet *set);
 
 gboolean atspi_state_set_is_empty (AtspiStateSet *set);
 
 void atspi_state_set_remove (AtspiStateSet *set, AtspiStateType state);
 
-AtspiStateSet * _atspi_state_set_new_internal (struct _AtspiAccessible *accessible, gint64 states);
+AtspiStateSet *_atspi_state_set_new_internal (struct _AtspiAccessible *accessible, gint64 states);
 
 G_END_DECLS
 
-#endif /* _ATSPI_STATE_SET_H_ */
+#endif /* _ATSPI_STATE_SET_H_ */
index 83fe534..4884f16 100644 (file)
@@ -22,8 +22,8 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#include <stdlib.h> /* for malloc */
 #include "atspi-private.h"
+#include <stdlib.h> /* for malloc */
 
 static GPtrArray *
 get_object_array_and_unref (DBusMessage *reply)
@@ -35,20 +35,20 @@ get_object_array_and_unref (DBusMessage *reply)
     return NULL;
 
   if (strcmp (dbus_message_get_signature (reply), "a(so)") != 0)
-  {
-    dbus_message_unref (reply);
-    return NULL;
-  }
+    {
+      dbus_message_unref (reply);
+      return NULL;
+    }
 
   array = g_ptr_array_new ();
 
   dbus_message_iter_init (reply, &iter);
   dbus_message_iter_recurse (&iter, &iter_array);
   while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
-  {
-    AtspiAccessible *accessible = _atspi_dbus_return_accessible_from_iter (&iter_array);
-    g_ptr_array_add (array, accessible);
-  }
+    {
+      AtspiAccessible *accessible = _atspi_dbus_consume_accessible (&iter_array);
+      g_ptr_array_add (array, accessible);
+    }
   dbus_message_unref (reply);
   return array;
 }
@@ -73,7 +73,7 @@ atspi_table_cell_get_column_span (AtspiTableCell *obj, GError **error)
 
   _atspi_dbus_get_property (obj, atspi_interface_table_cell, "ColumnSpan",
                             error, "i", &retval);
-         
+
   return retval;
 }
 
@@ -85,7 +85,7 @@ atspi_table_cell_get_column_span (AtspiTableCell *obj, GError **error)
  *
  * Returns: (element-type AtspiAccessible) (transfer full): a GPtrArray of
  * AtspiAccessibles representing the column header cells.
 */
+ */
 GPtrArray *
 atspi_table_cell_get_column_header_cells (AtspiTableCell *obj, GError **error)
 {
@@ -94,7 +94,7 @@ atspi_table_cell_get_column_header_cells (AtspiTableCell *obj, GError **error)
   g_return_val_if_fail (obj != NULL, NULL);
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_table_cell, "GetColumnHeaderCells", error, "");
-         
+
   return get_object_array_and_unref (reply);
 }
 
@@ -118,7 +118,7 @@ atspi_table_cell_get_row_span (AtspiTableCell *obj, GError **error)
 
   _atspi_dbus_get_property (obj, atspi_interface_table_cell, "RowSpan",
                             error, "i", &retval);
-         
+
   return retval;
 }
 
@@ -139,7 +139,7 @@ atspi_table_cell_get_row_header_cells (AtspiTableCell *obj, GError **error)
   g_return_val_if_fail (obj != NULL, NULL);
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_table_cell, "GetRowHeaderCells", error, "");
-         
+
   return get_object_array_and_unref (reply);
 }
 
@@ -169,7 +169,7 @@ atspi_table_cell_get_position (AtspiTableCell *obj,
   reply = _atspi_dbus_call_partial (obj, "org.freedesktop.DBus.Properties",
                                     "Get", error, "ss",
                                     atspi_interface_table_cell, "Position");
-         
+
   if (!reply)
     return -1;
 
@@ -183,10 +183,10 @@ atspi_table_cell_get_position (AtspiTableCell *obj,
   iter_sig = dbus_message_iter_get_signature (&iter_variant);
   /* TODO: Also report error here */
   if (strcmp (iter_sig, "(ii)") != 0)
-  {
-    dbus_free (iter_sig);
-    return FALSE;
-  }
+    {
+      dbus_free (iter_sig);
+      return FALSE;
+    }
   dbus_free (iter_sig);
 
   dbus_message_iter_recurse (&iter_variant, &iter_struct);
@@ -215,13 +215,13 @@ atspi_table_cell_get_position (AtspiTableCell *obj,
  */
 void
 atspi_table_cell_get_row_column_span (AtspiTableCell *obj,
-                                       gint *row,
-                                       gint *column,
-                                       gint *row_span,
-                                       gint *column_span,
-                                       GError **error)
+                                      gint *row,
+                                      gint *column,
+                                      gint *row_span,
+                                      gint *column_span,
+                                      GError **error)
 {
-  dbus_int32_t d_row = 0,  d_column = 0, d_row_span = 0, d_column_span = 0;
+  dbus_int32_t d_row = 0, d_column = 0, d_row_span = 0, d_column_span = 0;
 
   if (row)
     *row = -1;
@@ -265,7 +265,7 @@ atspi_table_cell_get_table (AtspiTableCell *obj, GError **error)
 
   _atspi_dbus_get_property (obj, atspi_interface_table_cell, "Table",
                             error, "(so)", &retval);
-         
+
   return retval;
 }
 
@@ -279,16 +279,15 @@ atspi_table_cell_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiTableCell),
-      (GBaseInitFunc) atspi_table_cell_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiTableCell", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiTableCell),
+        (GBaseInitFunc) atspi_table_cell_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiTableCell", &tinfo, 0);
+    }
   return type;
 }
index b16cd4b..f12f353 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_TABLE_CELL                    (atspi_table_cell_get_type ())
-#define ATSPI_IS_TABLE_CELL(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_TABLE_CELL)
-#define ATSPI_TABLE_CELL(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_TABLE_CELL, AtspiTableCell)
-#define ATSPI_TABLE_CELL_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_TABLE_CELL, AtspiTableCell))
+#define ATSPI_TYPE_TABLE_CELL (atspi_table_cell_get_type ())
+#define ATSPI_IS_TABLE_CELL(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_TABLE_CELL)
+#define ATSPI_TABLE_CELL(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_TABLE_CELL, AtspiTableCell)
+#define ATSPI_TABLE_CELL_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_TABLE_CELL, AtspiTableCell))
 
 GType atspi_table_cell_get_type ();
 
@@ -59,19 +59,19 @@ GPtrArray *atspi_table_cell_get_row_header_cells (AtspiTableCell *obj,
                                                   GError **error);
 
 gint atspi_table_cell_get_position (AtspiTableCell *obj,
-                                    gint           *row,
-                                    gint           *column,
-                                    GError        **error);
+                                    gint *row,
+                                    gint *column,
+                                    GError **error);
 
 void atspi_table_cell_get_row_column_span (AtspiTableCell *obj,
-                                              gint *row,
-                                              gint *column,
-                                              gint *row_span,
-                                              gint *column_span,
-                                              GError **error);
+                                           gint *row,
+                                           gint *column,
+                                           gint *row_span,
+                                           gint *column_span,
+                                           GError **error);
 
 AtspiAccessible *atspi_table_cell_get_table (AtspiTableCell *obj,
                                              GError **error);
 G_END_DECLS
 
-#endif /* _ATSPI_TABLE_CELL_H_ */
+#endif /* _ATSPI_TABLE_CELL_H_ */
index 08718f4..d178d38 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include <stdlib.h> /* for malloc */
 #include "atspi-private.h"
+#include <stdlib.h> /* for malloc */
+
+/**
+ * AtspiTable:
+ *
+ * An interface used by containers whose data is arranged in a tabular form.
+ *
+ * An interface used by containers whose contained data is arranged
+ * in a tabular (i.e. row-column) form. Tables may resemble
+ * a two-dimensional grid, as in a spreadsheet, or may feature objects
+ * which span multiple rows and/or columns, but whose bounds are
+ * aligned on a row/column matrix. Objects within tables are children
+ * of the table object, and they may be referenced either via a child
+ * index or via a row/column pair. Table 'cells' may implement other
+ * interfaces, such as Text, Action, Image, and Component, and should do
+ * so as appropriate to their onscreen presentation and/or behavior.
+ */
 
 /**
  * atspi_table_get_caption:
@@ -64,7 +80,7 @@ atspi_table_get_summary (AtspiTable *obj, GError **error)
 
   _atspi_dbus_get_property (obj, atspi_interface_table, "Summary", error, "(so)", &retval);
 
- return retval;
 return retval;
 }
 
 /**
@@ -85,7 +101,7 @@ atspi_table_get_n_rows (AtspiTable *obj, GError **error)
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_get_property (obj, atspi_interface_table, "NRows", error, "i", &retval);
-         
+
   return retval;
 }
 
@@ -107,7 +123,7 @@ atspi_table_get_n_columns (AtspiTable *obj, GError **error)
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_get_property (obj, atspi_interface_table, "NColumns", error, "i", &retval);
-         
+
   return retval;
 }
 
@@ -118,7 +134,7 @@ atspi_table_get_n_columns (AtspiTable *obj, GError **error)
  * @column: the specified table column, zero-indexed.
  *
  * Gets the table cell at the specified row and column indices.
- * To get the accessible object at a particular (x, y) screen 
+ * To get the accessible object at a particular (x, y) screen
  * coordinate, use #atspi_component_get_accessible_at_point.
  *
  * Returns: (transfer full): an #AtspiAccessible object representing the
@@ -126,9 +142,9 @@ atspi_table_get_n_columns (AtspiTable *obj, GError **error)
  **/
 AtspiAccessible *
 atspi_table_get_accessible_at (AtspiTable *obj,
-                                 gint row,
-                                 gint column,
-                                 GError **error)
+                               gint row,
+                               gint column,
+                               GError **error)
 {
   dbus_int32_t d_row = row, d_column = column;
   DBusMessage *reply;
@@ -147,7 +163,7 @@ atspi_table_get_accessible_at (AtspiTable *obj,
  * @column: the specified table column, zero-indexed.
  *
  * Gets the 1-D child index corresponding to the specified 2-D row and
- * column indices. To get the accessible object at a particular (x, y) screen 
+ * column indices. To get the accessible object at a particular (x, y) screen
  * coordinate, use #atspi_component_get_accessible_at_point.
  *
  * @see #atspi_table_get_row_at_index, #atspi_table_get_column_at_index
@@ -157,9 +173,9 @@ atspi_table_get_accessible_at (AtspiTable *obj,
  **/
 gint
 atspi_table_get_index_at (AtspiTable *obj,
-                            gint row,
-                            gint column,
-                            GError **error)
+                          gint row,
+                          gint column,
+                          GError **error)
 {
   dbus_int32_t d_row = row, d_column = column;
   dbus_int32_t retval = -1;
@@ -167,7 +183,7 @@ atspi_table_get_index_at (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_call (obj, atspi_interface_table, "GetIndexAt", error, "ii=>i", d_row, d_column, &retval);
-         
+
   return retval;
 }
 
@@ -176,7 +192,7 @@ atspi_table_get_index_at (AtspiTable *obj,
  * @obj: a pointer to the #AtspiTable implementor on which to operate.
  * @index: the specified child index, zero-indexed.
  *
- * Gets the table row index occupied by the child at a particular 1-D 
+ * Gets the table row index occupied by the child at a particular 1-D
  * child index.
  *
  * @see #atspi_table_get_index_at, #atspi_table_get_column_at_index
@@ -186,8 +202,8 @@ atspi_table_get_index_at (AtspiTable *obj,
  **/
 gint
 atspi_table_get_row_at_index (AtspiTable *obj,
-                               gint index,
-                               GError **error)
+                              gint index,
+                              GError **error)
 {
   dbus_int32_t d_index = index;
   dbus_int32_t retval = -1;
@@ -195,7 +211,7 @@ atspi_table_get_row_at_index (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_call (obj, atspi_interface_table, "GetRowAtIndex", error, "i=>i", d_index, &retval);
-         
+
   return retval;
 }
 
@@ -214,8 +230,8 @@ atspi_table_get_row_at_index (AtspiTable *obj,
  **/
 gint
 atspi_table_get_column_at_index (AtspiTable *obj,
-                                  gint index,
-                                  GError **error)
+                                 gint index,
+                                 GError **error)
 {
   dbus_int32_t d_index = index;
   dbus_int32_t retval = -1;
@@ -223,7 +239,7 @@ atspi_table_get_column_at_index (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_call (obj, atspi_interface_table, "GetColumnAtIndex", error, "i=>i", d_index, &retval);
-         
+
   return retval;
 }
 
@@ -239,8 +255,8 @@ atspi_table_get_column_at_index (AtspiTable *obj,
  **/
 gchar *
 atspi_table_get_row_description (AtspiTable *obj,
-                                  gint  row,
-                                  GError **error)
+                                 gint row,
+                                 GError **error)
 {
   dbus_int32_t d_row = row;
   char *retval = NULL;
@@ -248,7 +264,7 @@ atspi_table_get_row_description (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, NULL);
 
   _atspi_dbus_call (obj, atspi_interface_table, "GetRowDescription", error, "i=>s", d_row, &retval);
-         
+
   return retval;
 }
 
@@ -264,7 +280,8 @@ atspi_table_get_row_description (AtspiTable *obj,
  **/
 gchar *
 atspi_table_get_column_description (AtspiTable *obj,
-                                     gint         column, GError **error)
+                                    gint column,
+                                    GError **error)
 {
   dbus_int32_t d_column = column;
   char *retval = NULL;
@@ -292,9 +309,9 @@ atspi_table_get_column_description (AtspiTable *obj,
  **/
 gint
 atspi_table_get_row_extent_at (AtspiTable *obj,
-                                gint         row,
-                                gint         column,
-                                GError **error)
+                               gint row,
+                               gint column,
+                               GError **error)
 {
   dbus_int32_t d_row = row, d_column = column;
   dbus_int32_t retval = -1;
@@ -302,7 +319,7 @@ atspi_table_get_row_extent_at (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_call (obj, atspi_interface_table, "GetRowExtentAt", error, "ii=>i", d_row, d_column, &retval);
-         
+
   return retval;
 }
 
@@ -322,9 +339,9 @@ atspi_table_get_row_extent_at (AtspiTable *obj,
  **/
 gint
 atspi_table_get_column_extent_at (AtspiTable *obj,
-                                   gint         row,
-                                   gint         column,
-                                   GError **error)
+                                  gint row,
+                                  gint column,
+                                  GError **error)
 {
   dbus_int32_t d_row = row, d_column = column;
   dbus_int32_t retval = -1;
@@ -332,7 +349,7 @@ atspi_table_get_column_extent_at (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_call (obj, atspi_interface_table, "GetColumnExtentAt", error, "ii=>i", d_row, d_column, &retval);
-         
+
   return retval;
 }
 
@@ -349,8 +366,8 @@ atspi_table_get_column_extent_at (AtspiTable *obj,
  **/
 AtspiAccessible *
 atspi_table_get_row_header (AtspiTable *obj,
-                             gint         row,
-                             GError **error)
+                            gint row,
+                            GError **error)
 {
   dbus_int32_t d_row = row;
   DBusMessage *reply;
@@ -376,8 +393,8 @@ atspi_table_get_row_header (AtspiTable *obj,
  **/
 AtspiAccessible *
 atspi_table_get_column_header (AtspiTable *obj,
-                                gint column,
-                                GError **error)
+                               gint column,
+                               GError **error)
 {
   dbus_int32_t d_column = column;
   DBusMessage *reply;
@@ -393,7 +410,7 @@ atspi_table_get_column_header (AtspiTable *obj,
  * atspi_table_get_n_selected_rows:
  * @obj: a pointer to the #AtspiTable implementor on which to operate.
  *
- * Query a table to find out how many rows are currently selected. 
+ * Query a table to find out how many rows are currently selected.
  * Not all tables support row selection.
  *
  * Returns: a #gint indicating the number of rows currently selected.
@@ -406,7 +423,7 @@ atspi_table_get_n_selected_rows (AtspiTable *obj, GError **error)
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_get_property (obj, atspi_interface_table, "NSelectedRows", error, "i", &retval);
-         
+
   return retval;
 }
 
@@ -421,7 +438,7 @@ atspi_table_get_n_selected_rows (AtspiTable *obj, GError **error)
  **/
 GArray *
 atspi_table_get_selected_rows (AtspiTable *obj,
-                                 GError **error)
+                               GError **error)
 {
   GArray *rows = NULL;
 
@@ -444,7 +461,7 @@ atspi_table_get_selected_rows (AtspiTable *obj,
  **/
 GArray *
 atspi_table_get_selected_columns (AtspiTable *obj,
-                                 GError **error)
+                                  GError **error)
 {
   GArray *columns = NULL;
 
@@ -459,7 +476,7 @@ atspi_table_get_selected_columns (AtspiTable *obj,
  * atspi_table_get_n_selected_columns:
  * @obj: a pointer to the #AtspiTable implementor on which to operate.
  *
- * Queries a table to find out how many columns are currently selected. 
+ * Queries a table to find out how many columns are currently selected.
  * Not all tables support column selection.
  *
  * Returns: a #gint indicating the number of columns currently selected.
@@ -472,7 +489,7 @@ atspi_table_get_n_selected_columns (AtspiTable *obj, GError **error)
   g_return_val_if_fail (obj != NULL, -1);
 
   _atspi_dbus_get_property (obj, atspi_interface_table, "NSelectedColumns", error, "i", &retval);
-         
+
   return retval;
 }
 
@@ -481,15 +498,15 @@ atspi_table_get_n_selected_columns (AtspiTable *obj, GError **error)
  * @obj: a pointer to the #AtspiTable implementor on which to operate.
  * @row: the zero-indexed row number of the row being queried.
  *
- * Determines whether a table row is selected.  Not all tables support 
+ * Determines whether a table row is selected.  Not all tables support
  * row selection.
  *
  * Returns: #TRUE if the specified row is currently selected, #FALSE if not.
  **/
 gboolean
 atspi_table_is_row_selected (AtspiTable *obj,
-                               gint row,
-                               GError **error)
+                             gint row,
+                             GError **error)
 {
   dbus_int32_t d_row = row;
   dbus_bool_t retval = FALSE;
@@ -513,8 +530,8 @@ atspi_table_is_row_selected (AtspiTable *obj,
  **/
 gboolean
 atspi_table_is_column_selected (AtspiTable *obj,
-                                  gint column,
-                                  GError **error)
+                                gint column,
+                                GError **error)
 {
   dbus_int32_t d_column = column;
   dbus_bool_t retval = FALSE;
@@ -522,7 +539,7 @@ atspi_table_is_column_selected (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_table, "IsColumnSelected", error, "i=>b", d_column, &retval);
-         
+
   return retval;
 }
 
@@ -538,8 +555,8 @@ atspi_table_is_column_selected (AtspiTable *obj,
  **/
 gboolean
 atspi_table_add_row_selection (AtspiTable *obj,
-                                gint row,
-                                GError **error)
+                               gint row,
+                               GError **error)
 {
   dbus_int32_t d_row = row;
   dbus_bool_t retval = FALSE;
@@ -547,7 +564,7 @@ atspi_table_add_row_selection (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_table, "AddRowSelection", error, "i=>b", d_row, &retval);
-         
+
   return retval;
 }
 
@@ -563,8 +580,8 @@ atspi_table_add_row_selection (AtspiTable *obj,
  **/
 gboolean
 atspi_table_add_column_selection (AtspiTable *obj,
-                                   gint column,
-                                   GError **error)
+                                  gint column,
+                                  GError **error)
 {
   dbus_int32_t d_column = column;
   dbus_bool_t retval = FALSE;
@@ -572,7 +589,7 @@ atspi_table_add_column_selection (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_table, "AddColumnSelection", error, "i=>b", d_column, &retval);
-         
+
   return retval;
 }
 
@@ -589,8 +606,8 @@ atspi_table_add_column_selection (AtspiTable *obj,
  **/
 gboolean
 atspi_table_remove_row_selection (AtspiTable *obj,
-                                   gint row,
-                                   GError **error)
+                                  gint row,
+                                  GError **error)
 {
   dbus_int32_t d_row = row;
   dbus_bool_t retval = FALSE;
@@ -598,7 +615,7 @@ atspi_table_remove_row_selection (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_table, "RemoveRowSelection", error, "i=>b", d_row, &retval);
-         
+
   return retval;
 }
 
@@ -616,8 +633,8 @@ atspi_table_remove_row_selection (AtspiTable *obj,
  **/
 gboolean
 atspi_table_remove_column_selection (AtspiTable *obj,
-                                      gint column,
-                                      GError **error)
+                                     gint column,
+                                     GError **error)
 {
   dbus_int32_t d_column = column;
   dbus_bool_t retval = FALSE;
@@ -625,20 +642,20 @@ atspi_table_remove_column_selection (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_table, "RemoveColumnSelection", error, "i=>b", d_column, &retval);
-         
+
   return retval;
 }
 
 /**
  * atspi_table_get_row_column_extents_at_index:
  * @obj: a pointer to the #AtspiTable implementor on which to operate.
- * @index: the index of the #AtspiTable child whose row/column 
+ * @index: the index of the #AtspiTable child whose row/column
  * extents are requested.
  * @row: (out): back-filled with the first table row associated with
  * the cell with child index.
- * @col: (out): back-filled with the first table column associated 
+ * @col: (out): back-filled with the first table column associated
  * with the cell with child index.
- * @row_extents: (out): back-filled with the number of table rows 
+ * @row_extents: (out): back-filled with the number of table rows
  * across which child i extends.
  * @col_extents: (out): back-filled with the number of table columns
  * across which child i extends.
@@ -646,9 +663,9 @@ atspi_table_remove_column_selection (AtspiTable *obj,
  * if the child at index i corresponds to a selected table cell,
  * #FALSE otherwise.
  *
- * Given a child index, determines the row and column indices and 
+ * Given a child index, determines the row and column indices and
  * extents, and whether the cell is currently selected.  If
- * the child at index is not a cell (for instance, if it is 
+ * the child at index is not a cell (for instance, if it is
  * a summary, caption, etc.), #FALSE is returned.
  * The returned values are meaningful only if the Table has both
  * STATE_VISIBLE and STATE_SHOWING.
@@ -656,32 +673,36 @@ atspi_table_remove_column_selection (AtspiTable *obj,
  * Example:
  * If the #AtspiTable child at index '6' extends across columns 5 and 6 of
  * row 2 of an #AtspiTable instance, and is currently selected, then
- * 
+ *
  * retval = atspi_table_get_row_column_extents_at_index (table, 6,
- *                                             row, col, 
+ *                                             row, col,
  *                                             row_extents,
  *                                             col_extents,
  *                                             is_selected);
- * 
+ *
  * will return #TRUE, and after the call
  * row, col, row_extents, col_extents,
- * and is_selected will contain 2, 5, 1, 2, and 
+ * and is_selected will contain 2, 5, 1, 2, and
  * #TRUE, respectively.
  *
  * Returns: #TRUE if the index is associated with a valid table
- * cell, #FALSE if the index does not correspond to a cell.  If 
- * #FALSE is returned, the values of the out parameters are 
+ * cell, #FALSE if the index does not correspond to a cell.  If
+ * #FALSE is returned, the values of the out parameters are
  * undefined.
  **/
 gboolean
 atspi_table_get_row_column_extents_at_index (AtspiTable *obj,
-                                           gint index, gint *row, gint *col, 
-                                           gint *row_extents, gint *col_extents, 
-                                           gboolean *is_selected, GError **error)
+                                             gint index,
+                                             gint *row,
+                                             gint *col,
+                                             gint *row_extents,
+                                             gint *col_extents,
+                                             gboolean *is_selected,
+                                             GError **error)
 {
   dbus_int32_t d_index = index;
   dbus_bool_t retval = FALSE;
-  dbus_int32_t d_row = 0,  d_col = 0, d_row_extents = 0, d_col_extents = 0;
+  dbus_int32_t d_row = 0, d_col = 0, d_row_extents = 0, d_col_extents = 0;
   dbus_bool_t d_is_selected = FALSE;
 
   g_return_val_if_fail (obj != NULL, FALSE);
@@ -692,14 +713,15 @@ atspi_table_get_row_column_extents_at_index (AtspiTable *obj,
 
   *row = d_row;
   *col = d_col;
-  *row_extents = d_row_extents;;
+  *row_extents = d_row_extents;
+  ;
   *col_extents = d_col_extents;
-  *is_selected = d_is_selected;;
-  
+  *is_selected = d_is_selected;
+  ;
+
   return retval;
 }
 
-
 /**
  * atspi_table_is_selected:
  * @obj: a pointer to the #AtspiTable implementor on which to operate.
@@ -712,9 +734,9 @@ atspi_table_get_row_column_extents_at_index (AtspiTable *obj,
  **/
 gboolean
 atspi_table_is_selected (AtspiTable *obj,
-                            gint row,
-                            gint column,
-                            GError **error)
+                         gint row,
+                         gint column,
+                         GError **error)
 {
   dbus_int32_t d_row = row, d_column = column;
   dbus_bool_t retval = FALSE;
@@ -722,7 +744,7 @@ atspi_table_is_selected (AtspiTable *obj,
   g_return_val_if_fail (obj != NULL, FALSE);
 
   _atspi_dbus_call (obj, atspi_interface_table, "IsSelected", error, "ii=>b", d_row, d_column, &retval);
-         
+
   return retval;
 }
 
@@ -736,16 +758,15 @@ atspi_table_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiTable),
-      (GBaseInitFunc) atspi_table_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiTable", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiTable),
+        (GBaseInitFunc) atspi_table_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiTable", &tinfo, 0);
+    }
   return type;
 }
index 942f2f6..bbe5e83 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_TABLE                    (atspi_table_get_type ())
-#define ATSPI_IS_TABLE(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_TABLE)
-#define ATSPI_TABLE(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_TABLE, AtspiTable)
-#define ATSPI_TABLE_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_TABLE, AtspiTable))
+#define ATSPI_TYPE_TABLE (atspi_table_get_type ())
+#define ATSPI_IS_TABLE(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_TABLE)
+#define ATSPI_TABLE(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_TABLE, AtspiTable)
+#define ATSPI_TABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_TABLE, AtspiTable))
 
 GType atspi_table_get_type ();
 
@@ -46,15 +46,15 @@ struct _AtspiTable
   GTypeInterface parent;
 };
 
-AtspiAccessible * atspi_table_get_caption (AtspiTable *obj, GError **error);
+AtspiAccessible *atspi_table_get_caption (AtspiTable *obj, GError **error);
 
-AtspiAccessible * atspi_table_get_summary (AtspiTable *obj, GError **error);
+AtspiAccessible *atspi_table_get_summary (AtspiTable *obj, GError **error);
 
 gint atspi_table_get_n_rows (AtspiTable *obj, GError **error);
 
 gint atspi_table_get_n_columns (AtspiTable *obj, GError **error);
 
-AtspiAccessible * atspi_table_get_accessible_at (AtspiTable *obj, gint row, gint column, GError **error);
+AtspiAccessible *atspi_table_get_accessible_at (AtspiTable *obj, gint row, gint column, GError **error);
 
 gint atspi_table_get_index_at (AtspiTable *obj, gint row, gint column, GError **error);
 
@@ -62,9 +62,9 @@ gint atspi_table_get_row_at_index (AtspiTable *obj, gint index, GError **error);
 
 gint atspi_table_get_column_at_index (AtspiTable *obj, gint index, GError **error);
 
-gchar * atspi_table_get_row_description (AtspiTable *obj, gint row, GError **error);
+gchar *atspi_table_get_row_description (AtspiTable *obj, gint row, GError **error);
 
-gchar * atspi_table_get_column_description (AtspiTable *obj, gint         column, GError **error);
+gchar *atspi_table_get_column_description (AtspiTable *obj, gint column, GError **error);
 
 gint
 atspi_table_get_row_extent_at (AtspiTable *obj, gint row, gint column, GError **error);
@@ -72,15 +72,15 @@ atspi_table_get_row_extent_at (AtspiTable *obj, gint row, gint column, GError **
 gint
 atspi_table_get_column_extent_at (AtspiTable *obj, gint row, gint column, GError **error);
 
-AtspiAccessible * atspi_table_get_row_header (AtspiTable *obj, gint row, GError **error);
+AtspiAccessible *atspi_table_get_row_header (AtspiTable *obj, gint row, GError **error);
 
-AtspiAccessible * atspi_table_get_column_header (AtspiTable *obj, gint column, GError **error);
+AtspiAccessible *atspi_table_get_column_header (AtspiTable *obj, gint column, GError **error);
 
 gint atspi_table_get_n_selected_rows (AtspiTable *obj, GError **error);
 
 GArray *atspi_table_get_selected_rows (AtspiTable *obj, GError **error);
 
-GArray * atspi_table_get_selected_columns (AtspiTable *obj, GError **error);
+GArray *atspi_table_get_selected_columns (AtspiTable *obj, GError **error);
 
 gint atspi_table_get_n_selected_columns (AtspiTable *obj, GError **error);
 
@@ -102,4 +102,4 @@ gboolean atspi_table_is_selected (AtspiTable *obj, gint row, gint column, GError
 
 G_END_DECLS
 
-#endif /* _ATSPI_TABLE_H_ */
+#endif /* _ATSPI_TABLE_H_ */
index de99773..1c9747c 100644 (file)
  */
 
 #include "atspi-private.h"
+
+/**
+ * AtspiText:
+ *
+ * An interface implemented by objects which place textual
+ * information onscreen.
+ *
+ * The text interface should be implemented by objects which place textual
+ * information onscreen as character strings or glyphs. The text interface
+ * allows access to textual content including display attributes and
+ * semantic hints associated with runs of text, and to bounding
+ * information for glyphs and substrings. It also allows portions of text to
+ * be selected, if the objects StateSet includes STATE_SELECTABLE_TEXT.
+ */
+
 /**
  * atspi_range_copy:
  * @src: a pointer to the source #AtspiRange object that will be copied.
@@ -61,8 +76,7 @@ atspi_text_range_free (AtspiTextRange *range)
   g_free (range);
 }
 
-G_DEFINE_BOXED_TYPE (AtspiTextRange, atspi_text_range, atspi_text_range_copy,
-                     atspi_text_range_free)
+G_DEFINE_BOXED_TYPE (AtspiTextRange, atspi_text_range, atspi_text_range_copy, atspi_text_range_free)
 
 /**
  * atspi_text_get_character_count:
@@ -100,9 +114,9 @@ atspi_text_get_character_count (AtspiText *obj, GError **error)
  **/
 gchar *
 atspi_text_get_text (AtspiText *obj,
-                        gint start_offset,
-                        gint end_offset,
-                        GError **error)
+                     gint start_offset,
+                     gint end_offset,
+                     GError **error)
 {
   gchar *retval = NULL;
   dbus_int32_t d_start_offset = start_offset, d_end_offset = end_offset;
@@ -150,7 +164,6 @@ atspi_text_get_caret_offset (AtspiText *obj, GError **error)
  * Gets the attributes applied to a range of text from an #AtspiText
  * object. The text attributes correspond to CSS attributes
  * where possible.
- * <em>DEPRECATED</em>
  *
  * Returns: (element-type gchar* gchar*) (transfer full): a #GHashTable
  * describing the attributes at the given character offset.
@@ -159,10 +172,10 @@ atspi_text_get_caret_offset (AtspiText *obj, GError **error)
  **/
 GHashTable *
 atspi_text_get_attributes (AtspiText *obj,
-                          gint offset,
-                          gint *start_offset,
-                          gint *end_offset,
-                          GError **error)
+                           gint offset,
+                           gint *start_offset,
+                           gint *end_offset,
+                           GError **error)
 {
   return atspi_text_get_text_attributes (obj, offset, start_offset, end_offset, error);
 }
@@ -180,17 +193,16 @@ atspi_text_get_attributes (AtspiText *obj,
  * Gets the attributes applied to a range of text from an #AtspiText
  * object. The text attributes correspond to CSS attributes
  * where possible.
- * <em>DEPRECATED</em>
  *
  * Returns: (element-type gchar* gchar*) (transfer full): a #GHashTable
  * describing the attributes at the given character offset.
  **/
 GHashTable *
 atspi_text_get_text_attributes (AtspiText *obj,
-                          gint offset,
-                          gint *start_offset,
-                          gint *end_offset,
-                          GError **error)
+                                gint offset,
+                                gint *start_offset,
+                                gint *end_offset,
+                                GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_int32_t d_start_offset, d_end_offset;
@@ -199,7 +211,7 @@ atspi_text_get_text_attributes (AtspiText *obj,
   GHashTable *ret = NULL;
 
   if (obj == NULL)
-   return NULL;
+    return NULL;
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_text, "GetAttributes", error, "i", d_offset);
   _ATSPI_DBUS_CHECK_SIG (reply, "a{ss}ii", error, ret)
@@ -227,7 +239,7 @@ atspi_text_get_text_attributes (AtspiText *obj,
  *        search is based.
  * @include_defaults: a #bool that, when set as #FALSE, indicates the call
  * should only return those attributes which are explicitly set on the current
- * attribute run, omitting any attributes which are inherited from the 
+ * attribute run, omitting any attributes which are inherited from the
  * default values.
  * @start_offset: (out): a #gint pointer indicating the start of the desired text
  *                range.
@@ -242,11 +254,11 @@ atspi_text_get_text_attributes (AtspiText *obj,
  **/
 GHashTable *
 atspi_text_get_attribute_run (AtspiText *obj,
-                             gint offset,
-                             gboolean include_defaults,
-                             gint *start_offset,
-                             gint *end_offset,
-                             GError **error)
+                              gint offset,
+                              gboolean include_defaults,
+                              gint *start_offset,
+                              gint *end_offset,
+                              GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_int32_t d_start_offset, d_end_offset;
@@ -255,7 +267,7 @@ atspi_text_get_attribute_run (AtspiText *obj,
   GHashTable *ret = NULL;
 
   if (obj == NULL)
-   return NULL;
+    return NULL;
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_text,
                                     "GetAttributeRun", error, "ib", d_offset,
@@ -294,10 +306,10 @@ atspi_text_get_attribute_run (AtspiText *obj,
 gchar *
 atspi_text_get_attribute_value (AtspiText *obj,
                                 gint offset,
-                                gchar *attribute_value,
+                                const gchar *attribute_name,
                                 GError **error)
 {
-  return atspi_text_get_text_attribute_value (obj, offset, attribute_value,
+  return atspi_text_get_text_attribute_value (obj, offset, attribute_name,
                                               error);
 }
 
@@ -315,7 +327,7 @@ atspi_text_get_attribute_value (AtspiText *obj,
 gchar *
 atspi_text_get_text_attribute_value (AtspiText *obj,
                                      gint offset,
-                                     gchar *attribute_value,
+                                     const gchar *attribute_name,
                                      GError **error)
 {
   gchar *retval = NULL;
@@ -323,7 +335,7 @@ atspi_text_get_text_attribute_value (AtspiText *obj,
 
   g_return_val_if_fail (obj != NULL, NULL);
 
-  _atspi_dbus_call (obj, atspi_interface_text, "GetAttributeValue", error, "is=>s", d_i, (const gchar *)attribute_value, &retval);
+  _atspi_dbus_call (obj, atspi_interface_text, "GetAttributeValue", error, "is=>s", d_i, attribute_name, &retval);
 
   if (!retval)
     retval = g_strdup ("");
@@ -336,7 +348,7 @@ atspi_text_get_text_attribute_value (AtspiText *obj,
  * @obj: a pointer to the #AtspiText object to query.
  *
  * Gets the default attributes applied to an #AtspiText
- * object. The text attributes correspond to CSS attributes 
+ * object. The text attributes correspond to CSS attributes
  * where possible. The combination of this attribute set and
  * the attributes reported by #atspi_text_get_attributes
  * describes the entire set of text attributes over a range.
@@ -350,13 +362,12 @@ atspi_text_get_default_attributes (AtspiText *obj, GError **error)
 {
   DBusMessage *reply;
 
-    g_return_val_if_fail (obj != NULL, NULL);
+  g_return_val_if_fail (obj != NULL, NULL);
 
   reply = _atspi_dbus_call_partial (obj, atspi_interface_text, "GetDefaultAttributes", error, "");
   return _atspi_dbus_return_hash_from_message (reply);
 }
 
-
 /**
  * atspi_text_set_caret_offset:
  * @obj: a pointer to the #AtspiText object on which to operate.
@@ -368,8 +379,8 @@ atspi_text_get_default_attributes (AtspiText *obj, GError **error)
  **/
 gboolean
 atspi_text_set_caret_offset (AtspiText *obj,
-                               gint new_offset,
-                               GError **error)
+                             gint new_offset,
+                             GError **error)
 {
   dbus_int32_t d_new_offset = new_offset;
   dbus_bool_t retval = FALSE;
@@ -398,9 +409,9 @@ atspi_text_set_caret_offset (AtspiText *obj,
  **/
 AtspiTextRange *
 atspi_text_get_text_before_offset (AtspiText *obj,
-                                    gint offset,
-                                    AtspiTextBoundaryType type,
-                                    GError **error)
+                                   gint offset,
+                                   AtspiTextBoundaryType type,
+                                   GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_uint32_t d_type = type;
@@ -512,9 +523,9 @@ atspi_text_get_string_at_offset (AtspiText *obj,
  **/
 AtspiTextRange *
 atspi_text_get_text_at_offset (AtspiText *obj,
-                                    gint offset,
-                                    AtspiTextBoundaryType type,
-                                    GError **error)
+                               gint offset,
+                               AtspiTextBoundaryType type,
+                               GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_uint32_t d_type = type;
@@ -555,9 +566,9 @@ atspi_text_get_text_at_offset (AtspiText *obj,
  **/
 AtspiTextRange *
 atspi_text_get_text_after_offset (AtspiText *obj,
-                                    gint offset,
-                                    AtspiTextBoundaryType type,
-                                    GError **error)
+                                  gint offset,
+                                  AtspiTextBoundaryType type,
+                                  GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_uint32_t d_type = type;
@@ -595,8 +606,8 @@ atspi_text_get_text_after_offset (AtspiText *obj,
  **/
 guint
 atspi_text_get_character_at_offset (AtspiText *obj,
-                                     gint offset,
-                                     GError **error)
+                                    gint offset,
+                                    GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_int32_t retval = -1;
@@ -626,9 +637,9 @@ atspi_text_get_character_at_offset (AtspiText *obj,
  **/
 AtspiRect *
 atspi_text_get_character_extents (AtspiText *obj,
-                                    gint offset,
-                                   AtspiCoordType type,
-                                   GError **error)
+                                  gint offset,
+                                  AtspiCoordType type,
+                                  GError **error)
 {
   dbus_int32_t d_offset = offset;
   dbus_uint32_t d_type = type;
@@ -665,10 +676,10 @@ atspi_text_get_character_extents (AtspiText *obj,
  **/
 gint
 atspi_text_get_offset_at_point (AtspiText *obj,
-                                 gint x,
-                                 gint y,
-                                AtspiCoordType type,
-                                GError **error)
+                                gint x,
+                                gint y,
+                                AtspiCoordType type,
+                                GError **error)
 {
   dbus_int32_t d_x = x, d_y = y;
   dbus_uint32_t d_type = type;
@@ -701,10 +712,10 @@ atspi_text_get_offset_at_point (AtspiText *obj,
  **/
 AtspiRect *
 atspi_text_get_range_extents (AtspiText *obj,
-                               gint start_offset,
-                               gint end_offset,
-                               AtspiCoordType type,
-                               GError **error)
+                              gint start_offset,
+                              gint end_offset,
+                              AtspiCoordType type,
+                              GError **error)
 {
   dbus_int32_t d_start_offset = start_offset, d_end_offset = end_offset;
   dbus_uint32_t d_type = type;
@@ -747,14 +758,14 @@ atspi_text_get_range_extents (AtspiText *obj,
  **/
 GArray *
 atspi_text_get_bounded_ranges (AtspiText *obj,
-                                gint x,
-                                gint y,
-                                gint width,
-                                gint height,
-                                AtspiCoordType type,
-                                AtspiTextClipType clipTypeX,
-                                AtspiTextClipType clipTypeY,
-                                GError **error)
+                               gint x,
+                               gint y,
+                               gint width,
+                               gint height,
+                               AtspiCoordType type,
+                               AtspiTextClipType clipTypeX,
+                               AtspiTextClipType clipTypeY,
+                               GError **error)
 {
   dbus_int32_t d_x = x, d_y = y, d_width = width, d_height = height;
   dbus_uint32_t d_type = type;
@@ -801,8 +812,8 @@ atspi_text_get_n_selections (AtspiText *obj, GError **error)
  **/
 AtspiRange *
 atspi_text_get_selection (AtspiText *obj,
-                            gint selection_num,
-                            GError **error)
+                          gint selection_num,
+                          GError **error)
 {
   dbus_int32_t d_selection_num = selection_num;
   dbus_int32_t d_start_offset, d_end_offset;
@@ -832,8 +843,9 @@ atspi_text_get_selection (AtspiText *obj,
  **/
 gboolean
 atspi_text_add_selection (AtspiText *obj,
-                            gint start_offset, gint end_offset,
-                            GError **error)
+                          gint start_offset,
+                          gint end_offset,
+                          GError **error)
 {
   dbus_int32_t d_start_offset = start_offset, d_end_offset = end_offset;
   dbus_bool_t retval = FALSE;
@@ -854,8 +866,8 @@ atspi_text_add_selection (AtspiText *obj,
  **/
 gboolean
 atspi_text_remove_selection (AtspiText *obj,
-                               gint selection_num,
-                               GError **error)
+                             gint selection_num,
+                             GError **error)
 {
   dbus_int32_t d_selection_num = selection_num;
   dbus_bool_t retval = FALSE;
@@ -881,10 +893,10 @@ atspi_text_remove_selection (AtspiText *obj,
  **/
 gboolean
 atspi_text_set_selection (AtspiText *obj,
-                            gint selection_num,
-                            gint start_offset,
-                            gint end_offset,
-                            GError **error)
+                          gint selection_num,
+                          gint start_offset,
+                          gint end_offset,
+                          GError **error)
 {
   dbus_int32_t d_selection_num = selection_num, d_start_offset = start_offset, d_end_offset = end_offset;
   dbus_bool_t retval = FALSE;
@@ -911,10 +923,10 @@ atspi_text_set_selection (AtspiText *obj,
  **/
 gboolean
 atspi_text_scroll_substring_to (AtspiText *obj,
-                               gint start_offset,
-                               gint end_offset,
-                               AtspiScrollType type,
-                               GError **error)
+                                gint start_offset,
+                                gint end_offset,
+                                AtspiScrollType type,
+                                GError **error)
 {
   dbus_bool_t retval = FALSE;
 
@@ -944,12 +956,12 @@ atspi_text_scroll_substring_to (AtspiText *obj,
  **/
 gboolean
 atspi_text_scroll_substring_to_point (AtspiText *obj,
-                                     gint start_offset,
-                                     gint end_offset,
-                                     AtspiCoordType coords,
-                                     gint x,
-                                     gint y,
-                                     GError **error)
+                                      gint start_offset,
+                                      gint end_offset,
+                                      AtspiCoordType coords,
+                                      gint x,
+                                      gint y,
+                                      GError **error)
 {
   dbus_bool_t retval = FALSE;
 
@@ -972,16 +984,15 @@ atspi_text_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiText),
-      (GBaseInitFunc) atspi_text_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiText", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiText),
+        (GBaseInitFunc) atspi_text_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiText", &tinfo, 0);
+    }
   return type;
 }
index 994d12b..f8f949b 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -43,10 +43,10 @@ struct _AtspiRange
 
 /**
  * ATSPI_TYPE_RANGE:
- * 
+ *
  * The #GType for a boxed type holding a range within a text bock.
  */
-#define        ATSPI_TYPE_RANGE atspi_range_get_type ()
+#define ATSPI_TYPE_RANGE atspi_range_get_type ()
 
 GType atspi_range_get_type ();
 
@@ -63,15 +63,15 @@ struct _AtspiTextRange
 
 /**
  * ATSPI_TYPE_TEXT_RANGE:
- * 
+ *
  * The #GType for a boxed type holding a range within a text bock.
  */
-#define        ATSPI_TYPE_TEXT_RANGE atspi_text_range_get_type ()
+#define ATSPI_TYPE_TEXT_RANGE atspi_text_range_get_type ()
 
-#define ATSPI_TYPE_TEXT                    (atspi_text_get_type ())
-#define ATSPI_IS_TEXT(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_TEXT)
-#define ATSPI_TEXT(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_TEXT, AtspiText)
-#define ATSPI_TEXT_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_TEXT, AtspiText))
+#define ATSPI_TYPE_TEXT (atspi_text_get_type ())
+#define ATSPI_IS_TEXT(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_TEXT)
+#define ATSPI_TEXT(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_TEXT, AtspiText)
+#define ATSPI_TEXT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_TEXT, AtspiText))
 
 GType atspi_text_get_type ();
 
@@ -80,12 +80,11 @@ struct _AtspiText
   GTypeInterface parent;
 };
 
-
 GType atspi_text_range_get_type ();
 
 gint atspi_text_get_character_count (AtspiText *obj, GError **error);
 
-gchar * atspi_text_get_text (AtspiText *obj, gint start_offset, gint end_offset, GError **error);
+gchar *atspi_text_get_text (AtspiText *obj, gint start_offset, gint end_offset, GError **error);
 
 gint atspi_text_get_caret_offset (AtspiText *obj, GError **error);
 
@@ -98,38 +97,38 @@ GHashTable *atspi_text_get_text_attributes (AtspiText *obj, gint offset, gint *s
 GHashTable *atspi_text_get_attribute_run (AtspiText *obj, gint offset, gboolean include_defaults, gint *start_offset, gint *end_offset, GError **error);
 
 #ifndef ATSPI_DISABLE_DEPRECATED
-gchar * atspi_text_get_attribute_value (AtspiText *obj, gint offset, gchar *attribute_name, GError **error);
+gchar *atspi_text_get_attribute_value (AtspiText *obj, gint offset, const gchar *attribute_name, GError **error);
 #endif
 
-gchar * atspi_text_get_text_attribute_value (AtspiText *obj, gint offset, gchar *attribute_name, GError **error);
+gchar *atspi_text_get_text_attribute_value (AtspiText *obj, gint offset, const gchar *attribute_name, GError **error);
 
-GHashTable * atspi_text_get_default_attributes (AtspiText *obj, GError **error);
+GHashTable *atspi_text_get_default_attributes (AtspiText *obj, GError **error);
 
 gboolean atspi_text_set_caret_offset (AtspiText *obj, gint new_offset, GError **error);
 
 #ifndef ATSPI_DISABLE_DEPRECATED
-AtspiTextRange * atspi_text_get_text_before_offset (AtspiText *obj, gint offset, AtspiTextBoundaryType type, GError **error);
+AtspiTextRange *atspi_text_get_text_before_offset (AtspiText *obj, gint offset, AtspiTextBoundaryType type, GError **error);
 
-AtspiTextRange * atspi_text_get_text_at_offset (AtspiText *obj, gint offset, AtspiTextBoundaryType type, GError **error);
+AtspiTextRange *atspi_text_get_text_at_offset (AtspiText *obj, gint offset, AtspiTextBoundaryType type, GError **error);
 
-AtspiTextRange * atspi_text_get_text_after_offset (AtspiText *obj, gint offset, AtspiTextBoundaryType type, GError **error);
+AtspiTextRange *atspi_text_get_text_after_offset (AtspiText *obj, gint offset, AtspiTextBoundaryType type, GError **error);
 #endif
 
-AtspiTextRange * atspi_text_get_string_at_offset (AtspiText *obj, gint offset, AtspiTextGranularity granularity, GError **error);
+AtspiTextRange *atspi_text_get_string_at_offset (AtspiText *obj, gint offset, AtspiTextGranularity granularity, GError **error);
 
 guint atspi_text_get_character_at_offset (AtspiText *obj, gint offset, GError **error);
 
-AtspiRect * atspi_text_get_character_extents (AtspiText *obj, gint offset, AtspiCoordType type, GError **error);
+AtspiRect *atspi_text_get_character_extents (AtspiText *obj, gint offset, AtspiCoordType type, GError **error);
 
 gint atspi_text_get_offset_at_point (AtspiText *obj, gint x, gint y, AtspiCoordType type, GError **error);
 
-AtspiRect * atspi_text_get_range_extents (AtspiText *obj, gint start_offset, gint end_offset, AtspiCoordType type, GError **error);
+AtspiRect *atspi_text_get_range_extents (AtspiText *obj, gint start_offset, gint end_offset, AtspiCoordType type, GError **error);
 
-GArray * atspi_text_get_bounded_ranges (AtspiText *obj, gint x, gint y, gint width, gint height, AtspiCoordType type, AtspiTextClipType clipTypeX, AtspiTextClipType clipTypeY, GError **error);
+GArray *atspi_text_get_bounded_ranges (AtspiText *obj, gint x, gint y, gint width, gint height, AtspiCoordType type, AtspiTextClipType clipTypeX, AtspiTextClipType clipTypeY, GError **error);
 
 gint atspi_text_get_n_selections (AtspiText *obj, GError **error);
 
-AtspiRange * atspi_text_get_selection (AtspiText *obj, gint selection_num, GError **error);
+AtspiRange *atspi_text_get_selection (AtspiText *obj, gint selection_num, GError **error);
 
 gboolean atspi_text_add_selection (AtspiText *obj, gint start_offset, gint end_offset, GError **error);
 
@@ -142,4 +141,4 @@ gboolean atspi_text_scroll_substring_to (AtspiText *obj, gint start_offset, gint
 gboolean atspi_text_scroll_substring_to_point (AtspiText *obj, gint start_offset, gint end_offset, AtspiCoordType coords, gint x, gint y, GError **error);
 G_END_DECLS
 
-#endif /* _ATSPI_TEXT_H_ */
+#endif /* _ATSPI_TEXT_H_ */
index ab43ca8..4486b58 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 #include "atspi-constants.h"
 
+/**
+ * AtspiTypes:
+ *
+ * Type definitions needed by multiple interfaces.
+ */
+
 typedef struct _AtspiAccessible AtspiAccessible;
 typedef struct _AtspiAction AtspiAction;
 typedef struct _AtspiCollection AtspiCollection;
@@ -60,7 +66,7 @@ struct _AtspiDeviceEvent
   gushort hw_code;
   gushort modifiers;
   guint timestamp;
-  gchar * event_string;
+  gchar *event_string;
   gboolean is_text;
 };
 
@@ -83,35 +89,35 @@ struct _AtspiKeyDefinition
 
 /**
  * ATSPI_TYPE_KEY_DEFINITION:
- * 
+ *
  * The #GType for a boxed type holding a #AtspiKeyDefinition.
  */
-#define        ATSPI_TYPE_KEY_DEFINITION (atspi_key_definition_get_type ())
+#define ATSPI_TYPE_KEY_DEFINITION (atspi_key_definition_get_type ())
 
 typedef struct _AtspiEvent AtspiEvent;
 struct _AtspiEvent
 {
-  gchar  *type;
-  AtspiAccessible  *source;
-  gint         detail1;
-  gint         detail2;
+  gchar *type;
+  AtspiAccessible *source;
+  gint detail1;
+  gint detail2;
   GValue any_data;
   AtspiAccessible *sender;
 };
 
 /**
  * ATSPI_TYPE_DEVICE_EVENT:
- * 
+ *
  * The #GType for a boxed type holding a #AtspiDeviceEvent.
  */
-#define        ATSPI_TYPE_DEVICE_EVENT (atspi_device_event_get_type ())
+#define ATSPI_TYPE_DEVICE_EVENT (atspi_device_event_get_type ())
 
 /**
  * ATSPI_TYPE_EVENT:
- * 
+ *
  * The #GType for a boxed type holding a #AtspiEvent.
  */
-#define        ATSPI_TYPE_EVENT (atspi_event_get_type ())
+#define ATSPI_TYPE_EVENT (atspi_event_get_type ())
 
 typedef void AtspiKeystrokeListener;
 
@@ -128,21 +134,21 @@ typedef struct _AtspiKeySet
 {
   guint *keysyms;
   gushort *keycodes;
-  gchar          **keystrings;
-  gshort           len;
+  gchar **keystrings;
+  gshort len;
 } AtspiKeySet;
 
 /**
- *AtspiKeyListenerSyncType:
-  * @ATSPI_KEYLISTENER_NOSYNC: Events may be delivered asynchronously, 
- * which means in some cases they may already have been delivered to the 
- * application before the AT client receives the notification.  
- * @ATSPI_KEYLISTENER_SYNCHRONOUS: Events are delivered synchronously, before the 
- * currently focussed application sees them.  
+ * AtspiKeyListenerSyncType:
+ * @ATSPI_KEYLISTENER_NOSYNC: Events may be delivered asynchronously,
+ * which means in some cases they may already have been delivered to the
+ * application before the AT client receives the notification.
+ * @ATSPI_KEYLISTENER_SYNCHRONOUS: Events are delivered synchronously, before the
+ * currently focused application sees them.
  * @ATSPI_KEYLISTENER_CANCONSUME: Events may be consumed by the AT client.  Presumes and
  * requires #ATSPI_KEYLISTENER_SYNCHRONOUS, incompatible with #ATSPI_KEYLISTENER_NOSYNC.
  * @ATSPI_KEYLISTENER_ALL_WINDOWS: Events are received not from the application toolkit layer, but
- * from the device driver or windowing system subsystem; such notifications are 'global' in the 
+ * from the device driver or windowing system subsystem; such notifications are 'global' in the
  * sense that they are not broken or defeated by applications that participate poorly
  * in the accessibility APIs, or not at all; however because of the intrusive nature of
  * such snooping, it can have side-effects on certain older platforms.  If unconditional
@@ -154,13 +160,14 @@ typedef struct _AtspiKeySet
  * together, observing the compatibility limitations specified in the description of
  * each value.  For instance, #ATSPI_KEYLISTENER_ALL_WINDOWS | #ATSPI_KEYLISTENER_CANCONSUME is
  * a commonly used combination which gives the AT complete control over the delivery of matching
- * events.  However, such filters should be used sparingly as they may have a negative impact on 
+ * events.  However, such filters should be used sparingly as they may have a negative impact on
  * system performance.
  **/
-typedef enum {
+typedef enum
+{
   ATSPI_KEYLISTENER_NOSYNC = 0,
   ATSPI_KEYLISTENER_SYNCHRONOUS = 1 << 0,
   ATSPI_KEYLISTENER_CANCONSUME = 1 << 1,
   ATSPI_KEYLISTENER_ALL_WINDOWS = 1 << 2
 } AtspiKeyListenerSyncType;
-#endif /* _ATSPI_TYPES_H_ */
+#endif /* _ATSPI_TYPES_H_ */
index 28acade..ac2d3da 100644 (file)
 #include "atspi-private.h"
 
 /**
+ * AtspiValue:
+ *
+ * An interface supporting a one-dimensional scalar
+ * to be modified, or which reflects its value.
+ *
+ * An interface supporting a one-dimensional scalar
+ * to be modified, or which reflects its value. If
+ * STATE_EDITABLE is not present, the value is
+ * treated as "read only".
+ */
+
+/**
  * atspi_value_get_minimum_value:
- * @obj: a pointer to the #AtspiValue implementor on which to operate. 
+ * @obj: a pointer to the #AtspiValue implementor on which to operate.
  *
  * Gets the minimum allowed value for an #AtspiValue.
  *
@@ -40,13 +52,13 @@ atspi_value_get_minimum_value (AtspiValue *obj, GError **error)
 
   g_return_val_if_fail (obj != NULL, 0.0);
   _atspi_dbus_get_property (obj, atspi_interface_value, "MinimumValue", error, "d", &retval);
-  
+
   return retval;
 }
 
 /**
  * atspi_value_get_current_value:
- * @obj: a pointer to the #AtspiValue implementor on which to operate. 
+ * @obj: a pointer to the #AtspiValue implementor on which to operate.
  *
  * Gets the current value for an #AtspiValue.
  *
@@ -66,7 +78,7 @@ atspi_value_get_current_value (AtspiValue *obj, GError **error)
 
 /**
  * atspi_value_get_maximum_value:
- * @obj: a pointer to the #AtspiValue implementor on which to operate. 
+ * @obj: a pointer to the #AtspiValue implementor on which to operate.
  *
  * Gets the maximum allowed value for an #AtspiValue.
  *
@@ -75,7 +87,7 @@ atspi_value_get_current_value (AtspiValue *obj, GError **error)
 gdouble
 atspi_value_get_maximum_value (AtspiValue *obj, GError **error)
 {
-  double retval;       
+  double retval;
 
   g_return_val_if_fail (obj != NULL, 0.0);
 
@@ -106,25 +118,25 @@ atspi_value_set_current_value (AtspiValue *obj, gdouble new_value, GError **erro
   g_return_val_if_fail (accessible != NULL, FALSE);
 
   if (!accessible->parent.app || !accessible->parent.app->bus_name)
-{
-    g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
-                          _("The application no longer exists"));
-    return FALSE;
-  }
-
-    message = dbus_message_new_method_call (accessible->parent.app->bus_name,
-                                            accessible->parent.path,
-                                            DBUS_INTERFACE_PROPERTIES, "Set");
-    if (!message)
+    {
+      g_set_error_literal (error, ATSPI_ERROR, ATSPI_ERROR_APPLICATION_GONE,
+                           _ ("The application no longer exists"));
       return FALSE;
-    dbus_message_append_args (message, DBUS_TYPE_STRING, &atspi_interface_value,
-                               DBUS_TYPE_STRING, &str_curval,
-                              DBUS_TYPE_INVALID);
+    }
+
+  message = dbus_message_new_method_call (accessible->parent.app->bus_name,
+                                          accessible->parent.path,
+                                          DBUS_INTERFACE_PROPERTIES, "Set");
+  if (!message)
+    return FALSE;
+  dbus_message_append_args (message, DBUS_TYPE_STRING, &atspi_interface_value,
+                            DBUS_TYPE_STRING, &str_curval,
+                            DBUS_TYPE_INVALID);
   dbus_message_iter_init_append (message, &iter);
   dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "d", &iter_variant);
   dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_DOUBLE, &d_new_value);
   dbus_message_iter_close_container (&iter, &iter_variant);
-    reply = _atspi_dbus_send_with_reply_and_block (message, error);
+  reply = _atspi_dbus_send_with_reply_and_block (message, error);
   dbus_message_unref (reply);
 
   return TRUE;
@@ -132,7 +144,7 @@ atspi_value_set_current_value (AtspiValue *obj, gdouble new_value, GError **erro
 
 /**
  * atspi_value_get_minimum_increment:
- * @obj: a pointer to the #AtspiValue implementor on which to operate. 
+ * @obj: a pointer to the #AtspiValue implementor on which to operate.
  *
  * Gets the minimum increment by which an #AtspiValue can be adjusted.
  *
@@ -148,7 +160,29 @@ atspi_value_get_minimum_increment (AtspiValue *obj, GError **error)
   g_return_val_if_fail (obj != NULL, 0.0);
 
   _atspi_dbus_get_property (obj, atspi_interface_value, "MinimumIncrement", error, "d", &retval);
-  
+
+  return retval;
+}
+
+/**
+ * atspi_value_get_text:
+ * @obj: a pointer to the #AtspiValue implementor on which to operate.
+ *
+ * Gets the human readable text alternative associated with the value.
+ * @text is a newly created string, that must be freed by the
+ * caller. Can be NULL if no descriptor is available.
+ *
+ * Since: 2.46
+ **/
+gchar *
+atspi_value_get_text (AtspiValue *obj, GError **error)
+{
+  gchar *retval = NULL;
+
+  g_return_val_if_fail (obj != NULL, NULL);
+
+  _atspi_dbus_get_property (obj, atspi_interface_value, "Text", error, "s", &retval);
+
   return retval;
 }
 
@@ -162,16 +196,15 @@ atspi_value_get_type (void)
 {
   static GType type = 0;
 
-  if (!type) {
-    static const GTypeInfo tinfo =
+  if (!type)
     {
-      sizeof (AtspiValue),
-      (GBaseInitFunc) atspi_value_base_init,
-      (GBaseFinalizeFunc) NULL,
-    };
-
-    type = g_type_register_static (G_TYPE_INTERFACE, "AtspiValue", &tinfo, 0);
-
-  }
+      static const GTypeInfo tinfo = {
+        sizeof (AtspiValue),
+        (GBaseInitFunc) atspi_value_base_init,
+        (GBaseFinalizeFunc) NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_INTERFACE, "AtspiValue", &tinfo, 0);
+    }
   return type;
 }
index a012793..ba04ff0 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2002 Ximian, Inc.
  *           2002 Sun Microsystems Inc.
  * Copyright 2010, 2011 Novell, Inc.
- *           
+ *
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
 
 G_BEGIN_DECLS
 
-#define ATSPI_TYPE_VALUE                    (atspi_value_get_type ())
-#define ATSPI_IS_VALUE(obj)                 G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_VALUE)
-#define ATSPI_VALUE(obj)                    G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_VALUE, AtspiValue)
-#define ATSPI_VALUE_GET_IFACE(obj)          (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_VALUE, AtspiValue))
+#define ATSPI_TYPE_VALUE (atspi_value_get_type ())
+#define ATSPI_IS_VALUE(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATSPI_TYPE_VALUE)
+#define ATSPI_VALUE(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATSPI_TYPE_VALUE, AtspiValue)
+#define ATSPI_VALUE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), ATSPI_TYPE_VALUE, AtspiValue))
 
 GType atspi_value_get_type ();
 
@@ -56,6 +56,7 @@ gboolean atspi_value_set_current_value (AtspiValue *obj, gdouble new_value, GErr
 
 gdouble atspi_value_get_minimum_increment (AtspiValue *obj, GError **error);
 
+gchar *atspi_value_get_text (AtspiValue *obj, GError **error);
 G_END_DECLS
 
-#endif /* _ATSPI_VALUE_H_ */
+#endif /* _ATSPI_VALUE_H_ */
diff --git a/atspi/atspi-version.h.in b/atspi/atspi-version.h.in
new file mode 100644 (file)
index 0000000..801a4c5
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2023 SUSE LLC.
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _ATSPI_VERSION_H_
+#define _ATSPI_VERSION_H_
+
+G_BEGIN_DECLS
+
+/**
+ * ATSPI_MAJOR_VERSION:
+ *
+ * The major version of AT-SPI used at compile time.
+ *
+ * Since: 2.50.0
+ */
+#define ATSPI_MAJOR_VERSION (@ATSPI_MAJOR_VERSION@)
+
+/**
+ * ATSPI_MINOR_VERSION:
+ *
+ * The minor version of AT-SPI used at compile time.
+ *
+ * Since: 2.50.0
+ */
+#define ATSPI_MINOR_VERSION (@ATSPI_MINOR_VERSION@)
+
+/**
+ * ATSPI_MICRO_VERSION:
+ *
+ * The micro version / patch level of AT-SPI used at compile time.
+ *
+ * Since: 2.50.0
+ */
+#define ATSPI_MICRO_VERSION (@ATSPI_MICRO_VERSION@)
+
+G_END_DECLS
+
+#endif /* _ATSPI_VERSION_H_ */
index 89ff20f..03e8d8e 100644 (file)
 
 #include "glib.h"
 
-#include "atspi-constants.h"
-#include "atspi-types.h"
 #include "atspi-accessible.h"
 #include "atspi-action.h"
 #include "atspi-collection.h"
 #include "atspi-component.h"
+#include "atspi-constants.h"
 #include "atspi-device-listener.h"
 #include "atspi-document.h"
 #include "atspi-editabletext.h"
 #include "atspi-relation.h"
 #include "atspi-selection.h"
 #include "atspi-stateset.h"
-#include "atspi-table.h"
 #include "atspi-table-cell.h"
+#include "atspi-table.h"
 #include "atspi-text.h"
+#include "atspi-types.h"
 #include "atspi-value.h"
 
 #include "atspi-gmain.h"
 
 #include "atspi-enum-types.h"
+
+#include "atspi-version.h"
 #endif
index ace8502..91f5847 100644 (file)
@@ -7,6 +7,7 @@ atspi_sources = [
   'atspi-device.c',
   'atspi-device-legacy.c',
   'atspi-device-listener.c',
+  'atspi-device-mutter.c',
   'atspi-document.c',
   'atspi-editabletext.c',
   'atspi-event-listener.c',
@@ -15,7 +16,6 @@ atspi_sources = [
   'atspi-hypertext.c',
   'atspi-image.c',
   'atspi-matchrule.c',
-  'atspi-mutter.c',
   'atspi-misc.c',
   'atspi-object.c',
   'atspi-registry.c',
@@ -39,6 +39,7 @@ atspi_headers = [
   'atspi-device.h',
   'atspi-device-legacy.h',
   'atspi-device-listener.h',
+  'atspi-device-mutter.h',
   'atspi-document.h',
   'atspi-editabletext.h',
   'atspi-event-listener.h',
@@ -60,18 +61,44 @@ atspi_headers = [
   'atspi-value.h',
 ]
 
-x11_option = get_option('x11')
-if x11_option != 'no'
-  if x11_dep.found()
-    atspi_sources += ['atspi-device-x11.c']
-    atspi_headers += ['atspi-device-x11.h']
-  endif
+if x11_dep.found()
+  atspi_sources += ['atspi-device-x11.c']
+  atspi_headers += ['atspi-device-x11.h']
 endif
 
+gen_atspi_sources = []
+
+gen_atspi_sources += gnome.gdbus_codegen('atspi-dbus-mutter-screen-cast',
+                                          'org.gnome.Mutter.ScreenCast.xml',
+                                          interface_prefix: 'org.gnome.Mutter.',
+                                          namespace: 'AtspiDBusMutter')
+gen_atspi_sources += gnome.gdbus_codegen('atspi-dbus-mutter-remote-desktop',
+                                          'org.gnome.Mutter.RemoteDesktop.xml',
+                                          interface_prefix: 'org.gnome.Mutter.',
+                                          namespace: 'AtspiDBusMutter')
+gen_atspi_sources += gnome.gdbus_codegen('atspi-dbus-shell-introspect',
+                                          'org.gnome.Shell.Introspect.xml',
+                                          interface_prefix: 'org.gnome.Shell.',
+                                          namespace: 'AtspiDBusShell')
+
+atspi_sources += gen_atspi_sources
+
 atspi_includedir = join_paths(get_option('prefix'), get_option('includedir'), 'at-spi-2.0', 'atspi')
 
 install_headers(atspi_headers, install_dir: atspi_includedir)
 
+# Features header
+atspi_version_conf = configuration_data()
+atspi_version_conf.set('ATSPI_MAJOR_VERSION', atspi_major_version)
+atspi_version_conf.set('ATSPI_MINOR_VERSION', atspi_minor_version)
+atspi_version_conf.set('ATSPI_MICRO_VERSION', atspi_micro_version)
+
+atspi_version_h = configure_file(input: 'atspi-version.h.in',
+  output: 'atspi-version.h',
+  configuration: atspi_version_conf,
+                            install_dir: atspi_includedir,
+)
+
 # Marshallers
 atspi_marshals = gnome.genmarshal('atspimarshal',
   sources: 'atspimarshal.list',
@@ -91,7 +118,7 @@ atspi = library('atspi', atspi_sources + atspi_enums + atspi_marshals,
                        version: soversion,
                        soversion: soversion.split('.')[0],
                        include_directories: [ root_inc, registryd_inc ],
-                       dependencies: [ libdbus_dep, gobject_dep, dbind_dep, x11_deps ],
+                       dependencies: [ libdbus_dep, gobject_dep, gio_dep, dbind_dep, x11_deps, libei_dep, xkbcommon_dep ],
                        install: true)
 
 atspi_dep = declare_dependency(link_with: atspi,
@@ -135,10 +162,10 @@ endif
 
 pkgconfig = import('pkgconfig')
 pkgconfig.generate(
+  atspi,
   name: 'atspi',
   description: 'Accessibility Technology software library',
   version: meson.project_version(),
-  libraries: atspi,
   requires: ['dbus-1', 'glib-2.0'],
   subdirs: 'at-spi-2.0',
   filebase: 'atspi-2',
diff --git a/atspi/org.gnome.Mutter.RemoteDesktop.xml b/atspi/org.gnome.Mutter.RemoteDesktop.xml
new file mode 100644 (file)
index 0000000..64f8f82
--- /dev/null
@@ -0,0 +1,364 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+  <!--
+      org.gnome.Mutter.RemoteDesktop:
+      @short_description: Remote desktop interface
+
+      This API is private and not intended to be used outside of the integrated
+      system that uses libmutter. No compatibility between versions are
+      promised.
+  -->
+  <interface name="org.gnome.Mutter.RemoteDesktop">
+
+    <!--
+        CreateSession:
+        @session_path: Path to the new session object
+    -->
+    <method name="CreateSession">
+      <arg name="session_path" type="o" direction="out" />
+    </method>
+
+    <!--
+        SupportedDeviceTypes:
+        @short_description: Bit mask of supported device types
+
+        Device types:
+          1: keyboard
+          2: pointer
+          4: touchscreen
+    -->
+    <property name="SupportedDeviceTypes" type="u" access="read" />
+
+    <!--
+        Version:
+        @short_description: API version
+    -->
+    <property name="Version" type="i" access="read" />
+
+  </interface>
+
+  <!--
+       org.gnome.Mutter.RemoteDesktop.Session:
+       @short_description: Remote desktop session
+  -->
+  <interface name="org.gnome.Mutter.RemoteDesktop.Session">
+
+    <!--
+        SessionId:
+
+        An identification string used for identifying a remote desktop session.
+        It can be used to associate screen cast sessions with a remote desktop
+        session.
+    -->
+    <property name="SessionId" type="s" access="read" />
+
+    <!--
+        Start:
+
+        Start the remote desktop session
+    -->
+    <method name="Start" />
+
+    <!--
+        Stop:
+
+        Stop the remote desktop session
+    -->
+    <method name="Stop" />
+
+    <!--
+        Closed:
+
+        The session has closed.
+
+        A session doesn't have to have been started before it may be closed.
+        After it being closed, it can no longer be used.
+    -->
+    <signal name="Closed" />
+
+    <!--
+        NotifyKeyboardKeycode:
+
+        A key identified by an evdev keycode was pressed or released
+     -->
+    <method name="NotifyKeyboardKeycode">
+      <arg name="keycode" type="u" direction="in" />
+      <arg name="state" type="b" direction="in" />
+    </method>
+
+    <!--
+        NotifyKeyboardKeysym:
+
+        A key identified by a keysym was pressed or released
+     -->
+    <method name="NotifyKeyboardKeysym">
+      <arg name="keysym" type="u" direction="in" />
+      <arg name="state" type="b" direction="in" />
+    </method>
+
+    <!--
+        NotifyPointerButton:
+
+        A pointer button was pressed or released
+     -->
+    <method name="NotifyPointerButton">
+      <arg name="button" type="i" direction="in" />
+      <arg name="state" type="b" direction="in" />
+    </method>
+
+    <!--
+        NotifyPointerAxis:
+
+        A smooth pointer axis event notification. Relative motion deltas are to
+        be interpreted as pixel movement of a standardized mouse.
+
+        Additionally to the smooth pointer axis event notification, an emulated
+        discrete pointer axis event notification is emitted based on the
+        submitted accumulated smooth scrolling steps.
+        The base for these emulated discrete pointer axis event is the discrete
+        step with the value 10.0.
+        This means that for a delta dx (or dy) with the value 10.0 one emulated
+        discrete scrolling event is emitted.
+        For a high resolution smooth pointer axis event, a smaller value is
+        submitted for each scrolling step.
+        This means: For a double resolution mouse wheel one emulated discrete
+        event is emitted for 2 smooth pointer axis events with each having the
+        value 5.0.
+
+        Possible @flags:
+          1: finish - scroll motion was finished (e.g. fingers lifted)
+          2: source_wheel - The scroll event is originated by a mouse wheel.
+          4: source_finger - The scroll event is originated by one or more
+                             fingers on the device (eg. touchpads).
+          8: source_continuous - The scroll event is originated by the motion
+                                 of some device (eg. a scroll button is set).
+
+          Maximum one of the @flags 'source_wheel', 'source_finger',
+          'source_continuous' may be specified.
+          If no source flag is specified, `source_finger` is assumed.
+     -->
+    <method name="NotifyPointerAxis">
+      <arg name="dx" type="d" direction="in" />
+      <arg name="dy" type="d" direction="in" />
+      <arg name="flags" type="u" direction="in" />
+    </method>
+
+    <!--
+        NotifyPointerAxisDiscrete:
+
+        A discrete pointer axis event notification
+     -->
+    <method name="NotifyPointerAxisDiscrete">
+      <arg name="axis" type="u" direction="in" />
+      <arg name="steps" type="i" direction="in" />
+    </method>
+
+    <!--
+        NotifyPointerMotionRelative:
+
+        A relative pointer motion event notification
+     -->
+    <method name="NotifyPointerMotionRelative">
+      <arg name="dx" type="d" direction="in" />
+      <arg name="dy" type="d" direction="in" />
+    </method>
+
+    <!--
+        NotifyPointerMotionAbsolute:
+
+        A absolute pointer motion event notification
+     -->
+    <method name="NotifyPointerMotionAbsolute">
+      <arg name="stream" type="s" direction="in" />
+      <arg name="x" type="d" direction="in" />
+      <arg name="y" type="d" direction="in" />
+    </method>
+
+    <!--
+        NotifyTouchDown:
+
+        A absolute pointer motion event notification
+     -->
+    <method name="NotifyTouchDown">
+      <arg name="stream" type="s" direction="in" />
+      <arg name="slot" type="u" direction="in" />
+      <arg name="x" type="d" direction="in" />
+      <arg name="y" type="d" direction="in" />
+    </method>
+
+    <!--
+        NotifyTouchMotion:
+
+        A absolute pointer motion event notification
+     -->
+    <method name="NotifyTouchMotion">
+      <arg name="stream" type="s" direction="in" />
+      <arg name="slot" type="u" direction="in" />
+      <arg name="x" type="d" direction="in" />
+      <arg name="y" type="d" direction="in" />
+    </method>
+
+    <!--
+        NotifyTouchUp:
+
+        A absolute pointer motion event notification
+     -->
+    <method name="NotifyTouchUp">
+      <arg name="slot" type="u" direction="in" />
+    </method>
+
+    <!--
+        EnableClipboard:
+        @options: Options for the clipboard
+
+        Available @options include:
+
+        * "mime-types" (as): List of mime types, for which the clipboard of the
+                             remote desktop client has content.
+                             Each mime-type is in string form, e.g. "image/jpeg",
+                             "text/plain", etc..
+                             If this list is included in @options, then this call
+                             is equivalent to calling 'EnableClipboard' and
+                             'SetSelection' atomically.
+
+        Enables the clipboard for the remote desktop client which will allow it
+        to call the methods 'SetSelection', 'DisableClipboard', 'SelectionWrite',
+        'SelectionWriteDone', 'SelectionRead'.
+        The 'SelectionOwnerChanged' signal will also be emitted when the
+        selection owner changes to inform the API user of new clipboard mime
+        types, and the 'SelectionTransfer' signal will be emitted to request the
+        advertised clipboard content of a mime type.
+    -->
+    <method name="EnableClipboard">
+      <arg name="options" type="a{sv}" direction="in" />
+    </method>
+
+    <!--
+        DisableClipboard:
+
+        Unregisters all clipboard types that were advertised by the
+        remote desktop client.
+        The 'SelectionOwnerChanged' or 'SelectionTransfer' signals will not be
+        emitted any more.
+        Any 'SelectionTransfer' signals that weren't answered yet with a
+        'SelectionWriteDone' call, will be answered with a 'SelectionWriteDone'
+        call where 'success' is 'false'.
+    -->
+    <method name="DisableClipboard" />
+
+    <!--
+        SetSelection:
+        @options: Options for the clipboard selection
+
+        Available @options include:
+
+        * "mime-types" (as): List of mime types, for which the clipboard of the
+                             remote desktop client has content.
+                             Each mime-type is in string form, e.g. "image/jpeg",
+                             "text/plain", etc..
+
+        Sets the owner of the clipboard formats in 'mime-types' in @options to
+        the remote desktop client, i.e. the remote desktop client has data for
+        these advertised clipboard formats.
+    -->
+    <method name="SetSelection">
+      <arg name="options" type="a{sv}" direction="in" />
+    </method>
+
+    <!--
+        SelectionWrite:
+        @serial: The serial of the request where this answer is directed to
+        @fd: The file descriptor where the data will be written to
+
+        Answer to 'SelectionTransfer' signal. Contains the fd where the clipboard
+        content will be written to.
+    -->
+    <method name="SelectionWrite">
+      <arg name="serial" type="u" direction="in" />
+      <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+      <arg name="fd" type="h" direction="out" />
+    </method>
+
+    <!--
+        SelectionWriteDone:
+        @serial: The serial of the request where this answer is directed to
+        @success: A boolean which indicates whether the transfer of the clipboard
+                  data was successful ('true') or not ('false').
+
+        Notifies that the transfer of the clipboard data has either completed
+        successfully, or failed.
+    -->
+    <method name="SelectionWriteDone">
+      <arg name="serial" type="u" direction="in" />
+      <arg name="success" type="b" direction="in" />
+    </method>
+
+    <!--
+        SelectionRead:
+        @mime_type: The mime-type string of the requested format
+        @fd: The file descriptor where the data will be written to
+
+        Transfer the clipboard content given the specified mime type to the
+        method caller via a file descriptor.
+        It is the callee that creates the file descriptor.
+    -->
+    <method name="SelectionRead">
+      <arg name="mime_type" type="s" direction="in" />
+      <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+      <arg name="fd" type="h" direction="out" />
+    </method>
+
+    <!--
+        SelectionOwnerChanged:
+        @options: Options for the clipboard selection
+
+        Available @options include:
+
+        * "mime-types" (as): List of mime types, for which the clipboard of the
+                             remote desktop client has content.
+                             Each mime-type is in string form, e.g. "image/jpeg",
+                             "text/plain", etc..
+        * "session-is-owner" (b): 'true', if the remote desktop clients clipboard
+                                  is already owner of these types, else 'false'.
+
+        Informs the remote desktop client of new clipboard formats that are
+        available.
+    -->
+    <signal name="SelectionOwnerChanged">
+      <arg name="options" type="a{sv}" direction="in" />
+    </signal>
+
+    <!--
+        SelectionTransfer:
+        @mime_type: The mime-type string of the requested format
+        @serial: The serial, that the answer of this particular request, MUST use
+
+        Requests the data for a clipboard format from the remote desktop client.
+        MUST NOT be called when the remote desktop clients clipboard is (already)
+        disabled.
+    -->
+    <signal name="SelectionTransfer">
+      <arg name="mime_type" type="s" direction="in" />
+      <arg name="serial" type="u" direction="in" />
+    </signal>
+
+    <property name="CapsLockState" type="b" access="read" />
+    <property name="NumLockState" type="b" access="read" />
+
+    <!--
+        ConnectToEIS:
+
+        Request a connection to an EIS implementation.
+    -->
+    <method name="ConnectToEIS">
+      <arg type="a{sv}" name="options" direction="in"/>
+      <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+      <arg type="h" name="fd" direction="out"/>
+    </method>
+
+  </interface>
+
+</node>
diff --git a/atspi/org.gnome.Mutter.ScreenCast.xml b/atspi/org.gnome.Mutter.ScreenCast.xml
new file mode 100644 (file)
index 0000000..54d2965
--- /dev/null
@@ -0,0 +1,229 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+  <!--
+      org.gnome.Mutter.ScreenCast:
+      @short_description: Screen cast interface
+
+      This API is private and not intended to be used outside of the integrated
+      system that uses libmutter. No compatibility between versions are
+      promised.
+  -->
+  <interface name="org.gnome.Mutter.ScreenCast">
+
+    <!--
+        CreateSession:
+        @properties: Properties
+        @session_path: Path to the new session object
+
+        * "remote-desktop-session-id" (s): The ID of a remote desktop session.
+                                           Remote desktop driven screen casts
+                                           are started and stopped by the remote
+                                           desktop session.
+        * "disable-animations" (b): Set to "true" if the screen cast application
+                                    would prefer animations to be globally
+                                    disabled, while the session is running.
+                                    Default is "false".
+                                    Available since version 3.
+    -->
+    <method name="CreateSession">
+      <arg name="properties" type="a{sv}" direction="in" />
+      <arg name="session_path" type="o" direction="out" />
+    </method>
+
+    <!--
+        Version:
+        @short_description: API version
+    -->
+    <property name="Version" type="i" access="read" />
+
+  </interface>
+
+  <!--
+       org.gnome.Mutter.ScreenCast.Session:
+       @short_description: Screen cast session
+  -->
+  <interface name="org.gnome.Mutter.ScreenCast.Session">
+
+    <!--
+        Start:
+
+        Start the screen cast session
+    -->
+    <method name="Start" />
+
+    <!--
+        Stop:
+
+        Stop the screen cast session
+    -->
+    <method name="Stop" />
+
+    <!--
+        Closed:
+
+        The session has closed.
+    -->
+    <signal name="Closed" />
+
+    <!--
+        RecordMonitor:
+        @connector: Connector of the monitor to record
+        @properties: Properties
+        @stream_path: Path to the new stream object
+
+        Record a single monitor.
+
+        Available @properties include:
+
+        * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
+                             Available since API version 2.
+        * "is-recording" (b): Whether this is a screen recording. May be
+                              be used for choosing appropriate visual feedback.
+                              Default: false. Available since API version 4.
+
+        Available cursor mode values:
+
+        0: hidden - cursor is not included in the stream
+        1: embedded - cursor is included in the framebuffer
+        2: metadata - cursor is included as metadata in the PipeWire stream
+    -->
+    <method name="RecordMonitor">
+      <arg name="connector" type="s" direction="in" />
+      <arg name="properties" type="a{sv}" direction="in" />
+      <arg name="stream_path" type="o" direction="out" />
+    </method>
+
+    <!--
+        RecordWindow:
+        @properties: Properties used determining what window to select
+        @stream_path: Path to the new stream object
+
+        Supported since API version 2.
+
+        Record a single window. The cursor will not be included.
+
+        Available @properties include:
+
+        * "window-id" (t): Id of the window to record.
+        * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see RecordMonitor).
+        * "is-recording" (b): Whether this is a screen recording. May be
+                              be used for choosing panel icon.
+                              Default: false. Available since API version 4.
+
+    -->
+    <method name="RecordWindow">
+      <arg name="properties" type="a{sv}" direction="in" />
+      <arg name="stream_path" type="o" direction="out" />
+    </method>
+
+    <!--
+        RecordArea:
+        @x: X position of the recorded area
+        @y: Y position of the recorded area
+        @width: width of the recorded area
+        @height: height of the recorded area
+        @properties: Properties
+        @stream_path: Path to the new stream object
+
+        Record an area of the stage. The coordinates are in stage coordinates.
+        The size of the stream does not necessarily match the size of the
+        recorded area, and will depend on DPI scale of the affected monitors.
+
+        Available @properties include:
+
+        * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
+                             Available since API version 2.
+        * "is-recording" (b): Whether this is a screen recording. May be
+                              be used for choosing panel icon.
+                              Default: false. Available since API version 4.
+
+        Available cursor mode values:
+
+        0: hidden - cursor is not included in the stream
+        1: embedded - cursor is included in the framebuffer
+        2: metadata - cursor is included as metadata in the PipeWire stream
+    -->
+    <method name="RecordArea">
+      <arg name="x" type="i" direction="in" />
+      <arg name="y" type="i" direction="in" />
+      <arg name="width" type="i" direction="in" />
+      <arg name="height" type="i" direction="in" />
+      <arg name="properties" type="a{sv}" direction="in" />
+      <arg name="stream_path" type="o" direction="out" />
+    </method>
+
+    <!--
+        RecordVirtual:
+        @properties: Properties
+        @stream_path: Path to the new stream object
+
+        Record a virtual area that will be represented as a virtual monitor. The
+        width and height corresponds to the non-scaled intended stream size.
+
+        Available @properties include:
+
+        * "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
+                             Available since API version 2.
+        * "is-platform" (b): Whether this virtual output should be considered
+                             part of the platform, meaning it will not be
+                             interpreted as if the screen is shared, but more
+                             transparently as if it was a real monitor.
+                             Available since API version 3. Default: FALSE.
+
+        Available cursor mode values:
+
+        0: hidden - cursor is not included in the stream
+        1: embedded - cursor is included in the framebuffer
+        2: metadata - cursor is included as metadata in the PipeWire stream
+    -->
+    <method name="RecordVirtual">
+      <arg name="properties" type="a{sv}" direction="in" />
+      <arg name="stream_path" type="o" direction="out" />
+    </method>
+  </interface>
+
+  <!--
+       org.gnome.Mutter.ScreenCast.Stream:
+       @short_description: Screen cast stream
+  -->
+  <interface name="org.gnome.Mutter.ScreenCast.Stream">
+
+    <!--
+        Start:
+        @short_description: Start new stream
+
+        Start a stream of an already started session.
+    -->
+    <method name="Start"/>
+
+    <!--
+        PipeWireStreamAdded:
+        @short_description: Pipewire stream added
+
+        A signal emitted when PipeWire stream for the screen cast stream has
+        been created. The @node_id corresponds to the PipeWire stream node.
+    -->
+    <signal name="PipeWireStreamAdded">
+      <annotation name="org.gtk.GDBus.C.Name" value="pipewire-stream-added"/>
+      <arg name="node_id" type="u" direction="out" />
+    </signal>
+
+    <!--
+        Parameters:
+        @short_description: Optional stream parameters
+
+        Available parameters include:
+
+        * "position" (ii): Position of the source of the stream in the
+                           compositor coordinate space.
+        * "size" (ii): Size of the source of the stream in the compositor
+                       coordinate space.
+    -->
+    <property name="Parameters" type="a{sv}" access="read" />
+
+  </interface>
+
+</node>
diff --git a/atspi/org.gnome.Shell.Introspect.xml b/atspi/org.gnome.Shell.Introspect.xml
new file mode 100644 (file)
index 0000000..cb19cfe
--- /dev/null
@@ -0,0 +1,89 @@
+<!DOCTYPE node PUBLIC
+'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
+'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
+<node>
+
+  <!--
+      org.gnome.Shell.Introspect:
+      @short_description: Introspection interface
+
+      The interface used to introspect the state of Shell, such as running
+      applications, currently active application, etc.
+  -->
+  <interface name="org.gnome.Shell.Introspect">
+
+    <!--
+        RunningApplicationsChanged:
+        @short_description: Notifies when the running applications changes
+    -->
+    <signal name="RunningApplicationsChanged" />
+
+    <!--
+        WindowsChanged:
+        @short_description: Notifies when any window opens or closes
+    -->
+    <signal name="WindowsChanged" />
+
+    <!--
+        GetRunningApplications:
+        @short_description: Retrieves the description of all running applications
+
+        Each application is associated by an application ID. The details of
+        each application consists of a varlist of keys and values. Available
+        keys are listed below.
+
+        'active-on-seats' - (as)   list of seats the application is active on
+                                   (a seat only has at most one active
+                                   application)
+    -->
+    <method name="GetRunningApplications">
+      <arg name="apps" direction="out" type="a{sa{sv}}" />
+    </method>
+
+    <!--
+        GetWindows:
+        @short_description: Retrieves the current list of windows and their properties
+
+        A window is exposed as:
+        * t ID: unique ID of the window
+        * a{sv} properties: high-level properties
+
+          Known properties:
+
+          - "title"       (s): (readonly) title of the window
+          - "app-id"      (s): (readonly) application ID of the window
+          - "wm-class"    (s): (readonly) class of the window
+          - "client-type" (u): (readonly) 0 for Wayland, 1 for X11
+          - "is-hidden"   (b): (readonly) if the window is currently hidden
+          - "has-focus"   (b): (readonly) if the window currently have
+                                          keyboard focus
+          - "width"       (u): (readonly) width of the window
+          - "height"      (u): (readonly) height of the window
+    -->
+    <method name="GetWindows">
+      <arg name="windows" direction="out" type="a{ta{sv}}" />
+    </method>
+
+    <!--
+       AnimationsEnabled:
+       @short_description: Whether the shell animations are enabled
+
+       By default determined by the org.gnome.desktop.interface enable-animations
+       gsetting, but may be overridden, e.g. if there is an active screen cast or
+       remote desktop session that asked for animations to be disabled.
+
+       Since: 2
+    -->
+    <property name="AnimationsEnabled" type="b" access="read"/>
+
+    <!--
+       ScreenSize:
+       @short_description: The size of the screen
+
+       Since: 3
+    -->
+    <property name="ScreenSize" type="(ii)" access="read"/>
+
+    <property name="version" type="u" access="read"/>
+  </interface>
+</node>
index 0633c30..53ae3ff 100644 (file)
@@ -1,6 +1,6 @@
 /* -*- mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
- * 
- * at-spi-bus-launcher: Manage the a11y bus as a child process 
+ *
+ * at-spi-bus-launcher: Manage the a11y bus as a child process
  *
  * Copyright 2011-2018 Red Hat, Inc.
  *
 
 #include "config.h"
 
-#include <unistd.h>
-#include <string.h>
 #include <signal.h>
+#include <string.h>
+#include <unistd.h>
 #ifdef __linux__
 #include <sys/prctl.h>
 #include <sys/socket.h>
 #include <sys/un.h>
 #endif
-#include <sys/wait.h>
 #include <errno.h>
 #include <stdio.h>
+#include <sys/wait.h>
 
 #include <gio/gio.h>
 #ifdef HAVE_X11
-#include <X11/Xlib.h>
 #include <X11/Xatom.h>
+#include <X11/Xlib.h>
 #endif
 #ifdef DBUS_BROKER
 #include <systemd/sd-login.h>
 #endif
 #include <sys/stat.h>
 
-typedef enum {
+typedef enum
+{
   A11Y_BUS_STATE_IDLE = 0,
   A11Y_BUS_STATE_READING_ADDRESS,
   A11Y_BUS_STATE_RUNNING,
   A11Y_BUS_STATE_ERROR
 } A11yBusState;
 
-typedef struct {
+typedef struct
+{
   GMainLoop *loop;
   gboolean launch_immediately;
   gboolean a11y_enabled;
@@ -80,17 +82,17 @@ typedef struct {
 static A11yBusLauncher *_global_app = NULL;
 
 static const gchar introspection_xml[] =
-  "<node>"
-  "  <interface name='org.a11y.Bus'>"
-  "    <method name='GetAddress'>"
-  "      <arg type='s' name='address' direction='out'/>"
-  "    </method>"
-  "  </interface>"
-  "  <interface name='org.a11y.Status'>"
-  "    <property name='IsEnabled' type='b' access='readwrite'/>"
-  "    <property name='ScreenReaderEnabled' type='b' access='readwrite'/>"
-  "  </interface>"
-  "</node>";
+    "<node>"
+    "  <interface name='org.a11y.Bus'>"
+    "    <method name='GetAddress'>"
+    "      <arg type='s' name='address' direction='out'/>"
+    "    </method>"
+    "  </interface>"
+    "  <interface name='org.a11y.Status'>"
+    "    <property name='IsEnabled' type='b' access='readwrite'/>"
+    "    <property name='ScreenReaderEnabled' type='b' access='readwrite'/>"
+    "  </interface>"
+    "</node>";
 static GDBusNodeInfo *introspection_data = NULL;
 
 static void
@@ -108,10 +110,10 @@ respond_to_end_session (GDBusProxy *proxy)
 
 static void
 g_signal_cb (GDBusProxy *proxy,
-             gchar      *sender_name,
-             gchar      *signal_name,
-             GVariant   *parameters,
-             gpointer    user_data)
+             gchar *sender_name,
+             gchar *signal_name,
+             GVariant *parameters,
+             gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
 
@@ -124,9 +126,9 @@ g_signal_cb (GDBusProxy *proxy,
 }
 
 static void
-client_proxy_ready_cb (GObject      *source_object,
+client_proxy_ready_cb (GObject *source_object,
                        GAsyncResult *res,
-                       gpointer      user_data)
+                       gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
   GError *error = NULL;
@@ -230,14 +232,13 @@ register_client (A11yBusLauncher *app)
                      "RegisterClient", parameters,
                      G_DBUS_CALL_FLAGS_NONE,
                      G_MAXINT, NULL, client_registered, app);
-
 }
 
 static void
 name_appeared_handler (GDBusConnection *connection,
-                       const gchar     *name,
-                       const gchar     *name_owner,
-                       gpointer         user_data)
+                       const gchar *name,
+                       const gchar *name_owner,
+                       gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
 
@@ -250,10 +251,10 @@ name_appeared_handler (GDBusConnection *connection,
  * Read all data from a file descriptor to a C string buffer.
  */
 static gboolean
-unix_read_all_fd_to_string (int       fd,
-                            char     *buf,
-                            ssize_t   max_bytes,
-                            char    **error_msg)
+unix_read_all_fd_to_string (int fd,
+                            char *buf,
+                            ssize_t max_bytes,
+                            char **error_msg)
 {
   g_assert (max_bytes > 1);
   *error_msg = NULL;
@@ -293,12 +294,12 @@ unix_read_all_fd_to_string (int       fd,
 }
 
 static void
-on_bus_exited (GPid     pid,
-               gint     status,
+on_bus_exited (GPid pid,
+               gint status,
                gpointer data)
 {
   A11yBusLauncher *app = data;
-  
+
   app->a11y_bus_pid = -1;
   app->state = A11Y_BUS_STATE_ERROR;
   if (app->a11y_launch_error_message == NULL)
@@ -347,7 +348,7 @@ ensure_a11y_bus_daemon (A11yBusLauncher *app, char *config_path)
   g_clear_pointer (&app->a11y_launch_error_message, g_free);
 
   if (!g_spawn_async_with_pipes_and_fds (NULL,
-                                         (const gchar * const *) argv,
+                                         (const gchar *const *) argv,
                                          NULL,
                                          G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_LEAVE_DESCRIPTORS_OPEN,
                                          NULL, /* child_setup */
@@ -412,7 +413,7 @@ error:
 static gboolean
 ensure_a11y_bus_daemon (A11yBusLauncher *app, char *config_path)
 {
-       return FALSE;
+  return FALSE;
 }
 #endif
 
@@ -426,11 +427,11 @@ setup_bus_child_broker (gpointer data)
 
   dup2 (app->listenfd, 3);
   close (app->listenfd);
-  g_setenv("LISTEN_FDS", "1", TRUE);
+  g_setenv ("LISTEN_FDS", "1", TRUE);
 
-  pid_str = g_strdup_printf("%u", getpid());
-  g_setenv("LISTEN_PID", pid_str, TRUE);
-  g_free(pid_str);
+  pid_str = g_strdup_printf ("%u", getpid ());
+  g_setenv ("LISTEN_PID", pid_str, TRUE);
+  g_free (pid_str);
 }
 
 static gboolean
@@ -439,7 +440,7 @@ ensure_a11y_bus_broker (A11yBusLauncher *app, char *config_path)
   char *argv[] = { DBUS_BROKER, config_path, "--scope", "user", NULL };
   char *unit;
   struct sockaddr_un addr = { .sun_family = AF_UNIX, "" };
-  socklen_t addr_len = sizeof(addr);
+  socklen_t addr_len = sizeof (addr);
   GPid pid;
   GError *error = NULL;
 
@@ -466,15 +467,15 @@ ensure_a11y_bus_broker (A11yBusLauncher *app, char *config_path)
   if ((app->listenfd = socket (PF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0)) < 0)
     g_error ("Failed to create listening socket: %s", strerror (errno));
 
-  if (bind (app->listenfd, (struct sockaddr *)&addr, addr_len) < 0)
+  if (bind (app->listenfd, (struct sockaddr *) &addr, addr_len) < 0)
     g_error ("Failed to bind listening socket: %s", strerror (errno));
 
   if (!app->socket_name &&
-      getsockname (app->listenfd, (struct sockaddr *)&addr, &addr_len) < 0)
-    g_error ("Failed to get socket name for listening socket: %s", strerror(errno));
+      getsockname (app->listenfd, (struct sockaddr *) &addr, &addr_len) < 0)
+    g_error ("Failed to get socket name for listening socket: %s", strerror (errno));
 
   if (listen (app->listenfd, 1024) < 0)
-    g_error ("Failed to listen on socket: %s", strerror(errno));
+    g_error ("Failed to listen on socket: %s", strerror (errno));
 
   g_clear_pointer (&app->a11y_launch_error_message, g_free);
 
@@ -502,9 +503,9 @@ ensure_a11y_bus_broker (A11yBusLauncher *app, char *config_path)
   app->state = A11Y_BUS_STATE_RUNNING;
 
   if (app->socket_name)
-    app->a11y_bus_address = g_strconcat("unix:path=", addr.sun_path, NULL);
+    app->a11y_bus_address = g_strconcat ("unix:path=", addr.sun_path, NULL);
   else
-    app->a11y_bus_address = g_strconcat("unix:abstract=", addr.sun_path + 1, NULL);
+    app->a11y_bus_address = g_strconcat ("unix:abstract=", addr.sun_path + 1, NULL);
   g_debug ("a11y bus address: %s", app->a11y_bus_address);
 
   return TRUE;
@@ -519,7 +520,7 @@ error:
 static gboolean
 ensure_a11y_bus_broker (A11yBusLauncher *app, char *config_path)
 {
-       return FALSE;
+  return FALSE;
 }
 #endif
 
@@ -533,55 +534,55 @@ ensure_a11y_bus (A11yBusLauncher *app)
   if (app->a11y_bus_pid != 0)
     return FALSE;
 
-  if (g_file_test (SYSCONFDIR"/at-spi2/accessibility.conf", G_FILE_TEST_EXISTS))
-      config_path = "--config-file="SYSCONFDIR"/at-spi2/accessibility.conf";
+  if (g_file_test (SYSCONFDIR "/at-spi2/accessibility.conf", G_FILE_TEST_EXISTS))
+    config_path = "--config-file=" SYSCONFDIR "/at-spi2/accessibility.conf";
   else
-      config_path = "--config-file="DATADIR"/defaults/at-spi2/accessibility.conf";
-
-    xdg_runtime_dir = g_get_user_runtime_dir ();
-    if (xdg_runtime_dir)
-      {
-        const gchar *display = g_getenv ("DISPLAY");
-        gchar *at_spi_dir = g_strconcat (xdg_runtime_dir, "/at-spi", NULL);
-        gchar *p;
-        mkdir (xdg_runtime_dir, 0700);
-        if (!g_path_is_absolute (at_spi_dir))
+    config_path = "--config-file=" DATADIR "/defaults/at-spi2/accessibility.conf";
+
+  xdg_runtime_dir = g_get_user_runtime_dir ();
+  if (xdg_runtime_dir)
+    {
+      const gchar *display = g_getenv ("DISPLAY");
+      gchar *at_spi_dir = g_strconcat (xdg_runtime_dir, "/at-spi", NULL);
+      gchar *p;
+      mkdir (xdg_runtime_dir, 0700);
+      if (!g_path_is_absolute (at_spi_dir))
         {
           gchar *new_dir = g_canonicalize_filename (at_spi_dir, NULL);
           g_free (at_spi_dir);
           at_spi_dir = new_dir;
         }
-        if (mkdir (at_spi_dir, 0700) == 0 || errno == EEXIST)
-          {
-            app->socket_name = g_strconcat (at_spi_dir, "/bus", display, NULL);
-            g_free (at_spi_dir);
-            p = strchr (app->socket_name, ':');
-            if (p)
-              *p = '_';
-            if (strlen (app->socket_name) >= 100)
-              {
-                g_free (app->socket_name);
-                app->socket_name = NULL;
-              }
-          }
-        else
+      if (mkdir (at_spi_dir, 0700) == 0 || errno == EEXIST)
+        {
+          app->socket_name = g_strconcat (at_spi_dir, "/bus", display, NULL);
           g_free (at_spi_dir);
-      }
+          p = strchr (app->socket_name, ':');
+          if (p)
+            *p = '_';
+          if (strlen (app->socket_name) >= 100)
+            {
+              g_free (app->socket_name);
+              app->socket_name = NULL;
+            }
+        }
+      else
+        g_free (at_spi_dir);
+    }
 
 #ifdef WANT_DBUS_BROKER
-    success = ensure_a11y_bus_broker (app, config_path);
-    if (!success)
-      {
-        if (!ensure_a11y_bus_daemon (app, config_path))
-            return FALSE;
-      }
+  success = ensure_a11y_bus_broker (app, config_path);
+  if (!success)
+    {
+      if (!ensure_a11y_bus_daemon (app, config_path))
+        return FALSE;
+    }
 #else
-    success = ensure_a11y_bus_daemon (app, config_path);
-    if (!success)
-      {
-        if (!ensure_a11y_bus_broker (app, config_path))
-            return FALSE;
-      }
+  success = ensure_a11y_bus_daemon (app, config_path);
+  if (!success)
+    {
+      if (!ensure_a11y_bus_broker (app, config_path))
+        return FALSE;
+    }
 #endif
 
 #ifdef HAVE_X11
@@ -607,14 +608,14 @@ ensure_a11y_bus (A11yBusLauncher *app)
 }
 
 static void
-handle_method_call (GDBusConnection       *connection,
-                    const gchar           *sender,
-                    const gchar           *object_path,
-                    const gchar           *interface_name,
-                    const gchar           *method_name,
-                    GVariant              *parameters,
+handle_method_call (GDBusConnection *connection,
+                    const gchar *sender,
+                    const gchar *object_path,
+                    const gchar *interface_name,
+                    const gchar *method_name,
+                    GVariant *parameters,
                     GDBusMethodInvocation *invocation,
-                    gpointer               user_data)
+                    gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
 
@@ -632,13 +633,13 @@ handle_method_call (GDBusConnection       *connection,
 }
 
 static GVariant *
-handle_get_property  (GDBusConnection       *connection,
-                      const gchar           *sender,
-                      const gchar           *object_path,
-                      const gchar           *interface_name,
-                      const gchar           *property_name,
-                    GError **error,
-                    gpointer               user_data)
+handle_get_property (GDBusConnection *connection,
+                     const gchar *sender,
+                     const gchar *object_path,
+                     const gchar *interface_name,
+                     const gchar *property_name,
+                     GError **error,
+                     gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
 
@@ -651,8 +652,7 @@ handle_get_property  (GDBusConnection       *connection,
 }
 
 static void
-handle_a11y_enabled_change (A11yBusLauncher *app, gboolean enabled,
-                               gboolean notify_gsettings)
+handle_a11y_enabled_change (A11yBusLauncher *app, gboolean enabled, gboolean notify_gsettings)
 {
   GVariantBuilder builder;
   GVariantBuilder invalidated_builder;
@@ -687,8 +687,7 @@ handle_a11y_enabled_change (A11yBusLauncher *app, gboolean enabled,
 }
 
 static void
-handle_screen_reader_enabled_change (A11yBusLauncher *app, gboolean enabled,
-                               gboolean notify_gsettings)
+handle_screen_reader_enabled_change (A11yBusLauncher *app, gboolean enabled, gboolean notify_gsettings)
 {
   GVariantBuilder builder;
   GVariantBuilder invalidated_builder;
@@ -728,23 +727,23 @@ handle_screen_reader_enabled_change (A11yBusLauncher *app, gboolean enabled,
 }
 
 static gboolean
-handle_set_property  (GDBusConnection       *connection,
-                      const gchar           *sender,
-                      const gchar           *object_path,
-                      const gchar           *interface_name,
-                      const gchar           *property_name,
-                      GVariant *value,
-                    GError **error,
-                    gpointer               user_data)
+handle_set_property (GDBusConnection *connection,
+                     const gchar *sender,
+                     const gchar *object_path,
+                     const gchar *interface_name,
+                     const gchar *property_name,
+                     GVariant *value,
+                     GError **error,
+                     gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
   const gchar *type = g_variant_get_type_string (value);
   gboolean enabled;
-  
+
   if (g_strcmp0 (type, "b") != 0)
     {
       g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
-                       "org.a11y.Status.%s expects a boolean but got %s", property_name, type);
+                   "org.a11y.Status.%s expects a boolean but got %s", property_name, type);
       return FALSE;
     }
 
@@ -763,20 +762,18 @@ handle_set_property  (GDBusConnection       *connection,
   else
     {
       g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS,
-                       "Unknown property '%s'", property_name);
+                   "Unknown property '%s'", property_name);
       return FALSE;
     }
 }
 
-static const GDBusInterfaceVTable bus_vtable =
-{
+static const GDBusInterfaceVTable bus_vtable = {
   handle_method_call,
   NULL, /* handle_get_property, */
   NULL  /* handle_set_property */
 };
 
-static const GDBusInterfaceVTable status_vtable =
-{
+static const GDBusInterfaceVTable status_vtable = {
   NULL, /* handle_method_call */
   handle_get_property,
   handle_set_property
@@ -784,13 +781,13 @@ static const GDBusInterfaceVTable status_vtable =
 
 static void
 on_bus_acquired (GDBusConnection *connection,
-                 const gchar     *name,
-                 gpointer         user_data)
+                 const gchar *name,
+                 gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
   GError *error;
   guint registration_id;
-  
+
   if (connection == NULL)
     {
       g_main_loop_quit (app->loop);
@@ -823,21 +820,19 @@ on_bus_acquired (GDBusConnection *connection,
 
 static void
 on_name_lost (GDBusConnection *connection,
-              const gchar     *name,
-              gpointer         user_data)
+              const gchar *name,
+              gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
-  if (app->session_bus == NULL
-      && connection == NULL
-      && app->a11y_launch_error_message == NULL)
+  if (app->session_bus == NULL && connection == NULL && app->a11y_launch_error_message == NULL)
     app->a11y_launch_error_message = g_strdup ("Failed to connect to session bus");
   g_main_loop_quit (app->loop);
 }
 
 static void
 on_name_acquired (GDBusConnection *connection,
-                  const gchar     *name,
-                  gpointer         user_data)
+                  const gchar *name,
+                  gpointer user_data)
 {
   A11yBusLauncher *app = user_data;
 
@@ -867,12 +862,12 @@ sigterm_handler (int signum)
 }
 
 static gboolean
-on_sigterm_pipe (GIOChannel  *channel,
+on_sigterm_pipe (GIOChannel *channel,
                  GIOCondition condition,
-                 gpointer     data)
+                 gpointer data)
 {
   A11yBusLauncher *app = data;
-  
+
   g_main_loop_quit (app->loop);
 
   return FALSE;
@@ -897,7 +892,7 @@ init_sigterm_handling (A11yBusLauncher *app)
 static GSettings *
 get_schema (const gchar *name)
 {
-#if GLIB_CHECK_VERSION (2, 32, 0)
+#if GLIB_CHECK_VERSION(2, 32, 0)
   GSettingsSchemaSource *source = g_settings_schema_source_get_default ();
   if (!source)
     {
@@ -911,15 +906,15 @@ get_schema (const gchar *name)
 
   return g_settings_new_full (schema, NULL, NULL);
 #else
-  const char * const *schemas = NULL;
+  const char *const *schemas = NULL;
   gint i;
 
   schemas = g_settings_list_schemas ();
   for (i = 0; schemas[i]; i++)
-  {
-    if (!strcmp (schemas[i], name))
-      return g_settings_new (schemas[i]);
-  }
+    {
+      if (!strcmp (schemas[i], name))
+        return g_settings_new (schemas[i]);
+    }
 
   return NULL;
 #endif
@@ -937,7 +932,7 @@ gsettings_key_changed (GSettings *gsettings, const gchar *key, void *user_data)
 }
 
 int
-main (int    argc,
+main (int argc,
       char **argv)
 {
   gboolean a11y_set = FALSE;
@@ -956,8 +951,8 @@ main (int    argc,
       else if (sscanf (argv[i], "--screen-reader=%d",
                        &_global_app->screen_reader_enabled) == 1)
         screen_reader_set = TRUE;
-    else
-      g_error ("usage: %s [--launch-immediately] [--a11y=0|1] [--screen-reader=0|1]", argv[0]);
+      else
+        g_error ("usage: %s [--launch-immediately] [--a11y=0|1] [--screen-reader=0|1]", argv[0]);
     }
 
   _global_app->interface_schema = get_schema ("org.gnome.desktop.interface");
@@ -966,15 +961,15 @@ main (int    argc,
   if (!a11y_set)
     {
       _global_app->a11y_enabled = _global_app->interface_schema
-                                  ? g_settings_get_boolean (_global_app->interface_schema, "toolkit-accessibility")
-                                  : _global_app->launch_immediately;
+                                      ? g_settings_get_boolean (_global_app->interface_schema, "toolkit-accessibility")
+                                      : _global_app->launch_immediately;
     }
 
   if (!screen_reader_set)
     {
       _global_app->screen_reader_enabled = _global_app->a11y_schema
-                                  ? g_settings_get_boolean (_global_app->a11y_schema, "screen-reader-enabled")
-                                  : FALSE;
+                                               ? g_settings_get_boolean (_global_app->a11y_schema, "screen-reader-enabled")
+                                               : FALSE;
     }
 
   if (_global_app->interface_schema)
@@ -993,14 +988,14 @@ main (int    argc,
   g_assert (introspection_data != NULL);
 
   _global_app->name_owner_id =
-    g_bus_own_name (G_BUS_TYPE_SESSION,
-                    "org.a11y.Bus",
-                    G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT,
-                    on_bus_acquired,
-                    on_name_acquired,
-                    on_name_lost,
-                    _global_app,
-                    NULL);
+      g_bus_own_name (G_BUS_TYPE_SESSION,
+                      "org.a11y.Bus",
+                      G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT,
+                      on_bus_acquired,
+                      on_name_acquired,
+                      on_name_lost,
+                      _global_app,
+                      NULL);
 
   g_main_loop_run (_global_app->loop);
 
@@ -1011,10 +1006,10 @@ main (int    argc,
       _global_app->a11y_bus_pid = -1;
     }
 
-  /* Clear the X property if our bus is gone; in the case where e.g. 
-   * GDM is launching a login on an X server it was using before,
-   * we don't want early login processes to pick up the stale address.
-   */
+    /* Clear the X property if our bus is gone; in the case where e.g.
+     * GDM is launching a login on an X server it was using before,
+     * we don't want early login processes to pick up the stale address.
+     */
 #ifdef HAVE_X11
   if (_global_app->x11_prop_set)
     {
index 28ffa1c..3c0b674 100644 (file)
@@ -1,7 +1,10 @@
 [Unit]
 Description=Accessibility services bus
+PartOf=graphical-session.target
 
 [Service]
 Type=dbus
 BusName=org.a11y.Bus
 ExecStart=@libexecdir@/at-spi-bus-launcher
+Slice=session.slice
+TimeoutStopSec=5
index 21408f2..8e4b9b0 100644 (file)
@@ -46,8 +46,9 @@ launcher_args = [
              '-DDATADIR="@0@"'.format(atspi_datadir),
            ]
 
+dbus_daemon_arg = ''
 if get_option('dbus_daemon') != 'default'
-  launcher_args += '-DDBUS_DAEMON="@0@"'.format(get_option('dbus_daemon'))
+  dbus_daemon_arg = '-DDBUS_DAEMON="@0@"'.format(get_option('dbus_daemon'))
 else
   dbus_daemon = find_program('dbus-daemon',
                              '/sbin/dbus-daemon',
@@ -58,33 +59,57 @@ else
                              '/usr/pkg/bin/dbus-daemon',
                              required: false)
   if dbus_daemon.found()
-    launcher_args += '-DDBUS_DAEMON="@0@"'.format(dbus_daemon.path())
+    dbus_daemon_arg = '-DDBUS_DAEMON="@0@"'.format(dbus_daemon.full_path())
   endif
 endif
 
+dbus_broker_arg = ''
 needs_systemd = false
 if get_option('dbus_broker') != 'default'
-  launcher_args += '-DDBUS_BROKER="@0@"'.format(get_option('dbus_broker'))
+  dbus_broker_arg = '-DDBUS_BROKER="@0@"'.format(get_option('dbus_broker'))
   needs_systemd = true
 else
   dbus_broker = find_program('dbus-broker-launch',
                              required: false)
   if dbus_broker.found()
-    launcher_args += '-DDBUS_BROKER="@0@"'.format(dbus_broker.path())
-    needs_systemd = true
+    dbus_broker_arg = '-DDBUS_BROKER="@0@"'.format(dbus_broker.full_path())
+    if get_option('default_bus') != 'dbus-daemon'
+      needs_systemd = true
+    endif
   endif
 endif
 
-if get_option('default_bus') == 'dbus-broker'
-  launcher_args += '-DWANT_DBUS_BROKER'
+if not get_option('use_systemd')
+  if needs_systemd
+    error('Systemd is required for dbus-broker, but use_systemd is set to false.')
+  endif
+  dbus_broker_arg = ''
 endif
 
-if needs_systemd
-  systemd_dep = dependency('libsystemd')
+if dbus_broker_arg != ''
+  if needs_systemd
+    systemd_dep = dependency('libsystemd')
+  else
+    systemd_dep = dependency('libsystemd', required: false)
+    if not systemd_dep.found()
+      dbus_broker_arg = ''
+    endif
+  endif
 else
   systemd_dep = dependency('', required: false)
 endif
 
+if dbus_daemon_arg != ''
+  launcher_args += dbus_daemon_arg
+endif
+if dbus_broker_arg != ''
+  launcher_args += dbus_broker_arg
+endif
+
+if get_option('default_bus') == 'dbus-broker'
+  launcher_args += '-DWANT_DBUS_BROKER'
+endif
+
 executable('at-spi-bus-launcher', 'at-spi-bus-launcher.c',
            include_directories: [ root_inc, include_directories('.') ],
            dependencies: [ gio_dep, systemd_dep, x11_deps ],
diff --git a/ci/README.md b/ci/README.md
new file mode 100644 (file)
index 0000000..7fc8697
--- /dev/null
@@ -0,0 +1,32 @@
+# Continuous Integration scripts for at-spi2-core
+
+Please see the general [documentation for at-spi2-core's Gitlab CI][ci-docs].
+
+This directory contains scripts which get called during a run of a CI
+pipeline, and utilities to maintain the CI infrastructure.
+
+## Scripts used during a run of a CI pipeline:
+
+* `container-builds.yml` - Gets included from the toplevel
+  `.gitlab-ci.yml`; has the declarations to build each container image
+  with the [Freedesktop CI Templates][ci-templates] machinery.
+
+* `run-tests.sh` - Runs the test suite and prints other diagnostics.
+
+* `gen-coverage.sh` - After the test suite is run, merges the various
+  code coverage reports from `lcov`, and generates an HTML report.
+  
+* `lcovrc` - Configuration file for `lcov`, used by `gen-coverage.sh`.
+  Among other things, this tells `lcov` to exclude branch coverage for
+  the unreachable branches of `g_return_if_fail()` and friends.
+  
+* `run-style-check.sh` - Runs `clang-format-diff` to test for source
+  files with inconsistent formatting, and uploads the resulting report
+  to gitlab so it can be viewed as part of a merge request's analysis.
+  
+* `search-common-ancestor.sh` - Utility used from
+  `run-style-check.sh`; finds a git branch point from the current
+  commit.
+
+[ci-docs]: ../devel-docs/gitlab-ci.md
+[ci-templates]: https://gitlab.freedesktop.org/freedesktop/ci-templates/
diff --git a/ci/address-sanitizer.supp b/ci/address-sanitizer.supp
new file mode 100644 (file)
index 0000000..55ead47
--- /dev/null
@@ -0,0 +1,5 @@
+# Leak in __dbus_pending_call_new_unlocked
+# https://gitlab.freedesktop.org/dbus/dbus/-/issues/326
+leak:libdbus
+
+
diff --git a/ci/container_builds.yml b/ci/container_builds.yml
new file mode 100644 (file)
index 0000000..dec3e6a
--- /dev/null
@@ -0,0 +1,103 @@
+# This file defines the container images that at-spi2-core uses for its CI.
+#
+# Container images are built using the Freedesktop CI Templates infrastructure:
+# https://gitlab.freedesktop.org/freedesktop/ci-templates/
+
+# The SHAs here correspond to commits in the freedesktop/ci-templates repository.
+# It doesn't change often, but you can update to newer SHAs if there are important
+# changes there.
+include:
+  - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/3e66ea37e5672bb8f48e3056ba92915b5fc5b888/templates/opensuse.yml"
+  - remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/3e66ea37e5672bb8f48e3056ba92915b5fc5b888/templates/fedora.yml"
+
+variables:
+  # When branching change the suffix to avoid conflicts with images
+  # from the main branch
+  BASE_TAG: "2024-01-10.1-main"
+  RUST_STABLE: "1.75.0"
+
+.container.opensuse@x86_64:
+  stage: "container-build"
+  variables:
+    FDO_DISTRIBUTION_TAG: "x86_64-${BASE_TAG}"
+    FDO_DISTRIBUTION_VERSION: "tumbleweed"
+    FDO_UPSTREAM_REPO: "gnome/at-spi2-core"
+    FDO_DISTRIBUTION_PACKAGES: >-
+      bzip2
+      clang
+      clang-tools
+      dbus-1
+      dbus-1-devel
+      findutils
+      gawk
+      gcc
+      gettext
+      git
+      glib2-devel
+      gobject-introspection-devel
+      gsettings-desktop-schemas
+      itstool
+      libX11-devel
+      libXi-devel
+      libXtst-devel
+      libasan8
+      libxkbcommon-devel
+      libxml2-devel
+      llvm
+      meson
+      ninja
+      python3-pip
+      python311-gobject-devel
+      tar
+      wget
+      which
+      xvfb-run
+    FDO_DISTRIBUTION_EXEC: >-
+      bash ci/install-python-tools.sh &&
+      bash ci/install-rust.sh ${RUST_STABLE} x86_64-unknown-linux-gnu
+
+opensuse-container@x86_64:
+  extends:
+    - .fdo.container-build@opensuse@x86_64
+    - .container.opensuse@x86_64
+  stage: "container-build"
+
+.container.fedora@x86_64:
+  stage: "container-build"
+  variables:
+    FDO_DISTRIBUTION_TAG: "x86_64-${BASE_TAG}"
+    FDO_DISTRIBUTION_VERSION: "37"
+    FDO_UPSTREAM_REPO: "gnome/at-spi2-core"
+    FDO_DISTRIBUTION_PACKAGES: >-
+      clang
+      clang-tools-extra
+      dbus-daemon
+      dbus-devel
+      dbus-tools
+      findutils
+      gcc
+      gettext
+      git
+      glib2-devel
+      gobject-introspection-devel
+      gsettings-desktop-schemas
+      itstool
+      lcov
+      libXi-devel
+      libXtst-devel
+      libasan
+      libxkbcommon-devel
+      libxml2-devel
+      ninja-build
+      procps
+      python3
+      python3-pip
+      systemd-devel
+    FDO_DISTRIBUTION_EXEC: >-
+      pip3 install meson==0.63
+
+fedora-container@x86_64:
+  extends:
+    - .fdo.container-build@fedora
+    - .container.fedora@x86_64
+  stage: "container-build"
diff --git a/ci/env.sh b/ci/env.sh
new file mode 100644 (file)
index 0000000..95653b0
--- /dev/null
+++ b/ci/env.sh
@@ -0,0 +1,11 @@
+# Activate the Python virtual environment for CI scripts.
+#
+# We test for the presence of the file, since when first creating the container images for CI,
+# the venv has not been created yet.  This is mostly a hack to allow having a single "env.sh"
+# script instead of one for container creation and one for CI jobs.
+if [ -f /usr/local/python/bin/activate ]; then
+    source /usr/local/python/bin/activate
+fi
+
+export RUSTUP_HOME='/usr/local/rustup'
+export PATH=$PATH:/usr/local/cargo/bin
diff --git a/ci/install-python-tools.sh b/ci/install-python-tools.sh
new file mode 100644 (file)
index 0000000..0ed8aed
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# Creates a Python virtual environment in /usr/local/python and installs
+# the modules from requirements.txt in it.  These modules are required
+# by various jobs in the CI pipeline.
+
+set -eux -o pipefail
+
+python3 -m venv /usr/local/python
+source /usr/local/python/bin/activate
+pip3 install --upgrade pip
+pip3 install -r ci/requirements.txt
diff --git a/ci/install-rust.sh b/ci/install-rust.sh
new file mode 100644 (file)
index 0000000..dab7711
--- /dev/null
@@ -0,0 +1,26 @@
+source ./ci/env.sh
+
+set -eu
+export CARGO_HOME='/usr/local/cargo'
+
+RUSTUP_VERSION=1.24.3
+RUST_VERSION=$1
+RUST_ARCH=$2
+
+RUSTUP_URL=https://static.rust-lang.org/rustup/archive/$RUSTUP_VERSION/$RUST_ARCH/rustup-init
+wget $RUSTUP_URL
+
+chmod +x rustup-init;
+./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION;
+rm rustup-init;
+chmod -R a+w $RUSTUP_HOME $CARGO_HOME
+
+rustup --version
+cargo --version
+rustc --version
+
+rustup component add clippy-preview
+rustup component add rustfmt
+# cargo install --force cargo-c
+cargo install --version ^1.0 gitlab_clippy
+cargo install grcov
similarity index 100%
rename from .gitlab-ci/lcovrc
rename to ci/lcovrc
diff --git a/ci/pull-container-image.sh b/ci/pull-container-image.sh
new file mode 100644 (file)
index 0000000..c5e1205
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Utility script so you can pull the container image from CI for local development.
+# Run this script and follow the instructions; the script will tell you how
+# to run "podman run" to launch a container that has the same environment as the
+# one used during CI pipelines.  You can debug things at leisure there.
+
+set -eu
+set -o pipefail
+
+CONTAINER_BUILDS=ci/container_builds.yml
+
+if [ ! -f $CONTAINER_BUILDS ]
+then
+    echo "Please run this from the toplevel source directory in at-spi2-core"
+    exit 1
+fi
+
+tag=$(grep -e '^  BASE_TAG:' $CONTAINER_BUILDS | head -n 1 | sed -E 's/.*BASE_TAG: "(.+)"/\1/')
+full_tag=x86_64-$tag
+echo full_tag=\"$full_tag\"
+
+image_name=registry.gitlab.gnome.org/gnome/at-spi2-core/opensuse/tumbleweed:$full_tag
+
+echo pulling image $image_name
+podman pull $image_name
+
+echo ""
+echo "You can now run this:"
+echo "  podman run --rm -ti --cap-add=SYS_PTRACE -v \$(pwd):/srv/project -w /srv/project $image_name"
diff --git a/ci/requirements.txt b/ci/requirements.txt
new file mode 100644 (file)
index 0000000..f6da750
--- /dev/null
@@ -0,0 +1,7 @@
+docutils
+gi-docgen
+PyGObject
+pytest
+python-dbusmock
+Sphinx
+sphinx_rtd_theme
diff --git a/ci/run-registryd-tests.sh b/ci/run-registryd-tests.sh
new file mode 100755 (executable)
index 0000000..8d577a6
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+set -eu
+
+echo "About to run the tests.  First we'll launch a gnome-session DBus mock."
+
+python3 -m dbusmock --session org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager &
+
+gdbus wait --session --timeout 10 org.gnome.SessionManager
+
+gdbus call --session \
+      --dest org.gnome.SessionManager \
+      --object-path /org/gnome/SessionManager \
+      --method org.freedesktop.DBus.Mock.AddTemplate 'tests/dbusmock/mock-gnome-session.py' '{}'
+
+mkdir -p _build/tests/registryd
+
+cd tests/registryd
+
+python3 -m pytest --junit-xml=../../_build/tests/registryd/registryd-pytest.junit.xml
+
+kill %1  # Kill python dbusmock
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755 (executable)
index 0000000..b7752ed
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+set -e
+
+# We might need to add a new remote for the upstream main, since this script could
+# be running in a personal fork of the repository which has out of date branches.
+UPSTREAM_URL=https://gitlab.gnome.org/GNOME/at-spi2-core.git
+UPSTREAM_REMOTE=$(git remote -v | awk -v url="$UPSTREAM_URL" '$2 == url { print $1; exit }')
+if [ -n "$UPSTREAM_REMOTE" ]; then
+    echo "Reusing the existing repository on ${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}, it already has a remote, ${UPSTREAM_REMOTE}"
+    ORIGIN="$UPSTREAM_REMOTE"
+else
+    echo "Retrieving the current upstream repository from ${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}..."
+    git remote add upstream https://gitlab.gnome.org/GNOME/at-spi2-core.git
+    git fetch upstream
+    ORIGIN="upstream"
+fi
+
+# Wrap everything in a subshell so we can propagate the exit status.
+(
+
+# Work out the newest common ancestor between the detached HEAD that this CI job
+# has checked out, and the upstream target branch (which will typically be
+# `upstream/main` or `upstream/at-spi2-core-3-24`).
+#
+# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if we’re running in
+# a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise.
+newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${ORIGIN}/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH:-main}}") <(git rev-list --first-parent HEAD) | head -1)
+git diff -U0 --no-color "${newest_common_ancestor_sha}" | clang-format-diff -p1 > format-diff.log
+)
+exit_status=$?
+
+[ ${exit_status} == 0 ] || exit ${exit_status}
+
+format_diff="$(<format-diff.log)"
+
+if [ -n "${format_diff}" ]; then
+    cat format-diff.log
+    echo
+    echo "PLEASE FIX THE FORMATTING OF THE SOURCE CODE ABOVE"
+    echo
+    echo "See https://gnome.pages.gitlab.gnome.org/at-spi2-core/devel-docs/gitlab-ci.html#code-formatting"
+    echo "for details."
+
+    exit 1
+fi
diff --git a/ci/run-tests.sh b/ci/run-tests.sh
new file mode 100755 (executable)
index 0000000..38e019f
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+set -eu
+
+echo "About to run the tests.  First we'll launch a gnome-session DBus mock."
+
+python3 -m dbusmock --session org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager &
+
+gdbus wait --session --timeout 10 org.gnome.SessionManager
+
+gdbus call --session \
+      --dest org.gnome.SessionManager \
+      --object-path /org/gnome/SessionManager \
+      --method org.freedesktop.DBus.Mock.AddTemplate 'tests/dbusmock/mock-gnome-session.py' '{}'
+
+echo "Launching the accessibility bus by calling GetAddress:"
+
+gdbus call --session --dest org.a11y.Bus --object-path /org/a11y/bus --method org.a11y.Bus.GetAddress
+
+ps auxwww
+
+echo "Setting the mock session to the running state"
+
+gdbus call --session \
+      --dest org.gnome.SessionManager \
+      --object-path /org/gnome/SessionManager \
+      --method org.freedesktop.DBus.Mock.SetSessionRunning true
+
+echo "Now running the tests:"
+
+meson test -C _build --print-errorlogs
+
+echo "Telling the mock session to logout so the a11y daemons will exit"
+
+gdbus call --session \
+      --dest org.gnome.SessionManager \
+      --object-path /org/gnome/SessionManager \
+      --method org.gnome.SessionManager.Logout 0
+
+ps auxwww
index 512c1b3..bcbe391 100644 (file)
@@ -18,8 +18,8 @@
  */
 
 /* type driven marshalling */
-#include <stdio.h>
 #include <glib.h>
+#include <stdio.h>
 
 #include "config.h"
 #include "dbind-any.h"
  *    ~(boundary - 1)
  */
 #define ALIGN_VALUE(this, boundary) \
-  (( ((gulong)(this)) + (((gulong)(boundary)) -1)) & (~(((gulong)(boundary))-1)))
+  ((((gulong) (this)) + (((gulong) (boundary)) - 1)) & (~(((gulong) (boundary)) - 1)))
 
 #define ALIGN_ADDRESS(this, boundary) \
-  ((gpointer)ALIGN_VALUE(this, boundary))
+  ((gpointer) ALIGN_VALUE (this, boundary))
 
 #define PTR_PLUS(ptr, offset) \
-        ((gpointer) (((guchar *)(ptr)) + (offset)))
-
-#define DBIND_POD_CASES \
-         DBUS_TYPE_BYTE: \
-    case DBUS_TYPE_INT16: \
-    case DBUS_TYPE_UINT16: \
-    case DBUS_TYPE_INT32: \
-    case DBUS_TYPE_UINT32: \
-    case DBUS_TYPE_BOOLEAN: \
-    case DBUS_TYPE_INT64: \
-    case DBUS_TYPE_UINT64: \
-    case DBUS_TYPE_DOUBLE
+  ((gpointer) (((guchar *) (ptr)) + (offset)))
+
+#define DBIND_POD_CASES   \
+  DBUS_TYPE_BYTE:         \
+  case DBUS_TYPE_INT16:   \
+  case DBUS_TYPE_UINT16:  \
+  case DBUS_TYPE_INT32:   \
+  case DBUS_TYPE_UINT32:  \
+  case DBUS_TYPE_BOOLEAN: \
+  case DBUS_TYPE_INT64:   \
+  case DBUS_TYPE_UINT64:  \
+  case DBUS_TYPE_DOUBLE
 
 /*---------------------------------------------------------------------------*/
 
 static void
 warn_braces ()
 {
-    fprintf (stderr, "Error: dbus flags structures & dicts with braces rather than "
-             " an explicit type member of 'struct'\n");
+  fprintf (stderr, "Error: dbus flags structures & dicts with braces rather than "
+                   " an explicit type member of 'struct'\n");
 }
 
 /*---------------------------------------------------------------------------*/
@@ -67,68 +67,71 @@ warn_braces ()
 static unsigned int
 dbind_find_c_alignment_r (const char **type)
 {
-    unsigned int retval = 1;
+  unsigned int retval = 1;
 
-    char t = **type;
-    (*type)++;
+  char t = **type;
+  (*type)++;
 
 #ifdef DEBUG
-    fprintf (stderr, "\tfind align for %c (0x%x)\n", t, t);
+  fprintf (stderr, "\tfind align for %c (0x%x)\n", t, t);
 #endif
 
-        switch (t) {
+  switch (t)
+    {
     case DBUS_TYPE_BYTE:
-        return ALIGNOF_CHAR;
+      return ALIGNOF_CHAR;
     case DBUS_TYPE_BOOLEAN:
-        return ALIGNOF_DBUS_BOOL_T;
+      return ALIGNOF_DBUS_BOOL_T;
     case DBUS_TYPE_INT16:
     case DBUS_TYPE_UINT16:
-        return ALIGNOF_DBUS_INT16_T;
+      return ALIGNOF_DBUS_INT16_T;
     case DBUS_TYPE_INT32:
     case DBUS_TYPE_UINT32:
-        return ALIGNOF_DBUS_INT32_T;
+      return ALIGNOF_DBUS_INT32_T;
     case DBUS_TYPE_INT64:
     case DBUS_TYPE_UINT64:
-        return ALIGNOF_DBUS_INT64_T;
+      return ALIGNOF_DBUS_INT64_T;
     case DBUS_TYPE_DOUBLE:
-        return ALIGNOF_DOUBLE;
+      return ALIGNOF_DOUBLE;
     /* ptr types */
     case DBUS_TYPE_STRING:
     case DBUS_TYPE_OBJECT_PATH:
     case DBUS_TYPE_SIGNATURE:
     case DBUS_TYPE_ARRAY:
-        return ALIGNOF_DBIND_POINTER;
+      return ALIGNOF_DBIND_POINTER;
     case DBUS_STRUCT_BEGIN_CHAR:
       /* TODO: I think this would break with a nested struct */
 #if ALIGNOF_DBIND_STRUCT > 1
-                retval = MAX (retval, ALIGNOF_DBIND_STRUCT);
+      retval = MAX (retval, ALIGNOF_DBIND_STRUCT);
 #endif
-        while (**type != DBUS_STRUCT_END_CHAR) {
-            int elem_align = dbind_find_c_alignment_r (type);
-                        retval = MAX (retval, elem_align);
+      while (**type != DBUS_STRUCT_END_CHAR)
+        {
+          int elem_align = dbind_find_c_alignment_r (type);
+          retval = MAX (retval, elem_align);
         }
-        (*type)++;
-        return retval;
+      (*type)++;
+      return retval;
     case DBUS_DICT_ENTRY_BEGIN_CHAR:
 #if ALIGNOF_DBIND_STRUCT > 1
-                retval = MAX (retval, ALIGNOF_DBIND_STRUCT);
+      retval = MAX (retval, ALIGNOF_DBIND_STRUCT);
 #endif
-        while (**type != DBUS_DICT_ENTRY_END_CHAR) {
-            int elem_align = dbind_find_c_alignment_r (type);
-                        retval = MAX (retval, elem_align);
+      while (**type != DBUS_DICT_ENTRY_END_CHAR)
+        {
+          int elem_align = dbind_find_c_alignment_r (type);
+          retval = MAX (retval, elem_align);
         }
-        (*type)++;
-        return retval;
+      (*type)++;
+      return retval;
     case DBUS_TYPE_STRUCT:
     case DBUS_TYPE_DICT_ENTRY:
-        warn_braces ();
-        return ALIGNOF_DBIND_POINTER;
+      warn_braces ();
+      return ALIGNOF_DBIND_POINTER;
     case '\0':
-        g_assert_not_reached();
-        break;
+      g_assert_not_reached ();
+      break;
     default:
-                return 1;
-  }
+      return 1;
+    }
 }
 
 /*---------------------------------------------------------------------------*/
@@ -143,82 +146,91 @@ dbind_gather_alloc_info_r (const char **type)
     {
       switch (**type)
         {
-          case DBUS_STRUCT_BEGIN_CHAR:
-              while (**type != DBUS_STRUCT_END_CHAR && **type != '\0') (*type)++;
-              if (**type != '\0') (*type)++;
-              break;
-          case DBUS_DICT_ENTRY_BEGIN_CHAR:
-              while (**type != DBUS_DICT_ENTRY_END_CHAR && **type != '\0') (*type)++;
-              if (**type != '\0') (*type)++;
-              break;
-          case '\0':
-              break;
-          default:
-              (*type)++;
-              break;
+        case DBUS_STRUCT_BEGIN_CHAR:
+          while (**type != DBUS_STRUCT_END_CHAR && **type != '\0')
+            (*type)++;
+          if (**type != '\0')
+            (*type)++;
+          break;
+        case DBUS_DICT_ENTRY_BEGIN_CHAR:
+          while (**type != DBUS_DICT_ENTRY_END_CHAR && **type != '\0')
+            (*type)++;
+          if (**type != '\0')
+            (*type)++;
+          break;
+        case '\0':
+          break;
+        default:
+          (*type)++;
+          break;
         }
     }
 
-  switch (t) {
+  switch (t)
+    {
     case DBUS_TYPE_BYTE:
-        return sizeof (char);
+      return sizeof (char);
     case DBUS_TYPE_BOOLEAN:
-        return sizeof (dbus_bool_t);
+      return sizeof (dbus_bool_t);
     case DBUS_TYPE_INT16:
     case DBUS_TYPE_UINT16:
-        return sizeof (dbus_int16_t);
+      return sizeof (dbus_int16_t);
     case DBUS_TYPE_INT32:
     case DBUS_TYPE_UINT32:
-        return sizeof (dbus_int32_t);
+      return sizeof (dbus_int32_t);
     case DBUS_TYPE_INT64:
     case DBUS_TYPE_UINT64:
-        return sizeof (dbus_int64_t);
+      return sizeof (dbus_int64_t);
     case DBUS_TYPE_DOUBLE:
-        return sizeof (double);
+      return sizeof (double);
     /* ptr types */
     case DBUS_TYPE_STRING:
     case DBUS_TYPE_OBJECT_PATH:
     case DBUS_TYPE_SIGNATURE:
     case DBUS_TYPE_ARRAY:
-        return sizeof (void *);
-    case DBUS_STRUCT_BEGIN_CHAR: {
-                int sum = 0, stralign;
+      return sizeof (void *);
+    case DBUS_STRUCT_BEGIN_CHAR:
+      {
+        int sum = 0, stralign;
 
         stralign = dbind_find_c_alignment (*type - 1);
 
-        while (**type != DBUS_STRUCT_END_CHAR) {
-                        sum = ALIGN_VALUE (sum, dbind_find_c_alignment (*type));
-                        sum += dbind_gather_alloc_info_r (type);
-        }
-                sum = ALIGN_VALUE (sum, stralign);
+        while (**type != DBUS_STRUCT_END_CHAR)
+          {
+            sum = ALIGN_VALUE (sum, dbind_find_c_alignment (*type));
+            sum += dbind_gather_alloc_info_r (type);
+          }
+        sum = ALIGN_VALUE (sum, stralign);
 
         g_assert (**type == DBUS_STRUCT_END_CHAR);
         (*type)++;
 
-                return sum;
-    }
-    case DBUS_DICT_ENTRY_BEGIN_CHAR: {
-                int sum = 0, stralign;
+        return sum;
+      }
+    case DBUS_DICT_ENTRY_BEGIN_CHAR:
+      {
+        int sum = 0, stralign;
 
         stralign = dbind_find_c_alignment (*type - 1);
 
-        while (**type != DBUS_DICT_ENTRY_END_CHAR) {
-                        sum = ALIGN_VALUE (sum, dbind_find_c_alignment (*type));
-                        sum += dbind_gather_alloc_info_r (type);
-        }
-                sum = ALIGN_VALUE (sum, stralign);
+        while (**type != DBUS_DICT_ENTRY_END_CHAR)
+          {
+            sum = ALIGN_VALUE (sum, dbind_find_c_alignment (*type));
+            sum += dbind_gather_alloc_info_r (type);
+          }
+        sum = ALIGN_VALUE (sum, stralign);
 
         g_assert (**type == DBUS_DICT_ENTRY_END_CHAR);
         (*type)++;
 
-                return sum;
-    }
+        return sum;
+      }
     case DBUS_TYPE_STRUCT:
     case DBUS_TYPE_DICT_ENTRY:
-        warn_braces ();
+      warn_braces ();
     default:
-        return 0;
-  }
+      return 0;
+    }
 }
 
 static size_t
@@ -233,27 +245,29 @@ static void
 dbind_any_free_r (const char **type, void **data)
 {
 #ifdef DEBUG
-    fprintf (stderr, "any free '%c' to %p\n", **type, *data);
+  fprintf (stderr, "any free '%c' to %p\n", **type, *data);
 #endif
 
-    switch (**type) {
+  switch (**type)
+    {
     case DBIND_POD_CASES:
-        *data = ((guchar *)*data) + dbind_gather_alloc_info (*type);
-        (*type)++;
-        break;
+      *data = ((guchar *) *data) + dbind_gather_alloc_info (*type);
+      (*type)++;
+      break;
     case DBUS_TYPE_STRING:
     case DBUS_TYPE_OBJECT_PATH:
     case DBUS_TYPE_SIGNATURE:
 #ifdef DEBUG
-        fprintf (stderr, "string free %p\n", **(void ***)data);
+      fprintf (stderr, "string free %p\n", **(void ***) data);
 #endif
-        g_free (**(void ***)data);
-        *data = ((guchar *)*data) + dbind_gather_alloc_info (*type);
-        (*type)++;
-        break;
-    case DBUS_TYPE_ARRAY: {
+      g_free (**(void ***) data);
+      *data = ((guchar *) *data) + dbind_gather_alloc_info (*type);
+      (*type)++;
+      break;
+    case DBUS_TYPE_ARRAY:
+      {
         int i;
-        GArray *vals = **(void ***)data;
+        GArray *vals = **(void ***) data;
         size_t elem_size, elem_align;
         const char *saved_child_type;
 
@@ -261,69 +275,74 @@ dbind_any_free_r (const char **type, void **data)
         saved_child_type = *type;
 
         elem_size = dbind_gather_alloc_info (*type);
-        elem_align = dbind_find_c_alignment_r (type); 
+        elem_align = dbind_find_c_alignment_r (type);
 
-        for (i = 0; i < vals->len; i++) {
+        for (i = 0; i < vals->len; i++)
+          {
             void *ptr = vals->data + elem_size * i;
             *type = saved_child_type; /* rewind type info */
             ptr = ALIGN_ADDRESS (ptr, elem_align);
             dbind_any_free_r (type, &ptr);
-        }
+          }
         g_array_free (vals, TRUE);
         break;
-    }
-    case DBUS_STRUCT_BEGIN_CHAR: {
-                gconstpointer data0 = *data;
-                int offset = 0, stralign;
+      }
+    case DBUS_STRUCT_BEGIN_CHAR:
+      {
+        gconstpointer data0 = *data;
+        int offset = 0, stralign;
 
         stralign = dbind_find_c_alignment (*type);
         (*type)++;
 
-        offset = 0 ;
-        while (**type != DBUS_STRUCT_END_CHAR) {
+        offset = 0;
+        while (**type != DBUS_STRUCT_END_CHAR)
+          {
             const char *subt = *type;
-                        offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
-                        *data = PTR_PLUS (data0, offset);
+            offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
+            *data = PTR_PLUS (data0, offset);
             dbind_any_free_r (type, data);
             offset += dbind_gather_alloc_info (subt);
-        }
+          }
 
-                offset = ALIGN_VALUE (offset, stralign);
-                *data = PTR_PLUS (data0, offset);
+        offset = ALIGN_VALUE (offset, stralign);
+        *data = PTR_PLUS (data0, offset);
 
         g_assert (**type == DBUS_STRUCT_END_CHAR);
         (*type)++;
 
         break;
-    }
-    case DBUS_DICT_ENTRY_BEGIN_CHAR: {
-                gconstpointer data0 = *data;
-                int offset = 0, stralign;
+      }
+    case DBUS_DICT_ENTRY_BEGIN_CHAR:
+      {
+        gconstpointer data0 = *data;
+        int offset = 0, stralign;
 
         stralign = dbind_find_c_alignment (*type);
         (*type)++;
 
-        offset = 0 ;
-        while (**type != DBUS_DICT_ENTRY_END_CHAR) {
+        offset = 0;
+        while (**type != DBUS_DICT_ENTRY_END_CHAR)
+          {
             const char *subt = *type;
-                        offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
-                        *data = PTR_PLUS (data0, offset);
+            offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
+            *data = PTR_PLUS (data0, offset);
             dbind_any_free_r (type, data);
             offset += dbind_gather_alloc_info (subt);
-        }
+          }
 
-                offset = ALIGN_VALUE (offset, stralign);
-                *data = PTR_PLUS (data0, offset);
+        offset = ALIGN_VALUE (offset, stralign);
+        *data = PTR_PLUS (data0, offset);
 
         g_assert (**type == DBUS_DICT_ENTRY_END_CHAR);
         (*type)++;
 
         break;
-    }
+      }
     case DBUS_TYPE_STRUCT:
     case DBUS_TYPE_DICT_ENTRY:
-        warn_braces ();
-        break;
+      warn_braces ();
+      break;
     }
 }
 
@@ -331,28 +350,30 @@ dbind_any_free_r (const char **type, void **data)
 
 void
 dbind_any_marshal (DBusMessageIter *iter,
-                   const char           **type,
-                   void           **data)
+                   const char **type,
+                   void **data)
 {
-    size_t len;
+  size_t len;
 
 #ifdef DEBUG
-    fprintf (stderr, "any marshal '%c' to %p\n", **type, *data);
+  fprintf (stderr, "any marshal '%c' to %p\n", **type, *data);
 #endif
 
-    switch (**type) {
+  switch (**type)
+    {
     case DBIND_POD_CASES:
     case DBUS_TYPE_STRING:
     case DBUS_TYPE_OBJECT_PATH:
     case DBUS_TYPE_SIGNATURE:
-        len = dbind_gather_alloc_info (*type);
-        dbus_message_iter_append_basic (iter, **type, *data);
-        *data = ((guchar *)*data) + len;
-        (*type)++;
-        break;
-    case DBUS_TYPE_ARRAY: {
+      len = dbind_gather_alloc_info (*type);
+      dbus_message_iter_append_basic (iter, **type, *data);
+      *data = ((guchar *) *data) + len;
+      (*type)++;
+      break;
+    case DBUS_TYPE_ARRAY:
+      {
         int i;
-        GArray *vals = **(void ***)data;
+        GArray *vals = **(void ***) data;
         size_t elem_size, elem_align;
         DBusMessageIter sub;
         const char *saved_child_type;
@@ -362,27 +383,29 @@ dbind_any_marshal (DBusMessageIter *iter,
         saved_child_type = *type;
 
         elem_size = dbind_gather_alloc_info (*type);
-        elem_align = dbind_find_c_alignment_r (type); 
+        elem_align = dbind_find_c_alignment_r (type);
 
         /* wow this part of the API sucks too ... */
         child_type_string = g_strndup (saved_child_type, *type - saved_child_type);
         /* fprintf (stderr, "array child type '%s'\n", child_type_string); */
         dbus_message_iter_open_container (iter, DBUS_TYPE_ARRAY,
                                           child_type_string, &sub);
-        for (i = 0; i < vals->len; i++) {
+        for (i = 0; i < vals->len; i++)
+          {
             void *ptr = vals->data + elem_size * i;
             *type = saved_child_type; /* rewind type info */
             ptr = ALIGN_ADDRESS (ptr, elem_align);
             dbind_any_marshal (&sub, type, &ptr);
-        }
+          }
 
         dbus_message_iter_close_container (iter, &sub);
         g_free (child_type_string);
         break;
-    }
-    case DBUS_STRUCT_BEGIN_CHAR: {
-                gconstpointer data0 = *data;
-                int offset = 0, stralign;
+      }
+    case DBUS_STRUCT_BEGIN_CHAR:
+      {
+        gconstpointer data0 = *data;
+        int offset = 0, stralign;
         DBusMessageIter sub;
 
         stralign = dbind_find_c_alignment (*type);
@@ -391,17 +414,18 @@ dbind_any_marshal (DBusMessageIter *iter,
 
         dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL, &sub);
 
-        offset = 0 ;
-        while (**type != DBUS_STRUCT_END_CHAR) {
+        offset = 0;
+        while (**type != DBUS_STRUCT_END_CHAR)
+          {
             const char *subt = *type;
-                        offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
-                        *data = PTR_PLUS (data0, offset);
+            offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
+            *data = PTR_PLUS (data0, offset);
             dbind_any_marshal (&sub, type, data);
             offset += dbind_gather_alloc_info (subt);
-        }
+          }
 
-                offset = ALIGN_VALUE (offset, stralign);
-                *data = PTR_PLUS (data0, offset);
+        offset = ALIGN_VALUE (offset, stralign);
+        *data = PTR_PLUS (data0, offset);
 
         dbus_message_iter_close_container (iter, &sub);
 
@@ -409,10 +433,11 @@ dbind_any_marshal (DBusMessageIter *iter,
         (*type)++;
 
         break;
-    }
-    case DBUS_DICT_ENTRY_BEGIN_CHAR: {
-                gconstpointer data0 = *data;
-                int offset = 0, stralign;
+      }
+    case DBUS_DICT_ENTRY_BEGIN_CHAR:
+      {
+        gconstpointer data0 = *data;
+        int offset = 0, stralign;
         DBusMessageIter sub;
 
         stralign = dbind_find_c_alignment (*type);
@@ -421,17 +446,18 @@ dbind_any_marshal (DBusMessageIter *iter,
 
         dbus_message_iter_open_container (iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub);
 
-        offset = 0 ;
-        while (**type != DBUS_DICT_ENTRY_END_CHAR) {
+        offset = 0;
+        while (**type != DBUS_DICT_ENTRY_END_CHAR)
+          {
             const char *subt = *type;
-                        offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
-                        *data = PTR_PLUS (data0, offset);
+            offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
+            *data = PTR_PLUS (data0, offset);
             dbind_any_marshal (&sub, type, data);
             offset += dbind_gather_alloc_info (subt);
-        }
+          }
 
-                offset = ALIGN_VALUE (offset, stralign);
-                *data = PTR_PLUS (data0, offset);
+        offset = ALIGN_VALUE (offset, stralign);
+        *data = PTR_PLUS (data0, offset);
 
         dbus_message_iter_close_container (iter, &sub);
 
@@ -439,11 +465,11 @@ dbind_any_marshal (DBusMessageIter *iter,
         (*type)++;
 
         break;
-    }
+      }
     case DBUS_TYPE_STRUCT:
     case DBUS_TYPE_DICT_ENTRY:
-        warn_braces ();
-        break;
+      warn_braces ();
+      break;
     }
 }
 
@@ -451,113 +477,117 @@ dbind_any_marshal (DBusMessageIter *iter,
 
 void
 dbind_any_marshal_va (DBusMessageIter *iter,
-                      const char           **arg_types,
-                      va_list          args)
+                      const char **arg_types,
+                      va_list args)
 {
-    const char *p = *arg_types;
+  const char *p = *arg_types;
 
-    /* Guard against null arg types 
-       Fix for - http://bugs.freedesktop.org/show_bug.cgi?id=23027
-     */
-    if (p == NULL)
-        p = "";
+  /* Guard against null arg types
+     Fix for - http://bugs.freedesktop.org/show_bug.cgi?id=23027
+   */
+  if (p == NULL)
+    p = "";
 
-    {
-        /* special case base-types since we need to walk the stack worse-luck */
-        for (;*p != '\0' && *p != '=';) {
-            int intarg;
-            void *ptrarg;
-            double doublearg;
-            dbus_int64_t int64arg;
-            void *arg = NULL;
-
-            switch (*p) {
-            case DBUS_TYPE_BYTE:
-            case DBUS_TYPE_BOOLEAN:
-            case DBUS_TYPE_INT16:
-            case DBUS_TYPE_UINT16:
-            case DBUS_TYPE_INT32:
-            case DBUS_TYPE_UINT32:
-                intarg = va_arg (args, int);
-                arg = &intarg;
-                break;
-            case DBUS_TYPE_INT64:
-            case DBUS_TYPE_UINT64:
-                int64arg = va_arg (args, dbus_int64_t);
-                arg = &int64arg;
-                break;
-            case DBUS_TYPE_DOUBLE:
-                doublearg = va_arg (args, double);
-                arg = &doublearg;
-                break;
-            /* ptr types */
-            case DBUS_TYPE_STRING:
-            case DBUS_TYPE_OBJECT_PATH:
-            case DBUS_TYPE_SIGNATURE:
-            case DBUS_TYPE_ARRAY:
-            case DBUS_TYPE_DICT_ENTRY:
-                ptrarg = va_arg (args, void *);
-                arg = &ptrarg;
-                break;
-            case DBUS_STRUCT_BEGIN_CHAR:
-                ptrarg = va_arg (args, void *);
-                arg = ptrarg;
-                break;
-            case DBUS_DICT_ENTRY_BEGIN_CHAR:
-                ptrarg = va_arg (args, void *);
-                arg = ptrarg;
-                break;
-
-            case DBUS_TYPE_VARIANT:
-                fprintf (stderr, "No variant support yet - very toolkit specific\n");
-                ptrarg = va_arg (args, void *);
-                arg = &ptrarg;
-                break;
-            default:
-                fprintf (stderr, "Unknown / invalid arg type %c\n", *p);
-                break;
-            }
-            if (arg != NULL)
-                dbind_any_marshal (iter, &p, &arg);
-            }
-        if (*arg_types)
-          *arg_types = p;
-    }
+  {
+    /* special case base-types since we need to walk the stack worse-luck */
+    for (; *p != '\0' && *p != '=';)
+      {
+        int intarg;
+        void *ptrarg;
+        double doublearg;
+        dbus_int64_t int64arg;
+        void *arg = NULL;
+
+        switch (*p)
+          {
+          case DBUS_TYPE_BYTE:
+          case DBUS_TYPE_BOOLEAN:
+          case DBUS_TYPE_INT16:
+          case DBUS_TYPE_UINT16:
+          case DBUS_TYPE_INT32:
+          case DBUS_TYPE_UINT32:
+            intarg = va_arg (args, int);
+            arg = &intarg;
+            break;
+          case DBUS_TYPE_INT64:
+          case DBUS_TYPE_UINT64:
+            int64arg = va_arg (args, dbus_int64_t);
+            arg = &int64arg;
+            break;
+          case DBUS_TYPE_DOUBLE:
+            doublearg = va_arg (args, double);
+            arg = &doublearg;
+            break;
+          /* ptr types */
+          case DBUS_TYPE_STRING:
+          case DBUS_TYPE_OBJECT_PATH:
+          case DBUS_TYPE_SIGNATURE:
+          case DBUS_TYPE_ARRAY:
+          case DBUS_TYPE_DICT_ENTRY:
+            ptrarg = va_arg (args, void *);
+            arg = &ptrarg;
+            break;
+          case DBUS_STRUCT_BEGIN_CHAR:
+            ptrarg = va_arg (args, void *);
+            arg = ptrarg;
+            break;
+          case DBUS_DICT_ENTRY_BEGIN_CHAR:
+            ptrarg = va_arg (args, void *);
+            arg = ptrarg;
+            break;
+
+          case DBUS_TYPE_VARIANT:
+            fprintf (stderr, "No variant support yet - very toolkit specific\n");
+            ptrarg = va_arg (args, void *);
+            arg = &ptrarg;
+            break;
+          default:
+            fprintf (stderr, "Unknown / invalid arg type %c\n", *p);
+            break;
+          }
+        if (arg != NULL)
+          dbind_any_marshal (iter, &p, &arg);
+      }
+    if (*arg_types)
+      *arg_types = p;
+  }
 }
 
 /*---------------------------------------------------------------------------*/
 
 void
 dbind_any_demarshal (DBusMessageIter *iter,
-                     const char           **type,
-                     void           **data)
+                     const char **type,
+                     void **data)
 {
-    size_t len;
+  size_t len;
 
 #ifdef DEBUG
-    fprintf (stderr, "any demarshal '%c' to %p\n", **type, *data);
+  fprintf (stderr, "any demarshal '%c' to %p\n", **type, *data);
 #endif
 
-    switch (**type) {
+  switch (**type)
+    {
     case DBIND_POD_CASES:
-        len = dbind_gather_alloc_info (*type);
-        dbus_message_iter_get_basic (iter, *data);
-        *data = ((guchar *)*data) + len;
-        (*type)++;
-        break;
+      len = dbind_gather_alloc_info (*type);
+      dbus_message_iter_get_basic (iter, *data);
+      *data = ((guchar *) *data) + len;
+      (*type)++;
+      break;
     case DBUS_TYPE_STRING:
     case DBUS_TYPE_OBJECT_PATH:
     case DBUS_TYPE_SIGNATURE:
-        len = dbind_gather_alloc_info (*type);
-        dbus_message_iter_get_basic (iter, *data);
+      len = dbind_gather_alloc_info (*type);
+      dbus_message_iter_get_basic (iter, *data);
 #ifdef DEBUG
-        fprintf (stderr, "dup string '%s' (%p)\n", **(void ***)data, **(void ***)data);
+      fprintf (stderr, "dup string '%s' (%p)\n", **(void ***) data, **(void ***) data);
 #endif
-        **(void ***)data = g_strdup (**(void ***)data);
-        *data = ((guchar *)*data) + len;
-        (*type)++;
-        break;
-    case DBUS_TYPE_ARRAY: {
+      **(void ***) data = g_strdup (**(void ***) data);
+      *data = ((guchar *) *data) + len;
+      (*type)++;
+      break;
+    case DBUS_TYPE_ARRAY:
+      {
         GArray *vals;
         DBusMessageIter child;
         size_t elem_size, elem_align;
@@ -570,12 +600,13 @@ dbind_any_demarshal (DBusMessageIter *iter,
         elem_size = dbind_gather_alloc_info (*type);
         elem_align = dbind_find_c_alignment_r (type);
         vals = g_array_new (FALSE, FALSE, elem_size);
-        (**(void ***)data) = vals;
-        *data = ((guchar *)*data) + sizeof (void *);
+        (**(void ***) data) = vals;
+        *data = ((guchar *) *data) + sizeof (void *);
 
         i = 0;
         dbus_message_iter_recurse (iter, &child);
-        while (dbus_message_iter_get_arg_type (&child) != DBUS_TYPE_INVALID) {
+        while (dbus_message_iter_get_arg_type (&child) != DBUS_TYPE_INVALID)
+          {
             void *ptr;
             const char *subt = stored_child_type;
             g_array_set_size (vals, i + 1);
@@ -583,12 +614,13 @@ dbind_any_demarshal (DBusMessageIter *iter,
             ptr = ALIGN_ADDRESS (ptr, elem_align);
             dbind_any_demarshal (&child, &subt, &ptr);
             i++;
-        };
+          };
         break;
-    }
-    case DBUS_STRUCT_BEGIN_CHAR: {
-                gconstpointer data0 = *data;
-                int offset = 0, stralign;
+      }
+    case DBUS_STRUCT_BEGIN_CHAR:
+      {
+        gconstpointer data0 = *data;
+        int offset = 0, stralign;
         DBusMessageIter child;
 
         stralign = dbind_find_c_alignment (*type);
@@ -597,25 +629,27 @@ dbind_any_demarshal (DBusMessageIter *iter,
 
         dbus_message_iter_recurse (iter, &child);
 
-        while (**type != DBUS_STRUCT_END_CHAR) {
+        while (**type != DBUS_STRUCT_END_CHAR)
+          {
             const char *subt = *type;
-                        offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
-                        *data = PTR_PLUS (data0, offset);
+            offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
+            *data = PTR_PLUS (data0, offset);
             dbind_any_demarshal (&child, type, data);
             offset += dbind_gather_alloc_info (subt);
-        }
+          }
 
-                offset = ALIGN_VALUE (offset, stralign);
-                *data = PTR_PLUS (data0, offset);
+        offset = ALIGN_VALUE (offset, stralign);
+        *data = PTR_PLUS (data0, offset);
 
         g_assert (**type == DBUS_STRUCT_END_CHAR);
         (*type)++;
 
         break;
-    }
-    case DBUS_DICT_ENTRY_BEGIN_CHAR: {
-                gconstpointer data0 = *data;
-                int offset = 0, stralign;
+      }
+    case DBUS_DICT_ENTRY_BEGIN_CHAR:
+      {
+        gconstpointer data0 = *data;
+        int offset = 0, stralign;
         DBusMessageIter child;
 
         stralign = dbind_find_c_alignment (*type);
@@ -624,32 +658,33 @@ dbind_any_demarshal (DBusMessageIter *iter,
 
         dbus_message_iter_recurse (iter, &child);
 
-        while (**type != DBUS_DICT_ENTRY_END_CHAR) {
+        while (**type != DBUS_DICT_ENTRY_END_CHAR)
+          {
             const char *subt = *type;
-                        offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
-                        *data = PTR_PLUS (data0, offset);
+            offset = ALIGN_VALUE (offset, dbind_find_c_alignment (*type));
+            *data = PTR_PLUS (data0, offset);
             dbind_any_demarshal (&child, type, data);
             offset += dbind_gather_alloc_info (subt);
-        }
+          }
 
-                offset = ALIGN_VALUE (offset, stralign);
-                *data = PTR_PLUS (data0, offset);
+        offset = ALIGN_VALUE (offset, stralign);
+        *data = PTR_PLUS (data0, offset);
 
         g_assert (**type == DBUS_DICT_ENTRY_END_CHAR);
         (*type)++;
 
         break;
-    case DBUS_TYPE_VARIANT:
+      case DBUS_TYPE_VARIANT:
         /* skip; unimplemented for now */
         (*type)++;
         break;
-    }
+      }
     case DBUS_TYPE_STRUCT:
     case DBUS_TYPE_DICT_ENTRY:
-        warn_braces ();
-        break;
+      warn_braces ();
+      break;
     }
-    dbus_message_iter_next (iter);
+  dbus_message_iter_next (iter);
 }
 
 static const char *
@@ -659,13 +694,13 @@ pass_complex_arg (const char *p, char begin, char end)
 
   p++;
   while (*p && level > 0)
-  {
-    if (*p == begin)
-      level++;
-    else if (*p == end)
-      level--;
-    p++;
-  }
+    {
+      if (*p == begin)
+        level++;
+      else if (*p == end)
+        level--;
+      p++;
+    }
   if (*p == end)
     p++;
   return p;
@@ -675,77 +710,80 @@ static const char *
 pass_arg (const char *p)
 {
   switch (*p)
-  {
-  case '(':
-    return pass_complex_arg (p, '(', ')');
-  case '{':
-    return pass_complex_arg (p, '{', '}');
-  case 'a':
-    return pass_arg (p+1);
-  default:
-    return p + 1;
-  }
+    {
+    case '(':
+      return pass_complex_arg (p, '(', ')');
+    case '{':
+      return pass_complex_arg (p, '{', '}');
+    case 'a':
+      return pass_arg (p + 1);
+    default:
+      return p + 1;
+    }
 }
 
 /*---------------------------------------------------------------------------*/
 
 void
 dbind_any_demarshal_va (DBusMessageIter *iter,
-                        const char           **arg_types,
-                        va_list          args)
+                        const char **arg_types,
+                        va_list args)
 {
-    const char *p = *arg_types;
+  const char *p = *arg_types;
 
-    /* Just consume the in args without doing anything to them */
-    for (;*p != '\0' && *p != '=';) {
-        switch (*p) {
+  /* Just consume the in args without doing anything to them */
+  for (; *p != '\0' && *p != '=';)
+    {
+      switch (*p)
+        {
         case DBUS_TYPE_BYTE:
         case DBUS_TYPE_BOOLEAN:
         case DBUS_TYPE_INT16:
         case DBUS_TYPE_UINT16:
         case DBUS_TYPE_INT32:
         case DBUS_TYPE_UINT32:
-            va_arg (args, int);
-            break;
+          va_arg (args, int);
+          break;
         case DBUS_TYPE_INT64:
         case DBUS_TYPE_UINT64:
-            va_arg (args, dbus_int64_t);
-            break;
+          va_arg (args, dbus_int64_t);
+          break;
         case DBUS_TYPE_DOUBLE:
-            va_arg (args, double);
-            break;
+          va_arg (args, double);
+          break;
         /* ptr types */
         case DBUS_TYPE_STRING:
         case DBUS_TYPE_OBJECT_PATH:
         case DBUS_TYPE_SIGNATURE:
         case DBUS_TYPE_ARRAY:
         case DBUS_TYPE_DICT_ENTRY:
-            va_arg (args, void *);
-            break;
+          va_arg (args, void *);
+          break;
         case DBUS_STRUCT_BEGIN_CHAR:
-            va_arg (args, void *);
-            break;
+          va_arg (args, void *);
+          break;
         case DBUS_DICT_ENTRY_BEGIN_CHAR:
-            va_arg (args, void *);
-            break;
+          va_arg (args, void *);
+          break;
 
         case DBUS_TYPE_VARIANT:
-            fprintf (stderr, "No variant support yet - very toolkit specific\n");
-            va_arg (args, void *);
-            break;
+          fprintf (stderr, "No variant support yet - very toolkit specific\n");
+          va_arg (args, void *);
+          break;
         default:
-            fprintf (stderr, "Unknown / invalid arg type %c\n", *p);
-            break;
+          fprintf (stderr, "Unknown / invalid arg type %c\n", *p);
+          break;
         }
       p = pass_arg (p);
     }
 
-    if (p [0] == '=' && p[1] == '>')
-      p += 2;
+  if (p[0] == '=' && p[1] == '>')
+    p += 2;
 
-    for (;*p != '\0';) {
-        void *arg = va_arg (args, void *);
-        dbind_any_demarshal (iter, &p, &arg);
+  for (; *p != '\0';)
+    {
+      void *arg = va_arg (args, void *);
+      dbind_any_demarshal (iter, &p, &arg);
     }
 }
 
@@ -756,14 +794,14 @@ void
 dbind_any_free (const char *type,
                 void *ptr)
 {
-    dbind_any_free_r (&type, &ptr);
+  dbind_any_free_r (&type, &ptr);
 }
 
 /* should this be the default normalization ? */
 void
 dbind_any_free_ptr (const char *type, void *ptr)
 {
-    dbind_any_free (type, &ptr);
+  dbind_any_free (type, &ptr);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -771,7 +809,7 @@ dbind_any_free_ptr (const char *type, void *ptr)
 unsigned int
 dbind_find_c_alignment (const char *type)
 {
-    return dbind_find_c_alignment_r (&type);
+  return dbind_find_c_alignment_r (&type);
 }
 
 /*END------------------------------------------------------------------------*/
index 859c895..f13539b 100644 (file)
 
 unsigned int dbind_find_c_alignment (const char *type);
 
-void   dbind_any_marshal       (DBusMessageIter *iter,
-                                const char           **type,
-                                void           **val);
+void dbind_any_marshal (DBusMessageIter *iter,
+                        const char **type,
+                        void **val);
 
-void   dbind_any_marshal_va    (DBusMessageIter *iter,
-                                const char           **arg_types,
-                                va_list          args);
+void dbind_any_marshal_va (DBusMessageIter *iter,
+                           const char **arg_types,
+                           va_list args);
 
-void   dbind_any_demarshal     (DBusMessageIter *iter,
-                                const char           **type,
-                                void           **val);
+void dbind_any_demarshal (DBusMessageIter *iter,
+                          const char **type,
+                          void **val);
 
-void   dbind_any_demarshal_va  (DBusMessageIter *iter,
-                                const char           **arg_types,
-                                va_list          args);
+void dbind_any_demarshal_va (DBusMessageIter *iter,
+                             const char **arg_types,
+                             va_list args);
 
-void   dbind_any_free          (const char      *type,
-                                void            *ptr_to_ptr);
+void dbind_any_free (const char *type,
+                     void *ptr_to_ptr);
 
-void   dbind_any_free_ptr      (const char      *type,
-                                void            *ptr);
+void dbind_any_free_ptr (const char *type,
+                         void *ptr);
 
 #endif /* _DBIND_ANY_H_ */
index e154f85..a05e8ba 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include <stdio.h>
+#include <glib.h>
 #include <stdarg.h>
-#include <sys/time.h>
+#include <stdio.h>
 #include <string.h>
-#include <glib.h>
+#include <sys/time.h>
 
+#include "atspi/atspi-gmain.h"
 #include "config.h"
 #include "dbind/dbind.h"
-#include "atspi/atspi-gmain.h"
 
 static int dbind_timeout = -1;
 
@@ -36,15 +36,15 @@ static int dbind_timeout = -1;
 
 /*---------------------------------------------------------------------------*/
 
-typedef struct _SpiReentrantCallClosure 
+typedef struct _SpiReentrantCallClosure
 {
   DBusMessage *reply;
 } SpiReentrantCallClosure;
 
 static void
-set_reply (DBusPendingCall * pending, void *user_data)
+set_reply (DBusPendingCall *pending, void *user_data)
 {
-  SpiReentrantCallClosure* closure = (SpiReentrantCallClosure *) user_data; 
+  SpiReentrantCallClosure *closure = (SpiReentrantCallClosure *) user_data;
 
   closure->reply = dbus_pending_call_steal_reply (pending);
   dbus_pending_call_unref (pending);
@@ -60,7 +60,7 @@ time_elapsed (struct timeval *origin)
 }
 
 DBusMessage *
-dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusError *error)
+dbind_send_and_allow_reentry (DBusConnection *bus, DBusMessage *message, DBusError *error)
 {
   DBusPendingCall *pending;
   SpiReentrantCallClosure *closure;
@@ -76,18 +76,18 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
       ret = dbus_connection_send_with_reply_and_block (bus, message,
                                                        dbind_timeout, error);
       if (g_main_depth () == 0 && !in_dispatch)
-      {
-        in_dispatch = TRUE;
-        while (dbus_connection_dispatch (bus) == DBUS_DISPATCH_DATA_REMAINS);
-        in_dispatch = FALSE;
-      }
+        {
+          in_dispatch = TRUE;
+          while (dbus_connection_dispatch (bus) == DBUS_DISPATCH_DATA_REMAINS)
+            ;
+          in_dispatch = FALSE;
+        }
       return ret;
     }
 
   closure = g_new0 (SpiReentrantCallClosure, 1);
   closure->reply = NULL;
-  if (!dbus_connection_send_with_reply (bus, message, &pending, dbind_timeout)
-      || !pending)
+  if (!dbus_connection_send_with_reply (bus, message, &pending, dbind_timeout) || !pending)
     {
       g_free (closure);
       return NULL;
@@ -101,14 +101,14 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
     {
       if (!dbus_connection_read_write_dispatch (bus, dbind_timeout))
         {
-          //dbus_pending_call_set_notify (pending, NULL, NULL, NULL);
+          // dbus_pending_call_set_notify (pending, NULL, NULL, NULL);
           dbus_pending_call_cancel (pending);
           dbus_pending_call_unref (pending);
           return NULL;
         }
       if (time_elapsed (&tv) > dbind_timeout)
         {
-          //dbus_pending_call_set_notify (pending, NULL, NULL, NULL);
+          // dbus_pending_call_set_notify (pending, NULL, NULL, NULL);
           dbus_pending_call_cancel (pending);
           dbus_pending_call_unref (pending);
           dbus_set_error_const (error, "org.freedesktop.DBus.Error.NoReply",
@@ -116,7 +116,7 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
           return NULL;
         }
     }
-  
+
   ret = closure->reply;
   dbus_pending_call_unref (pending);
   return ret;
@@ -124,79 +124,80 @@ dbind_send_and_allow_reentry (DBusConnection * bus, DBusMessage * message, DBusE
 
 dbus_bool_t
 dbind_method_call_reentrant_va (DBusConnection *cnx,
-                                const char     *bus_name,
-                                const char     *path,
-                                const char     *interface,
-                                const char     *method,
-                                DBusError      *opt_error,
-                                const char     *arg_types,
-                                va_list         args)
+                                const char *bus_name,
+                                const char *path,
+                                const char *interface,
+                                const char *method,
+                                DBusError *opt_error,
+                                const char *arg_types,
+                                va_list args)
 {
-    dbus_bool_t success = FALSE;
-    DBusMessage *msg = NULL, *reply = NULL;
-    DBusMessageIter iter;
-    DBusError *err, real_err;
-    const char *p;
+  dbus_bool_t success = FALSE;
+  DBusMessage *msg = NULL, *reply = NULL;
+  DBusMessageIter iter;
+  DBusError *err, real_err;
+  const char *p;
   va_list args_demarshal;
 
   dbus_error_init (&real_err);
 
   va_copy (args_demarshal, args);
-    if (opt_error)
-        err = opt_error;
-    else {
-        err = &real_err;
+  if (opt_error)
+    err = opt_error;
+  else
+    {
+      err = &real_err;
     }
 
-    msg = dbus_message_new_method_call (bus_name, path, interface, method);
-    if (!msg)
-        goto out;
+  msg = dbus_message_new_method_call (bus_name, path, interface, method);
+  if (!msg)
+    goto out;
 
-    p = arg_types;
-    dbus_message_iter_init_append (msg, &iter);
-    dbind_any_marshal_va (&iter, &p, args);
+  p = arg_types;
+  dbus_message_iter_init_append (msg, &iter);
+  dbind_any_marshal_va (&iter, &p, args);
 
-    reply = dbind_send_and_allow_reentry (cnx, msg, err);
-    if (!reply)
-        goto out;
+  reply = dbind_send_and_allow_reentry (cnx, msg, err);
+  if (!reply)
+    goto out;
 
-    if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
+  if (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_ERROR)
     {
       goto out;
     }
-    /* demarshal */
-    if (p[0] == '=' && p[1] == '>')
+  /* demarshal */
+  if (p[0] == '=' && p[1] == '>')
     {
-        DBusMessageIter iter;
-        dbus_message_iter_init (reply, &iter);
-       if (strcmp (p + 2, dbus_message_get_signature (reply)) != 0)
-       {
-           g_warning ("dbind: Call to \"%s\" returned signature %s; expected %s",
-                      method, dbus_message_get_signature (reply), p + 2);
-           if (opt_error)
-               dbus_set_error (opt_error, DBUS_ERROR_INVALID_ARGS,
-                               "Call to \"%s\" returned signature %s; expected %s",
-                               method, dbus_message_get_signature (reply),
-                                p + 2);
-           goto out;
-       }
-        p = arg_types;
-        dbind_any_demarshal_va (&iter, &p, args_demarshal);
+      DBusMessageIter iter;
+      dbus_message_iter_init (reply, &iter);
+      if (strcmp (p + 2, dbus_message_get_signature (reply)) != 0)
+        {
+          g_warning ("dbind: Call to \"%s\" returned signature %s; expected %s",
+                     method, dbus_message_get_signature (reply), p + 2);
+          if (opt_error)
+            dbus_set_error (opt_error, DBUS_ERROR_INVALID_ARGS,
+                            "Call to \"%s\" returned signature %s; expected %s",
+                            method, dbus_message_get_signature (reply),
+                            p + 2);
+          goto out;
+        }
+      p = arg_types;
+      dbind_any_demarshal_va (&iter, &p, args_demarshal);
     }
 
-    success = TRUE;
+  success = TRUE;
 out:
-    if (msg)
-        dbus_message_unref (msg);
+  if (msg)
+    dbus_message_unref (msg);
 
-    if (reply)
-        dbus_message_unref (reply);
+  if (reply)
+    dbus_message_unref (reply);
 
-    if (dbus_error_is_set (&real_err))
-        dbus_error_free (&real_err);
+  if (dbus_error_is_set (&real_err))
+    dbus_error_free (&real_err);
 
-    va_end (args_demarshal);
-    return success;
+  va_end (args_demarshal);
+  return success;
 }
 
 /**
@@ -213,109 +214,112 @@ out:
  *             and pointers to argument data.
  *
  * Makes a D-Bus method call using the supplied location data, method name and
- * argument data.This function is re-entrant. It continuously reads from the D-Bus
- * bus and dispatches messages until a reply has been recieved.
+ * argument data. This function is re-entrant. It continuously reads from the D-Bus
+ * bus and dispatches messages until a reply has been received.
  **/
 dbus_bool_t
 dbind_method_call_reentrant (DBusConnection *cnx,
-                             const char     *bus_name,
-                             const char     *path,
-                             const char     *interface,
-                             const char     *method,
-                             DBusError      *opt_error,
-                             const char     *arg_types,
+                             const char *bus_name,
+                             const char *path,
+                             const char *interface,
+                             const char *method,
+                             DBusError *opt_error,
+                             const char *arg_types,
                              ...)
 {
-    dbus_bool_t success = FALSE;
-    va_list args;
-
-    va_start (args, arg_types);
-    success = dbind_method_call_reentrant_va (cnx,
-                                              bus_name,
-                                              path,
-                                              interface,
-                                              method,
-                                              opt_error,
-                                              arg_types,
-                                              args);
-    va_end (args);
-
-    return success;
+  dbus_bool_t success = FALSE;
+  va_list args;
+
+  va_start (args, arg_types);
+  success = dbind_method_call_reentrant_va (cnx,
+                                            bus_name,
+                                            path,
+                                            interface,
+                                            method,
+                                            opt_error,
+                                            arg_types,
+                                            args);
+  va_end (args);
+
+  return success;
 }
 
-/*---------------------------------------------------------------------------*/
-
-/* TODO: opt_error is unused; should be removed */
 dbus_bool_t
-dbind_emit_signal_va (DBusConnection *cnx,
-                      const char     *path,
-                      const char     *interface,
-                      const char     *signal,
-                      DBusError      *opt_error,
-                      const char     *arg_types,
-                      va_list         args)
+dbind_method_call_va (DBusConnection *cnx,
+                      const char *bus_name,
+                      const char *path,
+                      const char *interface,
+                      const char *method,
+                      const char *arg_types,
+                      va_list args)
 {
-    dbus_bool_t success = FALSE;
-    DBusMessage *msg = NULL;
-    DBusMessageIter iter;
-    const char *p;
+  dbus_bool_t success = FALSE;
+  DBusMessage *msg = NULL;
+  DBusMessageIter iter;
+  const char *p;
+  va_list args_demarshal;
 
-    msg = dbus_message_new_signal (path, interface, signal);
-    if (!msg)
-        goto out;
+  va_copy (args_demarshal, args);
 
-    p = arg_types;
-    dbus_message_iter_init_append (msg, &iter);
-    dbind_any_marshal_va (&iter, &p, args);
+  msg = dbus_message_new_method_call (bus_name, path, interface, method);
+  if (!msg)
+    return FALSE;
 
-    if (!dbus_connection_send (cnx, msg, NULL))
-       goto out;
+  p = arg_types;
+  dbus_message_iter_init_append (msg, &iter);
+  dbind_any_marshal_va (&iter, &p, args);
 
-    success = TRUE;
-out:
+  dbus_connection_send (cnx, msg, NULL);
+  dbus_message_unref (msg);
 
-    if (msg)
-        dbus_message_unref (msg);
-
-    return success;
+  va_end (args_demarshal);
+  return success;
 }
 
 /**
- * dbind_emit_signal:
+ * dbind_method_call:
  *
  * @cnx:       A D-Bus Connection used to make the method call.
- * @path:      The D-Bus object path that this signal is emitted from.
+ * @bus_name:  The D-Bus bus name of the program where the method call should
+ *             be made.
+ * @path:      The D-Bus object path that should handle the method.
  * @interface: The D-Bus interface used to scope the method name.
- * @signal:    Name of signal to emit.
- * @opt_error: D-Bus error.
+ * @method:    Method to be invoked.
  * @arg_types: Variable length arguments interleaving D-Bus argument types
  *             and pointers to argument data.
  *
- * Emits a D-Bus signal  using the supplied signal name and argument data.
+ * Sends a D-Bus method call using the supplied location data, method name and
+ * argument data, without waiting for a re ply.
  **/
 dbus_bool_t
-dbind_emit_signal (DBusConnection *cnx,
-                   const char     *path,
-                   const char     *interface,
-                   const char     *signal,
-                   DBusError      *opt_error,
-                   const char     *arg_types,
+dbind_method_call (DBusConnection *cnx,
+                   const char *bus_name,
+                   const char *path,
+                   const char *interface,
+                   const char *method,
+                   const char *arg_types,
                    ...)
 {
-    dbus_bool_t success = FALSE;
-    va_list args;
-
-    va_start (args, arg_types);
-    success = dbind_emit_signal_va (cnx, path, interface, signal, opt_error, arg_types, args);
-    va_end (args);
-
-    return success;
+  dbus_bool_t success = FALSE;
+  va_list args;
+
+  va_start (args, arg_types);
+  success = dbind_method_call_va (cnx,
+                                  bus_name,
+                                  path,
+                                  interface,
+                                  method,
+                                  arg_types,
+                                  args);
+  va_end (args);
+
+  return success;
 }
+
 void
 dbind_set_timeout (int timeout)
 {
   dbind_timeout = timeout;
 }
 
-
 /*END------------------------------------------------------------------------*/
index 0c10c7d..2f69b33 100644 (file)
 #define _DBIND_H_
 
 #define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus.h>
 #include <dbind/dbind-any.h>
+#include <dbus/dbus.h>
 
 DBusMessage *
 dbind_send_and_allow_reentry (DBusConnection *bus, DBusMessage *message, DBusError *error);
 
 dbus_bool_t
 dbind_method_call_reentrant_va (DBusConnection *cnx,
-                                const char     *bus_name,
-                                const char     *path,
-                                const char     *interface,
-                                const char     *method,
-                                DBusError      *opt_error,
-                                const char     *arg_types,
-                                va_list         args);
+                                const char *bus_name,
+                                const char *path,
+                                const char *interface,
+                                const char *method,
+                                DBusError *opt_error,
+                                const char *arg_types,
+                                va_list args);
 
 dbus_bool_t
 dbind_method_call_reentrant (DBusConnection *cnx,
-                             const char     *bus_name,
-                             const char     *path,
-                             const char     *interface,
-                             const char     *method,
-                             DBusError      *opt_error,
-                             const char     *arg_types,
+                             const char *bus_name,
+                             const char *path,
+                             const char *interface,
+                             const char *method,
+                             DBusError *opt_error,
+                             const char *arg_types,
                              ...);
 
 dbus_bool_t
-dbind_emit_signal_va (DBusConnection *cnx,
-                      const char     *path,
-                      const char     *interface,
-                      const char     *signal,
-                      DBusError      *opt_error,
-                      const char     *arg_types,
-                      va_list         args);
+dbind_method_call_va (DBusConnection *cnx,
+                      const char *bus_name,
+                      const char *path,
+                      const char *interface,
+                      const char *method,
+                      const char *arg_types,
+                      va_list args);
 
 dbus_bool_t
-dbind_emit_signal (DBusConnection *cnx,
-                   const char     *path,
-                   const char     *interface,
-                   const char     *signal,
-                   DBusError      *opt_error,
-                   const char     *arg_types,
+dbind_method_call (DBusConnection *cnx,
+                   const char *bus_name,
+                   const char *path,
+                   const char *interface,
+                   const char *method,
+                   const char *arg_types,
                    ...);
 
 void dbind_set_timeout (int timeout);
index 511839c..494d1ac 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include <stdio.h>
+#include <dbind/dbind.h>
 #include <glib.h>
+#include <stdio.h>
 #include <string.h>
-#include <dbind/dbind.h>
 
-/* Wow! dbus is unpleasant to use */
-
-#define DESKICE_PATH      "/Novell/ICEDesktop/Daemon"
-#define DESKICE_NAMESPACE "Novell.ICEDesktop.Daemon"
-
-void marshal (DBusMessage *msg, const char *type, void *ptr)
+void
+marshal (DBusMessage *msg, const char *type, void *ptr)
 {
-    DBusMessageIter iter;
+  DBusMessageIter iter;
 
-    dbus_message_iter_init_append (msg, &iter);
-    dbind_any_marshal (&iter, &type, &ptr);
+  dbus_message_iter_init_append (msg, &iter);
+  dbind_any_marshal (&iter, &type, &ptr);
 }
 
-void demarshal (DBusMessage *msg, const char *type, void *ptr)
+void
+demarshal (DBusMessage *msg, const char *type, void *ptr)
 {
-    DBusMessageIter iter;
-
-    if (!dbus_message_iter_init (msg, &iter))
-      {
-        fprintf (stderr, "no data in msg\n");
-        g_assert_not_reached ();
-      }
-    else
-        dbind_any_demarshal (&iter, &type, &ptr);
+  DBusMessageIter iter;
+
+  if (!dbus_message_iter_init (msg, &iter))
+    {
+      fprintf (stderr, "no data in msg\n");
+      g_assert_not_reached ();
+    }
+  else
+    dbind_any_demarshal (&iter, &type, &ptr);
 }
 
 #if 0
@@ -74,350 +71,322 @@ void dump_msg (DBusMessage *msg)
 }
 #endif
 
-void test_simple ()
+void
+test_simple ()
 {
-    dbus_int32_t v1, v2;
-    DBusMessage *msg;
+  dbus_int32_t v1, v2;
+  DBusMessage *msg;
 
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
-    v1 = 42;
-    marshal (msg, "i", &v1);
-    demarshal (msg, "i", &v2);
-    g_assert (v2 == 42);
-    g_assert (v1 == v2);
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  v1 = 42;
+  marshal (msg, "i", &v1);
+  demarshal (msg, "i", &v2);
+  g_assert (v2 == 42);
+  g_assert (v1 == v2);
 
-    dbind_any_free ("i", &v2); /* nop */
-    dbus_message_unref (msg);
+  dbind_any_free ("i", &v2); /* nop */
+  dbus_message_unref (msg);
 
-    printf ("simple ok\n");
+  printf ("simple ok\n");
 }
 
-void test_array ()
+void
+test_array ()
 {
-    GArray *a1, *a2;
-    DBusMessage *msg;
-
-    /* pod types */
-    a1 = g_array_new (FALSE, FALSE, sizeof (dbus_int32_t));
-    g_array_set_size (a1, 4);
-    g_array_index (a1, dbus_int32_t, 0) = 42;
-    g_array_index (a1, dbus_int32_t, 1) = 17;
-    g_array_index (a1, dbus_int32_t, 2) = 26;
-    g_array_index (a1, dbus_int32_t, 3) = 38;
-
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
-    marshal (msg, "ai", &a1);
-    demarshal (msg, "ai", &a2);
-
-    g_assert (a2 != NULL);
-    g_assert (a2->len == 4);
-    g_assert (g_array_index (a2, dbus_int32_t, 0) == 42);
-    g_assert (g_array_index (a2, dbus_int32_t, 1) == 17);
-    g_assert (g_array_index (a2, dbus_int32_t, 2) == 26);
-    g_assert (g_array_index (a2, dbus_int32_t, 3) == 38);
-    g_array_free (a1, TRUE);
-
-    dbind_any_free ("ai", &a2);
-    dbus_message_unref (msg);
-
-    printf ("array ok\n");
+  GArray *a1, *a2;
+  DBusMessage *msg;
+
+  /* pod types */
+  a1 = g_array_new (FALSE, FALSE, sizeof (dbus_int32_t));
+  g_array_set_size (a1, 4);
+  g_array_index (a1, dbus_int32_t, 0) = 42;
+  g_array_index (a1, dbus_int32_t, 1) = 17;
+  g_array_index (a1, dbus_int32_t, 2) = 26;
+  g_array_index (a1, dbus_int32_t, 3) = 38;
+
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  marshal (msg, "ai", &a1);
+  demarshal (msg, "ai", &a2);
+
+  g_assert (a2 != NULL);
+  g_assert (a2->len == 4);
+  g_assert (g_array_index (a2, dbus_int32_t, 0) == 42);
+  g_assert (g_array_index (a2, dbus_int32_t, 1) == 17);
+  g_assert (g_array_index (a2, dbus_int32_t, 2) == 26);
+  g_assert (g_array_index (a2, dbus_int32_t, 3) == 38);
+  g_array_free (a1, TRUE);
+
+  dbind_any_free ("ai", &a2);
+  dbus_message_unref (msg);
+
+  printf ("array ok\n");
 }
 
-/* this taught me that the struct type is a mis-nomer, 
+/* this taught me that the struct type is a mis-nomer,
    it is generated by brackets */
-void test_struct_native ()
+void
+test_struct_native ()
 {
-    DBusMessage *msg;
-    DBusMessageIter iter, arr, str;
+  DBusMessage *msg;
+  DBusMessageIter iter, arr, str;
 
-    /* manually create ar(ss) */
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  /* manually create ar(ss) */
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
 
-    dbus_message_iter_init_append (msg, &iter);
+  dbus_message_iter_init_append (msg, &iter);
 
-    dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ss)", &arr);
-    {
-        char *foo;
-        dbus_message_iter_open_container (&arr, DBUS_TYPE_STRUCT, NULL, &str);
-
-        foo = "foo";
-        dbus_message_iter_append_basic (&str, DBUS_TYPE_STRING, &foo);
-        foo = "baa";
-        dbus_message_iter_append_basic (&str, DBUS_TYPE_STRING, &foo);
-        
-        dbus_message_iter_close_container (&arr, &str);
-    }
-    dbus_message_iter_close_container (&iter, &arr);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ss)", &arr);
+  {
+    char *foo;
+    dbus_message_iter_open_container (&arr, DBUS_TYPE_STRUCT, NULL, &str);
 
-    printf ("native struct marshalling ok\n");
-    
-    dbus_message_unref (msg);
-}
+    foo = "foo";
+    dbus_message_iter_append_basic (&str, DBUS_TYPE_STRING, &foo);
+    foo = "baa";
+    dbus_message_iter_append_basic (&str, DBUS_TYPE_STRING, &foo);
 
+    dbus_message_iter_close_container (&arr, &str);
+  }
+  dbus_message_iter_close_container (&iter, &arr);
 
-void test_struct_simple ()
-{
-    typedef struct {
-        char *foo;
-        char *baa;
-        char *baz;
-    } FooBaa;
-    GArray *a1 = NULL, *a2 = NULL;
-    DBusMessage *msg;
-
-    a1 = g_array_new (FALSE, FALSE, sizeof (FooBaa));
-    g_array_set_size (a1, 2);
-    g_array_index (a1, FooBaa, 0).foo = "foo";
-    g_array_index (a1, FooBaa, 0).baa = "baa";
-    g_array_index (a1, FooBaa, 0).baz = "baz";
-    g_array_index (a1, FooBaa, 1).foo = "Foo";
-    g_array_index (a1, FooBaa, 1).baa = "baA";
-    g_array_index (a1, FooBaa, 1).baz = "BaZ";
-
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
-    marshal (msg, "a(sss)", &a1);
-    demarshal (msg, "a(sss)", &a2);
-
-    g_assert (a2 != NULL);
-    g_assert (a2 != a1);
-    g_assert (a2->len == 2);
-    g_assert (!strcmp (g_array_index (a2, FooBaa, 0).foo, "foo"));
-    g_assert (!strcmp (g_array_index (a2, FooBaa, 0).baa, "baa"));
-    g_assert (!strcmp (g_array_index (a2, FooBaa, 0).baz, "baz"));
-    g_assert (!strcmp (g_array_index (a2, FooBaa, 1).foo, "Foo"));
-    g_assert (!strcmp (g_array_index (a2, FooBaa, 1).baa, "baA"));
-    g_assert (!strcmp (g_array_index (a2, FooBaa, 1).baz, "BaZ"));
-    
-    printf ("simple struct ok\n");
-
-    dbind_any_free ("a(sss)", &a2);
-    dbus_message_unref (msg);
+  printf ("native struct marshalling ok\n");
+
+  dbus_message_unref (msg);
 }
 
-void test_struct_complex ()
+void
+test_struct_simple ()
 {
-    typedef struct {
-        dbus_int32_t x, y;
-    } Point;
-    typedef struct {
-        unsigned char pad1;
-        double        val;
-        Point         tl, br;
-        char          pad2;
-        char         *name;
-    } Complex;
-#define TYPEOF_POINT \
-    DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
-        DBUS_TYPE_INT32_AS_STRING \
-        DBUS_TYPE_INT32_AS_STRING \
-    DBUS_STRUCT_END_CHAR_AS_STRING
-#define TYPEOF_COMPLEX \
-    DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
-        DBUS_TYPE_BYTE_AS_STRING \
-        DBUS_TYPE_DOUBLE_AS_STRING \
-        TYPEOF_POINT \
-        TYPEOF_POINT \
-        DBUS_TYPE_BYTE_AS_STRING \
-        DBUS_TYPE_STRING_AS_STRING \
-    DBUS_STRUCT_END_CHAR_AS_STRING
-
-
-    DBusMessage *msg;
-    Complex c1, c2;
-
-    memset (&c1, 0, sizeof (c1));
-    memset (&c2, 0, sizeof (c2));
-
-    c1.pad1 = 2;
-    c1.val = 0.1327569;
-    c1.tl.x = 1;
-    c1.tl.y = 17;
-    c1.br.x = 2587;
-    c1.br.y = -1;
-    c1.pad2 = 1;
-    c1.name = "stroustrup";
-
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
-    marshal (msg, TYPEOF_COMPLEX, &c1);
-    demarshal (msg, TYPEOF_COMPLEX, &c2);
-
-    g_assert (c2.pad1 == 2);
-    g_assert (c2.val == c1.val);
-    g_assert (c2.val != 0);
-    g_assert (c2.tl.x == 1);
-    g_assert (c2.tl.y == 17);
-    g_assert (c2.br.x == 2587);
-    g_assert (c2.br.y == -1);
-    g_assert (c2.pad2 == 1);
-    g_assert (!strcmp (c1.name, "stroustrup"));
-    
-    printf ("complex struct ok\n");
-
-    dbind_any_free (TYPEOF_COMPLEX, &c2);
-    dbus_message_unref (msg);
+  typedef struct
+  {
+    char *foo;
+    char *baa;
+    char *baz;
+  } FooBaa;
+  GArray *a1 = NULL, *a2 = NULL;
+  DBusMessage *msg;
+
+  a1 = g_array_new (FALSE, FALSE, sizeof (FooBaa));
+  g_array_set_size (a1, 2);
+  g_array_index (a1, FooBaa, 0).foo = "foo";
+  g_array_index (a1, FooBaa, 0).baa = "baa";
+  g_array_index (a1, FooBaa, 0).baz = "baz";
+  g_array_index (a1, FooBaa, 1).foo = "Foo";
+  g_array_index (a1, FooBaa, 1).baa = "baA";
+  g_array_index (a1, FooBaa, 1).baz = "BaZ";
+
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  marshal (msg, "a(sss)", &a1);
+  demarshal (msg, "a(sss)", &a2);
+
+  g_assert (a2 != NULL);
+  g_assert (a2 != a1);
+  g_assert (a2->len == 2);
+  g_assert (!strcmp (g_array_index (a2, FooBaa, 0).foo, "foo"));
+  g_assert (!strcmp (g_array_index (a2, FooBaa, 0).baa, "baa"));
+  g_assert (!strcmp (g_array_index (a2, FooBaa, 0).baz, "baz"));
+  g_assert (!strcmp (g_array_index (a2, FooBaa, 1).foo, "Foo"));
+  g_assert (!strcmp (g_array_index (a2, FooBaa, 1).baa, "baA"));
+  g_assert (!strcmp (g_array_index (a2, FooBaa, 1).baz, "BaZ"));
+
+  printf ("simple struct ok\n");
+
+  dbind_any_free ("a(sss)", &a2);
+  dbus_message_unref (msg);
+  g_array_free (a1, TRUE);
 }
 
-void test_struct_with_array ()
+void
+test_struct_complex ()
 {
-    typedef struct {
-        GArray *vals;
-        unsigned char pad1;
-    } ArrayStruct;
-#define TYPEOF_ARRAYSTRUCT \
-        DBUS_TYPE_ARRAY_AS_STRING \
-    DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
-        DBUS_TYPE_ARRAY_AS_STRING \
-        DBUS_TYPE_UINT32_AS_STRING \
-        DBUS_TYPE_BYTE_AS_STRING \
-    DBUS_STRUCT_END_CHAR_AS_STRING
-
-
-    DBusMessage *msg;
-    GArray *a1, *a2;
-    ArrayStruct *p, *q;
-
-
-    a1 = g_array_new (FALSE, FALSE, sizeof (ArrayStruct));
-    g_array_set_size (a1, 2);
-    p = &g_array_index (a1, ArrayStruct, 0);
-    p[0].vals = g_array_new (FALSE, FALSE, sizeof (dbus_uint32_t));
-    g_array_set_size (p[0].vals, 2);
-    g_array_index (p[0].vals, dbus_uint32_t, 0) = 1;
-    g_array_index (p[0].vals, dbus_uint32_t, 1) = 1000;
-    p[0].pad1 = 2;
-    p[1].vals = g_array_new (FALSE, FALSE, sizeof (dbus_uint32_t));
-    g_array_set_size (p[1].vals, 2);
-    g_array_index (p[1].vals, dbus_uint32_t, 0) = 1000000;
-    g_array_index (p[1].vals, dbus_uint32_t, 1) = 1000000000;
-    p[1].pad1 = 8;
-
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
-    marshal (msg, TYPEOF_ARRAYSTRUCT, &a1);
-    demarshal (msg, TYPEOF_ARRAYSTRUCT, &a2);
-
-    q = &g_array_index (a2, ArrayStruct, 0);
-    g_assert (q[0].pad1 == 2);
-    g_assert (g_array_index (q[1].vals, dbus_uint32_t, 1) == 1000000000);
-    
-    printf ("struct with array ok\n");
-
-    dbind_any_free (TYPEOF_ARRAYSTRUCT, &a2);
-    dbus_message_unref (msg);
-    g_array_free (p[0].vals, TRUE);
-    g_array_free (p[1].vals, TRUE);
+  typedef struct
+  {
+    dbus_int32_t x, y;
+  } Point;
+  typedef struct
+  {
+    unsigned char pad1;
+    double val;
+    Point tl, br;
+    char pad2;
+    char *name;
+  } Complex;
+#define TYPEOF_POINT               \
+  DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
+  DBUS_TYPE_INT32_AS_STRING        \
+  DBUS_TYPE_INT32_AS_STRING        \
+  DBUS_STRUCT_END_CHAR_AS_STRING
+#define TYPEOF_COMPLEX             \
+  DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
+  DBUS_TYPE_BYTE_AS_STRING         \
+  DBUS_TYPE_DOUBLE_AS_STRING       \
+  TYPEOF_POINT                     \
+  TYPEOF_POINT                     \
+  DBUS_TYPE_BYTE_AS_STRING         \
+  DBUS_TYPE_STRING_AS_STRING       \
+  DBUS_STRUCT_END_CHAR_AS_STRING
+
+  DBusMessage *msg;
+  Complex c1, c2;
+
+  memset (&c1, 0, sizeof (c1));
+  memset (&c2, 0, sizeof (c2));
+
+  c1.pad1 = 2;
+  c1.val = 0.1327569;
+  c1.tl.x = 1;
+  c1.tl.y = 17;
+  c1.br.x = 2587;
+  c1.br.y = -1;
+  c1.pad2 = 1;
+  c1.name = "stroustrup";
+
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  marshal (msg, TYPEOF_COMPLEX, &c1);
+  demarshal (msg, TYPEOF_COMPLEX, &c2);
+
+  g_assert (c2.pad1 == 2);
+  g_assert (c2.val == c1.val);
+  g_assert (c2.val != 0);
+  g_assert (c2.tl.x == 1);
+  g_assert (c2.tl.y == 17);
+  g_assert (c2.br.x == 2587);
+  g_assert (c2.br.y == -1);
+  g_assert (c2.pad2 == 1);
+  g_assert (!strcmp (c1.name, "stroustrup"));
+
+  printf ("complex struct ok\n");
+
+  dbind_any_free (TYPEOF_COMPLEX, &c2);
+  dbus_message_unref (msg);
 }
 
-void test_twovals ()
+void
+test_struct_with_array ()
 {
-    typedef struct {
-        dbus_int32_t v1;
-        dbus_int32_t v2;
-    } TwoVal;
-#define TYPEOF_TWOVAL \
-        DBUS_TYPE_INT32_AS_STRING \
-        DBUS_TYPE_INT32_AS_STRING \
-
-    DBusMessage *msg;
-    DBusMessageIter iter;
-    TwoVal i, o;
-    const char *type_twoval = TYPEOF_TWOVAL;
-    const char *type;
-    void *ptr;
-
-    msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
-    i.v1 = 42;
-  i.v2 = 1764;
-    dbus_message_iter_init_append (msg, &iter);
-    type = type_twoval;
-    ptr = &i;
-    dbind_any_marshal (&iter, &type, &ptr);
-    dbind_any_marshal (&iter, &type, &ptr);
-    dbus_message_iter_init (msg, &iter);
-    type = type_twoval;
-    ptr = &o;
-    dbind_any_demarshal (&iter, &type, &ptr);
-    dbind_any_demarshal (&iter, &type, &ptr);
-    g_assert (o.v1 == 42);
-    g_assert (o.v2 == 1764);
-    g_assert (i.v1 == o.v1);
-    g_assert (i.v2 == o.v2);
-
-    dbind_any_free ("ii", &o); /* nop */
-    dbus_message_unref (msg);
-
-    printf ("two-val ok\n");
+  typedef struct
+  {
+    GArray *vals;
+    unsigned char pad1;
+  } ArrayStruct;
+#define TYPEOF_ARRAYSTRUCT         \
+  DBUS_TYPE_ARRAY_AS_STRING        \
+  DBUS_STRUCT_BEGIN_CHAR_AS_STRING \
+  DBUS_TYPE_ARRAY_AS_STRING        \
+  DBUS_TYPE_UINT32_AS_STRING       \
+  DBUS_TYPE_BYTE_AS_STRING         \
+  DBUS_STRUCT_END_CHAR_AS_STRING
+
+  DBusMessage *msg;
+  GArray *a1, *a2;
+  ArrayStruct *p, *q;
+
+  a1 = g_array_new (FALSE, FALSE, sizeof (ArrayStruct));
+  g_array_set_size (a1, 2);
+  p = &g_array_index (a1, ArrayStruct, 0);
+  p[0].vals = g_array_new (FALSE, FALSE, sizeof (dbus_uint32_t));
+  g_array_set_size (p[0].vals, 2);
+  g_array_index (p[0].vals, dbus_uint32_t, 0) = 1;
+  g_array_index (p[0].vals, dbus_uint32_t, 1) = 1000;
+  p[0].pad1 = 2;
+  p[1].vals = g_array_new (FALSE, FALSE, sizeof (dbus_uint32_t));
+  g_array_set_size (p[1].vals, 2);
+  g_array_index (p[1].vals, dbus_uint32_t, 0) = 1000000;
+  g_array_index (p[1].vals, dbus_uint32_t, 1) = 1000000000;
+  p[1].pad1 = 8;
+
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  marshal (msg, TYPEOF_ARRAYSTRUCT, &a1);
+  demarshal (msg, TYPEOF_ARRAYSTRUCT, &a2);
+
+  q = &g_array_index (a2, ArrayStruct, 0);
+  g_assert (q[0].pad1 == 2);
+  g_assert (g_array_index (q[1].vals, dbus_uint32_t, 1) == 1000000000);
+
+  printf ("struct with array ok\n");
+
+  dbind_any_free (TYPEOF_ARRAYSTRUCT, &a2);
+  dbus_message_unref (msg);
+  g_array_free (p[0].vals, TRUE);
+  g_array_free (p[1].vals, TRUE);
+  g_array_free (a1, TRUE);
 }
 
-void test_marshalling ()
+void
+test_twovals ()
 {
-    test_simple ();
-    test_array ();
-    test_struct_native ();
-    test_struct_simple ();
-    test_struct_complex ();
-    test_struct_with_array ();
-    test_twovals ();
-
-    printf ("Marshalling ok\n");
+  typedef struct
+  {
+    dbus_int32_t v1;
+    dbus_int32_t v2;
+  } TwoVal;
+#define TYPEOF_TWOVAL       \
+  DBUS_TYPE_INT32_AS_STRING \
+  DBUS_TYPE_INT32_AS_STRING
+
+  DBusMessage *msg;
+  DBusMessageIter iter;
+  TwoVal i, o;
+  const char *type_twoval = TYPEOF_TWOVAL;
+  const char *type;
+  void *ptr;
+
+  msg = dbus_message_new (DBUS_MESSAGE_TYPE_METHOD_CALL);
+  i.v1 = 42;
+  i.v2 = 1764;
+  dbus_message_iter_init_append (msg, &iter);
+  type = type_twoval;
+  ptr = &i;
+  dbind_any_marshal (&iter, &type, &ptr);
+  dbind_any_marshal (&iter, &type, &ptr);
+  dbus_message_iter_init (msg, &iter);
+  type = type_twoval;
+  ptr = &o;
+  dbind_any_demarshal (&iter, &type, &ptr);
+  dbind_any_demarshal (&iter, &type, &ptr);
+  g_assert (o.v1 == 42);
+  g_assert (o.v2 == 1764);
+  g_assert (i.v1 == o.v1);
+  g_assert (i.v2 == o.v2);
+
+  dbind_any_free ("ii", &o); /* nop */
+  dbus_message_unref (msg);
+
+  printf ("two-val ok\n");
 }
 
-void test_teamspaces (DBusConnection *bus)
+void
+test_marshalling ()
 {
-    GArray *spaces;
-    DBusError error;
-    int i;
-    typedef struct {
-        char *name;
-        char *id;
-        char *url;
-    } TeamSpace;
-
-    dbus_error_init (&error);
-    if (!dbind_method_call_reentrant (bus,
-                                      NULL,
-                                      DESKICE_PATH,
-                                      DESKICE_NAMESPACE,
-                                      "GetTeamList",
-                                      &error,
-                                      "=>a(sss)",
-                                      &spaces)) {
-        fprintf (stderr, "Error getting team spaces %s: %s\n",
-                 error.name, error.message);
-        dbus_error_free (&error);
-        return;
-    }
-
-    if (!spaces) {
-        fprintf (stderr, "no teamspaces\n");
-        return;
-    }
-    fprintf (stderr, "%d teamspace(s)\n", spaces->len);
-    for (i = 0; i < spaces->len; i++) {
-        TeamSpace *space = &g_array_index (spaces, TeamSpace, i);
-        fprintf (stderr, "\t%d: %s, %s, %s\n", i, space->name, space->id, space->url);
-    }
-
-    dbind_any_free_ptr ("a(sss)", spaces);
+  test_simple ();
+  test_array ();
+  test_struct_native ();
+  test_struct_simple ();
+  test_struct_complex ();
+  test_struct_with_array ();
+  test_twovals ();
+
+  printf ("Marshalling ok\n");
 }
 
-void test_helpers ()
+void
+test_helpers ()
 {
-    dbind_find_c_alignment ("(sss)");
-    dbind_find_c_alignment ("a(sss)");
-    dbind_find_c_alignment ("(s(s)yd(d)s)");
-    dbind_find_c_alignment ("a{ss}");
-    printf ("helpers passed\n");
+  dbind_find_c_alignment ("(sss)");
+  dbind_find_c_alignment ("a(sss)");
+  dbind_find_c_alignment ("(s(s)yd(d)s)");
+  dbind_find_c_alignment ("a{ss}");
+  printf ("helpers passed\n");
 }
 
-int main (int argc, char **argv)
+int
+main (int argc, char **argv)
 {
-    DBusConnection *bus;
-
-    bus = dbus_bus_get (DBUS_BUS_SESSION, NULL);
+  DBusConnection *bus = dbus_bus_get (DBUS_BUS_SESSION, NULL);
+  g_assert (bus != NULL);
 
-    test_helpers ();
-    test_marshalling ();
-    test_teamspaces (bus);
+  test_helpers ();
+  test_marshalling ();
 
-    return 0;
+  return 0;
 }
diff --git a/devel-docs/architecture-modules.svg b/devel-docs/architecture-modules.svg
new file mode 100644 (file)
index 0000000..1f03afb
--- /dev/null
@@ -0,0 +1,686 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   width="1280"
+   height="720"
+   viewBox="0 0 338.66667 190.5"
+   version="1.1"
+   id="svg5"
+   inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
+   sodipodi:docname="modules.svg"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <sodipodi:namedview
+     id="namedview7"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:document-units="px"
+     showgrid="true"
+     inkscape:snap-text-baseline="true"
+     inkscape:zoom="1"
+     inkscape:cx="503"
+     inkscape:cy="340.5"
+     inkscape:window-width="1920"
+     inkscape:window-height="1011"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     units="px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:showpageshadow="2"
+     inkscape:deskcolor="#d1d1d1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid31"
+       spacingx="2.6458333"
+       spacingy="2.6458333" />
+  </sodipodi:namedview>
+  <defs
+     id="defs2" />
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+       id="rect6957"
+       width="5.291667"
+       height="15.874998"
+       x="58.208332"
+       y="44.979168"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-7-6"
+       width="5.2916675"
+       height="39.687492"
+       x="58.208332"
+       y="92.604164"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-7-6-3"
+       width="5.2916689"
+       height="39.687492"
+       x="161.39583"
+       y="92.604164"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-7-6-2"
+       width="5.2916665"
+       height="10.583333"
+       x="58.208332"
+       y="145.52083"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-7-6-2-6"
+       width="5.2916665"
+       height="10.583333"
+       x="161.39583"
+       y="145.52083"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-7-6-2-1"
+       width="5.2916665"
+       height="10.583333"
+       x="224.89581"
+       y="145.5208"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-7-6-2-2"
+       width="5.2916665"
+       height="10.583333"
+       x="293.68756"
+       y="145.52081"
+       rx="0"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-0"
+       width="5.2916698"
+       height="15.874998"
+       x="161.39583"
+       y="44.979168"
+       rx="2.1000001e-06"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-0-9"
+       width="5.2916698"
+       height="5.2916632"
+       x="161.39583"
+       y="74.083336"
+       rx="2.1000001e-06"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-0-9-3"
+       width="5.2916689"
+       height="111.125"
+       x="224.89583"
+       y="21.166666"
+       rx="2.1000001e-06"
+       ry="0" />
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-0-9-6"
+       width="5.2916627"
+       height="87.3125"
+       x="293.6875"
+       y="44.979168"
+       rx="2.1000001e-06"
+       ry="0" />
+    <rect
+       style="fill:#37abc8;stroke:#000000;stroke-width:0.529167;stroke-dashoffset:0.264583"
+       id="rect3573"
+       width="116.41666"
+       height="42.333332"
+       x="2.6458333"
+       y="2.6458333"
+       rx="0"
+       ry="4.6139526e-08" />
+    <g
+       id="g3544"
+       transform="translate(-0.16277917,13.22917)">
+      <rect
+         style="fill:#f6d5ff;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121"
+         width="333.375"
+         height="13.229167"
+         x="2.645833"
+         y="142.875"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="169.49611"
+         y="153.45833"
+         id="text18003"><tspan
+           id="tspan18001"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="169.49611"
+           y="153.45833"
+           sodipodi:role="line">at-spi-registryd</tspan></text>
+    </g>
+    <g
+       id="g5515">
+      <rect
+         style="fill:#ffeeaa;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3"
+         width="105.83333"
+         height="13.229178"
+         x="8.2398052"
+         y="79.374985"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="60.838665"
+         y="89.958351"
+         id="text18003-6"><tspan
+           id="tspan18001-7"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="60.838665"
+           y="89.958351"
+           sodipodi:role="line">atk-adaptor</tspan></text>
+    </g>
+    <g
+       id="g5520"
+       transform="translate(-1.6999953e-6,-29.104157)">
+      <rect
+         style="fill:#ffeeaa;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-50-3"
+         width="58.208332"
+         height="13.229176"
+         x="134.9375"
+         y="108.47916"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="164.04167"
+         y="119.0625"
+         id="text18003-6-36-6"><tspan
+           id="tspan18001-7-1-7"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="164.04167"
+           y="119.0625"
+           sodipodi:role="line">libatspi</tspan></text>
+    </g>
+    <g
+       id="g3366"
+       transform="translate(2.6458247,13.229155)">
+      <rect
+         style="fill:#ffeeaa;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-9"
+         width="57.906025"
+         height="13.229162"
+         x="132.59398"
+         y="47.625004"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="161.59608"
+         y="58.208332"
+         id="text18003-6-31"><tspan
+           id="tspan18001-7-9"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="161.59608"
+           y="58.208332"
+           sodipodi:role="line">pyatspi2</tspan></text>
+    </g>
+    <g
+       id="g3549"
+       transform="translate(-2.8148834e-6,15.875009)">
+      <rect
+         style="fill:#ffeeaa;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-9-6"
+         width="333.375"
+         height="13.229166"
+         x="2.6458361"
+         y="116.41666"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="169.49095"
+         y="127.00001"
+         id="text18003-6-31-7"><tspan
+           id="tspan18001-7-9-5"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="169.49095"
+           y="127.00001"
+           sodipodi:role="line">dbus-daemon</tspan></text>
+    </g>
+    <g
+       id="g5510">
+      <rect
+         style="fill:#ffeeaa;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5"
+         width="105.83333"
+         height="13.229166"
+         x="8.2398052"
+         y="60.854164"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="60.854168"
+         y="71.4375"
+         id="text18003-6-3"><tspan
+           id="tspan18001-7-5"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="60.854168"
+           y="71.4375"
+           sodipodi:role="line">atk</tspan></text>
+    </g>
+    <g
+       id="g72755"
+       transform="translate(50.270837,-203.72916)">
+      <g
+         id="g71246"
+         transform="translate(26.458337,5.2916587)">
+        <rect
+           style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#afe9af;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+           id="rect121-3-5-9-9"
+           width="37.041672"
+           height="13.229172"
+           x="132.29166"
+           y="206.375"
+           rx="0"
+           ry="0" />
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="150.51019"
+           y="216.95833"
+           id="text18003-6-3-22-7"><tspan
+             id="tspan18001-7-5-8-3"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+             x="150.51019"
+             y="216.95833"
+             sodipodi:role="line">Odilia</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g5500">
+      <rect
+         style="fill:#afdde9;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5-6-7"
+         width="31.750002"
+         height="13.229173"
+         x="82.020836"
+         y="7.9375"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="97.895836"
+         y="18.520836"
+         id="text18003-6-3-2-92"><tspan
+           id="tspan18001-7-5-9-0"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="97.895836"
+           y="18.520836"
+           sodipodi:role="line">GTK3</tspan></text>
+    </g>
+    <g
+       id="g5490">
+      <rect
+         style="fill:#afdde9;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5-6-06"
+         width="37.041668"
+         height="13.229168"
+         x="7.9374971"
+         y="26.458334"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="26.458336"
+         y="37.041668"
+         id="text18003-6-3-2-26"><tspan
+           id="tspan18001-7-5-9-1"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="26.458336"
+           y="37.041668"
+           sodipodi:role="line">Firefox</tspan></text>
+    </g>
+    <g
+       id="g5495">
+      <rect
+         style="fill:#afdde9;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5-6-06-3"
+         width="63.499996"
+         height="13.229169"
+         x="50.270832"
+         y="26.458338"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="82.020836"
+         y="37.041668"
+         id="text18003-6-3-2-26-7"><tspan
+           id="tspan18001-7-5-9-1-5"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="82.020836"
+           y="37.041668"
+           sodipodi:role="line">LibreOffice</tspan></text>
+    </g>
+    <g
+       id="g5505">
+      <rect
+         style="fill:#afdde9;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5-6-06-3-7"
+         width="68.791664"
+         height="13.229165"
+         x="7.9374986"
+         y="7.937501"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="42.333332"
+         y="18.520832"
+         id="text18003-6-3-2-26-7-8"><tspan
+           id="tspan18001-7-5-9-1-5-4"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="42.333336"
+           y="18.520832"
+           sodipodi:role="line">gnome-shell</tspan></text>
+    </g>
+    <g
+       id="g6438"
+       transform="translate(50.27084)">
+      <rect
+         style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#37abc8;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264583;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+         id="rect3573-3"
+         width="79.375"
+         height="42.333332"
+         x="206.375"
+         y="2.6458333"
+         rx="0"
+         ry="4.6139526e-08" />
+      <rect
+         style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#afdde9;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+         id="rect121-3-5-6"
+         width="31.750002"
+         height="13.229173"
+         x="211.66666"
+         y="7.9374952"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="227.54166"
+         y="18.52083"
+         id="text18003-6-3-2"><tspan
+           id="tspan18001-7-5-9"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="227.54166"
+           y="18.52083"
+           sodipodi:role="line">GTK4</tspan></text>
+      <rect
+         style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#afdde9;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+         id="rect121-3-5-6-1"
+         width="31.750002"
+         height="13.229173"
+         x="248.70833"
+         y="7.9374952"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="264.58334"
+         y="18.52083"
+         id="text18003-6-3-2-2"><tspan
+           id="tspan18001-7-5-9-7"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="264.58334"
+           y="18.52083"
+           sodipodi:role="line">Qt5</tspan></text>
+      <rect
+         style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#afdde9;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+         id="rect121-3-5-6-0"
+         width="42.333324"
+         height="13.229163"
+         x="224.89581"
+         y="26.458323"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="246.06248"
+         y="37.041664"
+         id="text18003-6-3-2-9"><tspan
+           id="tspan18001-7-5-9-3"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="246.06248"
+           y="37.041664"
+           sodipodi:role="line">WebKit</tspan></text>
+    </g>
+    <rect
+       style="fill:#2ca02c;stroke:#000000;stroke-width:0.529167;stroke-dashoffset:0.264583"
+       id="rect3573-3-5"
+       width="68.791664"
+       height="42.333332"
+       x="129.64583"
+       y="2.6458333"
+       rx="0"
+       ry="4.6139526e-08" />
+    <g
+       id="g8221"
+       transform="translate(12.926873,-1.6789301e-5)">
+      <rect
+         style="fill:#afe9af;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5-9"
+         width="31.75"
+         height="13.229164"
+         x="135.23979"
+         y="7.9375167"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="150.81248"
+         y="18.52083"
+         id="text18003-6-3-22"><tspan
+           id="tspan18001-7-5-8"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="150.81248"
+           y="18.52083"
+           sodipodi:role="line">Orca</tspan></text>
+    </g>
+    <g
+       id="g5525">
+      <rect
+         style="fill:#afe9af;stroke:#000000;stroke-width:0.529167;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1"
+         id="rect121-3-5-9-6"
+         width="58.20834"
+         height="13.229164"
+         x="135.23979"
+         y="26.458349"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:21.1667px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="164.04166"
+         y="37.041664"
+         id="text18003-6-3-22-1"><tspan
+           id="tspan18001-7-5-8-2"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;text-anchor:middle;stroke-width:0.264583px"
+           x="164.04166"
+           y="37.041664"
+           sodipodi:role="line">Accerciser</tspan></text>
+    </g>
+    <g
+       id="g34790"
+       transform="translate(169.26871,2.6458311)">
+      <rect
+         style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+         id="rect6957-6"
+         width="5.2916665"
+         height="10.583333"
+         x="39.6875"
+         y="174.625"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.9375px;line-height:15.875px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="47.625"
+         y="182.5625"
+         id="text17035"><tspan
+           sodipodi:role="line"
+           id="tspan17033"
+           style="font-size:7.9375px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px"
+           x="47.625"
+           y="182.5625">in-process</tspan></text>
+    </g>
+    <g
+       id="g46909"
+       transform="translate(5.4249766)">
+      <rect
+         style="font-variation-settings:normal;vector-effect:none;fill:#ffeeaa;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+         id="rect3573-8-7"
+         width="58.208313"
+         height="10.583325"
+         x="134.9375"
+         y="177.27083"
+         rx="0"
+         ry="4.6139526e-08" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.9375px;line-height:15.875px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="164.03391"
+         y="185.20833"
+         id="text17035-7"><tspan
+           sodipodi:role="line"
+           id="tspan17033-5"
+           style="font-size:7.9375px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px"
+           x="164.03391"
+           y="185.20833">glue</tspan></text>
+    </g>
+    <g
+       id="g46904"
+       transform="translate(-5.2250091)">
+      <rect
+         style="font-variation-settings:normal;vector-effect:none;fill:#afe9af;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+         id="rect3573-8-9"
+         width="58.208336"
+         height="10.583336"
+         x="76.729164"
+         y="177.27083"
+         rx="0"
+         ry="4.6139526e-08" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.9375px;line-height:15.875px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="105.83333"
+         y="185.20833"
+         id="text17035-9"><tspan
+           sodipodi:role="line"
+           id="tspan17033-2"
+           style="font-size:7.9375px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px"
+           x="105.83333"
+           y="185.20833">assistive tech</tspan></text>
+    </g>
+    <g
+       id="g34795"
+       transform="translate(174.62496,2.6458311)">
+      <rect
+         style="font-variation-settings:normal;vector-effect:none;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+         id="rect6957-7-6-1"
+         width="5.2916665"
+         height="10.583333"
+         x="92.604172"
+         y="174.625"
+         rx="0"
+         ry="0" />
+      <text
+         xml:space="preserve"
+         style="font-size:7.9375px;line-height:15.875px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         x="100.54169"
+         y="182.5625"
+         id="text17035-2"><tspan
+           sodipodi:role="line"
+           id="tspan17033-0"
+           style="font-size:7.9375px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px"
+           x="100.54169"
+           y="182.5625">context switch!</tspan></text>
+    </g>
+    <g
+       id="g46899"
+       transform="translate(-2.6458333)">
+      <g
+         id="g34800"
+         transform="translate(-142.55777,2.6458158)">
+        <rect
+           style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#afdde9;fill-opacity:1;stroke:#000000;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.0700044;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
+           id="rect3573-8"
+           width="58.208328"
+           height="10.583333"
+           x="147.84944"
+           y="174.62502"
+           rx="0"
+           ry="4.6139526e-08" />
+        <text
+           xml:space="preserve"
+           style="font-size:7.9375px;line-height:15.875px;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="177.04082"
+           y="182.56252"
+           id="text17035-2-2"><tspan
+             sodipodi:role="line"
+             id="tspan17033-0-3"
+             style="font-size:7.9375px;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px"
+             x="177.04082"
+             y="182.56252">toolkits</tspan></text>
+      </g>
+    </g>
+    <rect
+       style="font-variation-settings:normal;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.264584;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
+       id="rect6957-0-9-5"
+       width="5.2916698"
+       height="5.2916632"
+       x="58.208332"
+       y="74.083336"
+       rx="2.1000001e-06"
+       ry="0" />
+  </g>
+</svg>
diff --git a/devel-docs/architecture.rst b/devel-docs/architecture.rst
new file mode 100644 (file)
index 0000000..43e01d9
--- /dev/null
@@ -0,0 +1,150 @@
+Architecture of the accessibility stack
+=======================================
+
+.. image:: architecture-modules.svg
+  :alt: Block diagram of the accessibility modules and how they communicate with each other, described in the text.
+
+The diagram above shows how the various modules for accessibility
+communicate with each other.  The modules at the top are those with
+which users interact: GUI toolkits for applications and screen
+readers.  The rest of the modules are infrastructure.
+
+The diagram has modules grouped in vertical bands like this:
+
+* Old toolkits: gnome-shell, GTK3, Firefox, and LibreOffice all use
+  atk and atk-adaptor, to talk via DBus, to at-spi-registryd and
+  assistive technologies like screen readers.
+
+* Modern toolkits: GTK4, Qt5, and WebKit talk DBus directly
+  instead of going through atk's intermediary layer.
+
+* Orca and Accerciser (and Dogtail, which is not in the diagram) are
+  the counterpart to the applications; they are the assistive tech
+  that is used to perceive applications.  They use libatspi and
+  pyatspi2 to talk DBus, and to keep a representation of the
+  accessible objects in apps.
+
+* Odilia is a newcomer; it is a screen reader written in Rust, that
+  talks DBus directly.
+
+Modules which are in-process are connected by black bands, for example
+there are black bands in sequence between GTK3, atk, and atk-adaptor.
+The latter two are libraries just linked along with GTK3, so all
+communication between those modules is just in-process function calls.
+
+The diagram has red bands to show where context switches happen when
+communication goes out-of-process, i.e. when applications and screen
+readers communicate.  For example, whenever something happens in
+gnome-shell, there is a context switch to dbus-daemon, and another
+context switch to Orca.  The accessibility protocol is very chatty,
+with a lot of going back and forth, so these context switches probably
+add up — but we don't have profiling information just yet.
+
+Also, some of the modules or layers in each vertical band can probably
+be removed.  For example, as of 2023/Jun/22 there is work being done
+to `remove Orca's use of pyatspi2
+<https://gitlab.gnome.org/GNOME/orca/-/issues/300>`_, and to use the
+atspi library directly.
+
+The following sections describe what happens between **pairs of
+modules**, for example, between atk and atk-adaptor, or between atspi
+and pyatspi2.
+
+Old toolkits that still use atk
+-------------------------------
+
+GTK2, GTK3, gnome-shell, Firefox, Chromium, LibreOffice, and Java
+Swing are made accessible by implementing the GObject interfaces
+defined in atk.
+
+To make a toolkit accessible means adding a way to
+extract information from it in a standard way; you don't want screen
+readers to have separate implementations for GTK, Qt, St, Firefox,
+etc.
+
+For every window, regardless of toolkit, you want to have a
+"list children" method.  For every widget you want "get accessible
+name", so for a button it may tell you "OK button", and for an image
+it may tell you "thumbnail of file.jpg".  For widgets that you can
+interact with, you want "list actions" and "run action X", so a button
+may present an "activate" action, and a check button may present a
+"toggle" action.
+
+Atk and atk-adaptor
+-------------------
+
+However, ATK is just abstract interfaces for the benefit of toolkits.
+We need a way to ship the information extracted from toolkits to
+assistive tech like screen readers.  The atspi protocol is a set of
+DBus interfaces that an application must implement; atk-adaptor is an
+implementation of those DBus interfaces that works by calling atk's
+slightly different interfaces, which in turn are implemented by
+toolkits.  Atk-adaptor also caches some things that it already asked
+to the toolkit, so it doesn't have to ask again unless the toolkit
+notifies about a change.
+
+If this seems like too much translation is going on, that's because it
+is!  One goal in the accessibility overhaul is to remove these
+redundant layers, which grew out of compatibility concerns at various
+points in time.
+
+atk-adaptor, dbus-daemon, and libatspi
+--------------------------------------
+
+So, atk-adaptor ships the information via the DBus daemonf (either the
+original dbus-daemon or newer implementations like dbus-broker).
+What's on the other side?  In the case of Orca it is libatspi, a
+hand-written binding to the DBus interfaces for accessibility.
+
+Libatspi also keeps an internal representation of the information that
+it got shipped from the toolkit.  When Orca asks, "what's the name of
+this widget?", libatspi may already have that information cached.  Of
+course, the first time it does that, it actually goes and asks the
+toolkit via DBus for that information.
+
+libatspi and pyatspi2
+---------------------
+
+But Orca is written in Python, and libatspi is a C library.  Pyatspi2
+is a Python binding for libatspi.  Many years ago we didn't have an
+automatic way to create language bindings, so there is a hand-writtten
+"old API" implemented in terms of the "new API" that is auto-generated
+via GObject Introspection from libatspi.
+
+Pyatspi2 also has a bit of logic which should probably not be there,
+but rather in Orca itself or in libatspi.
+
+Note the `work to remove Orca's use of pyatspi2
+<https://gitlab.gnome.org/GNOME/orca/-/issues/300>`_.  This may allow
+us to remove pyatspi2 from the stack for end-users very soon; it still
+needs to be kept around for developers who use tools like Accerciser,
+which also use pyatspi2.
+
+Screen readers and other Assistive Technologies (ATs)
+-----------------------------------------------------
+
+Finally we get to Orca, a screen reader written in Python.  Orca uses
+speech synthesis to read out loud the names of widgets, their
+available actions, and generally any information that widgets want to
+present to the user.  It also implements hotkeys to navigate between
+elements in the user interface, or a "where am I" function that tells
+you where the current focus is in the widget hierarchy.
+
+ATs that do not use libatspi
+----------------------------
+
+In the diagram, Odilia is the only screen reader that connects
+directly to dbus-daemon instead of going through the legacy layers of
+pyatspi2 and libatspi.  Odilia calls the atspi APIs via DBus directly.
+(Implementation detail: Odilia is written in Rust, and uses zbus as
+its Rust-only implementation of dbus).
+
+Toolkits that do not use atk
+----------------------------
+
+Modern toolkits like GTK4, Qt5, and WebKit call the DBus APIs for
+atspi directly, instead of using atk's intermediate layer.  Their job
+then becomes to translate their own toolkit concepts into atspi
+concepts.  This is in contrast to toolkits which still use atk, which
+must translate their own concepts into atk, and then atk-adaptor
+translates *that* into atspi concepts.
diff --git a/devel-docs/at-spi3.rst b/devel-docs/at-spi3.rst
new file mode 100644 (file)
index 0000000..7cb62f7
--- /dev/null
@@ -0,0 +1,43 @@
+AT-SPI 3 roadmap
+================
+
+Note: this document may be obsolete. See also new-protocol.rst.
+
+This document is a place to collect changes that we should consider for a
+future version of the API.
+
+- Remove ATSPI_COORD_TYPE_SCREEN. It cannot be supported under Wayland.
+
+- Remove the legacy device event controller API. AtspiDevice should handle
+  things related to the keyboard and mouse.
+
+- Eliminate the registry daemon. The new device API no longer uses it for
+  key grabs (except for the existing legacy back end), and the mouse could
+  similarly be handled in-process. Aside from the device event controller,
+  the registry daemon currently keeps a list of applications and registerd
+  events, but querying applications could be done with a DBus signal that
+  applications could then respond to, and applications could similarly
+  query consumers for a list of events that they care about.
+
+- The DBus API for sending events should be reviewed. All events in the
+  `xml/Event.xml` file return items with the same "siiva{sv}" signature
+  when it is not necessary. Take for example "StateChanged", which only
+  uses the first two variables: a string of the state which has been
+  changed, and a signed integer that may be either 1 or 0 depending on
+  if the state has been added or removed. For one thing, it is clear that
+  the second argument for "StateChanged" should be "b" for bool, and
+  secondly the arguments "iva{sv}" do not seem to be used at all for this
+  event, and subsequently could be dropped. This is only the example of
+  one event with issues like this. Nearly every event has a similar case
+  of some unused fields, or fields that don't *exactly* match the
+  semantics of their type sent over DBus.
+
+- ChildCount and GetChildAtIndex could have unsigned arguments (#106).
+
+- For the Collection interface, roles are signed, but they are unsigned
+  elsewhere (#108).
+
+- For the Collection interface, states are signed, but they are unsigned
+  elsewhere (#109).
+
+- The AtspiEventListener API is hard to use and also needs to be reworked.
diff --git a/devel-docs/atk-deprecations.rst b/devel-docs/atk-deprecations.rst
new file mode 100644 (file)
index 0000000..53ad682
--- /dev/null
@@ -0,0 +1,31 @@
+Deprecations in ATK that need work elsewhere
+============================================
+
+``atk_document_get_locale()`` and the corresponding field in the vtable
+``AtkDocumentIface.get_document_locale`` are documented as deprecated
+since 2013 (commit 97880727). However, WebKitGtk still seems to
+implement it; it should use ``AtkObjectClass.get_object_locale``
+instead.
+
+Note that Orca does not seem to use the ``Document.GetLocale`` method
+nor the ``Accessible.Locale`` property, so probably the code above from
+WebKitGtk is not exercised.
+
+AtkValue
+--------
+
+The following methods are deprecated in ``AtkValueIface`` since 2014
+(commit 98838b2a):
+
+-  ``get_current_value`` - replaced with ``get_value_and_text``
+-  ``set_current_value`` - replaced with ``set_value``
+
+And the following are replaced with ``get_range``, which returns an
+``AtkRange`` boxed type:
+
+-  ``get_maximum_value``
+-  ``get_minimum_value``
+-  ``get_minimum_increment``
+
+Firefox still does not implement ``get_range``, ``get_value_and_text``,
+``set_value``. See bug #71.
diff --git a/devel-docs/atspi-python-stack.rst b/devel-docs/atspi-python-stack.rst
new file mode 100644 (file)
index 0000000..456d178
--- /dev/null
@@ -0,0 +1,146 @@
+Libatspi and the Python stack
+=============================
+
+Libatspi is a C library that holds an AT's view of an application's
+tree of accessible objects.  For example, when Orca gets to know about
+an application, it has to build a view of the app's accessible objects
+so it can let the user navigate among them.  Libatspi provides that
+view with a tree-ish data structure.
+
+The Python API for libatspi
+---------------------------
+
+Orca is written in Python, so there is an intermediate layer between
+Libatspi and Orca — that's pyatspi2.  While in principle it could just
+be a language binding generated automatically from GObject
+Introspection data on ``libatspi.so``, in practice it is a
+hand-written wrapper around exactly that kind of
+automatically-generated binding.  Orca predates GObject Introspection;
+instead of changing its code to use the new automatically-generated
+API, pyatspi2 was written/modified to accomodate Orca's use of the
+"old API".
+
+For the purposes of this chapter, we will call the GObject
+Introspection API generated for libatspi the "GI API", and what Orca
+expects and consumes from pyatspi2 the "old API".
+
+Cleaning up the Python stack
+----------------------------
+
+The Python part of the accessibility stack has more or less these components:
+
+- Orca, the screenreader.
+- Pyatspi2, API glue and a little logic.
+- Dogtail, a GUI testing tool built upon the accessibility APIs.
+- Accerciser, a tool for developers.
+
+Pyatspi2 has no CI, but it does have a test suite.  Its repository
+could be merged into at-spi2-core, the same as was done for
+atk/at-spi2-atk.  One detail is that pyatspi2 still uses autotools,
+while at-spi2-core uses meson, but this is a good opportunity to
+change pyatspi2 to meson as well.
+
+Orca has no CI.  It has a substantial test suite whose runner launches
+applications like Firefox or LibreOffice, and runs a bunch of custom
+scripts on them.
+
+I would like to gradually "disappear" pyatspi2 like this:
+
+* Make Orca use the GI API directly, instead of pyatspi2's wrappers.
+  I think a lot of the work to do this is just renaming functions; for
+  example, in the way that pyatspi already does things like
+  ``Atspi.Hyperlink.getObject = Atspi.Hyperlink.get_object`` just for
+  Orca's benefit.  **Update:** This is in progress as of 2023/Jun/14,
+  see `Orca issue #300
+  <https://gitlab.gnome.org/GNOME/orca/-/issues/300>`_.
+
+* If Orca wants to keep running on old versions of the stack, those
+  compatibility wrappers should live in Orca itself, not in pyatspi2.
+  I would prefer it if Orca were released in tandem with at-spi2-core,
+  but I don't know all of Orca's goals for accomodating various systems.
+
+* Some parts of pyatspi2 are not just wrappers, but they have some
+  logic of their own or hold a bit of state on their own.  I'd like to
+  move this logic down to libatspi, or up into Orca, if possible.
+  Rationale: if it's actual logic, don't make it part of the binding;
+  instead make it generally useful in the basic library.  If it's
+  utility code for Orca, make it live in Orca.
+
+You'll note that I have not mentioned Dogtail and Accerciser in the
+points above.  The same work should be done in them, and I think it
+would be useful to make a choice:
+
+* Can we formally consider orca/dogtail/accerciser to be the only
+  supported users of pyatspi2?  That is, can we agree to release them
+  in tandem with at-spi2-core+pyatspi2 while we finish cleaning things
+  up, but not worry about external consumers of the API?
+
+* If there are external consumers of the Python API which we must
+  absolutely keep running, can we let them know how to make the
+  necessary changes?
+
+(I'm trying to reduce the amount of code that the "GNOME accessibility
+team" is expected to keep working at all times.)
+
+Per the discussion in `at-spi2-core !136
+<https://gitlab.gnome.org/GNOME/at-spi2-core/-/merge_requests/136>`,
+these are the reverse dependencies of pyatspi2 in Debian:
+
+* ``accerciser`` - It's in a creaky state; would be good to replace it
+  with something that is not X11-centric.
+* ``autokey-common`` - Only uses the `keyboard listener
+  <https://github.com/autokey/autokey/blob/717f90321b0d4a8053bdb7490ac7ca4e8c086ce9/lib/autokey/interface.py#L1317-L1346>`_,
+  but this is changing in atspi anyway.
+* caribou - It is `archived/read-only
+  <https://gitlab.gnome.org/Archive/caribou>`_ and the last release
+  was `from 2016 <https://download.gnome.org/sources/caribou/0.4/>`_ -
+  probably dead by now.
+* gnome-photos-tests - Only uses dogtail.
+* ibus-speech - Hypra, not open source?
+* ibus-speech-applet - Hypra, not open source?
+* orca - Under discussion in the present document.
+* python3-dogtail - Under discussion in the present document.
+
+At some point we may want to make pyatspi2 emit a deprecation warning,
+when GNOME-owned projects are converted to use the
+gobject-introspected Atspi directly.
+
+Orca's compatibility goals
+--------------------------
+
+Orca has to work in GNOME, MATE, KDE, and basically every other desktop.
+
+Some people update Orca by hand even when they stay on an old distro.
+This is easy to do — Orca can be installed in one's home directory as
+a Python program — but upgrading at-spi2-core and its integrated
+libraries requires superuser privileges.
+
+I'm not sure how to resolve that.  We cannot support everyone's custom
+configuration forever, but maybe we can make it easy for them to get
+distro-like packages with updates.  SUSE's Open Build Service can
+build packages for many distros, or maybe we can find contacts who are
+willing to maintain updated packages or Orca's stack for their old
+distros.
+
+Modern amenities for Orca
+-------------------------
+
+I think this would be a good chance to bring some modern Python 3 amenities to Orca:
+
+* Ruff/Flake8 - various lints and style checks.
+* Automatic code formatting around PEP 8, like we ensure the C style
+  during CI for at-spi2-core.
+* Code coverage reports.  These are especially useful to find obsolete
+  compatibility code.
+* Static and runtime type checks.
+
+If these look like a subset of `Hypermodern Python Cookiecutter
+<https://github.com/cjolowicz/cookiecutter-hypermodern-python>`_, it's
+because they are!
+
+Summary: automate as much as possible of the grunt work that
+maintainers need to do, and have the robots do it for us.  Use tools
+that help us keep a rowdy code base under control.  See if type
+checking can help us catch bugs early.  Make the code easier to
+approach for newcomer by having safety checks everywhere.
+
diff --git a/devel-docs/conf.py b/devel-docs/conf.py
new file mode 100644 (file)
index 0000000..36bd918
--- /dev/null
@@ -0,0 +1,53 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+# sys.path.insert(0, os.path.abspath('.'))
+
+import os
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'Development guide for the accessibility infrastructure'
+copyright = '2022, Federico Mena Quintero'
+author = 'Federico Mena Quintero'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'sphinx_rtd_theme'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
diff --git a/devel-docs/de-controller.rst b/devel-docs/de-controller.rst
new file mode 100644 (file)
index 0000000..0fd07d3
--- /dev/null
@@ -0,0 +1,29 @@
+Notes on the device event controller machinery
+==============================================
+
+In pyatspi2, ``Registry.setReferenceWIndow()`` is misspelled. However,
+that function is never called in Orca or elsewhere, as far as I can
+tell.
+
+This ties down to ``atspi_registry_set_reference_window()``, which just
+calls ``_atspi_mutter_set_reference_window()``. The side effect of that
+is to set the ``ATSPI_MUTTER_DATA.window_id`` and
+``window_id_is_explicit``, but again, those fields never get used in the
+``atspi-mutter.c`` code. I think they were meant to be used in
+``_atspi_mutter_generate_keyboard_event`` or
+``_atspi_mutter_generate_mouse_event``.
+
+Relatedly, ``_atspi_mutter_generate_keyboard_event`` takes a
+``keystring`` argument but it’s not used.
+
+What is incomplete here?
+
+Refactoring plan
+----------------
+
+While the device event controller (DEC) code works for X11, it doesn’t
+work for Wayland because there are no hooks there to sniff the keyboard
+or mouse.
+
+However, the machinery to synthesize events is presumably still useful.
+I’d like to be able to add tests for it.
diff --git a/devel-docs/gitlab-ci.md b/devel-docs/gitlab-ci.md
deleted file mode 100644 (file)
index d7d675e..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-# Gitlab Continuous Integration (CI) for at-spi2-core
-
-Summary: make the robots set up an environment for running the test
-suite, run it, and report back to us.
-
-If you have questions about the CI, mail federico@gnome.org, or [file
-an issue](https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues) and
-mention `@federico` in it.
-
-Table of contents:
-
-[[_TOC_]]
-
-# Quick overview
-
-By having a [`.gitlab-ci.yml`](../.gitlab-ci.yml) file in the toplevel
-directory of a project, Gitlab knows that it must run a continuous
-integration pipeline when certain events occur, for example, when
-someone creates a merge request, or pushes to a branch.
-
-What's a pipeline?  It is an automated version of the following.
-Running the test suite for at-spi2-core involves some repetitive
-steps:
-
-* Create a pristine and minimal environment for testing, without all the random
-  gunk from one's development system.  Gitlab CI uses Linux containers,
-  with pre-built operating system images in the [Open Container
-  Initiative][OCI] format — this is what Docker, Podman, etc. all use.
-
-* Install the build-time dependencies (gcc, meson, libfoo-devel,
-  etc.), the test-time dependencies (dbus-daemon, etc.) in that
-  pristine environment, as well as special tools (lcov, libasan,
-  clang-tools).
-
-* Run the build and install it, and run the test suite.
-
-* Run variations of the build and test suite with other tools — for
-  example, using static analysis during compilation, or with address
-  sanitizer (asan), or with a code coverage tool.  Gitlab can collect
-  the analysis results of each of these tools and present them as part
-  of the merge request that is being evaluated.  It also lets
-  developers obtain those useful results without dealing with a lot of
-  fiddly tools on their own computers.
-  
-Additionally, on each pipeline run we'd like to do extra repetitive
-work like building the reference documentation, and publishing it on a
-web page.
-
-The `.gitlab-ci.yml` file defines the CI pipeline, the jobs it will
-run (build/test, coverage, asan, static-scan, etc.), and the locations
-where each job's artifacts will be stored.
-
-What's an artifact or a job?  Read on!
-
-# A little glossary
-
-**Pipeline** - A collection of **jobs**, which can be run in parallel
-or sequentially.  For example, a pair of "build" and "test" jobs would
-need to run sequentially, but maybe a "render documentation" job can
-run in parallel with them.  Similarly, "build" jobs for various
-distributions or configurations could be run in parallel.
-
-**Job** - Think of it as running a shell script within a container.
-It can have input from other previous jobs: if you have separate
-"build" and "test" jobs, then the "build" job will want to keep around
-its compiled artifacts so that the "test" job can use them.  It can
-provide output artifacts that can be stored for human perusal, or for
-use by other jobs.
-
-**Artifact** - Something produced from a job.  If your job compiles
-binaries, those binaries could be artifacts if you decide to keep them
-around for use later.  A documentation job can produce HTML artifacts
-from the rendered documentation.  A code coverage job will produce a
-coverage report artifact.
-
-**Runner** - An operating system setup for running jobs.
-Gitlab.gnome.org provides runners for Linux, BSD, Windows, and MacOS.
-For example. the Linux runners let you use any OCI image, so you can
-test on openSUSE, Fedora, a custom distro, etc.  You don't normally
-need to be concerned with runners; Gitlab assigns the shared runners
-automatically to your pipeline.
-
-**Container** - You can think of it as a chroot with extra isolation,
-or a lightweight virtual machine.  Basically, the Linux kernel can
-isolate groups of processes in control groups (cgroups).  Each cgroup
-can have a different view of the file system, as if you had a
-different chroot for each cgroup.  Cgroups can be isolated to be in
-their own PID namespace, so running "ps" in the container will not
-show all the processes in the system, but only those inside the
-container's cgroup.  File system overlays allow you to have read-only
-images for the operating system (the OCI images we talked about above)
-plus a read-write overlay that is kept around only during the lifetime
-of a container, or persistently if one wants.  For Gitlab CI one does
-not need to deal with containers directly, but keep in mind that your
-jobs will run inside a container, which is more limited than e.g. a
-shell session on a graphical, development machine.
-
-# The CI pipeline for at-spi2-core
-
-The `.gitlab-ci.yml` file is a more-or-less declarative description
-the CI pipeline, with some `script` sections which are imperative
-commands to actually *do stuff*.
-
-Jobs are run in `stages`, and the names of the stages are declared
-near the beginning of the YAML file.  The stage names are arbitrary;
-the ones here follow some informal GNOME conventions.
-
-Jobs are declared at the toplevel of the YAML file, and they are
-distinguished from other declarations by having a container `image`
-declared for them, as well as a `script` to execute.
-
-Many jobs need exactly the same kind of setup (same container images,
-mostly same package dependencies), so they use `extends:` to use a
-declared template with all that stuff instead of redeclaring it each
-time.  In our configuration, the `.only-default` template has the
-`PROJECT_DEPS`, with the dependencies that most jobs need.  The
-`.build-setup` template is for the analysis jobs, and it lets them
-declare `EXTRA_DEPS` as an environment variable with the names of
-extra dependencies: for example, the coverage job puts `lcov` in
-`EXTRA_DEPS`.  The commands in `before_script` blocks use these
-environment variables to install the package dependencies, for example
-`zypper install -y ${PROJECT_DEPS}` for an openSUSE job.
-
-The `build` stage has these jobs:
-
-* `opensuse-x86_64` - Extends the `.build-default` rule,
-  builds/installs the code, and runs the tests.  Generally this is the
-  job that one cares about during regular development.
-
-The `analysis` stage has these jobs:
-
-* `static-scan` - Runs static analysis during compilation, which
-  performs interprocedural analysis to detect things like double
-  `free()` or uninitialized struct fields across functions.
-  
-* `asan-build` - Builds and runs with Address Sanitizer (libasan).
-
-* `coverage` - Instruments the build to get code coverage information,
-  and runs the test suite to see how much of the code it manages to
-  exercise.  This is to see which code paths may be untested
-  automatically, and to decide which ones would require manual
-  testing, or refactoring to allow automated testing.
-
-As of 2021/Dec/15 there are some commented-out jobs to generate
-documentation and publish it; this needs to be made to work.
-
-# General advice and future work
-
-A failed run of a CI pipeline should trouble you; it either means that
-some test broke, or that something is not completely deterministic.
-Fix it at once.
-
-Try not to accept merge requests that fail the CI, as this will make
-`git bisect` hard in the future.  There are tools like Marge-bot to
-enforce this; ask federico@gnome.org about it.  Read ["The Not Rocket
-Science Rule Of Software
-Engineering"](https://graydon.livejournal.com/186550.html), which can
-be summarized as "automatically maintain a repository of code that
-always passes all the tests" for inspiration.  Marge-bot is an
-implementation of that, and can be used with Gitlab.
-
-If your software can be configured to build with substantial changes,
-the CI pipeline should have jobs that test each of those
-configurations.  For example, at-spi-bus-launcher operates differently
-depending on whether dbus-daemon or dbus-broker are being used.  As of
-2021/Dec/15 the CI only tests dbus-daemon; there should be a test for
-dbus-broker, too.
-
-Although the YAML syntax for `.gitlab-ci.yml` is a bit magic, the
-scripts and configuration are quite amenable to refactoring.  Do it
-often!
-
-Minimizing the amount of time that CI takes to run is a good goal.  It
-reduces energy consumption in the build farm, and allows you to have a
-faster feedback loop.  Instead of installing package dependencies on
-each job, we can move to prebuilt container images.
-
-# References
-
-Full documentation for Gitlab CI: https://docs.gitlab.com/ee/ci/
-
-Introduction to Gitlab CI: https://docs.gitlab.com/ee/ci/quick_start/index.html
-
-at-spi2-core's CI pipeline is mostly [cut-and-pasted from
-libgweather](https://gitlab.gnome.org/GNOME/libgweather/-/blob/main/.gitlab-ci.yml).
-Thanks to Emmanuele Bassi for his advice on how to use it.
-
-[OCI]: https://opencontainers.org/
diff --git a/devel-docs/gitlab-ci.rst b/devel-docs/gitlab-ci.rst
new file mode 100644 (file)
index 0000000..339404b
--- /dev/null
@@ -0,0 +1,287 @@
+Gitlab Continuous Integration (CI) for at-spi2-core
+===================================================
+
+Summary: make the robots set up an environment for running the test
+suite, run it, and report back to us.  Have them also run lints and
+formatters, and get interesting reports for our perusal.
+
+If you have questions about the CI, mail federico@gnome.org, or `file an
+issue <https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues>`__ and
+mention ``@federico`` in it.
+
+Quick overview
+--------------
+
+By having a `.gitlab-ci.yml
+<https://gitlab.gnome.org/GNOME/at-spi2-core/-/blob/main/.gitlab-ci.yml>`_
+file in the toplevel directory of a project, Gitlab knows that it must
+run a continuous integration pipeline when certain events occur, for
+example, when someone creates a merge request, or pushes to a branch.
+
+What’s a pipeline? It is an automated version of the following. Running
+the test suite for at-spi2-core involves some repetitive steps:
+
+-  Create a reproducible environment for testing, without all
+   the random gunk from one’s development system. Gitlab CI uses Linux
+   containers, with pre-built operating system images in the `Open
+   Container Initiative <https://opencontainers.org/>`__ format — this
+   is what Docker, Podman, etc. all use.
+
+-  Install the build-time dependencies (gcc, meson, libfoo-devel, etc.),
+   the test-time dependencies (dbus-daemon, etc.) in that pristine
+   environment, as well as special tools (lcov, libasan, clang-tools).
+
+-  Run the build and install it, and run the test suite.
+
+-  Run variations of the build and test suite with other tools — for
+   example, using static analysis during compilation, or with address
+   sanitizer (asan), or with a code coverage tool. Gitlab can collect
+   the analysis results of each of these tools and present them as part
+   of the merge request that is being evaluated. It also lets developers
+   obtain those useful results without dealing with a lot of fiddly
+   tools on their own computers.
+
+Additionally, on each pipeline run we’d like to do extra repetitive work
+like building the reference documentation, and publishing it on a web
+page.
+
+The ``.gitlab-ci.yml`` file defines the CI pipeline, the jobs it will
+run (build/test, coverage, asan, static-scan, etc.), and the locations
+where each job’s artifacts will be stored.
+
+What’s an artifact or a job? Read on!
+
+A little glossary
+-----------------
+
+**Pipeline** - A collection of **jobs**, which can be run in parallel or
+sequentially. For example, a pair of “build” and “test” jobs would need
+to run sequentially, but maybe a “render documentation” job can run in
+parallel with them. Similarly, “build” jobs for various distributions or
+configurations could be run in parallel.
+
+**Job** - Think of it as running a shell script within a container. It
+can have input from other previous jobs: if you have separate “build”
+and “test” jobs, then the “build” job will want to keep around its
+compiled artifacts so that the “test” job can use them. It can provide
+output artifacts that can be stored for human perusal, or for use by
+other jobs.
+
+**Artifact** - Something produced from a job. If your job compiles
+binaries, those binaries could be artifacts if you decide to keep them
+around for use later. A documentation job can produce HTML artifacts
+from the rendered documentation. A code coverage job will produce a
+coverage report artifact.
+
+**Runner** - An operating system setup for running jobs.
+Gitlab.gnome.org provides runners for Linux, BSD, Windows, and MacOS.
+For example. the Linux runners let you use any OCI image, so you can
+test on openSUSE, Fedora, a custom distro, etc. You don’t normally need
+to be concerned with runners; Gitlab assigns the shared runners
+automatically to your pipeline.
+
+**Container** - You can think of it as a chroot with extra isolation, or
+a lightweight virtual machine. Basically, the Linux kernel can isolate
+groups of processes in control groups (cgroups). Each cgroup can have a
+different view of the file system, as if you had a different chroot for
+each cgroup. Cgroups can be isolated to be in their own PID namespace,
+so running “ps” in the container will not show all the processes in the
+system, but only those inside the container’s cgroup. File system
+overlays allow you to have read-only images for the operating system
+(the OCI images we talked about above) plus a read-write overlay that is
+kept around only during the lifetime of a container, or persistently if
+one wants. For Gitlab CI one does not need to deal with containers
+directly, but keep in mind that your jobs will run inside a container,
+which is more limited than e.g. a shell session on a graphical,
+development machine.
+
+The CI pipeline for at-spi2-core
+--------------------------------
+
+The ``.gitlab-ci.yml`` file is a more-or-less declarative description
+the CI pipeline, with some ``script`` sections which are imperative
+commands to actually *do stuff*.
+
+Jobs are run in ``stages``, and the names of the stages are declared
+near the beginning of the YAML file. The stage names are arbitrary; the
+ones here follow some informal GNOME conventions.
+
+Jobs are declared at the toplevel of the YAML file, and they are
+distinguished from other declarations by having a container ``image``
+declared for them, as well as a ``script`` to execute.
+
+Many jobs need exactly the same kind of setup (same container images,
+mostly same package dependencies), so they use ``extends:`` to use a
+declared template with all that stuff instead of redeclaring it each
+time.
+
+The ``container-build`` stage builds container images with the
+reproducible environments described above.  See the :ref:`ci_templates`
+below for details.
+
+The ``style-check`` stage runs a code formatter to ensure that new
+code preserves the coding style.  It does not modify your code;
+instead the job will fail if your code does not match the rest of the
+coding style, so you can fix it.  See :ref:`code_formatting` for details.
+
+The ``build`` stage has these jobs:
+
+-  ``opensuse-x86_64`` - Extends the ``.only-default`` rule,
+   builds/installs the code, and runs the tests. Generally this is the
+   job that one cares about during regular development.
+
+-  ``fedora-x86_64`` - Same as the previous job, but runs on Fedora
+   instead of openSUSE. The intention is to run the build configuration
+   for ``dbus-broker`` here instead of ``dbus-daemon``.
+
+The ``analysis`` stage has these jobs:
+
+-  ``static-scan`` - Runs static analysis during compilation, which
+   performs interprocedural analysis to detect things like double
+   ``free()`` or uninitialized struct fields across functions.
+
+-  ``asan-build`` - Builds and runs with Address Sanitizer (libasan).
+
+-  ``coverage`` - Instruments the build to get code coverage
+   information, and runs the test suite to see how much of the code it
+   manages to exercise. This is to see which code paths may be untested
+   automatically, and to decide which ones would require manual testing,
+   or refactoring to allow automated testing.
+
+Finally, the ``docs`` stage builds documentation:
+
+- ``reference`` - Public API reference.
+
+- ``devel-docs`` - Development guide for the accessibility internals,
+   including the document you are reading right now.
+
+
+.. _ci_templates:
+
+CI templates
+------------
+
+The task of setting up a container image to do CI for a particular
+distro or build configuration is rather repetitive. One has to start
+with a “bare” distro image, then install the build-time dependencies
+that your project requires, which is slow; then you want to test
+another distro, then you want to make those container images easily
+available to your project’s forks, and then you start pulling your
+hair.
+
+`Fredesktop CI
+Templates <https://gitlab.freedesktop.org/freedesktop/ci-templates/>`__
+(`documentation <https://freedesktop.pages.freedesktop.org/ci-templates/>`__)
+are a solution to this. They can automatically build container images
+for various distros, make them available to forks of your project, and
+have some nice amenities to reduce the maintenance burden.
+
+At-spi2-core uses CI templates to test its various build configurations,
+since it actually works differently depending on a distro’s choice of
+``dbus-daemon`` versus ``dbus-broker``.
+
+The prebuilt container images are stored here:
+https://gitlab.gnome.org/GNOME/at-spi2-core/container_registry
+
+They get updated automatically thanks to the CI Templates machinery.
+
+.. _code_formatting:
+
+Code formatting
+---------------
+
+The C coding style is enforced via `clang-format
+<https://clang.llvm.org/docs/ClangFormat.html>`_ and a 
+`.clang-format
+<https://gitlab.gnome.org/GNOME/at-spi2-core/-/blob/main/.clang-format>`_
+configuration file (`docs on configuration
+<https://clang.llvm.org/docs/ClangFormatStyleOptions.html>`_).
+
+The ``style-check-diff`` job in CI will fail if you put in new code
+that does not match what ``clang-format`` would do for it.  You must
+fix your code by hand; it is not re-indented automatically to give you
+a chance to selectively opt-out of formatting some chunks of code.
+
+To format a whole file, run ``clang-format -i some_file.c``.  The
+``-i`` option means "in place"; with it the file will be overwritten,
+otherwise clang-format will write to standard output.
+
+You can prevent a chunk of code from being changed with comments like
+the following, for example, for a struct initializer:
+
+.. code:: c
+
+   /* clang-format off */
+
+   static MyStruct some_array[] = {
+     { "a",            42, "b"        },
+     { "long string",   0, "blahblah" },
+     { "etc etc",     -42, ""         },
+   };
+
+   /* clang-format on */
+
+Note that **clang-format likes to re-order includes alphabetically**
+within chunks separated by blank lines:
+
+.. code:: c
+
+   #include <dbus/dbus.h>
+   
+   #include "de-marshaller.h"
+   #include "de-types.h"
+   #include "keymasks.h"
+   #include "paths.h"
+   
+   #include "deviceeventcontroller.h"
+   #include "introspection.h"
+   #include "reentrant-list.h"
+
+Here, each of the three groups of includes will be sorted
+independently.  You can fix your header files so that the order of
+inclusion doesn't matter, or separate them out with blank lines to
+enforce ordering.
+
+General advice and future work
+------------------------------
+
+A failed run of a CI pipeline should trouble you; it either means that
+some test broke, or that something is not completely deterministic. Fix
+it at once.
+
+Try not to accept merge requests that fail the CI, as this will make
+``git bisect`` hard in the future. There are tools like Marge-bot to
+enforce this; ask federico@gnome.org about it. Read `“The Not Rocket
+Science Rule Of Software
+Engineering” <https://graydon.livejournal.com/186550.html>`__, which can
+be summarized as “automatically maintain a repository of code that
+always passes all the tests” for inspiration. Marge-bot is an
+implementation of that, and can be used with Gitlab.
+
+If your software can be configured to build with substantial changes,
+the CI pipeline should have jobs that test each of those configurations.
+For example, at-spi-bus-launcher operates differently depending on
+whether ``dbus-daemon`` or ``dbus-broker`` are being used. As of
+2022/Apr/19 the CI only tests ``dbus-daemon``; there should be a test
+for dbus-broker, too, in the ``fedora-x86_64`` job since that is one of
+the distros that uses ``dbus-broker``.
+
+Although the YAML syntax for ``.gitlab-ci.yml`` is a bit magic, the
+scripts and configuration are quite amenable to refactoring. Do it
+often!
+
+Minimizing the amount of time that CI takes to run is a good goal. It
+reduces energy consumption in the build farm, and allows you to have a
+faster feedback loop. Instead of installing package dependencies on each
+job, we can move to prebuilt container images.
+
+References
+----------
+
+Full documentation for Gitlab CI: https://docs.gitlab.com/ee/ci/
+
+Introduction to Gitlab CI:
+https://docs.gitlab.com/ee/ci/quick_start/index.html
+
+Freedesktop CI templates:
+https://gitlab.freedesktop.org/freedesktop/ci-templates/
diff --git a/devel-docs/index.rst b/devel-docs/index.rst
new file mode 100644 (file)
index 0000000..6c0178c
--- /dev/null
@@ -0,0 +1,44 @@
+Development guide for the accessibility infrastructure
+======================================================
+
+.. toctree::
+   :caption: For toolkit implementors
+   :maxdepth: 1
+
+   toolkits
+   atk-deprecations
+   xml-changes
+   xml-interfaces
+
+.. toctree::
+   :caption: Roadmap and Design Documents
+   :maxdepth: 1
+
+   architecture
+   roadmap
+   at-spi3
+   atspi-python-stack
+   de-controller
+   new-protocol
+
+.. toctree::
+   :caption: Meeting minutes
+   :maxdepth: 1
+
+   meeting-2023-01-13
+
+.. toctree::
+   :caption: Info for Maintainers
+   :maxdepth: 1
+
+   gitlab-ci
+             
+
+Welcome to the developer's guide for the freedesktop accessibility
+infrastructure.  This guide intends to become a repository of
+knowledge on the implementation of the accessibility infrastructure,
+as well as a guide for application developers and toolkit developers
+who want to make their user interfaces accessible.
+
+If you want to modify this document, `please see its source code
+<https://gitlab.gnome.org/GNOME/at-spi2-core/-/tree/main/devel-docs>`_.
diff --git a/devel-docs/meeting-2023-01-13.rst b/devel-docs/meeting-2023-01-13.rst
new file mode 100644 (file)
index 0000000..24822de
--- /dev/null
@@ -0,0 +1,157 @@
+Meeting minutes, 2023/Jan/13
+============================
+
+Attendees
+---------
+
+- bgt lover
+- Emmanuele Bassi
+- Federico Mena Quintero
+- Matt Campbell
+- Mike Gorse
+- Samuel Thibault
+
+- Didier Spaier (listening only)
+- Melody (listening only)
+
+
+Agenda
+------
+
+* Introductions
+* Orca hotkeys for Wayland/GTK4
+* pyatspi2 / orca integration plans
+
+
+Some pre-meeting links from from Samuel Thibault
+------------------------------------------------
+
+- https://gitlab.gnome.org/GNOME/gtk/-/issues/1739 original discussion within gtk
+- https://wiki.gnome.org/Hackfests/GTK2020/Notes notes during the 2020 gtk meeting
+- https://bugzilla.gnome.org/show_bug.cgi?id=649559#c3 discussion on shortcomings of the current at-spi events
+- https://gitlab.freedesktop.org/whot/macrod/ an example of macro daemon written by Peter Hutterer himself
+- https://gitlab.gnome.org/GNOME/mutter/-/issues/9 the issue in mutter
+- https://www.freedesktop.org/wiki/Accessibility/Input/ more general notes on input needs
+- https://www.freedesktop.org/wiki/Accessibility/GTK-a11y-revamp/ more general notes on the gtk a11y revamp
+- https://www.freedesktop.org/wiki/Accessibility/Wayland/ more general notes on wayland
+
+
+Minutes
+-------
+
+**Introductions:**
+
+* Federico - helping with CI, writing tests, code cleanup / refactoring, making things easier for the real devs
+* Matt - AccessKit (Rust abstraction over linux/macos/windows accessibility APIs), wants to get input handling solved
+* bgt lover (Alberto) - Odilia screen reader, general interest in how accessibility works
+* Mike - atspi maintainer, ported it to DBus, worked with Mark Doffman from Codethink.  Working on the keyboard issue.
+* Samuel - working on accessibility for 20 years, touching many layers of the stack, maintaining speech-dispatcher.
+* Emmanuele - GTK, author of accessibility API in GTK4, mostly working on other things right now
+
+___
+
+**Orca, keyboard handling, Wayland/GTK4:**
+
+Mike - has a MR against mutter, pinged Garnacho to review it.  Sets up a DBus interface that clients can connect to to grab keys.  May need turning into a Wayland protocol; Mike wasn't sure if that would be controversial.  Maybe write a proposal and see how things go.  Someone was ready to make a similar change for KDE (orca #285).  bgt lover had an idea for authentication in a Wayland protocol. 
+
+Matt - would like to go with whatever is more likely to ship sooner.  Remember that this is between the AT and compositor, not apps.
+
+bgt lover - we need a protocol for mutter/kwin/whatever.  Agrees with Matt that it is something between the AT and the compositor, not the apps.  Some details on proposed portal protocol (FIXME, bgt lover posted them on matrix, will paste on freedesktop wiki).
+
+Emmanuele - this should not need a portal; ATs are privileged anyway.  A Wayland protocol is fine; ATs can probably talk to the compositor using libwayland or whatever.  We are ignoring X11 at this point.  If you want a shim for X11, this basically removes Wayland from the picture and means you may have to use DBus.
+
+Matt - we already have a solution for X11 thanks to Mike; this can ship right away for gnome 44 and then we can get the Wayland solution right.
+
+Mike - do we also need a Wayland protocol to handle authentication?
+
+Matt - ATs and screen readers are installed on the system, not as flatpaks.  We already had this exact discussion at Microsoft for the Windows screen readers.
+
+Emmanuele - the compositor can decide whether to talk to an AT or not anyway.  Any input method talks to the compositor right now via the Wayland protocol.
+
+bgt lover - what if a malicious thing wants to present itself as a screen reader?
+
+Emmanuele - it means the user or the OS installed it.  For example, GNOME has standardised on ibus as *the* input method, and it is a privileged component.  Anything that talks to the compositor is a privileged component.
+
+Matt - does the compositor have a hardcoded list of privileged components; do downstream distributors have to patch it to allow other components?
+
+Emmanuele - no, it means you would have to go through an official rpm/deb to install odilia or other components.  Not as a flatpak, since those are sandboxed.  The theory is that distros test the component and guarantee that it works.
+
+Matt - this is hard for Odilia, since it hasn't built a user base yet, so what if they want to provide their own package?
+
+Mike - from old hackfest notes - there was talk about seeing whether things are in /usr/local/bin and then they are automatically trusted
+
+Emmanuele - the compositor can decide if a peer that is connecting to it via the Wayland socket has access to functionality.
+
+Samuel - would this be through PolicyKit?
+
+Emmanuele - it *is* problematic to say that if you connect to the compositor, you can get key events.  However, we don't have a mechanism to do authentication or privilege escalation via Wayland.  PolicyKit is all DBus - it gives you a token, and then you could use that token to talk to the compositor
+
+bgt lover - just accept the permissions if the user installed it
+
+Emmanuele - it's a bootstrapping problem; if you don't have a screen reader you cannot interact anyway to ask the user whether something has authorization.
+
+Samuel - the compositor could implement by hand (e.g. pre-recorded) a very basic accessible way to ask the question, that doesn't need a screen reader
+
+Federico - we can probably punt the more general problem of authorization-in-Wayland until later, and get screen readers working for now
+
+Federico - is this related to gnome-control-center/gnome-settings-daemon's hotkeys?
+
+Matt - watching keys is different from grabbing.  E.g. Orca needs to be able to stop speech when a key is pressed; this is not covered by the current mechanism for hotkeys.  Also, screen readers needs non-standard modifiers, like Insert or Caps Lock.  Also, dynamically grabbing/ungrabbing keys as the context changes.  Or Orca+H where it "grabs all the keys" so it gets into Learn mode, and you exit it with Esc.
+
+Sam - In GTK3 it was sending the watch events to Orca synchronously, waiting for an answer from Orca before processing the event. That was making the whole desktop really slower. For watches, it doesn't actually need to be synchronous, it can be handled asynchronously, it's just an event.
+
+bgt lover - it's not just the keyboard, it can also be the mouse or something else, like when flicking left/right on a touch screen
+
+Sam - doing it from the toolkit with confirmation from Orca on each event makes everything slow
+
+Matt - mouse events can probably just be a watching thing (asynchronous). For gestures, it should probably be on a registration base, to tell ahead which ones should be passed to the screen reader
+
+(Some discussion of awkward behavior in other platforms, and how we don't want to replicate that for Linux)
+
+Sam - The grabbing could be dynamic, depending on the mode. Normally you'd only have capslock/insert grabbed. In help mode you'd grab all the keyboard
+
+Matt - per Wayland's wish to keep frames perfect - maybe have a list of changes to keygrabs so they can be handled atomically, without intermediate states
+
+Sam - a grabbed-key event could be synchronously acked by the AT along a list of grab adds/dels, so that grabbing updates can be atomic with the grabbed-key event
+
+Emmanuele - needs to leave; will read notes later
+
+To-do: post link to the Wayland book that bgt lover talked about - https://wayland-book.com/
+
+___
+
+**pyatspi2 / orca integration plans:**
+
+Merge pytaspi2 into at-spi2-core, like other other modules, and release Orca and at-spi2-core in tandem.
+
+Matt assumes that the X11 changes can be done so Orca can use them.
+
+Federico is not sure how much accerciser is used these days.
+
+Sam - it's indeed easier to tell people to use it for reproducing an issue in an app, than teaching them to use a scren reader (even if ideally all devs learnt that)
+
+Federico: wondering how to communicate with projects like Firefox, WebKit, Chromium about things we find along the way; so far, taking notes and putting them in the development guide for at-spi2-core, with the intention of finding the right people and pointing them at those documents, but haven't been filing bugs in the respective bug trackers. Also, the XML interfaces: have been trying to coordinate the C code with the XML while writing tests for C code to increase code coverage, but not everything is covered yet, so haven't gone through all the code yet. You can write the XML interfaces for D-Bus, but the demarshalers are written by hand, so you have to coordinate them by hand with the XML; haven't found a way to do that automatically. Even if we port things to GDBus (trying to do), GDBus code generator writes method signatures for you, but it doesn't handle things like the super long signatures we have for some methods. Don't think the GDBus code generator writes that out into C structs or something you can use directly. Wonder how to solve that, like split those arguments with super long signatures into finer-grained arguments. Like to have something that if we change the XML signature, it will emit a compile error if the code hasn't been changed.
+
+Federico: Haven't found a way to automatically guarantee that argument signatures from the XML DBus interfaces match the C code or the marshallers.  I want a compile error if the long signatures like type="a((so)(so)(so)iiassusau)" get changed and don't match what the code expects.  Maybe zbus in Rust can do that?
+
+bgt lover: yes, zbus can help
+
+Federico: That gives me an excuse to start porting at least the marshaling code to Rust, and maybe port the C logic later.
+
+___
+
+**Final comments:**
+
+Matt: what do we need to get the X11 solution shipped in at-spi2-core and Orca?
+
+Mike: the code is in the latest release in at-spi2-core; just need the Orca part merged and tested.
+
+Mike: some people in orca-list do test the latest versions, so we can ask them to test the merged code once it lands
+
+Federico - can we remove the old key code from at-spi2-core ?
+
+Mike - probably nobody is using it any more indeed ?
+
+---
+
+Meeting adjourned.
diff --git a/devel-docs/meson.build b/devel-docs/meson.build
new file mode 100644 (file)
index 0000000..18f391a
--- /dev/null
@@ -0,0 +1,93 @@
+gdbus_codegen = find_program('gdbus-codegen',
+                             native: true,
+                             required: get_option('docs'))
+
+sphinx_build = find_program('sphinx-build',
+                            native: true,
+                            required: get_option('docs'))
+
+# Gather the XML files, prefixed by the "xml/" directory name
+# introspection_sources comes from xml/meson.build
+interfaces_xml = []
+foreach i: introspection_sources
+  interfaces_xml += join_paths(meson.project_source_root(), 'xml', i)
+endforeach
+
+# gdbus-codegen can take an dbus.xml file and generate various interfaces
+# from it, named as some_prefix-org.foo.InterfaceName.rst
+# We need an explicit list of those; for example, xml/Event.xml contains
+# various interfaces and so we can't just substitute "xml" for "rst".
+interfaces_rst_sources = [
+  'doc-org.a11y.atspi.Accessible.rst',
+  'doc-org.a11y.atspi.Action.rst',
+  'doc-org.a11y.atspi.Application.rst',
+  'doc-org.a11y.atspi.Cache.rst',
+  'doc-org.a11y.atspi.Collection.rst',
+  'doc-org.a11y.atspi.Component.rst',
+  'doc-org.a11y.atspi.DeviceEventController.rst',
+  'doc-org.a11y.atspi.DeviceEventListener.rst',
+  'doc-org.a11y.atspi.Document.rst',
+  'doc-org.a11y.atspi.EditableText.rst',
+  'doc-org.a11y.atspi.Event.Document.rst',
+  'doc-org.a11y.atspi.Event.Focus.rst',
+  'doc-org.a11y.atspi.Event.Keyboard.rst',
+  'doc-org.a11y.atspi.Event.Mouse.rst',
+  'doc-org.a11y.atspi.Event.Object.rst',
+  'doc-org.a11y.atspi.Event.Terminal.rst',
+  'doc-org.a11y.atspi.Event.Window.rst',
+  'doc-org.a11y.atspi.Hyperlink.rst',
+  'doc-org.a11y.atspi.Hypertext.rst',
+  'doc-org.a11y.atspi.Image.rst',
+  'doc-org.a11y.atspi.Registry.rst',
+  'doc-org.a11y.atspi.Selection.rst',
+  'doc-org.a11y.atspi.Socket.rst',
+  'doc-org.a11y.atspi.Table.rst',
+  'doc-org.a11y.atspi.TableCell.rst',
+  'doc-org.a11y.atspi.Text.rst',
+  'doc-org.a11y.atspi.Value.rst',
+]
+
+# The 'devel-docs/doc' here is a prefix that gdbus-codegen will put in front
+# of the interface names that it finds in the input XML files.
+interfaces_rst = custom_target(
+  'interfaces_rst',
+  input: interfaces_xml,
+  output: interfaces_rst_sources,
+  command: [ gdbus_codegen, '--generate-rst', 'devel-docs/doc', '@INPUT@']
+)
+
+docs_sources = [
+  'architecture.rst',
+  'architecture-modules.svg',
+  'at-spi3.rst',
+  'atk-deprecations.rst',
+  'atspi-python-stack.rst',
+  'conf.py',
+  'de-controller.rst',
+  'gitlab-ci.rst',
+  'index.rst',
+  'meeting-2023-01-13.rst',
+  'new-protocol.rst',
+  'roadmap.rst',
+  'toolkits.rst',
+  'xml-changes.rst',
+  'xml-interfaces.rst',
+]
+
+# sphinx-build(1) does not seem to easily support generated files in the build directory.
+# So, we'll copy all the source files from the source directory to the build directory,
+# and just do the build from there.
+copied_docs_sources = []
+foreach i: docs_sources
+  copied_docs_sources += configure_file(copy: true, input: i, output: i)
+
+  # When we bump meson to 0.64 or later, replace the line above with this:
+  # copied_docs_sources += fs.copyfile(i)
+endforeach
+
+custom_target(
+  'devel_docs',
+  input: copied_docs_sources + interfaces_rst,
+  output: 'html',
+  command: [ sphinx_build, meson.current_build_dir(), '@OUTPUT@' ],
+)
diff --git a/devel-docs/new-protocol.rst b/devel-docs/new-protocol.rst
new file mode 100644 (file)
index 0000000..418449b
--- /dev/null
@@ -0,0 +1,229 @@
+Next-generation accessibility architecture
+==========================================
+
+This is a high-level overview of a proposed next-generation accessibility
+architecture for free software platforms.
+
+Goals
+-----
+
+- Sandboxing support.
+
+- Window system independence in the core, with Wayland integration layered on
+  top.
+
+- Minimal impact on performance and resource usage when assistive technologies
+  are not active.
+
+- Low latency, especially when assistive technologies are responding to user
+  commands.
+
+- Efficient support for assistive technologies that need to traverse the whole
+  accessibility tree; we must not assume that we know what specific access
+  patterns ATs will need.
+
+- Network transparency with reasonable performance, enabling accessible remote
+  desktops, something that even proprietary platforms generally don't support.
+
+- Support for one-to-many use cases, both live and pre-recorded, such as
+  accessible screencasts and screenshots; no platform does this yet.
+
+Terminology
+-----------
+
+This document uses the terms "client" and "provider" as defined by Microsoft's
+UI Automation (UIA) API. Briefly, the applications that are being made
+accessible are providers; the assistive technologies are clients.
+
+Core concepts
+-------------
+
+The central difference between this accessibility architecture and most others
+being used today, including AT-SPI, is that this architecture is
+push-based. Providers push full accessibility trees and incremental tree updates
+to interested clients. Clients only make requests to individual providers to
+perform actions that change the state of the UI, such as programmatically
+setting focus or activating a UI element (the equivalent of a mouse
+click). Clients don't send requests to query the tree; each client maintains a
+local copy of the tree based on pushes from the provider, and queries that
+copy. This is true even for features that have traditionally relied heavily on
+IPC, such as rich text support. The current plan is for clients to infer events
+from changes to the tree, by comparing the old and new versions of updated
+nodes.
+
+The key to making all of this work is to define the optimal set of node roles,
+properties, and relationships. The primary inspiration for the proposed
+architecture is the internal accessibility architecture of Chromium, which the
+Firefox accessibility team has recently imitated (with some differences) in its
+Cache The World project. Because Chromium and Firefox are multi-process, while
+current pull-based platform accessibility APIs are synchronous, and considering
+that having a high number of IPC round trips is inefficient, both browsers
+arrived at an architecture where the sandboxed content/renderer process pushes
+accessibility trees and tree updates to the privileged main process. What we
+propose here is to extend this push-based approach all the way to the assistive
+technologies.
+
+One guiding principle for the design of accessibility properties in this
+architecture is that they should be independent of global context. For example,
+all coordinates are relative to the containing surface, in contrast with
+AT-SPI's absolute screen coordinates. For the same reason, and also for
+security, providers must not be required, or even able, to tell clients which
+provider has the global focus; clients will get that information from the
+windowing system (e.g. Wayland compositor).
+
+We propose a separate accessibility tree for each surface, as opposed to
+AT-SPI's tree per application. In our experience, assistive technologies rarely,
+if ever, need to traverse across surface boundaries. If needed, client code can
+combine the separate trees into a single tree; with the push approach, all trees
+will already be immediately available in the client's address space. In our
+opinion, there's no need to have application nodes. However, we understand the
+importance of clients knowing which application or toolkit a particular tree is
+coming from, so they can implement application-specific workarounds.
+
+Tree snapshots and updates are analogous to frames of visual output, in that all
+information is made available at once, without requiring further
+request/response round trips. Our proposed architecture shares `Wayland's goal
+of atomicity
+<https://wayland-book.com/protocol-design/design-patterns.html#atomicity>`_,
+where "every frame is perfect." Ideally, each accessibility tree update should
+be pushed at the same time as its corresponding visual frame.
+
+We will make sure that providers know at all times whether any clients are
+currently active, to minimize the performance usage and resource footprint of
+the accessibility stack when no ATs are active. Users must be able to load and
+unload ATs at will, without having to restart applications.
+
+Benefits and risks
+------------------
+
+This push-based architecture meets all of the goals listed above, including the
+later goals which, as noted above, advance the state of the art for
+accessibility even compared to proprietary platforms.
+
+Notably, the push approach means that assistive technologies can be fully
+responsive even when an application's UI thread is busy or hung. Just as sighted
+users can still see the latest visual frame in this case, AT users will be able
+to query the latest tree snapshot, even if the application itself doesn't
+respond to their actions.
+
+Because two of the three major browser engines already use a push approach
+internally, the core concept has been well validated. With careful design of the
+core serialized data formats, the browsers' content/renderer processes should be
+able to push tree updates in our format to assistive technologies with minimal
+involvement from the privileged main browser process, thus reducing the scope of
+that security-sensitive process.
+
+The push approach does have risks. In particular, because it requires all
+details of an accessibility tree to be pushed up front, there is a risk that,
+particularly for large, complex trees, such as long text documents and large
+lists or tables, performance may be degraded compared to a pull-based approach
+where clients send queries on demand via IPC. However, for lists or tables, in
+both native and web applications, it's common to implement a virtualized view,
+where view-level data structures are created lazily for only a portion of the
+full dataset. We believe that it's similarly feasible to virtualize large text
+documents, though this needs to be done carefully to avoid degrading the
+functionality that AT users have come to expect. Some legacy providers may have
+been implemented with the assumption that the accessibility tree is queried
+lazily, rather than being traversed in its entirety up-front. If we find that
+this is a problem in practice, it may be necessary for such providers to stay on
+AT-SPI rather than the new architecture. It will likely not be possible to
+completely discontinue AT-SPI support anyway.
+
+Another challenge for the push approach is hit-testing. ATs need to be able to
+determine which UI element is at a particular point, so they can respond to
+mouse movement and touch input. In current accessibility APIs, the client sends
+a hit-test request to the provider, which typically passes the request onto an
+existing hit-testing implementation in the GUI toolkit, browser engine,
+etc. These existing hit-testing implementations are often complex, particularly
+for browser engines, and it may be challenging to correctly match their behavior
+in client implementations using information that can be practically conveyed in
+a provider-independent accessibility tree. But because a hit-test is a query
+rather than a UI-updating action, in keeping with the goals set out above, this
+query should be done locally in the client, not through IPC. Chromium worked
+around the problem by responding to the first hit-test request using information
+in the accessibility tree, but then asynchronously sending a hit-test request to
+the renderer and using the response in future accessibility hit-tests. The
+Firefox Cache The World project implemented an alternative solution, where the
+information pushed by the content process includes a list of on-screen nodes
+sorted in z-order. Our current plan is to follow the Firefox approach.
+
+Overall, we believe the benefits of this proposed architecture, particularly the
+potential ways of advancing the state of the art in accessibility as outlined
+above, outweigh the risks.
+
+Open questions
+--------------
+
+Host protocol: Wayland or D-Bus
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We'll need to work with key decision-makers, including toolkit and compositor
+developers, to determine whether our proposed architecture will be integrated
+with the broader free desktop stack via Wayland or D-Bus. We would prefer to
+extend Wayland rather than running in parallel with Wayland via D-Bus as AT-SPI
+does. We believe it's important that clients get some key global information,
+such as the set of all surfaces with accessibility trees and the currently
+focused surface, directly from the compositor. Mediating communication between
+clients and providers through the Wayland compositor reduces security
+considerations specific to the accessibility stack. Finally, as noted above, it
+would be ideal to synchronize accessibility tree updates with corresponding
+visual frames, and a Wayland protocol extension seems like the best way to do
+this. However, we understand that the decision will ultimately need to be made
+based on whatever is most politically feasible, not what's technically ideal.
+
+Serialization format
+~~~~~~~~~~~~~~~~~~~~
+
+To minimize the performance risks of the push approach, we'd prefer to use a
+zero-copy serialization format such as `Cap'n Proto
+<https://capnproto.org/>`_. Note that we would only use the serialization layer
+of Cap'n Proto, not the RPC system. The reference implementation in C++ is under
+the permissive MIT license; implementations for other languages are under
+similarly permissive licenses. A downside of choosing Cap'n Proto is that there
+isn't an actively maintained C implementation. `FlatBuffers
+<https://flatbuffers.dev/>`_ is conceptually similar, and it has an active C
+implementation, but the existing implementations are under the Apache 2.0
+license, which is incompatible with GPLv2. In any case, we realize that it may
+be better to choose a serialization format that's already being used by the free
+desktop stack, such as the D-Bus serialization format. In addition, addressing
+performance issues at an architectural level, e.g. by virtualizing large
+documents or lists as discussed above, is likely to be more effective than
+trying to optimize serialization.
+
+Project plan
+------------
+
+This proposed architecture will build on the work that has already been done by
+the `AccessKit <https://github.com/AccessKit/accesskit>`_ project. The AccessKit
+schema, which defines all node properties, as well as roles and other enums, is
+heavily based on Chromium's accessibility architecture, and has gone through
+several iterations of its own. However, the schema isn't yet frozen; we'll need
+to get it to that point as part of this project. We're already planning to make
+some modest changes to the AccessKit schema to meet the specific goals of this
+architecture.
+
+Once we've agreed on a host protocol (Wayland or D-Bus), we'll prototype a
+provider and a client. The first provider will be an AccessKit platform adapter,
+written in Rust. The first client for this architecture will be a bridge to
+AT-SPI, building on AccessKit's current AT-SPI provider implementation, which is
+also written in Rust.
+
+A key use case which needs to be validated as part of this project is web
+browsing. We believe it would make the most sense to implement a provider for
+the new architecture in Chromium first, because Chromium and AccessKit are most
+conceptually similar, and because all relevant code in Chromium is under a
+permissive BSD license. This use case will certainly require us to work through
+several limitations of AccessKit, in both the schema and the AT-SPI
+provider. Thus, implementing the new architecture in a browser engine is likely
+to be the most time-consuming part of the whole project.
+
+An AT-SPI provider that acts as a proxy for the new architecture, as described
+above, won't meet all of the goals of the project, particularly around latency
+and efficiency, due to the pull-based, IPC-heavy nature of AT-SPI. To meet these
+goals completely, ATs such as Orca will need to directly implement the client
+side of the new architecture, while continuing to support AT-SPI for backward
+compatibility. Our current plan is to implement our client library in Rust and
+provide Python bindings for it using PyO3. If it's deemed necessary to implement
+client support for the new architecture in pyatspi and the underlying C library,
+to avoid major refactoring of the ATs themselves, that will increase the
+difficulty of this part of the project.
diff --git a/devel-docs/roadmap.rst b/devel-docs/roadmap.rst
new file mode 100644 (file)
index 0000000..df7c96c
--- /dev/null
@@ -0,0 +1,189 @@
+Accessibility infrastructure roadmap
+====================================
+
+Note that this roadmap refers exclusively to **cleanups** and **paying
+technical debt**. It does not yet refer to actually changing the
+accessibility interfaces, or the way accessibility works in general.
+Possible API changes are discussed in the :doc:`at-spi3`.
+
+High level goals, detailed below
+--------------------------------
+
+-  Make at-spi2-core/xml the authoritative version of the a11y
+   interfaces.
+
+-  Remove all the hand-written DBus code in at-spi2-core; replace with
+   gdbus as generated from the XML files.
+
+-  Add good end-to-end tests, to complement the ones already in
+   at-spi2-atk.
+
+-  Remove as much duplication / leftovers from the CORBA days /
+   compatibility hacks as we can.
+
+-  Give people the confidence that the accessibility stack works, so
+   it’s their responsibility to make their apps and gnome-shell
+   accessible.
+
+Short term tasks
+----------------
+
+-  Merge these repositories into a single one: at-spi2-core, atk,
+   at-spi2-atk. They are tightly coupled, and it will be much easier to
+   test/refactor them if the code is in the same repo. See “`merge the
+   repositories <#merge-the-repositories>`__” below for details.
+
+- Replace manually-written DBus code in at-spi2-core for automatically
+   generated code. See “`Remove hand-written DBus code
+   <#remove-hand-written-dbus-code>`__” below for details.
+
+-  `Make the XML interfaces the single source of
+   truth <#make-the-xml-interfaces-the-single-source-of-truth>`__.
+
+Details on big tasks
+--------------------
+
+Merge the repositories
+~~~~~~~~~~~~~~~~~~~~~~
+
+Merging at-spi2-core, atk, and at-spi2-atk into a single repository will
+make end-to-end testing easier. As of 2022/May/27, at-spi2-atk has a few
+end-to-end tests, which do not manage to exercise all the code in
+libatspi or in atk. Having all the code in the same repository will make
+it easier to refactor and test things. Some reasons to merge:
+
+-  at-spi2-atk has the real end-to-end integration tests for
+   at-spi2-core; it tests the part for an accessible application and the
+   accessibility technology together, with the registry daemon in the
+   middle. It would be nice to run these tests automatically when any of
+   at-spi2-core or atk changes.
+
+-  Both at-spi2-atk and pyatspi2 have “dummy” implementations of the ATK
+   interfaces to use with their tests. It may be possible to deduplicate
+   that.
+
+-  Doing refactoring across all modules will be easier if their tests
+   are in a single place.
+
+-  We only have to get the CI working once, instead of three times.
+
+Some cool things in at-spi2-core’s CI that now work for all the
+accessibility middleware:
+
+-  CI pipelines run the test suite and generate a code coverage report.
+   This can be used to fine-tune tests, or decide how to refactor things
+   for finer-grained testing.
+
+-  Static analysis. Fix broken C code as early as possible.
+
+-  Address Sanitizer - runtime analysis; does not fully work yet, but
+   the basics are there.
+
+-  Infrastructure to test build configurations for various distro
+   images, e.g. dbus-daemon for openSUSE, versus dbus-broker for Fedora
+   - those have different code paths.
+
+Make the XML interfaces the single source of truth
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In the past the at-spi2-core/xml files, which define the DBus interfaces
+for accessibility, have gotten out of sync with at-spi2-core’s own C
+code, because it does DBus calls by hand instead of using an
+autogenerated binding - there weren’t any at the time it was written.
+Also they have gotten out of sync with external copies, like GTK.
+Perhaps we can add some bits to GTK’s CI scripts to guarantee that this
+doesn’t happen, or make GTK just reference at-spi2-core/xml directly.
+
+It may not be possible to “disappear” libatspi2 and rely only on an
+autogenerated binding for the XML DBus interfaces everywhere, but that
+should certainly be a goal.
+
+Remove hand-written DBus code
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+My initial goal is to replace it with gdbus from GIO (an auto-generated
+C binding to XML interfaces). I want to experiment with a few strategies
+to make this easier. Right now all the DBus code is interwoven with
+logic from at-spi2-core, so the first thing is to separate them. Then,
+replace the DBus code in one shot for gdbus.
+
+For example, there’s quite a bit of code like this:
+
+.. code:: c
+
+   static void
+   handle_some_method (DBusMessage *message)
+   {
+     foo = demarshal_a_bit ();
+     bar = find_the_accessible ();
+     bar_set_foo (bar, foo);
+
+     baz = demarshal_a_bit ();
+     bar_set_baz (bar, baz);
+
+     while (some_logic_here)
+     {
+       qux = demarshal_something ();
+       blah_blah (qux, bar);
+     }
+
+     /* etc */
+   }
+
+So I would first split it into a part that demarshals everything, and
+then one that does the logic:
+
+.. code:: c
+
+   typedef struct {
+     Accessible accessible;
+     Foo foo;
+     Baz baz;
+     Qux quxes[];
+   } SomeMethodArgs;
+
+   handle_some_method (DBusMessage *message)
+   {
+     SomeMethodArgs args;
+
+     if (demarshal_some_method_args (message, &args) != SUCCESS)
+     {
+       return ERROR;
+     }
+
+     do_the_thing (args.accessible, args.foo, args.baz, args.quxes);
+   }
+
+Once everything is split apart, it’s a lot easier to replace the
+demarshalers with gdbus calls, and the rest of the logic can hopefully
+remain unchanged.
+
+As a side benefit, this may allow testing the logic without having to
+worry about inter-process communication. Test the thing; assume
+communication works.
+
+It may not be possible to separate all such cases so cleanly. However,
+if a certain “sequence” requires intermediate IPC, then that is a good
+indication for a less granular interface to add later: instead of
+querying for an object and then for each of its properties / children /
+etc., maybe send the whole object’s tree in a single call.
+
+(Future goal: this separation of IPC vs. logic may make it easier, to
+port the accessibility middleware to Rust - something I’d really like to
+do.)
+
+End-to-end tests
+~~~~~~~~~~~~~~~~
+
+There are already some end-to-end tests in at-spi2-atk/tests. They
+create a mock AT and a mock accessible application, and ensure that what
+they communicate through the accessibility bus matches on both ends.
+
+These tests are good! Let’s add more extensive ones to help test things
+like event throttling, unstable applications, compatibility APIs, etc.
+
+Should we merge pyatspi2 in here?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Maybe! It is a compatibility layer, through and through, and maybe we
+can disappear it gradually if we change Orca in lockstep.
diff --git a/devel-docs/toolkits.rst b/devel-docs/toolkits.rst
new file mode 100644 (file)
index 0000000..609cb91
--- /dev/null
@@ -0,0 +1,74 @@
+Accessibility implementations in different toolkits
+===================================================
+
+Toolkits that use the DBus APIs directly
+----------------------------------------
+
+GTK4
+~~~~
+
+Sources:
+```gtk4/gtk/a11y`` <https://gitlab.gnome.org/GNOME/gtk/-/tree/main/gtk/a11y>`__
+
+Qt5
+---
+
+Sources:
+```qtbase/src/gui/accessible/linux`` <https://github.com/qt/qtbase/tree/dev/src/gui/accessible/linux>`__
+
+Note: Qt’s implementation of
+`Cache.GetItems <https://github.com/qt/qtbase/blob/dev/src/gui/accessible/linux/qspi_struct_marshallers.cpp#L41-L71>`__
+uses the old signature ``a((so)(so)(so)a(so)assusau)`` instead of the
+preferred/new ``a((so)(so)(so)iiassusau)``.
+
+WebKit
+------
+
+Sources:
+```WebKit/Source/WebCore/accessibility/atspi`` <https://github.com/WebKit/WebKit/tree/main/Source/WebCore/accessibility/atspi>`__
+
+Toolkits that use ATK
+---------------------
+
+GTK3
+----
+
+Sources:
+```gtk3/gtk/a11y`` <https://gitlab.gnome.org/GNOME/gtk/-/tree/gtk-3-24/gtk/a11y>`__
+
+gnome-shell / St / via clutter’s cally
+--------------------------------------
+
+Sources:
+```mutter/clutter/clutter/cally`` <https://gitlab.gnome.org/GNOME/mutter/-/tree/main/clutter/clutter/cally>`__
+
+Mozilla Firefox
+---------------
+
+Sources:
+```gecko-dev/accessible/atk`` <https://github.com/mozilla/gecko-dev/tree/master/accessible/atk>`__
+
+Chromium
+--------
+
+Uses both ATK and libatspi?
+
+Sources: \*
+```chromium/ui/accessibility/platform/*auralinux*`` <https://github.com/chromium/chromium/tree/main/ui/accessibility/platform>`__
+(atk) \*
+```chromium/ui/accessibility/platform/inspect/*auralinux*`` <https://github.com/chromium/chromium/tree/main/ui/accessibility/platform/inspect>`__
+(atspi) \*
+```chromium/content/browser/accessibility/*auralinux*`` <https://github.com/chromium/chromium/tree/main/content/browser/accessibility/>`__
+(atspi and atk)
+
+LibreOffice
+-----------
+
+Sources:
+```LibreOffice/core/vcl/unx/gtk3/a11y`` <https://github.com/LibreOffice/core/tree/master/vcl/unx/gtk3/a11y>`__
+
+Java Swing - via java-atk-wrapper
+---------------------------------
+
+Sources:
+```java-atk-wrapper`` <https://gitlab.gnome.org/GNOME/java-atk-wrapper>`__
diff --git a/devel-docs/xml-changes.rst b/devel-docs/xml-changes.rst
new file mode 100644 (file)
index 0000000..cf49b4b
--- /dev/null
@@ -0,0 +1,63 @@
+Changes to the DBus XML interfaces
+==================================
+
+The `XML descriptions of DBus interfaces
+<https://gitlab.gnome.org/GNOME/at-spi2-core/-/tree/main/xml>`_ and
+the actual C code that implements them have gone out of sync in the
+past.  During the process of `auditing the XML and C code
+<https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/75>`_ to ensure
+they match each other, changes have been needed in the XML
+definitions.
+
+**Assumptions for toolkits:** Regretfully, both the in-tree XML files
+and the introspected XML you get from DBus have been out of sync with
+the C code.  We are fixing this so that they always stay in sync:
+
+* Make the XML files the single source of truth...
+
+* By making sure the XML matches the C code, which is the ground truth
+  before this auditing project began...
+
+* And by making sure that the introspected XML matches the XML files
+  in-tree.
+
+* Along the way, document all the XML interfaces properly.
+
+This document is a list of changes that we've made to the XML
+interfaces since 2022/Jun (starting with version 2.45.90).  If you
+generate code based on the XML, keep an eye on this document.
+
+The changes here are about **method signatures**.  Changes to the
+documentation are not listed, since they do not affect generated code.
+The changes are listed in reverse chronological order (newest first).
+
+* add8abce - 2022/12/09 - ``DeviceEventListener.xml`` - Remove unused signals
+  ``DeviceListenerRegistered`` and ``DeviceListenerDeregistered``.
+
+* 9096b760 - 2022/12/09 - ``DeviceEventController.xml`` -  fix the signature
+  of the ``types`` argument in the ``RegisterKeystrokeListener``
+  method; it's ``u`` now as it is a bitmask, not an array.
+
+* 55934a59 - 2022/12/05 - ``DeviceEventController.xml`` - remove unused method
+  ``DeregisterDeviceEventListener``.
+
+* 9b96a257 - 2022/12/05 - ``DeviceEventController.xml`` - remove unused method
+  ``RegisterDeviceEventListener``.
+
+* cb10a4c9 - 2022/12/05 - ``DeviceEventController.xml`` - remove unused method
+  ``GetDeviceEventListeners``.
+
+* f0781465 - 2022/08/26 - ``Event.xml`` - Fix the signature of all
+  signals.  See https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/74
+
+* 01d624b1 - 2022/08/11 - ``Application.xml`` - document the ``GetLocale`` method as not
+  used.
+
+* 26835da29 - 2022/08/04 - ``Event.xml`` - Add an ``Announcement`` signal to the
+  ``org.a11y.atspi.Event.Object`` interface.
+
+* 0412902f - 2022/07/01 - ``DeviceEventListener.xml``: add missing signals
+  ``KeystrokeListenerRegistered``, ``KeystrokeListenerDeregistered``
+
+* ae6eb3bd - 2022/07/01 - ``DeviceEventController.xml``: add missing
+  methods ``GetKeystrokeListeners``.
diff --git a/devel-docs/xml-interfaces.rst b/devel-docs/xml-interfaces.rst
new file mode 100644 (file)
index 0000000..c39f3ef
--- /dev/null
@@ -0,0 +1,33 @@
+DBus XML Interfaces
+===================
+
+.. toctree::
+   :maxdepth: 1
+              
+   doc-org.a11y.atspi.Accessible
+   doc-org.a11y.atspi.Action
+   doc-org.a11y.atspi.Application
+   doc-org.a11y.atspi.Cache
+   doc-org.a11y.atspi.Collection
+   doc-org.a11y.atspi.Component
+   doc-org.a11y.atspi.DeviceEventController
+   doc-org.a11y.atspi.DeviceEventListener
+   doc-org.a11y.atspi.Document
+   doc-org.a11y.atspi.EditableText
+   doc-org.a11y.atspi.Event.Document
+   doc-org.a11y.atspi.Event.Focus
+   doc-org.a11y.atspi.Event.Keyboard
+   doc-org.a11y.atspi.Event.Mouse
+   doc-org.a11y.atspi.Event.Object
+   doc-org.a11y.atspi.Event.Terminal
+   doc-org.a11y.atspi.Event.Window
+   doc-org.a11y.atspi.Hyperlink
+   doc-org.a11y.atspi.Hypertext
+   doc-org.a11y.atspi.Image
+   doc-org.a11y.atspi.Registry
+   doc-org.a11y.atspi.Selection
+   doc-org.a11y.atspi.Socket
+   doc-org.a11y.atspi.Table
+   doc-org.a11y.atspi.TableCell
+   doc-org.a11y.atspi.Text
+   doc-org.a11y.atspi.Value
diff --git a/doc/atk.toml.in b/doc/atk.toml.in
new file mode 100644 (file)
index 0000000..f45fcde
--- /dev/null
@@ -0,0 +1,52 @@
+[library]
+version = "@VERSION@"
+browse_url = "https://gitlab.gnome.org/GNOME/at-spi2-core/"
+repository_url = "https://gitlab.gnome.org/GNOME/at-spi2-core.git"
+website_url = "https://wiki.gnome.org/Accessibility"
+docs_url = "https://gnome.pages.gitlab.gnome.org/at-spi2-core/atk/"
+authors = "ATK Development Team"
+license = "LGPL-2.1-or-later"
+description = """GNOME provides support for accessibility devices using the ATK
+framework. This framework defines a set of interfaces to which
+graphical interface components adhere. This allows, for instance,
+screen readers to read the text of an interface and interact with its
+controls. ATK support is built into GTK+ 3 and the rest of the GNOME
+platform, so any application using GTK+ 3 will have reasonable
+accessibility support for free.
+GTK4 now includes accessibility support natively and does not need ATK."""
+devhelp = true
+search_index = true
+logo_url = "logo.png"
+
+dependencies = ["GObject-2.0",]
+
+  [dependencies."GObject-2.0"]
+  name = "GObject"
+  description = "The base type system library"
+  docs_url = "https://docs.gtk.org/gobject/"
+
+related = ["Atspi-2.0"]
+
+  [related."Atspi-2.0"]
+  name = "AT-SPI"
+  description = "The Assistive Technology Service Provider Interface"
+  docs_url = "https://gnome.pages.gitlab.gnome.org/at-spi2-core/libatspi/"
+
+[theme]
+name = "basic"
+show_index_summary = true
+show_class_hierarchy = true
+
+[source-location]
+# The base URL for the web UI
+base_url = "https://gitlab.gnome.org/GNOME/at-spi2-core/-/blob/HEAD/"
+# The format for links, using "filename" and "line" for the format
+file_format = "{filename}#L{line}"
+
+[extra]
+content_files = [
+]
+content_images = [
+  "logo.png",
+]
+urlmap_file = "urlmap.js"
diff --git a/doc/libatspi.toml.in b/doc/libatspi.toml.in
new file mode 100644 (file)
index 0000000..eb47cca
--- /dev/null
@@ -0,0 +1,44 @@
+[library]
+version = "@VERSION@"
+browse_url = "https://gitlab.gnome.org/GNOME/at-spi2-core/"
+repository_url = "https://gitlab.gnome.org/GNOME/at-spi2-core.git"
+website_url = "https://wiki.gnome.org/Accessibility"
+doc_url = "https://gnome.pages.gitlab.gnome.org/at-spi2-core/libatspi/"
+authors = "The AT-SPI2 maintainers"
+license = "LGPL-2.1-or-later"
+description = "The Assistive Technology Service Provider Interface, version 2"
+dependencies = ["GObject-2.0",]
+devhelp = true
+search_index = true
+logo_url = "logo.png"
+
+  [dependencies."GObject-2.0"]
+  name = "GObject"
+  description = "The base type system library"
+  docs_url = "https://docs.gtk.org/gobject/"
+
+related = ["Atk"]
+
+  [related."Atk"]
+  name = "Atk"
+  description = "The Accessibility toolkite"
+  docs_url = "https://gnome.pages.gitlab.gnome.org/at-spi2-core/atk/"
+
+[theme]
+name = "basic"
+show_index_summary = true
+show_class_hierarchy = true
+
+[source-location]
+# The base URL for the web UI
+base_url = "https://gitlab.gnome.org/GNOME/at-spi2-core/-/blob/HEAD/"
+# The format for links, using "filename" and "line" for the format
+file_format = "{filename}#L{line}"
+
+[extra]
+content_files = [
+]
+content_images = [
+  "logo.png",
+]
+urlmap_file = "urlmap.js"
diff --git a/doc/libatspi/Makefile.am b/doc/libatspi/Makefile.am
deleted file mode 100644 (file)
index 93270f4..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-# We require automake 1.6 at least.
-AUTOMAKE_OPTIONS = 1.6
-
-# The name of the module, e.g. 'glib'.
-DOC_MODULE=libatspi
-
-# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
-#DOC_MODULE_VERSION=2
-
-
-# The top-level SGML file. You can change this if you want to.
-DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
-
-# Directories containing the source code, relative to $(srcdir).
-# gtk-doc will search all .c and .h files beneath these paths
-# for inline comments documenting functions and macros.
-# e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk
-DOC_SOURCE_DIR=$(top_srcdir)/atspi
-
-# Extra options to pass to gtkdoc-scangobj. Not normally needed.
-SCANGOBJ_OPTIONS=
-
-# Extra options to supply to gtkdoc-scan.
-# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
-SCAN_OPTIONS=
-
-# Extra options to supply to gtkdoc-mkdb.
-# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
-MKDB_OPTIONS=--sgml-mode --output-format=xml
-
-# Extra options to supply to gtkdoc-mktmpl
-# e.g. MKTMPL_OPTIONS=--only-section-tmpl
-MKTMPL_OPTIONS=
-
-# Extra options to supply to gtkdoc-mkhtml
-MKHTML_OPTIONS=
-
-# Extra options to supply to gtkdoc-fixref. Not normally needed.
-# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
-FIXXREF_OPTIONS=
-
-# Used for dependencies. The docs will be rebuilt if any of these change.
-# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
-# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
-HFILE_GLOB=$(top_srcdir)/atspi/*.h
-CFILE_GLOB=$(top_srcdir)/atspi/*.c
-
-# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
-# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
-EXTRA_HFILES=
-
-# Header files to ignore when scanning. Use base file name, no paths
-# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
-IGNORE_HFILES=
-
-# Images to copy into HTML directory.
-# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
-HTML_IMAGES=
-
-# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
-# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
-content_files=
-
-# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
-# These files must be listed here *and* in content_files
-# e.g. expand_content_files=running.sgml
-expand_content_files=
-
-# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
-# Only needed if you are using gtkdoc-scangobj to dynamically query widget
-# signals and properties.
-# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
-# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
-GTKDOC_CFLAGS=$(GLIB_CFLAGS) $(GOBJ_CFLAGS) $(DBUS_CFLAGS)
-GTKDOC_LIBS=$(GLIB_LIBS) $(GOBJ_LIBS) $(DBUS_LIBS) $(top_builddir)/atspi/libatspi.la
-
-# This includes the standard gtk-doc make rules, copied by gtkdocize.
-include $(top_srcdir)/gtk-doc.make
-
-# Other files to distribute
-# e.g. EXTRA_DIST += version.xml.in
-EXTRA_DIST += meson.build
-
-# Files not to distribute
-# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
-# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
-#DISTCLEANFILES +=
-
-# Comment this out if you want your docs-status tested during 'make check'
-if ENABLE_GTK_DOC
-#TESTS_ENVIRONMENT = cd $(srcdir) &&
-#TESTS = $(GTKDOC_CHECK)
-endif
-
--include $(top_srcdir)/git.mk
diff --git a/doc/libatspi/libatspi-docs.sgml b/doc/libatspi/libatspi-docs.sgml
deleted file mode 100644 (file)
index 935767c..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
-               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
-[
-  <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'">
-  <!ENTITY version SYSTEM "version.xml">
-]>
-<book id="index">
-  <bookinfo>
-    <title>libatspi Reference Manual</title>
-    <releaseinfo>
-      for libatspi &version;.
-      The latest version of this documentation can be found on-line at
-      <ulink role="online-location" url="http://developer.gnome.org/libatspi/">http://developer.gnome.org/libatspi/</ulink>.
-    </releaseinfo>
-  </bookinfo>
-
-  <chapter>
-    <title>API reference</title>
-        <xi:include href="xml/atspi-text.xml"/>
-    <xi:include href="xml/atspi-stateset.xml"/>
-    <xi:include href="xml/atspi-application.xml"/>
-    <xi:include href="xml/atspi-collection.xml"/>
-    <xi:include href="xml/atspi-action.xml"/>
-    <xi:include href="xml/atspi-relation.xml"/>
-    <xi:include href="xml/atspi-image.xml"/>
-    <xi:include href="xml/atspi-matchrule.xml"/>
-    <xi:include href="xml/atspi-document.xml"/>
-    <xi:include href="xml/atspi-object.xml"/>
-    <xi:include href="xml/atspi-accessible.xml"/>
-    <xi:include href="xml/atspi-device-listener.xml"/>
-    <xi:include href="xml/atspi-hyperlink.xml"/>
-    <xi:include href="xml/atspi-editabletext.xml"/>
-    <xi:include href="xml/atspi-value.xml"/>
-    <xi:include href="xml/atspi-table.xml"/>
-    <xi:include href="xml/atspi-table-cell.xml"/>
-    <xi:include href="xml/atspi-selection.xml"/>
-    <xi:include href="xml/atspi-event-listener.xml"/>
-    <xi:include href="xml/atspi-hypertext.xml"/>
-    <xi:include href="xml/atspi-component.xml"/>
-    <xi:include href="xml/atspi-registry.xml"/>
-    <xi:include href="xml/atspi-types.xml"/>
-    <xi:include href="xml/atspi-constants.xml"/>
-    <xi:include href="xml/atspi-misc.xml"/>
-
-  </chapter>
-  <chapter id="object-tree">
-    <title>Object Hierarchy</title>
-     <xi:include href="xml/tree_index.sgml"/>
-  </chapter>
-  <index id="api-index-full">
-    <title>API Index</title>
-    <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
-  </index>
-
-  <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
-</book>
diff --git a/doc/libatspi/libatspi-sections.txt b/doc/libatspi/libatspi-sections.txt
deleted file mode 100644 (file)
index d7bfc10..0000000
+++ /dev/null
@@ -1,686 +0,0 @@
-<SECTION>
-<FILE>atspi-text</FILE>
-AtspiRange
-atspi_range_copy
-AtspiTextRange
-atspi_text_get_type
-AtspiText
-atspi_text_range_get_type
-atspi_text_get_character_count
-atspi_text_get_text
-atspi_text_get_caret_offset
-atspi_text_get_attributes
-atspi_text_get_attribute_run
-atspi_text_get_attribute_value
-atspi_text_get_default_attributes
-atspi_text_set_caret_offset
-atspi_text_get_text_before_offset
-atspi_text_get_text_at_offset
-atspi_text_get_text_after_offset
-atspi_text_get_character_at_offset
-atspi_text_get_character_extents
-atspi_text_get_offset_at_point
-atspi_text_get_range_extents
-atspi_text_get_bounded_ranges
-atspi_text_get_n_selections
-atspi_text_get_selection
-atspi_text_add_selection
-atspi_text_remove_selection
-atspi_text_set_selection
-atspi_text_get_string_at_offset
-atspi_text_get_text_attribute_value
-atspi_text_get_text_attributes
-atspi_text_scroll_substring_to
-atspi_text_scroll_substring_to_point
-<SUBSECTION Standard>
-ATSPI_TEXT
-ATSPI_IS_TEXT
-ATSPI_TYPE_TEXT
-atspi_range_get_type
-ATSPI_TEXT_GET_IFACE
-ATSPI_TYPE_RANGE
-ATSPI_TYPE_TEXT_RANGE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-stateset</FILE>
-<TITLE>AtspiStateSet</TITLE>
-AtspiStateSet
-AtspiStateSetClass
-atspi_state_set_new
-atspi_state_set_set_by_name
-atspi_state_set_add
-atspi_state_set_compare
-atspi_state_set_contains
-atspi_state_set_equals
-atspi_state_set_get_states
-atspi_state_set_is_empty
-atspi_state_set_remove
-<SUBSECTION Standard>
-ATSPI_STATE_SET
-ATSPI_IS_STATE_SET
-ATSPI_TYPE_STATE_SET
-atspi_state_set_get_type
-ATSPI_STATE_SET_CLASS
-ATSPI_IS_STATE_SET_CLASS
-ATSPI_STATE_SET_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-application</FILE>
-<TITLE>AtspiApplication</TITLE>
-AtspiApplication
-AtspiApplicationClass
-<SUBSECTION Standard>
-ATSPI_APPLICATION
-ATSPI_IS_APPLICATION
-ATSPI_TYPE_APPLICATION
-ATSPI_APPLICATION_CLASS
-ATSPI_IS_APPLICATION_CLASS
-ATSPI_APPLICATION_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-collection</FILE>
-AtspiCollection
-atspi_collection_is_ancestor_of
-atspi_collection_get_matches
-atspi_collection_get_matches_to
-atspi_collection_get_matches_from
-atspi_collection_get_active_descendant
-<SUBSECTION Standard>
-ATSPI_COLLECTION
-ATSPI_IS_COLLECTION
-ATSPI_TYPE_COLLECTION
-atspi_collection_get_type
-ATSPI_COLLECTION_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-action</FILE>
-AtspiAction
-atspi_action_get_n_actions
-atspi_action_get_description
-atspi_action_get_key_binding
-atspi_action_get_action_description
-atspi_action_get_action_name
-atspi_action_get_localized_name
-atspi_action_get_name
-atspi_action_do_action
-<SUBSECTION Standard>
-ATSPI_ACTION
-ATSPI_IS_ACTION
-ATSPI_TYPE_ACTION
-atspi_action_get_type
-ATSPI_ACTION_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-relation</FILE>
-<TITLE>AtspiRelation</TITLE>
-AtspiRelation
-AtspiRelationClass
-atspi_relation_get_relation_type
-atspi_relation_get_n_targets
-atspi_relation_get_target
-<SUBSECTION Standard>
-ATSPI_RELATION
-ATSPI_IS_RELATION
-ATSPI_TYPE_RELATION
-atspi_relation_get_type
-ATSPI_RELATION_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-image</FILE>
-AtspiImage
-atspi_image_get_image_description
-atspi_image_get_image_size
-atspi_image_get_image_position
-atspi_image_get_image_extents
-atspi_image_get_image_locale
-<SUBSECTION Standard>
-ATSPI_IMAGE
-ATSPI_IS_IMAGE
-ATSPI_TYPE_IMAGE
-atspi_image_get_type
-ATSPI_IMAGE_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-matchrule</FILE>
-<TITLE>AtspiMatchRule</TITLE>
-AtspiMatchRule
-AtspiMatchRuleClass
-atspi_match_rule_new
-<SUBSECTION Standard>
-ATSPI_MATCH_RULE
-ATSPI_IS_MATCH_RULE
-ATSPI_TYPE_MATCH_RULE
-atspi_match_rule_get_type
-ATSPI_MATCH_RULE_CLASS
-ATSPI_IS_MATCH_RULE_CLASS
-ATSPI_MATCH_RULE_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-document</FILE>
-AtspiDocument
-atspi_document_get_locale
-atspi_document_get_attribute_value
-atspi_document_get_attributes
-atspi_document_get_current_page_number
-atspi_document_get_document_attribute_value
-atspi_document_get_document_attributes
-atspi_document_get_page_count
-<SUBSECTION Standard>
-ATSPI_DOCUMENT
-ATSPI_IS_DOCUMENT
-ATSPI_TYPE_DOCUMENT
-atspi_document_get_type
-ATSPI_DOCUMENT_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-object</FILE>
-<TITLE>AtspiObject</TITLE>
-AtspiObject
-AtspiObjectClass
-<SUBSECTION Standard>
-ATSPI_OBJECT
-ATSPI_IS_OBJECT
-ATSPI_TYPE_OBJECT
-atspi_object_get_type
-ATSPI_OBJECT_CLASS
-ATSPI_IS_OBJECT_CLASS
-ATSPI_OBJECT_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-accessible</FILE>
-<TITLE>AtspiAccessible</TITLE>
-AtspiAccessible
-AtspiAccessibleClass
-atspi_accessible_new
-atspi_role_get_name
-atspi_accessible_get_name
-atspi_accessible_get_description
-atspi_accessible_get_parent
-atspi_accessible_get_child_count
-atspi_accessible_get_child_at_index
-atspi_accessible_get_index_in_parent
-atspi_accessible_get_relation_set
-atspi_accessible_get_role
-atspi_accessible_get_role_name
-atspi_accessible_get_localized_role_name
-atspi_accessible_get_state_set
-atspi_accessible_get_attributes
-atspi_accessible_get_attributes_as_array
-atspi_accessible_get_locale
-atspi_accessible_get_toolkit_name
-atspi_accessible_get_toolkit_version
-atspi_accessible_get_atspi_version
-atspi_accessible_get_id
-atspi_accessible_get_application
-atspi_accessible_get_action
-atspi_accessible_get_collection
-atspi_accessible_get_component
-atspi_accessible_get_document
-atspi_accessible_get_editable_text
-atspi_accessible_get_hyperlink
-atspi_accessible_get_hypertext
-atspi_accessible_get_image
-atspi_accessible_get_selection
-atspi_accessible_get_table
-atspi_accessible_get_table_cell
-atspi_accessible_get_text
-atspi_accessible_get_value
-atspi_accessible_get_object_locale 
-atspi_accessible_set_cache_mask 
-atspi_accessible_clear_cache
-atspi_accessible_get_process_id
-atspi_accessible_get_action_iface
-atspi_accessible_get_collection_iface
-atspi_accessible_get_component_iface
-atspi_accessible_get_document_iface
-atspi_accessible_get_editable_text_iface
-atspi_accessible_get_hypertext_iface
-atspi_accessible_get_image_iface
-atspi_accessible_get_selection_iface
-atspi_accessible_get_table_iface
-atspi_accessible_get_text_iface
-atspi_accessible_get_value_iface
-atspi_accessible_get_interfaces
-atspi_accessible_get_accessible_id
-<SUBSECTION Standard>
-ATSPI_ACCESSIBLE
-ATSPI_IS_ACCESSIBLE
-ATSPI_TYPE_ACCESSIBLE
-atspi_accessible_get_type
-ATSPI_ACCESSIBLE_CLASS
-ATSPI_IS_ACCESSIBLE_CLASS
-ATSPI_ACCESSIBLE_GET_CLASS
-
-<SUBSECTION Private>
-AtspiAccessiblePrivate
-</SECTION>
-
-<SECTION>
-<FILE>atspi-device-listener</FILE>
-<TITLE>AtspiDeviceListener</TITLE>
-AtspiDeviceListenerCB
-AtspiDeviceListenerSimpleCB
-AtspiDeviceListener
-AtspiDeviceListenerClass
-atspi_device_listener_new
-atspi_device_listener_new_simple
-atspi_device_listener_add_callback
-atspi_device_listener_remove_callback
-<SUBSECTION Standard>
-ATSPI_DEVICE_LISTENER
-ATSPI_IS_DEVICE_LISTENER
-ATSPI_TYPE_DEVICE_LISTENER
-atspi_device_listener_get_type
-ATSPI_DEVICE_LISTENER_CLASS
-ATSPI_IS_DEVICE_LISTENER_CLASS
-ATSPI_DEVICE_LISTENER_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-hypertext</FILE>
-AtspiHypertext
-atspi_hypertext_get_n_links
-atspi_hypertext_get_link
-atspi_hypertext_get_link_index
-<SUBSECTION Standard>
-ATSPI_HYPERTEXT
-ATSPI_IS_HYPERTEXT
-ATSPI_TYPE_HYPERTEXT
-atspi_hypertext_get_type
-ATSPI_HYPERTEXT_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-hyperlink</FILE>
-<TITLE>AtspiHyperlink</TITLE>
-AtspiHyperlink
-AtspiHyperlinkClass
-atspi_hyperlink_new
-atspi_hyperlink_get_n_anchors
-atspi_hyperlink_get_uri
-atspi_hyperlink_get_object
-atspi_hyperlink_get_index_range
-atspi_hyperlink_get_start_index
-atspi_hyperlink_get_end_index
-atspi_hyperlink_is_valid
-<SUBSECTION Standard>
-ATSPI_HYPERLINK
-ATSPI_IS_HYPERLINK
-ATSPI_TYPE_HYPERLINK
-atspi_hyperlink_get_type
-ATSPI_HYPERLINK_CLASS
-ATSPI_IS_HYPERLINK_CLASS
-ATSPI_HYPERLINK_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-editabletext</FILE>
-AtspiEditableText
-atspi_editable_text_insert_text
-atspi_editable_text_copy_text
-atspi_editable_text_cut_text
-atspi_editable_text_delete_text
-atspi_editable_text_paste_text
-<SUBSECTION Standard>
-ATSPI_EDITABLE_TEXT
-ATSPI_IS_EDITABLE_TEXT
-ATSPI_TYPE_EDITABLE_TEXT
-atspi_editable_text_get_type
-ATSPI_EDITABLE_TEXT_GET_IFACE
-<SUBSECTION Private>
-atspi_editable_text_set_attributes
-</SECTION>
-
-<SECTION>
-<FILE>atspi-value</FILE>
-AtspiValue
-atspi_value_get_minimum_value
-atspi_value_get_current_value
-atspi_value_get_maximum_value
-atspi_value_set_current_value
-atspi_value_get_minimum_increment
-<SUBSECTION Standard>
-ATSPI_VALUE
-ATSPI_IS_VALUE
-ATSPI_TYPE_VALUE
-atspi_value_get_type
-ATSPI_VALUE_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-table</FILE>
-AtspiTable
-atspi_table_get_caption
-atspi_table_get_summary
-atspi_table_get_n_rows
-atspi_table_get_n_columns
-atspi_table_get_accessible_at
-atspi_table_get_index_at
-atspi_table_get_row_at_index
-atspi_table_get_column_at_index
-atspi_table_get_row_description
-atspi_table_get_column_description
-atspi_table_get_row_extent_at
-atspi_table_get_column_extent_at
-atspi_table_get_row_header
-atspi_table_get_column_header
-atspi_table_get_n_selected_rows
-atspi_table_get_selected_rows
-atspi_table_get_selected_columns
-atspi_table_get_n_selected_columns
-atspi_table_is_row_selected
-atspi_table_is_column_selected
-atspi_table_add_row_selection
-atspi_table_add_column_selection
-atspi_table_remove_row_selection
-atspi_table_remove_column_selection
-atspi_table_get_row_column_extents_at_index
-atspi_table_is_selected
-<SUBSECTION Standard>
-ATSPI_TABLE
-ATSPI_IS_TABLE
-ATSPI_TYPE_TABLE
-atspi_table_get_type
-ATSPI_TABLE_GET_IFACE
-</SECTION>
-
-<FILE>atspi-table-cell</FILE>
-AtspiTableCell
-atspi_table_cell_get_column_span
-atspi_table_cell_get_column_header_cells
-atspi_table_cell_get_column_index
-atspi_table_cell_get_row_span
-atspi_table_cell_get_row_header_cells
-atspi_table_cell_get_position
-atspi_table_cell_get_row_column_span
-atspi_table_cell_get_table
-<SUBSECTION Standard>
-ATSPI_TABLE_CELL
-ATSPI_IS_TABLE_CELL
-ATSPI_TYPE_TABLE_CELL
-atspi_table_cell_get_type
-ATSPI_TABLE_CELL_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-selection</FILE>
-AtspiSelection
-atspi_selection_get_n_selected_children
-atspi_selection_get_selected_child
-atspi_selection_select_child
-atspi_selection_deselect_selected_child
-atspi_selection_deselect_child
-atspi_selection_is_child_selected
-atspi_selection_select_all
-atspi_selection_clear_selection
-<SUBSECTION Standard>
-ATSPI_SELECTION
-ATSPI_IS_SELECTION
-ATSPI_TYPE_SELECTION
-atspi_selection_get_type
-ATSPI_SELECTION_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-event-listener</FILE>
-<TITLE>AtspiEventListener</TITLE>
-AtspiEventListenerCB
-AtspiEventListenerSimpleCB
-AtspiEventListener
-AtspiEventListenerClass
-atspi_event_listener_get_type
-atspi_event_listener_new
-atspi_event_listener_new_simple
-atspi_event_listener_register
-atspi_event_listener_register_from_callback
-atspi_event_listener_register_from_callback_full
-atspi_event_listener_register_no_data
-atspi_event_listener_register_full
-atspi_event_listener_deregister
-atspi_event_listener_deregister_from_callback
-atspi_event_listener_deregister_no_data
-<SUBSECTION Standard>
-ATSPI_EVENT_LISTENER
-ATSPI_IS_EVENT_LISTENER
-ATSPI_TYPE_EVENT_LISTENER
-atspi_event_get_type
-ATSPI_EVENT_LISTENER_CLASS
-ATSPI_IS_EVENT_LISTENER_CLASS
-ATSPI_EVENT_LISTENER_GET_CLASS
-</SECTION>
-
-<SECTION>
-<FILE>atspi-component</FILE>
-AtspiRect
-ATSPI_TYPE_RECT
-atspi_rect_copy
-AtspiPoint
-ATSPI_TYPE_POINT
-atspi_point_get_type
-atspi_point_copy
-atspi_component_get_type
-AtspiComponent
-atspi_component_contains
-atspi_component_get_accessible_at_point
-atspi_component_get_extents
-atspi_component_get_position
-atspi_component_get_size
-atspi_component_get_layer
-atspi_component_get_mdi_z_order
-atspi_component_grab_focus
-atspi_component_get_alpha
-atspi_component_scroll_to
-atspi_component_scroll_to_point
-atspi_component_set_extents
-atspi_component_set_position
-atspi_component_set_size
-<SUBSECTION Standard>
-ATSPI_COMPONENT
-ATSPI_IS_COMPONENT
-ATSPI_TYPE_COMPONENT
-atspi_rect_get_type
-ATSPI_COMPONENT_GET_IFACE
-</SECTION>
-
-<SECTION>
-<FILE>atspi-registry</FILE>
-atspi_key_definition_get_type
-atspi_get_desktop_count
-atspi_get_desktop
-atspi_get_desktop_list
-atspi_register_keystroke_listener
-atspi_deregister_keystroke_listener
-atspi_register_device_event_listener
-atspi_deregister_device_event_listener
-atspi_generate_keyboard_event
-atspi_generate_mouse_event
-atspi_set_reference_window
-</SECTION>
-
-<SECTION>
-<FILE>atspi-types</FILE>
-AtspiControllerEventMask
-AtspiKeyMaskType
-AtspiKeyEventMask
-AtspiDeviceEventMask
-AtspiDeviceEvent
-AtspiEventListenerMode
-AtspiKeyDefinition
-AtspiEvent
-AtspiKeystrokeListener
-AtspiKeyListenerSyncType
-
-<SUBSECTION Standard>
-ATSPI_TYPE_EVENT
-atspi_device_event_get_type
-atspi_key_listener_sync_type_get_type
-</SECTION>
-
-<SECTION>
-<FILE>atspi-constants</FILE>
-AtspiLocaleType
-ATSPI_LOCALE_TYPE
-AtspiCoordType
-ATSPI_COORD_TYPE_COUNT
-AtspiCollectionSortOrder
-ATSPI_SORTORDER_COUNT
-AtspiCollectionMatchType
-ATSPI_MATCHTYPES_COUNT
-AtspiCollectionTreeTraversalType
-ATSPI_TREETRAVERSALTYPE
-AtspiComponentLayer
-ATSPI_COMPONENTLAYER_COUNT
-AtspiTextGranularity
-AtspiTextBoundaryType
-ATSPI_TEXT_BOUNDARY_TYPE_COUNT
-AtspiTextClipType
-ATSPI_TEXT_CLIP_TYPE_COUNT
-AtspiStateType
-ATSPI_STATETYPE_COUNT
-AtspiKeyEventType
-ATSPI_KEYEVENTTYPE_COUNT
-AtspiEventType
-ATSPI_EVENTTYPE_COUNT
-AtspiKeySynthType
-ATSPI_KEYSYNTHTYPE_COUNT
-AtspiModifierType
-ATSPI_MODIFIERTYPE_COUNT
-AtspiRelationType
-ATSPI_RELATIONTYPE_COUNT
-AtspiRole
-ATSPI_ROLE_COUNT
-AtspiCache
-AtspiScrollType
-ATSPI_SCROLLTYPE_COUNT
-
-<SUBSECTION Standard>
-atspi_cache_get_type
-atspi_collection_match_type_get_type
-atspi_collection_sort_order_get_type
-atspi_collection_tree_traversal_type_get_type
-atspi_component_layer_get_type
-atspi_coord_type_get_type
-atspi_event_type_get_type
-atspi_key_event_type_get_type
-atspi_key_synth_type_get_type
-atspi_locale_type_get_type
-atspi_modifier_type_get_type
-atspi_modifier_type_get_type
-atspi_relation_type_get_type
-atspi_role_get_type
-atspi_scroll_type_get_type
-atspi_state_type_get_type
-atspi_text_boundary_type_get_type
-atspi_text_clip_type_get_type
-atspi_text_granularity_get_type
-ATSPI_TYPE_CACHE
-ATSPI_TYPE_COLLECTION_MATCH_TYPE
-ATSPI_TYPE_COLLECTION_SORT_ORDER
-ATSPI_TYPE_COLLECTION_TREE_TRAVERSAL_TYPE
-ATSPI_TYPE_COMPONENT_LAYER
-ATSPI_TYPE_COORD_TYPE
-ATSPI_TYPE_DEVICE_EVENT
-ATSPI_TYPE_EVENT_TYPE
-ATSPI_TYPE_KEY_EVENT_TYPE
-ATSPI_TYPE_KEY_LISTENER_SYNC_TYPE
-ATSPI_TYPE_KEY_SYNTH_TYPE
-ATSPI_TYPE_LOCALE_TYPE
-ATSPI_TYPE_MODIFIER_TYPE
-ATSPI_TYPE_RELATION_TYPE
-ATSPI_TYPE_ROLE
-ATSPI_TYPE_SCROLL_TYPE
-ATSPI_TYPE_STATE_TYPE
-ATSPI_TYPE_TEXT_BOUNDARY_TYPE
-ATSPI_TYPE_TEXT_CLIP_TYPE
-ATSPI_TYPE_TEXT_GRANULARITY
-</SECTION>
-
-<SECTION>
-<FILE>atspi-misc</FILE>
-atspi_init
-atspi_is_initialized
-atspi_set_timeout
-atspi_set_main_context
-atspi_event_main
-atspi_event_quit
-atspi_exit
-
-<SUBSECTION Private>
-atspi_main_loop
-atspi_get_a11y_bus
-atspi_dbus_connection_setup_with_g_main
-atspi_dbus_server_setup_with_g_main
-atspi_bus_registry
-ATSPI_CACHE_CHILDREN
-ATSPI_CACHE_DESCRIPTION
-ATSPI_CACHE_INTERFACES
-ATSPI_CACHE_NAME
-ATSPI_CACHE_PARENT
-ATSPI_CACHE_ROLE
-ATSPI_CACHE_STATES
-ATSPI_DBUS_INTERFACE_ACCESSIBLE
-ATSPI_DBUS_INTERFACE_ACTION
-ATSPI_DBUS_INTERFACE_APPLICATION
-ATSPI_DBUS_INTERFACE_CACHE
-ATSPI_DBUS_INTERFACE_COLLECTION
-ATSPI_DBUS_INTERFACE_COMPONENT
-ATSPI_DBUS_INTERFACE_DEC
-ATSPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER
-ATSPI_DBUS_INTERFACE_DOCUMENT
-ATSPI_DBUS_INTERFACE_EDITABLE_TEXT
-ATSPI_DBUS_INTERFACE_EVENT_KEYBOARD
-ATSPI_DBUS_INTERFACE_EVENT_MOUSE
-ATSPI_DBUS_INTERFACE_EVENT_OBJECT
-ATSPI_DBUS_INTERFACE_HYPERLINK
-ATSPI_DBUS_INTERFACE_HYPERTEXT
-ATSPI_DBUS_INTERFACE_IMAGE
-ATSPI_DBUS_INTERFACE_REGISTRY
-ATSPI_DBUS_INTERFACE_SELECTION
-ATSPI_DBUS_INTERFACE_SOCKET
-ATSPI_DBUS_INTERFACE_TABLE
-ATSPI_DBUS_INTERFACE_TABLE_CELL
-ATSPI_DBUS_INTERFACE_TEXT
-ATSPI_DBUS_INTERFACE_VALUE
-ATSPI_DBUS_NAME_REGISTRY
-ATSPI_DBUS_PATH_DEC
-ATSPI_DBUS_PATH_NULL
-ATSPI_DBUS_PATH_REGISTRY
-ATSPI_DBUS_PATH_ROOT
-atspi_interface_accessible
-atspi_interface_action
-atspi_interface_application
-atspi_interface_cache
-atspi_interface_collection
-atspi_interface_component
-atspi_interface_dec
-atspi_interface_device_event_listener
-atspi_interface_document
-atspi_interface_editable_text
-atspi_interface_hyperlink
-atspi_interface_hypertext
-atspi_interface_image
-atspi_interface_registry
-atspi_interface_selection
-atspi_interface_table
-atspi_interface_table_cell
-atspi_interface_text
-atspi_interface_value
-atspi_no_cache
-atspi_path_dec
-atspi_path_registry
-atspi_path_root
-AtspiReference
-AtspiError
-ATSPI_ERROR
-
-</SECTION>
diff --git a/doc/libatspi/libatspi.types b/doc/libatspi/libatspi.types
deleted file mode 100644 (file)
index abeb3fe..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-atspi_accessible_get_type
-atspi_action_get_type
-atspi_collection_get_type
-atspi_component_get_type
-atspi_device_listener_get_type
-atspi_document_get_type
-atspi_editable_text_get_type
-atspi_event_get_type
-atspi_event_listener_get_type
-atspi_hyperlink_get_type
-atspi_hypertext_get_type
-atspi_image_get_type
-atspi_key_definition_get_type
-atspi_match_rule_get_type
-atspi_object_get_type
-atspi_point_get_type
-atspi_range_get_type
-atspi_rect_get_type
-atspi_relation_get_type
-atspi_selection_get_type
-atspi_state_set_get_type
-atspi_table_get_type
-atspi_text_get_type
-atspi_text_range_get_type
-atspi_value_get_type
diff --git a/doc/libatspi/meson.build b/doc/libatspi/meson.build
deleted file mode 100644 (file)
index 77a860c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-version_xml_conf = configuration_data()
-version_xml_conf.set('PACKAGE_VERSION', meson.project_name())
-configure_file(input: 'version.xml.in',
-               output: 'version.xml',
-               configuration: version_xml_conf)
-
-glib_prefix = dependency('glib-2.0').get_pkgconfig_variable('prefix')
-glib_docpath = join_paths(glib_prefix, 'share', 'gtk-doc', 'html')
-docpath = join_paths(atspi_datadir, 'gtk-doc', 'html')
-
-gnome.gtkdoc('libatspi',
-             main_xml: 'libatspi-docs.sgml',
-             src_dir: [
-               join_paths(meson.source_root(), 'atspi'),
-               join_paths(meson.build_root(), 'atspi'),
-             ],
-             dependencies: atspi_dep,
-             gobject_typesfile: 'libatspi.types',
-             scan_args: [
-               '--rebuild-types',
-             ],
-             mkdb_args: [
-               '--sgml-mode',
-               '--output-format=xml',
-             ],
-             fixxref_args: [
-               '--html-dir=@0@'.format(docpath),
-               '--extra-dir=@0@'.format(join_paths(glib_docpath, 'glib')),
-               '--extra-dir=@0@'.format(join_paths(glib_docpath, 'gobject')),
-             ],
-             install: true)
-
diff --git a/doc/libatspi/tmpl/atspi-accessible.sgml b/doc/libatspi/tmpl/atspi-accessible.sgml
deleted file mode 100644 (file)
index 0e161ee..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-AtspiAccessible
-
-<!-- ##### SECTION Short_Description ##### -->
-The base interface which is implemented by all accessible objects.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-The base interface which is implemented by all accessible objects. 
-All objects support interfaces for querying their contained 'children'
-and position in the accessible-object hierarchy, whether or not they
-actually have children.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiAccessible ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiAccessibleClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
-<!-- ##### FUNCTION atspi_role_get_name ##### -->
-<para>
-
-</para>
-
-@role: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_name ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_description ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_parent ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_child_count ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_child_at_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@child_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_index_in_parent ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_relation_set ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_role ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_role_name ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_localized_role_name ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_state_set ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_attributes ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_attributes_as_array ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_toolkit_name ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_toolkit_version ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_application ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_action ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_collection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_component ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_document ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_editable_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_hyperlink ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_hypertext ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_image ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_table ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_interfaces ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_accessible_get_accessible_id ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-action.sgml b/doc/libatspi/tmpl/atspi-action.sgml
deleted file mode 100644 (file)
index d8802a1..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-action
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiAction ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_action_get_n_actions ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_action_get_description ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_action_get_key_binding ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_action_get_name ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_action_do_action ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-application.sgml b/doc/libatspi/tmpl/atspi-application.sgml
deleted file mode 100644 (file)
index e6a6316..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-application
-
-<!-- ##### SECTION Short_Description ##### -->
- An interface identifying the root object associated
- with a running application.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
- An interface identifying an object which is the root of the
-  hierarchy associated with a running application.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiApplication ##### -->
-<para>
-
-</para>
-
-@parent: 
-@hash: 
-@bus_name: 
-@bus: 
-@root: 
-@cache: 
-@toolkit_name: 
-@toolkit_version: 
-@atspi_version: 
-@time_added: 
-
-<!-- ##### STRUCT AtspiApplicationClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
diff --git a/doc/libatspi/tmpl/atspi-collection.sgml b/doc/libatspi/tmpl/atspi-collection.sgml
deleted file mode 100644 (file)
index 1e604b2..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-collection
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface designed to allow accessibles which satisfy a set of 
-criteria to be returned.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface designed to allow accessibles which satisfy a set of 
-criteria to be returned. This interface can be used to avoid iteration
-or client-side search of the object tree.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiCollection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_collection_is_ancestor_of ##### -->
-<para>
-
-</para>
-
-@collection: 
-@test: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_collection_get_matches ##### -->
-<para>
-
-</para>
-
-@collection: 
-@rule: 
-@sortby: 
-@count: 
-@traverse: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_collection_get_matches_to ##### -->
-<para>
-
-</para>
-
-@collection: 
-@current_object: 
-@rule: 
-@sortby: 
-@tree: 
-@limit_scope: 
-@count: 
-@traverse: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_collection_get_matches_from ##### -->
-<para>
-
-</para>
-
-@collection: 
-@current_object: 
-@rule: 
-@sortby: 
-@tree: 
-@count: 
-@traverse: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_collection_get_active_descendant ##### -->
-<para>
-
-</para>
-
-@collection: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-component.sgml b/doc/libatspi/tmpl/atspi-component.sgml
deleted file mode 100644 (file)
index 546137e..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-component
-
-<!-- ##### SECTION Short_Description ##### -->
- An interface implemented by objects which have onscreen visual 
- representations.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-  The Component interface is implemented by objects which occupy on-screen
-  space, e.g. objects which have onscreen visual representations. The methods
-  in Component allow clients to identify where the objects lie in the onscreen
-  coordinate system, their relative size, stacking order, and position. It
-  also provides a mechanism whereby keyboard focus may be transferred to 
-  specific user interface elements programmatically.  This is a 2D API. 
-  Coordinates of 3D objects are projected into the 2-dimensional screen view
-  for purposes of this interface.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiRect ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_TYPE_RECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION atspi_rect_copy ##### -->
-<para>
-
-</para>
-
-@src: 
-@Returns: 
-
-
-<!-- ##### STRUCT AtspiPoint ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_TYPE_POINT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION atspi_point_get_type ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_point_copy ##### -->
-<para>
-
-</para>
-
-@src: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_type ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### STRUCT AtspiComponent ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_component_contains ##### -->
-<para>
-
-</para>
-
-@obj: 
-@x: 
-@y: 
-@ctype: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_accessible_at_point ##### -->
-<para>
-
-</para>
-
-@obj: 
-@x: 
-@y: 
-@ctype: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_extents ##### -->
-<para>
-
-</para>
-
-@obj: 
-@ctype: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_position ##### -->
-<para>
-
-</para>
-
-@obj: 
-@ctype: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_size ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_layer ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_mdi_z_order ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_grab_focus ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_component_get_alpha ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-constants.sgml b/doc/libatspi/tmpl/atspi-constants.sgml
deleted file mode 100644 (file)
index af2ec33..0000000
+++ /dev/null
@@ -1,499 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-constants
-
-<!-- ##### SECTION Short_Description ##### -->
-Constant definitions needed by multiple interfaces.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-Constant definitions needed by multiple interfaces.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM AtspiLocaleType ##### -->
-<para>
-
-</para>
-
-@ATSPI_LOCALE_TYPE_MESSAGES: 
-@ATSPI_LOCALE_TYPE_COLLATE: 
-@ATSPI_LOCALE_TYPE_CTYPE: 
-@ATSPI_LOCALE_TYPE_MONETARY: 
-@ATSPI_LOCALE_TYPE_NUMERIC: 
-@ATSPI_LOCALE_TYPE_TIME: 
-
-<!-- ##### MACRO ATSPI_LOCALE_TYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiScrollType ##### -->
-<para>
-
-</para>
-
-@ATSPI_SCROLL_TOP_LEFT:
-@ATSPI_SCROLL_BOTTOM_RIGHT:
-@ATSPI_SCROLL_TOP_EDGE:
-@ATSPI_SCROLL_BOTTOM_EDGE:
-@ATSPI_SCROLL_LEFT_EDGE:
-@ATSPI_SCROLL_RIGHT_EDGE:
-@ATSPI_SCROLL_ANYWHERE:
-
-<!-- ##### MACRO ATSPI_SCROLLTYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiCoordType ##### -->
-<para>
-
-</para>
-
-@ATSPI_COORD_TYPE_SCREEN: 
-@ATSPI_COORD_TYPE_WINDOW: 
-@ATSPI_COORD_TYPE_PARENT:
-
-<!-- ##### MACRO ATSPI_COORD_TYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiCollectionSortOrder ##### -->
-<para>
-
-</para>
-
-@ATSPI_Collection_SORT_ORDER_INVALID: 
-@ATSPI_Collection_SORT_ORDER_CANONICAL: 
-@ATSPI_Collection_SORT_ORDER_FLOW: 
-@ATSPI_Collection_SORT_ORDER_TAB: 
-@ATSPI_Collection_SORT_ORDER_REVERSE_CANONICAL: 
-@ATSPI_Collection_SORT_ORDER_REVERSE_FLOW: 
-@ATSPI_Collection_SORT_ORDER_REVERSE_TAB: 
-@ATSPI_Collection_SORT_ORDER_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_SORTORDER_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiCollectionMatchType ##### -->
-<para>
-
-</para>
-
-@ATSPI_Collection_MATCH_INVALID: 
-@ATSPI_Collection_MATCH_ALL: 
-@ATSPI_Collection_MATCH_ANY: 
-@ATSPI_Collection_MATCH_NONE: 
-@ATSPI_Collection_MATCH_EMPTY: 
-@ATSPI_Collection_MATCH_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_MATCHTYPES_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiCollectionTreeTraversalType ##### -->
-<para>
-
-</para>
-
-@ATSPI_Collection_TREE_RESTRICT_CHILDREN: 
-@ATSPI_Collection_TREE_RESTRICT_SIBLING: 
-@ATSPI_Collection_TREE_INORDER: 
-@ATSPI_Collection_TREE_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_TREETRAVERSALTYPE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiComponentLayer ##### -->
-<para>
-
-</para>
-
-@ATSPI_LAYER_INVALID: 
-@ATSPI_LAYER_BACKGROUND: 
-@ATSPI_LAYER_CANVAS: 
-@ATSPI_LAYER_WIDGET: 
-@ATSPI_LAYER_MDI: 
-@ATSPI_LAYER_POPUP: 
-@ATSPI_LAYER_OVERLAY: 
-@ATSPI_LAYER_WINDOW: 
-@ATSPI_LAYER_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_COMPONENTLAYER_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiTextBoundaryType ##### -->
-<para>
-
-</para>
-
-@ATSPI_TEXT_BOUNDARY_CHAR: 
-@ATSPI_TEXT_BOUNDARY_WORD_START: 
-@ATSPI_TEXT_BOUNDARY_WORD_END: 
-@ATSPI_TEXT_BOUNDARY_SENTENCE_START: 
-@ATSPI_TEXT_BOUNDARY_SENTENCE_END: 
-@ATSPI_TEXT_BOUNDARY_LINE_START: 
-@ATSPI_TEXT_BOUNDARY_LINE_END: 
-
-<!-- ##### MACRO ATSPI_TEXT_BOUNDARY_TYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiTextClipType ##### -->
-<para>
-
-</para>
-
-@ATSPI_TEXT_CLIP_NONE: 
-@ATSPI_TEXT_CLIP_MIN: 
-@ATSPI_TEXT_CLIP_MAX: 
-@ATSPI_TEXT_CLIP_BOTH: 
-
-<!-- ##### MACRO ATSPI_TEXT_CLIP_TYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiStateType ##### -->
-<para>
-
-</para>
-
-@ATSPI_STATE_INVALID: 
-@ATSPI_STATE_ACTIVE: 
-@ATSPI_STATE_ARMED: 
-@ATSPI_STATE_BUSY: 
-@ATSPI_STATE_CHECKED: 
-@ATSPI_STATE_COLLAPSED: 
-@ATSPI_STATE_DEFUNCT: 
-@ATSPI_STATE_EDITABLE: 
-@ATSPI_STATE_ENABLED: 
-@ATSPI_STATE_EXPANDABLE: 
-@ATSPI_STATE_EXPANDED: 
-@ATSPI_STATE_FOCUSABLE: 
-@ATSPI_STATE_FOCUSED: 
-@ATSPI_STATE_HAS_TOOLTIP: 
-@ATSPI_STATE_HORIZONTAL: 
-@ATSPI_STATE_ICONIFIED: 
-@ATSPI_STATE_MODAL: 
-@ATSPI_STATE_MULTI_LINE: 
-@ATSPI_STATE_MULTISELECTABLE: 
-@ATSPI_STATE_OPAQUE: 
-@ATSPI_STATE_PRESSED: 
-@ATSPI_STATE_RESIZABLE: 
-@ATSPI_STATE_SELECTABLE: 
-@ATSPI_STATE_SELECTED: 
-@ATSPI_STATE_SENSITIVE: 
-@ATSPI_STATE_SHOWING: 
-@ATSPI_STATE_SINGLE_LINE: 
-@ATSPI_STATE_STALE: 
-@ATSPI_STATE_TRANSIENT: 
-@ATSPI_STATE_VERTICAL: 
-@ATSPI_STATE_VISIBLE: 
-@ATSPI_STATE_MANAGES_DESCENDANTS: 
-@ATSPI_STATE_INDETERMINATE: 
-@ATSPI_STATE_REQUIRED: 
-@ATSPI_STATE_TRUNCATED: 
-@ATSPI_STATE_ANIMATED: 
-@ATSPI_STATE_INVALID_ENTRY: 
-@ATSPI_STATE_SUPPORTS_AUTOCOMPLETION: 
-@ATSPI_STATE_SELECTABLE_TEXT: 
-@ATSPI_STATE_IS_DEFAULT: 
-@ATSPI_STATE_VISITED: 
-@ATSPI_STATE_CHECKABLE: 
-@ATSPI_STATE_HAS_POPUP: 
-@ATSPI_STATE_READ_ONLY: 
-@ATSPI_STATE_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_STATETYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiKeyEventType ##### -->
-<para>
-
-</para>
-
-@ATSPI_KEY_PRESSED: 
-@ATSPI_KEY_RELEASED: 
-
-<!-- ##### MACRO ATSPI_KEYEVENTTYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiEventType ##### -->
-<para>
-
-</para>
-
-@ATSPI_KEY_PRESSED_EVENT: 
-@ATSPI_KEY_RELEASED_EVENT: 
-@ATSPI_BUTTON_PRESSED_EVENT: 
-@ATSPI_BUTTON_RELEASED_EVENT: 
-
-<!-- ##### MACRO ATSPI_EVENTTYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiKeySynthType ##### -->
-<para>
-
-</para>
-
-@ATSPI_KEY_PRESS: 
-@ATSPI_KEY_RELEASE: 
-@ATSPI_KEY_PRESSRELEASE: 
-@ATSPI_KEY_SYM: 
-@ATSPI_KEY_STRING: 
-@ATSPI_KEY_LOCKMODIFIERS: 
-@ATSPI_KEY_UNLOCKMODIFIERS: 
-
-<!-- ##### MACRO ATSPI_KEYSYNTHTYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiModifierType ##### -->
-<para>
-
-</para>
-
-@ATSPI_MODIFIER_SHIFT: 
-@ATSPI_MODIFIER_SHIFTLOCK: 
-@ATSPI_MODIFIER_CONTROL: 
-@ATSPI_MODIFIER_ALT: 
-@ATSPI_MODIFIER_META: 
-@ATSPI_MODIFIER_META2: 
-@ATSPI_MODIFIER_META3: 
-@ATSPI_MODIFIER_NUMLOCK: 
-
-<!-- ##### MACRO ATSPI_MODIFIERTYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiRelationType ##### -->
-<para>
-
-</para>
-
-@ATSPI_RELATION_NULL: 
-@ATSPI_RELATION_LABEL_FOR: 
-@ATSPI_RELATION_LABELLED_BY: 
-@ATSPI_RELATION_CONTROLLER_FOR: 
-@ATSPI_RELATION_CONTROLLED_BY: 
-@ATSPI_RELATION_MEMBER_OF: 
-@ATSPI_RELATION_TOOLTIP_FOR: 
-@ATSPI_RELATION_NODE_CHILD_OF: 
-@ATSPI_RELATION_NODE_PARENT_OF: 
-@ATSPI_RELATION_EXTENDED: 
-@ATSPI_RELATION_FLOWS_TO: 
-@ATSPI_RELATION_FLOWS_FROM: 
-@ATSPI_RELATION_SUBWINDOW_OF: 
-@ATSPI_RELATION_EMBEDS: 
-@ATSPI_RELATION_EMBEDDED_BY: 
-@ATSPI_RELATION_POPUP_FOR: 
-@ATSPI_RELATION_PARENT_WINDOW_OF: 
-@ATSPI_RELATION_DESCRIPTION_FOR: 
-@ATSPI_RELATION_DESCRIBED_BY: 
-@ATSPI_RELATION_DETAILS:
-@ATSPI_RELATION_DETAILS_FOR:
-@ATSPI_RELATION_ERROR_MESSAGE:
-@ATSPI_RELATION_ERROR_FOR:
-@ATSPI_RELATION_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_RELATIONTYPE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM AtspiRole ##### -->
-<para>
-
-</para>
-
-@ATSPI_ROLE_INVALID: 
-@ATSPI_ROLE_ACCELERATOR_LABEL: 
-@ATSPI_ROLE_ALERT: 
-@ATSPI_ROLE_ANIMATION: 
-@ATSPI_ROLE_ARROW: 
-@ATSPI_ROLE_CALENDAR: 
-@ATSPI_ROLE_CANVAS: 
-@ATSPI_ROLE_CHECK_BOX: 
-@ATSPI_ROLE_CHECK_MENU_ITEM: 
-@ATSPI_ROLE_COLOR_CHOOSER: 
-@ATSPI_ROLE_COLUMN_HEADER: 
-@ATSPI_ROLE_COMBO_BOX: 
-@ATSPI_ROLE_DATE_EDITOR: 
-@ATSPI_ROLE_DESKTOP_ICON: 
-@ATSPI_ROLE_DESKTOP_FRAME: 
-@ATSPI_ROLE_DIAL: 
-@ATSPI_ROLE_DIALOG: 
-@ATSPI_ROLE_DIRECTORY_PANE: 
-@ATSPI_ROLE_DRAWING_AREA: 
-@ATSPI_ROLE_FILE_CHOOSER: 
-@ATSPI_ROLE_FILLER: 
-@ATSPI_ROLE_FOCUS_TRAVERSABLE: 
-@ATSPI_ROLE_FONT_CHOOSER: 
-@ATSPI_ROLE_FRAME: 
-@ATSPI_ROLE_GLASS_PANE: 
-@ATSPI_ROLE_HTML_CONTAINER: 
-@ATSPI_ROLE_ICON: 
-@ATSPI_ROLE_IMAGE: 
-@ATSPI_ROLE_INTERNAL_FRAME: 
-@ATSPI_ROLE_LABEL: 
-@ATSPI_ROLE_LAYERED_PANE: 
-@ATSPI_ROLE_LIST: 
-@ATSPI_ROLE_LIST_ITEM: 
-@ATSPI_ROLE_MENU: 
-@ATSPI_ROLE_MENU_BAR: 
-@ATSPI_ROLE_MENU_ITEM: 
-@ATSPI_ROLE_OPTION_PANE: 
-@ATSPI_ROLE_PAGE_TAB: 
-@ATSPI_ROLE_PAGE_TAB_LIST: 
-@ATSPI_ROLE_PANEL: 
-@ATSPI_ROLE_PASSWORD_TEXT: 
-@ATSPI_ROLE_POPUP_MENU: 
-@ATSPI_ROLE_PROGRESS_BAR: 
-@ATSPI_ROLE_PUSH_BUTTON: 
-@ATSPI_ROLE_RADIO_BUTTON: 
-@ATSPI_ROLE_RADIO_MENU_ITEM: 
-@ATSPI_ROLE_ROOT_PANE: 
-@ATSPI_ROLE_ROW_HEADER: 
-@ATSPI_ROLE_SCROLL_BAR: 
-@ATSPI_ROLE_SCROLL_PANE: 
-@ATSPI_ROLE_SEPARATOR: 
-@ATSPI_ROLE_SLIDER: 
-@ATSPI_ROLE_SPIN_BUTTON: 
-@ATSPI_ROLE_SPLIT_PANE: 
-@ATSPI_ROLE_STATUS_BAR: 
-@ATSPI_ROLE_TABLE: 
-@ATSPI_ROLE_TABLE_CELL: 
-@ATSPI_ROLE_TABLE_COLUMN_HEADER: 
-@ATSPI_ROLE_TABLE_ROW_HEADER: 
-@ATSPI_ROLE_TEAROFF_MENU_ITEM: 
-@ATSPI_ROLE_TERMINAL: 
-@ATSPI_ROLE_TEXT: 
-@ATSPI_ROLE_TOGGLE_BUTTON: 
-@ATSPI_ROLE_TOOL_BAR: 
-@ATSPI_ROLE_TOOL_TIP: 
-@ATSPI_ROLE_TREE: 
-@ATSPI_ROLE_TREE_TABLE: 
-@ATSPI_ROLE_UNKNOWN: 
-@ATSPI_ROLE_VIEWPORT: 
-@ATSPI_ROLE_WINDOW: 
-@ATSPI_ROLE_EXTENDED: 
-@ATSPI_ROLE_HEADER: 
-@ATSPI_ROLE_FOOTER: 
-@ATSPI_ROLE_PARAGRAPH: 
-@ATSPI_ROLE_RULER: 
-@ATSPI_ROLE_APPLICATION: 
-@ATSPI_ROLE_AUTOCOMPLETE: 
-@ATSPI_ROLE_EDITBAR: 
-@ATSPI_ROLE_EMBEDDED: 
-@ATSPI_ROLE_ENTRY: 
-@ATSPI_ROLE_CHART: 
-@ATSPI_ROLE_CAPTION: 
-@ATSPI_ROLE_DOCUMENT_FRAME: 
-@ATSPI_ROLE_HEADING: 
-@ATSPI_ROLE_PAGE: 
-@ATSPI_ROLE_SECTION: 
-@ATSPI_ROLE_REDUNDANT_OBJECT: 
-@ATSPI_ROLE_FORM: 
-@ATSPI_ROLE_LINK: 
-@ATSPI_ROLE_INPUT_METHOD_WINDOW: 
-@ATSPI_ROLE_TABLE_ROW: 
-@ATSPI_ROLE_TREE_ITEM: 
-@ATSPI_ROLE_DOCUMENT_SPREADSHEET: 
-@ATSPI_ROLE_DOCUMENT_PRESENTATION: 
-@ATSPI_ROLE_DOCUMENT_TEXT: 
-@ATSPI_ROLE_DOCUMENT_WEB: 
-@ATSPI_ROLE_DOCUMENT_EMAIL: 
-@ATSPI_ROLE_COMMENT: 
-@ATSPI_ROLE_LIST_BOX: 
-@ATSPI_ROLE_GROUPING: 
-@ATSPI_ROLE_IMAGE_MAP: 
-@ATSPI_ROLE_NOTIFICATION: 
-@ATSPI_ROLE_INFO_BAR: 
-@ATSPI_ROLE_LEVEL_BAR: 
-@ATSPI_ROLE_TITLE_BAR: 
-@ATSPI_ROLE_BLOCK_QUOTE: 
-@ATSPI_ROLE_AUDIO: 
-@ATSPI_ROLE_VIDEO: 
-@ATSPI_ROLE_DEFINITION: 
-@ATSPI_ROLE_ARTICLE: 
-@ATSPI_ROLE_LANDMARK: 
-@ATSPI_ROLE_LOG: 
-@ATSPI_ROLE_MARQUEE: 
-@ATSPI_ROLE_MATH: 
-@ATSPI_ROLE_RATING: 
-@ATSPI_ROLE_TIMER: 
-@ATSPI_ROLE_STATIC: 
-@ATSPI_ROLE_MATH_FRACTION: 
-@ATSPI_ROLE_MATH_ROOT: 
-@ATSPI_ROLE_SUBSCRIPT: 
-@ATSPI_ROLE_SUPERSCRIPT: 
-@ATSPI_ROLE_DESCRIPTION_LIST:
-@ATSPI_ROLE_DESCRIPTION_TERM:
-@ATSPI_ROLE_DESCRIPTION_VALUE:
-@ATSPI_ROLE_LAST_DEFINED: 
-
-<!-- ##### MACRO ATSPI_ROLE_COUNT ##### -->
-<para>
-
-</para>
-
-
-
diff --git a/doc/libatspi/tmpl/atspi-device-listener.sgml b/doc/libatspi/tmpl/atspi-device-listener.sgml
deleted file mode 100644 (file)
index f1f3de1..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-devicelistener
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface for creating and manipulating
-device listeners.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface for creating and manipulating
-device listeners with callback functions.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### USER_FUNCTION AtspiDeviceListenerCB ##### -->
-<para>
-
-</para>
-
-@stroke: 
-@user_data: 
-@Returns: 
-
-
-<!-- ##### USER_FUNCTION AtspiDeviceListenerSimpleCB ##### -->
-<para>
-
-</para>
-
-@stroke: 
-@Returns: 
-
-
-<!-- ##### STRUCT AtspiDeviceListener ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiDeviceListenerClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-@device_event: 
-
-<!-- ##### FUNCTION atspi_device_listener_new ##### -->
-<para>
-
-</para>
-
-@callback: 
-@user_data: 
-@callback_destroyed: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_device_listener_new_simple ##### -->
-<para>
-
-</para>
-
-@callback: 
-@callback_destroyed: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_device_listener_add_callback ##### -->
-<para>
-
-</para>
-
-@listener: 
-@callback: 
-@callback_destroyed: 
-@user_data: 
-
-
-<!-- ##### FUNCTION atspi_device_listener_remove_callback ##### -->
-<para>
-
-</para>
-
-@listener: 
-@callback: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-document.sgml b/doc/libatspi/tmpl/atspi-document.sgml
deleted file mode 100644 (file)
index 5162ed2..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-document
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiDocument ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_document_get_locale ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_document_get_attribute_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@attribute: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_document_get_attributes ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-editabletext.sgml b/doc/libatspi/tmpl/atspi-editabletext.sgml
deleted file mode 100644 (file)
index 3fa05bd..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-editabletext
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface that provides methods for modifying textual content
-of components which support editing.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-Derived from atspi-text, the atspi-editabletext interface 
-provides methods for modifying textual content of components
-which support editing. EditableText also interacts with the
-system clipboard via copy, cut, and paste methods.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiEditableText ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_editable_text_set_attributes ##### -->
-<para>
-
-</para>
-
-@obj: 
-@attributes: 
-@start_pos: 
-@end_pos: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_editable_text_insert_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@position: 
-@text: 
-@length: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_editable_text_copy_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@start_pos: 
-@end_pos: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_editable_text_cut_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@start_pos: 
-@end_pos: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_editable_text_delete_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@start_pos: 
-@end_pos: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_editable_text_paste_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@position: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-event-listener.sgml b/doc/libatspi/tmpl/atspi-event-listener.sgml
deleted file mode 100644 (file)
index 5cf1a87..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-event-listener
-
-<!-- ##### SECTION Short_Description ##### -->
-A generic interface implemented by objects for the receipt of event 
-notifications.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-A generic interface implemented by objects for the receipt of event 
-notifications. atspi-event-listener is the interface via which clients of 
-the atspi-registry receive notification of changes to an application's user 
-interface and content. 
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### USER_FUNCTION AtspiEventListenerCB ##### -->
-<para>
-
-</para>
-
-@event: 
-@user_data: 
-
-
-<!-- ##### USER_FUNCTION AtspiEventListenerSimpleCB ##### -->
-<para>
-
-</para>
-
-@event: 
-
-
-<!-- ##### STRUCT AtspiEventListener ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiEventListenerClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
-<!-- ##### FUNCTION atspi_event_listener_get_type ##### -->
-<para>
-
-</para>
-
-@void: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_new ##### -->
-<para>
-
-</para>
-
-@callback: 
-@user_data: 
-@callback_destroyed: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_new_simple ##### -->
-<para>
-
-</para>
-
-@callback: 
-@callback_destroyed: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_register ##### -->
-<para>
-
-</para>
-
-@listener: 
-@event_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_register_from_callback ##### -->
-<para>
-
-</para>
-
-@callback: 
-@user_data: 
-@callback_destroyed: 
-@event_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_register_no_data ##### -->
-<para>
-
-</para>
-
-@callback: 
-@callback_destroyed: 
-@event_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_deregister ##### -->
-<para>
-
-</para>
-
-@listener: 
-@event_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_deregister_from_callback ##### -->
-<para>
-
-</para>
-
-@callback: 
-@user_data: 
-@event_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_listener_deregister_no_data ##### -->
-<para>
-
-</para>
-
-@callback: 
-@event_type: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-hyperlink.sgml b/doc/libatspi/tmpl/atspi-hyperlink.sgml
deleted file mode 100644 (file)
index 5942ad3..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-hyperlink
-
-<!-- ##### SECTION Short_Description ##### -->
-Instances of atspi-hyperlink are the means by which end users
-and clients interact with linked content.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
- Instances of atspi-hyperlink are returned by
- atspi-hypertext objects, and are the means by
- which end users and clients interact with linked,
- and in some cases embedded, content. These instances
- may have multiple "anchors", where an anchor corresponds to a
- reference to a particular resource with a corresponding resource
- identified (URI).
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiHyperlink ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiHyperlinkClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
-<!-- ##### FUNCTION atspi_hyperlink_get_n_anchors ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hyperlink_get_uri ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hyperlink_get_object ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hyperlink_get_index_range ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hyperlink_get_start_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hyperlink_get_end_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hyperlink_is_valid ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-hypertext.sgml b/doc/libatspi/tmpl/atspi-hypertext.sgml
deleted file mode 100644 (file)
index 5448f61..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-hypertext
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface used for objects which implement linking between
-multiple resource locations.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface used for objects which implement linking between
-multiple resource or content locations, or multiple 'markers'
-within a single document. A hypertext instance is associated
-with one or more hyperlinks which are associated with  particular
-offests within the hypertext's content.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiHypertext ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_hypertext_get_n_links ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hypertext_get_link ##### -->
-<para>
-
-</para>
-
-@obj: 
-@link_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_hypertext_get_link_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@character_offset: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-image.sgml b/doc/libatspi/tmpl/atspi-image.sgml
deleted file mode 100644 (file)
index 2b7a36e..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-image
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiImage ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_image_get_image_description ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_image_get_image_size ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_image_get_image_position ##### -->
-<para>
-
-</para>
-
-@obj: 
-@ctype: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_image_get_image_extents ##### -->
-<para>
-
-</para>
-
-@obj: 
-@ctype: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_image_get_image_locale ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-listener-private.sgml b/doc/libatspi/tmpl/atspi-listener-private.sgml
deleted file mode 100644 (file)
index f529533..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-listener-private
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
diff --git a/doc/libatspi/tmpl/atspi-matchrule.sgml b/doc/libatspi/tmpl/atspi-matchrule.sgml
deleted file mode 100644 (file)
index b52922b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-matchrule
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface that allows the definition of match rules
-for accessible objects.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface that allows the definition of match rules
-for accessible objects.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiMatchRule ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiMatchRuleClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
-<!-- ##### FUNCTION atspi_match_rule_new ##### -->
-<para>
-
-</para>
-
-@states: 
-@statematchtype: 
-@attributes: 
-@attributematchtype: 
-@roles: 
-@rolematchtype: 
-@interfaces: 
-@interfacematchtype: 
-@invert: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-misc-private.sgml b/doc/libatspi/tmpl/atspi-misc-private.sgml
deleted file mode 100644 (file)
index aa4c96c..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-misc-private
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiReference ##### -->
-<para>
-
-</para>
-
-@name: 
-@path: 
-
-<!-- ##### MACRO ATSPI_DBUS_NAME_REGISTRY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_PATH_REGISTRY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_REGISTRY ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_PATH_NULL ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_PATH_ROOT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_PATH_DEC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_DEC ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_CACHE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_ACCESSIBLE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_ACTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_APPLICATION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_COLLECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_COMPONENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_DOCUMENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_EDITABLE_TEXT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_EVENT_KEYBOARD ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_EVENT_MOUSE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_EVENT_OBJECT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_HYPERLINK ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_HYPERTEXT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_IMAGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_SELECTION ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_TABLE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_TEXT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_VALUE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO ATSPI_DBUS_INTERFACE_SOCKET ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### VARIABLE atspi_path_dec ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_path_registry ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_path_root ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_bus_registry ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_accessible ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_action ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_application ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_collection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_component ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_dec ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_device_event_listener ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_document ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_editable_text ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_hyperlink ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_hypertext ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_image ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_registry ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_selection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_table ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_table_cell ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_text ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_cache ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### VARIABLE atspi_interface_value ##### -->
-<para>
-
-</para>
-
-
diff --git a/doc/libatspi/tmpl/atspi-misc.sgml b/doc/libatspi/tmpl/atspi-misc.sgml
deleted file mode 100644 (file)
index 06656a4..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-misc
-
-<!-- ##### SECTION Short_Description ##### -->
-Miscellaneous methods for using AT-SPI services.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-Miscellaneous methods for using AT-SPI services.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION atspi_init ##### -->
-<para>
-
-</para>
-
-@void: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_event_main ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION atspi_event_quit ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION atspi_exit ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-object.sgml b/doc/libatspi/tmpl/atspi-object.sgml
deleted file mode 100644 (file)
index 568af9a..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-AtspiObject
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiObject ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiObjectClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
diff --git a/doc/libatspi/tmpl/atspi-registry.sgml b/doc/libatspi/tmpl/atspi-registry.sgml
deleted file mode 100644 (file)
index a8e9569..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-registry
-
-<!-- ##### SECTION Short_Description ##### -->
-A service through which applications providing accessibility services 
-can rendezvous with consumers of those services.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-A service through which applications providing accessibility services (servers)
-can rendezvous with consumers of those services (Assistive Technologies). The 
-atspi-registry is the first "port of call" for accessible applications and for
-assistive technologies wishing to query and interact with those applications.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### FUNCTION atspi_key_definition_get_type ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_get_desktop_count ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_get_desktop ##### -->
-<para>
-
-</para>
-
-@i: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_get_desktop_list ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_register_keystroke_listener ##### -->
-<para>
-
-</para>
-
-@listener: 
-@key_set: 
-@modmask: 
-@event_types: 
-@sync_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_deregister_keystroke_listener ##### -->
-<para>
-
-</para>
-
-@listener: 
-@key_set: 
-@modmask: 
-@event_types: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_register_device_event_listener ##### -->
-<para>
-
-</para>
-
-@listener: 
-@event_types: 
-@filter: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_deregister_device_event_listener ##### -->
-<para>
-
-</para>
-
-@listener: 
-@filter: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_generate_keyboard_event ##### -->
-<para>
-
-</para>
-
-@keyval: 
-@keystring: 
-@synth_type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_generate_mouse_event ##### -->
-<para>
-
-</para>
-
-@x: 
-@y: 
-@name: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-relation.sgml b/doc/libatspi/tmpl/atspi-relation.sgml
deleted file mode 100644 (file)
index dc548e6..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-relation
-
-<!-- ##### SECTION Short_Description ##### -->
- An interface via which non-hierarchical relationships
- are indicated.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
- An interface via which non-hierarchical relationships
- are indicated. An instance of this interface represents
- a "one-to-many" correspondance.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiRelation ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiRelationClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
-<!-- ##### FUNCTION atspi_relation_get_relation_type ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_relation_get_n_targets ##### -->
-<para>
-
-</para>
-
-@obj: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_relation_get_target ##### -->
-<para>
-
-</para>
-
-@obj: 
-@i: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-selection.sgml b/doc/libatspi/tmpl/atspi-selection.sgml
deleted file mode 100644 (file)
index 6c7a102..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-selection
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface which indicates that an object exposes a 'selection' model,
-allowing the selection of one or more of its children.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface which indicates that an object exposes a 'selection'
-model, allowing the selection of one or more of its children.
-Read-only Selection instances are possible, in which case the
-interface is used to programmatically determine the selected-ness
-of its children.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiSelection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_selection_get_n_selected_children ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_get_selected_child ##### -->
-<para>
-
-</para>
-
-@obj: 
-@selected_child_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_select_child ##### -->
-<para>
-
-</para>
-
-@obj: 
-@child_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_deselect_selected_child ##### -->
-<para>
-
-</para>
-
-@obj: 
-@selected_child_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_deselect_child ##### -->
-<para>
-
-</para>
-
-@obj: 
-@child_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_is_child_selected ##### -->
-<para>
-
-</para>
-
-@obj: 
-@child_index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_select_all ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_selection_clear_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-stateset.sgml b/doc/libatspi/tmpl/atspi-stateset.sgml
deleted file mode 100644 (file)
index dc65b8d..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-stateset
-
-<!-- ##### SECTION Short_Description ##### -->
-The atspi-stateset objects implement wrappers around a
-bitmap of accessible states.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-The atspi-stateset objects implement wrappers around a
-bitmap of accessible states.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiStateSet ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiStateSetClass ##### -->
-<para>
-
-</para>
-
-@parent_class: 
-
-<!-- ##### FUNCTION atspi_state_set_new ##### -->
-<para>
-
-</para>
-
-@states: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_state_set_set_by_name ##### -->
-<para>
-
-</para>
-
-@set: 
-@name: 
-@enabled: 
-
-
-<!-- ##### FUNCTION atspi_state_set_add ##### -->
-<para>
-
-</para>
-
-@set: 
-@state: 
-
-
-<!-- ##### FUNCTION atspi_state_set_compare ##### -->
-<para>
-
-</para>
-
-@set: 
-@set2: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_state_set_contains ##### -->
-<para>
-
-</para>
-
-@set: 
-@state: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_state_set_equals ##### -->
-<para>
-
-</para>
-
-@set: 
-@set2: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_state_set_get_states ##### -->
-<para>
-
-</para>
-
-@set: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_state_set_is_empty ##### -->
-<para>
-
-</para>
-
-@set: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_state_set_remove ##### -->
-<para>
-
-</para>
-
-@set: 
-@state: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-table.sgml b/doc/libatspi/tmpl/atspi-table.sgml
deleted file mode 100644 (file)
index a90cea4..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-table
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface used by containers whose data is arranged in a tabular form.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface used by containers whose contained data is arranged
-in a tabular (i.e. row-column) form. Tables may resemble
-a two-dimensional grid, as in a spreadsheet, or may feature objects
-which span multiple rows and/or columns, but whose bounds are
-aligned on a row/column matrix. Objects within tables are children
-of the table object, and they may be referenced either via a child
-index or via a row/column pair. Table 'cells' may implement other
-interfaces, such as Text, Action, Image, and Component, and should do
-so as appropriate to their onscreen rresentation and/or behavior.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiTable ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_table_get_caption ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_summary ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_n_rows ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_n_columns ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_accessible_at ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_index_at ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_row_at_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_column_at_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@index: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_row_description ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_column_description ##### -->
-<para>
-
-</para>
-
-@obj: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_row_extent_at ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_column_extent_at ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_row_header ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_column_header ##### -->
-<para>
-
-</para>
-
-@obj: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_n_selected_rows ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_selected_rows ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_selected_columns ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_n_selected_columns ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_is_row_selected ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_is_column_selected ##### -->
-<para>
-
-</para>
-
-@obj: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_add_row_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_add_column_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_remove_row_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_remove_column_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@column: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_get_row_column_extents_at_index ##### -->
-<para>
-
-</para>
-
-@obj: 
-@index: 
-@row: 
-@col: 
-@row_extents: 
-@col_extents: 
-@is_selected: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_table_is_selected ##### -->
-<para>
-
-</para>
-
-@obj: 
-@row: 
-@column: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-text.sgml b/doc/libatspi/tmpl/atspi-text.sgml
deleted file mode 100644 (file)
index 961edcb..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-text
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface implemented by objects which place textual
-information onscreen.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-The text interface should be implemented by objects which place textual
-information onscreen as character strings or glyphs. The text interface
-allows access to textual content including display attributes and 
-semantic hints associated with runs of text, and to bounding boc
-information for glyphs and substrings. It also alows portions of text to
-be selected, if the objects StateSet includes STATE_SELECTABLE_TEXT.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiRange ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_TYPE_RANGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION atspi_range_copy ##### -->
-<para>
-
-</para>
-
-@src: 
-@Returns: 
-
-
-<!-- ##### STRUCT AtspiTextRange ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_TYPE_TEXT_RANGE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION atspi_text_get_type ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### STRUCT AtspiText ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_text_range_get_type ##### -->
-<para>
-
-</para>
-
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_character_count ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_text ##### -->
-<para>
-
-</para>
-
-@obj: 
-@start_offset: 
-@end_offset: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_caret_offset ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_attributes ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@start_offset: 
-@end_offset: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_attribute_run ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@include_defaults: 
-@start_offset: 
-@end_offset: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_attribute_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@attribute_name: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_default_attributes ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_set_caret_offset ##### -->
-<para>
-
-</para>
-
-@obj: 
-@new_offset: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_text_before_offset ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_text_at_offset ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_text_after_offset ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_character_at_offset ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_character_extents ##### -->
-<para>
-
-</para>
-
-@obj: 
-@offset: 
-@type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_offset_at_point ##### -->
-<para>
-
-</para>
-
-@obj: 
-@x: 
-@y: 
-@type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_range_extents ##### -->
-<para>
-
-</para>
-
-@obj: 
-@start_offset: 
-@end_offset: 
-@type: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_bounded_ranges ##### -->
-<para>
-
-</para>
-
-@obj: 
-@x: 
-@y: 
-@width: 
-@height: 
-@type: 
-@clipTypeX: 
-@clipTypeY: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_n_selections ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_get_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@selection_num: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_add_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@start_offset: 
-@end_offset: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_remove_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@selection_num: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_text_set_selection ##### -->
-<para>
-
-</para>
-
-@obj: 
-@selection_num: 
-@start_offset: 
-@end_offset: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/atspi-types.sgml b/doc/libatspi/tmpl/atspi-types.sgml
deleted file mode 100644 (file)
index 987b7fa..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-types
-
-<!-- ##### SECTION Short_Description ##### -->
-Type definitions needed by multiple interfaces.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-Type definitions needed by multiple interfaces.
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiAccessible ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiAction ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiCollection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiComponent ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiDocument ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiEditableText ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiHyperlink ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiHypertext ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiImage ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiSelection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiTable ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiTableCell ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiText ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiValue ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### TYPEDEF AtspiControllerEventMask ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### TYPEDEF AtspiKeyMaskType ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### TYPEDEF AtspiKeyEventMask ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### TYPEDEF AtspiDeviceEventMask ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiDeviceEvent ##### -->
-<para>
-
-</para>
-
-@type: 
-@id: 
-@hw_code: 
-@modifiers: 
-@timestamp: 
-@event_string: 
-@is_text: 
-
-<!-- ##### STRUCT AtspiEventListenerMode ##### -->
-<para>
-
-</para>
-
-@synchronous: 
-@preemptive: 
-@global: 
-
-<!-- ##### STRUCT AtspiKeyDefinition ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### STRUCT AtspiEvent ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_TYPE_EVENT ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### TYPEDEF AtspiKeystrokeListener ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ENUM AtspiKeyListenerSyncType ##### -->
-<para>
-
-</para>
-
-@ATSPI_KEYLISTENER_NOSYNC: 
-@ATSPI_KEYLISTENER_SYNCHRONOUS: 
-@ATSPI_KEYLISTENER_CANCONSUME: 
-@ATSPI_KEYLISTENER_ALL_WINDOWS: 
-
diff --git a/doc/libatspi/tmpl/atspi-value.sgml b/doc/libatspi/tmpl/atspi-value.sgml
deleted file mode 100644 (file)
index 59f3cfc..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<!-- ##### SECTION Title ##### -->
-atspi-value
-
-<!-- ##### SECTION Short_Description ##### -->
-An interface supporting a one-dimensional scalar 
-to be modified, or which reflects its value.
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-An interface supporting a one-dimensional scalar 
-to be modified, or which reflects its value. If
-STATE_EDITABLE is not present, the value is
-treated as "read only".
-</para>
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT AtspiValue ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_value_get_minimum_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_value_get_current_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_value_get_maximum_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_value_set_current_value ##### -->
-<para>
-
-</para>
-
-@obj: 
-@new_value: 
-@error: 
-@Returns: 
-
-
-<!-- ##### FUNCTION atspi_value_get_minimum_increment ##### -->
-<para>
-
-</para>
-
-@obj: 
-@error: 
-@Returns: 
-
-
diff --git a/doc/libatspi/tmpl/libatspi-unused.sgml b/doc/libatspi/tmpl/libatspi-unused.sgml
deleted file mode 100644 (file)
index 33ae061..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<!-- ##### MACRO ATSPI_CACHE_CHILDREN ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_CACHE_DESCRIPTION ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_CACHE_INTERFACES ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_CACHE_NAME ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_CACHE_PARENT ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_CACHE_ROLE ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### MACRO ATSPI_CACHE_STATES ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_accessible_new ##### -->
-<para>
-
-</para>
-
-@app: 
-@path: 
-@Returns: 
-
-<!-- ##### FUNCTION atspi_dbus_handle_deviceEvent ##### -->
-<para>
-
-</para>
-
-@bus: 
-@message: 
-@data: 
-@Returns: 
-
-<!-- ##### FUNCTION atspi_document_get_type ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION atspi_hyperlink_new ##### -->
-<para>
-
-</para>
-
-@app: 
-@path: 
-@Returns: 
-
-<!-- ##### FUNCTION atspi_image_get_type ##### -->
-<para>
-
-</para>
-
-
diff --git a/doc/libatspi/version.xml.in b/doc/libatspi/version.xml.in
deleted file mode 100644 (file)
index a24f987..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@PACKAGE_VERSION@
diff --git a/doc/logo.png b/doc/logo.png
new file mode 100644 (file)
index 0000000..bc4ede7
Binary files /dev/null and b/doc/logo.png differ
diff --git a/doc/meson.build b/doc/meson.build
new file mode 100644 (file)
index 0000000..0de4f72
--- /dev/null
@@ -0,0 +1,74 @@
+dependency('gi-docgen', version: '>= 2021.1',
+           fallback: ['gi-docgen', 'dummy_dep'],
+           native: true,
+           required: get_option('docs'))
+
+gidocgen = find_program('gi-docgen')
+
+docs_dir = atspi_datadir / 'doc'
+
+gidocgen_common_args = [
+  '--quiet',
+  '--no-namespace-dir',
+  '--fatal-warnings',
+]
+
+################################ ATK
+atk_expand_content_files =[]
+
+atk_toml_data = configuration_data()
+atk_toml_data.set('VERSION', meson.project_version())
+
+atk_toml = configure_file(
+  input: 'atk.toml.in',
+  output: 'atk.toml',
+  configuration: atk_toml_data
+)
+
+custom_target('atk-doc',
+  input: [ atk_toml, atk_gir[0] ],
+  output: 'atk',
+  command: [
+    gidocgen,
+    'generate',
+    gidocgen_common_args,
+    '--config=@INPUT0@',
+    '--output-dir=@OUTPUT@',
+    '--content-dir=@0@'.format(meson.current_source_dir()),
+    '@INPUT1@',
+  ],
+  install: true,
+  install_dir: docs_dir,
+  depend_files: atk_expand_content_files,
+)
+
+
+################################ libatspi
+libatspi_expand_content_files = []
+
+libatspi_toml_data = configuration_data()
+libatspi_toml_data.set('VERSION', meson.project_version())
+
+libatspi_toml = configure_file(
+  input: 'libatspi.toml.in',
+  output: 'libatspi.toml',
+  configuration: libatspi_toml_data
+)
+
+custom_target('libatspi-doc',
+  input: [ libatspi_toml, libatspi_gir[0] ],
+  output: 'libatspi',
+  command: [
+    gidocgen,
+    'generate',
+    gidocgen_common_args,
+    '--config=@INPUT0@',
+    '--output-dir=@OUTPUT@',
+    '--content-dir=@0@'.format(meson.current_source_dir()),
+    '@INPUT1@',
+  ],
+  install: true,
+  install_dir: docs_dir,
+  depend_files: libatspi_expand_content_files,
+)
+
diff --git a/doc/urlmap.js b/doc/urlmap.js
new file mode 100644 (file)
index 0000000..13eab86
--- /dev/null
@@ -0,0 +1,17 @@
+// SPDX-FileCopyrightText: 2021 GNOME Foundation
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+// A map between namespaces and base URLs for their online documentation
+baseURLs = [
+  [ 'GLib', 'https://docs.gtk.org/glib/' ],
+  [ 'GObject', 'https://docs.gtk.org/gobject/' ],
+  [ 'Gio', 'https://docs.gtk.org/gio/' ],
+  [ 'Gdk', 'https://docs.gtk.org/gdk3/' ],
+  [ 'GdkX11', 'https://docs.gtk.org/gdk3-x11/' ],
+  [ 'Gtk', 'https://docs.gtk.org/gtk3/' ],
+  [ 'Pango', 'https://docs.gtk.org/Pango/' ],
+  [ 'PangoCairo', 'https://docs.gtk.org/PangoCairo/' ],
+  [ 'GdkPixbuf', 'https://docs.gtk.org/gdk-pixbuf/' ],
+  [ 'Atk', 'https://gnome.pages.gitlab.gnome.org/at-spi2-core/atk/' ],
+  [ 'Atspi', 'https://gnome.pages.gitlab.gnome.org/at-spi2-core/libatspi/' ],
+]
diff --git a/droute/droute-pairhash.c b/droute/droute-pairhash.c
new file mode 100644 (file)
index 0000000..8c5e458
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "droute-pairhash.h"
+
+/*---------------------------------------------------------------------------*/
+
+static guint
+str_hash (guint32 h, const char *p)
+{
+  for (p += 1; *p != '\0'; p++)
+    h = (h << 5) - h + *p;
+
+  return h;
+}
+
+/*---------------------------------------------------------------------------*/
+
+StrPair *
+str_pair_new (const gchar *one, const gchar *two)
+{
+  StrPair *pair;
+
+  pair = g_new (StrPair, 1);
+  pair->one = one;
+  pair->two = two;
+  return pair;
+}
+
+guint
+str_pair_hash (gconstpointer key)
+{
+  StrPair *pair = (StrPair *) key;
+  guint hash = 0;
+
+  /*g_return_val_if_fail (pair      != NULL, 0);
+    g_return_val_if_fail (pair->one != NULL, 0);
+    g_return_val_if_fail (pair->two != NULL, 0);
+  */
+
+  if (*(pair->two) != '\0')
+    {
+      hash = *(pair->two);
+      hash = str_hash (hash, pair->two);
+      hash = str_hash (hash, pair->one);
+    }
+
+  return hash;
+}
+
+gboolean
+str_pair_equal (gconstpointer a, gconstpointer b)
+{
+  StrPair *ap = (StrPair *) a;
+  StrPair *bp = (StrPair *) b;
+
+  if (g_str_equal (ap->one, bp->one) &&
+      g_str_equal (ap->two, bp->two))
+    {
+      return TRUE;
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/droute/droute-pairhash.h b/droute/droute-pairhash.h
new file mode 100644 (file)
index 0000000..54aec93
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _DROUTE_PAIRHASH_H
+#define _DROUTE_PAIRHASH_H
+
+#include <glib.h>
+
+typedef struct _StrPair StrPair;
+struct _StrPair
+{
+  const gchar *one;
+  const gchar *two;
+};
+
+StrPair *str_pair_new (const gchar *one,
+                       const gchar *two);
+
+guint str_pair_hash (gconstpointer key);
+gboolean str_pair_equal (gconstpointer a,
+                         gconstpointer b);
+
+#endif /* _DROUTE_PAIRHASH_H */
diff --git a/droute/droute-test.c b/droute/droute-test.c
new file mode 100644 (file)
index 0000000..5900ccb
--- /dev/null
@@ -0,0 +1,313 @@
+#include <droute/droute.h>
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "atspi/atspi.h"
+
+#define TEST_OBJECT_PATH "/test/object"
+#define TEST_INTERFACE_ONE "test.interface.One"
+#define TEST_INTERFACE_TWO "test.interface.Two"
+
+#define OBJECT_ONE "ObjectOne";
+#define OBJECT_TWO "ObjectTwo";
+
+#define STRING_ONE "StringOne"
+#define STRING_TWO "StringTwo"
+
+#define INT_ONE 0
+#define INT_TWO 456
+
+#define NONE_REPLY_STRING "NoneMethod"
+
+const gchar *test_interface_One =
+    "<interface name=\"test.interface.One\">"
+    "  <method name=\"null\"/>"
+    "  <method name=\"getInt\">"
+    "    <arg direction=\"out\" type=\"o\"/>"
+    "  </method>"
+    "  <method name=\"setInt\">"
+    "    <arg direction=\"in\" type=\"o\"/>"
+    "  </method>"
+    "  <method name=\"getString\">"
+    "    <arg direction=\"out\" type=\"s\"/>"
+    "  </method>"
+    "  <method name=\"setString\">"
+    "    <arg direction=\"in\" type=\"s\"/>"
+    "  </method>"
+    "</interface>";
+
+const gchar *test_interface_Two =
+    "<interface name=\"test.interface.One\">"
+    "  <method name=\"null\"/>"
+    "  <method name=\"getInt\">"
+    "    <arg direction=\"out\" type=\"o\"/>"
+    "  </method>"
+    "  <method name=\"setInt\">"
+    "    <arg direction=\"in\" type=\"o\"/>"
+    "  </method>"
+    "  <method name=\"getString\">"
+    "    <arg direction=\"out\" type=\"s\"/>"
+    "  </method>"
+    "  <method name=\"setString\">"
+    "    <arg direction=\"in\" type=\"s\"/>"
+    "  </method>"
+    "</interface>";
+
+typedef struct _AnObject
+{
+  gchar *astring;
+  guint *anint;
+} AnObject;
+
+static DBusConnection *bus;
+static GMainLoop *main_loop;
+static gboolean success = TRUE;
+
+static DBusMessage *
+impl_null (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+
+  reply = dbus_message_new_method_return (message);
+  return reply;
+}
+
+static DBusMessage *
+impl_getInt (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AnObject *object = (AnObject *) user_data;
+  DBusMessage *reply;
+  DBusError error;
+
+  dbus_error_init (&error);
+
+  reply = dbus_message_new_method_return (message);
+  dbus_message_append_args (reply, DBUS_TYPE_INT32, &(object->anint), DBUS_TYPE_INVALID);
+  return reply;
+}
+
+static DBusMessage *
+impl_setInt (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AnObject *object = (AnObject *) user_data;
+  DBusMessage *reply;
+  DBusError error;
+
+  dbus_error_init (&error);
+
+  dbus_message_get_args (message, &error, DBUS_TYPE_INT32, &(object->anint), DBUS_TYPE_INVALID);
+
+  reply = dbus_message_new_method_return (message);
+  return reply;
+}
+
+static DBusMessage *
+impl_getString (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AnObject *object = (AnObject *) user_data;
+  DBusMessage *reply;
+  DBusError error;
+
+  dbus_error_init (&error);
+
+  reply = dbus_message_new_method_return (message);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &(object->astring), DBUS_TYPE_INVALID);
+  return reply;
+}
+
+static DBusMessage *
+impl_setString (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  AnObject *object = (AnObject *) user_data;
+  DBusMessage *reply;
+  DBusError error;
+
+  dbus_error_init (&error);
+
+  g_free (object->astring);
+  dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &(object->astring), DBUS_TYPE_INVALID);
+
+  reply = dbus_message_new_method_return (message);
+  return reply;
+}
+
+static DBusMessage *
+impl_getInterfaceOne (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+  DBusError error;
+  gchar *itf = TEST_INTERFACE_ONE;
+
+  dbus_error_init (&error);
+
+  reply = dbus_message_new_method_return (message);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &itf, DBUS_TYPE_INVALID);
+  return reply;
+}
+
+static DBusMessage *
+impl_getInterfaceTwo (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DBusMessage *reply;
+  DBusError error;
+  gchar *itf = TEST_INTERFACE_TWO;
+
+  dbus_error_init (&error);
+
+  reply = dbus_message_new_method_return (message);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &itf, DBUS_TYPE_INVALID);
+  return reply;
+}
+
+static DRouteMethod test_methods_one[] = {
+  { impl_null, "null" },
+  { impl_getInt, "getInt" },
+  { impl_setInt, "setInt" },
+  { impl_getString, "getString" },
+  { impl_setString, "setString" },
+  { impl_getInterfaceOne, "getInterfaceOne" },
+  { NULL, NULL }
+};
+
+static DRouteMethod test_methods_two[] = {
+  { impl_null, "null" },
+  { impl_getInt, "getInt" },
+  { impl_setInt, "setInt" },
+  { impl_getString, "getString" },
+  { impl_setString, "setString" },
+  { impl_getInterfaceTwo, "getInterfaceTwo" },
+  { NULL, NULL }
+};
+
+static DRouteProperty test_properties[] = {
+  { NULL, NULL, NULL }
+};
+
+static void
+set_reply (DBusPendingCall *pending, void *user_data)
+{
+  void **replyptr = (void **) user_data;
+
+  *replyptr = dbus_pending_call_steal_reply (pending);
+  dbus_pending_call_unref (pending);
+}
+
+static DBusMessage *
+send_and_allow_reentry (DBusConnection *bus, DBusMessage *message, DBusError *error)
+{
+  DBusPendingCall *pending;
+  DBusMessage *reply = NULL;
+
+  if (!dbus_connection_send_with_reply (bus, message, &pending, -1))
+    {
+      return NULL;
+    }
+  dbus_pending_call_set_notify (pending, set_reply, (void *) &reply, NULL);
+  while (!reply)
+    {
+      if (!dbus_connection_read_write_dispatch (bus, -1))
+        return NULL;
+    }
+  return reply;
+}
+
+gboolean
+do_tests_func (gpointer data)
+{
+  DBusError error;
+  const gchar *bus_name;
+  DBusMessage *message, *reply;
+
+  gchar *expected_string;
+  gchar *result_string;
+
+  dbus_error_init (&error);
+  bus_name = dbus_bus_get_unique_name (bus);
+
+  /* --------------------------------------------------------*/
+
+  message = dbus_message_new_method_call (bus_name,
+                                          TEST_OBJECT_PATH,
+                                          TEST_INTERFACE_ONE,
+                                          "null");
+  reply = send_and_allow_reentry (bus, message, NULL);
+  dbus_message_unref (message);
+  if (reply)
+    dbus_message_unref (reply);
+
+  /* --------------------------------------------------------*/
+
+  expected_string = TEST_INTERFACE_ONE;
+  result_string = NULL;
+  message = dbus_message_new_method_call (bus_name,
+                                          TEST_OBJECT_PATH,
+                                          TEST_INTERFACE_ONE,
+                                          "getInterfaceOne");
+  reply = send_and_allow_reentry (bus, message, NULL);
+  dbus_message_unref (message);
+  dbus_message_get_args (reply, NULL, DBUS_TYPE_STRING, &result_string,
+                         DBUS_TYPE_INVALID);
+  dbus_message_unref (reply);
+  if (g_strcmp0 (expected_string, result_string))
+    {
+      g_print ("Failed: reply to getInterfaceOne was %s; expected %s\n",
+               result_string, expected_string);
+      exit (1);
+    }
+
+  /* --------------------------------------------------------*/
+
+  g_main_loop_quit (main_loop);
+  return FALSE;
+}
+
+int
+main (int argc, char **argv)
+{
+  DRouteContext *cnx;
+  DRoutePath *path;
+  AnObject *object;
+  DBusError error;
+
+  /* Setup some server object */
+
+  object = g_new0 (AnObject, 1);
+  object->astring = g_strdup (STRING_ONE);
+  object->anint = INT_ONE;
+
+  dbus_error_init (&error);
+  main_loop = g_main_loop_new (NULL, FALSE);
+  bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
+  atspi_dbus_connection_setup_with_g_main (bus, g_main_context_default ());
+
+  cnx = droute_new ();
+  path = droute_add_one (cnx, TEST_OBJECT_PATH, object);
+
+  droute_path_add_interface (path,
+                             TEST_INTERFACE_ONE,
+                             test_interface_One,
+                             test_methods_one,
+                             test_properties);
+
+  droute_path_add_interface (path,
+                             TEST_INTERFACE_TWO,
+                             test_interface_Two,
+                             test_methods_two,
+                             test_properties);
+
+  droute_path_register (path, bus);
+
+  g_idle_add (do_tests_func, NULL);
+  g_main_loop_run (main_loop);
+
+  droute_free (cnx);
+  g_free (object->astring);
+  g_free (object);
+
+  if (success)
+    return 0;
+  else
+    return 1;
+}
diff --git a/droute/droute-variant.c b/droute/droute-variant.c
new file mode 100644 (file)
index 0000000..b6ebb72
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "glib.h"
+#include <stdlib.h>
+#include <string.h>
+
+#include "droute-variant.h"
+
+/*---------------------------------------------------------------------------*/
+
+dbus_bool_t
+droute_return_v_int32 (DBusMessageIter *iter, dbus_int32_t val)
+{
+  DBusMessageIter sub;
+
+  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &sub))
+    {
+      return FALSE;
+    }
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &val);
+  dbus_message_iter_close_container (iter, &sub);
+  return TRUE;
+}
+
+dbus_bool_t
+droute_return_v_double (DBusMessageIter *iter, double val)
+{
+  DBusMessageIter sub;
+
+  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_DOUBLE_AS_STRING, &sub))
+    {
+      return FALSE;
+    }
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_DOUBLE, &val);
+  dbus_message_iter_close_container (iter, &sub);
+  return TRUE;
+}
+
+dbus_bool_t
+droute_return_v_string (DBusMessageIter *iter, const char *val)
+{
+  DBusMessageIter sub;
+
+  if (!val)
+    val = "";
+  if (!g_utf8_validate (val, -1, NULL))
+    {
+      g_warning ("droute: Received bad UTF-8 string");
+      val = "";
+    }
+
+  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &sub))
+    {
+      return FALSE;
+    }
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING, &val);
+  dbus_message_iter_close_container (iter, &sub);
+  return TRUE;
+}
+
+dbus_bool_t
+droute_return_v_object (DBusMessageIter *iter, const char *path)
+{
+  DBusMessageIter sub;
+
+  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &sub))
+    {
+      return FALSE;
+    }
+  dbus_message_iter_append_basic (&sub, DBUS_TYPE_OBJECT_PATH, &path);
+  dbus_message_iter_close_container (iter, &sub);
+  return TRUE;
+}
+
+/*---------------------------------------------------------------------------*/
+
+dbus_int32_t
+droute_get_v_int32 (DBusMessageIter *iter)
+{
+  DBusMessageIter sub;
+  dbus_int32_t rv;
+
+  // TODO- ensure we have the correct type
+  dbus_message_iter_recurse (iter, &sub);
+  dbus_message_iter_get_basic (&sub, &rv);
+  return rv;
+}
+
+const char *
+droute_get_v_string (DBusMessageIter *iter)
+{
+  DBusMessageIter sub;
+  char *rv;
+
+  // TODO- ensure we have the correct type
+  dbus_message_iter_recurse (iter, &sub);
+  dbus_message_iter_get_basic (&sub, &rv);
+  return rv;
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/droute/droute-variant.h b/droute/droute-variant.h
new file mode 100644 (file)
index 0000000..ca0da2d
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _DROUTE_VARIANT_H
+#define _DROUTE_VARIANT_H
+
+#include <dbus/dbus.h>
+
+dbus_bool_t droute_return_v_int32 (DBusMessageIter *iter, dbus_int32_t val);
+dbus_bool_t droute_return_v_double (DBusMessageIter *iter, double val);
+dbus_bool_t droute_return_v_string (DBusMessageIter *iter, const char *val);
+dbus_bool_t droute_return_v_object (DBusMessageIter *iter, const char *path);
+
+dbus_int32_t droute_get_v_int32 (DBusMessageIter *iter);
+const char *droute_get_v_string (DBusMessageIter *iter);
+
+#endif /* _DROUTE_VARIANT_H */
diff --git a/droute/droute.c b/droute/droute.c
new file mode 100644 (file)
index 0000000..45c0e09
--- /dev/null
@@ -0,0 +1,741 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "droute-pairhash.h"
+#include "droute.h"
+
+#define CHUNKS_DEFAULT (512)
+
+#define oom() g_error ("D-Bus out of memory, this message will fail anyway")
+
+#if defined DROUTE_DEBUG
+#define _DROUTE_DEBUG(format, args...) g_print (format, ##args)
+#else
+#define _DROUTE_DEBUG(format, args...)
+#endif
+
+struct _DRouteContext
+{
+  GPtrArray *registered_paths;
+
+  gchar *introspect_string;
+};
+
+struct _DRoutePath
+{
+  DRouteContext *cnx;
+  gchar *path;
+  gboolean prefix;
+  GStringChunk *chunks;
+  GPtrArray *interfaces;
+  GPtrArray *introspection;
+  GHashTable *methods;
+  GHashTable *properties;
+
+  DRouteIntrospectChildrenFunction introspect_children_cb;
+  void *introspect_children_data;
+  void *user_data;
+  DRouteGetDatumFunction get_datum;
+  DRouteQueryInterfaceFunction query_interface_cb;
+};
+
+/*---------------------------------------------------------------------------*/
+
+typedef struct PropertyPair
+{
+  DRoutePropertyFunction get;
+  DRoutePropertyFunction set;
+} PropertyPair;
+
+/*---------------------------------------------------------------------------*/
+
+static DBusHandlerResult
+handle_message (DBusConnection *bus, DBusMessage *message, void *user_data);
+
+static DBusMessage *
+droute_object_does_not_exist_error (DBusMessage *message);
+
+/*---------------------------------------------------------------------------*/
+
+static DRoutePath *
+path_new (DRouteContext *cnx,
+          const char *path,
+          gboolean prefix,
+          void *user_data,
+          DRouteIntrospectChildrenFunction introspect_children_cb,
+          void *introspect_children_data,
+          DRouteGetDatumFunction get_datum,
+          DRouteQueryInterfaceFunction query_interface_cb)
+{
+  DRoutePath *new_path;
+
+  new_path = g_new0 (DRoutePath, 1);
+  new_path->cnx = cnx;
+  new_path->path = g_strdup (path);
+  new_path->prefix = prefix;
+  new_path->chunks = g_string_chunk_new (CHUNKS_DEFAULT);
+  new_path->interfaces = g_ptr_array_new ();
+  new_path->introspection = g_ptr_array_new ();
+
+  new_path->methods = g_hash_table_new_full ((GHashFunc) str_pair_hash,
+                                             str_pair_equal,
+                                             g_free,
+                                             NULL);
+
+  new_path->properties = g_hash_table_new_full ((GHashFunc) str_pair_hash,
+                                                str_pair_equal,
+                                                g_free,
+                                                g_free);
+
+  new_path->introspect_children_cb = introspect_children_cb;
+  new_path->introspect_children_data = introspect_children_data;
+  new_path->user_data = user_data;
+  new_path->get_datum = get_datum;
+  new_path->query_interface_cb = query_interface_cb;
+
+  return new_path;
+}
+
+static void
+path_free (DRoutePath *path, gpointer user_data)
+{
+  g_free (path->path);
+  g_string_chunk_free (path->chunks);
+  g_ptr_array_free (path->interfaces, TRUE);
+  g_free (g_ptr_array_free (path->introspection, FALSE));
+  g_hash_table_destroy (path->methods);
+  g_hash_table_destroy (path->properties);
+  g_free (path);
+}
+
+static void *
+path_get_datum (DRoutePath *path, const gchar *pathstr)
+{
+  if (path->get_datum != NULL)
+    return (path->get_datum) (pathstr, path->user_data);
+  else
+    return path->user_data;
+}
+
+/*---------------------------------------------------------------------------*/
+
+DRouteContext *
+droute_new ()
+{
+  DRouteContext *cnx;
+
+  cnx = g_new0 (DRouteContext, 1);
+  cnx->registered_paths = g_ptr_array_new ();
+
+  return cnx;
+}
+
+void
+droute_free (DRouteContext *cnx)
+{
+  g_ptr_array_foreach (cnx->registered_paths, (GFunc) path_free, NULL);
+  g_ptr_array_free (cnx->registered_paths, TRUE);
+  g_free (cnx);
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+
+static DBusObjectPathVTable droute_vtable = {
+  NULL,
+  &handle_message,
+  NULL, NULL, NULL, NULL
+};
+
+DRoutePath *
+droute_add_one (DRouteContext *cnx,
+                const char *path,
+                const void *data)
+{
+  DRoutePath *new_path;
+
+  new_path = path_new (cnx, path, FALSE, (void *) data, NULL, NULL, NULL,
+                       NULL);
+
+  g_ptr_array_add (cnx->registered_paths, new_path);
+  return new_path;
+}
+
+DRoutePath *
+droute_add_many (DRouteContext *cnx,
+                 const char *path,
+                 const void *data,
+                 DRouteIntrospectChildrenFunction introspect_children_cb,
+                 void *introspect_children_data,
+                 const DRouteGetDatumFunction get_datum,
+                 const DRouteQueryInterfaceFunction query_interface_cb)
+{
+  DRoutePath *new_path;
+
+  new_path = path_new (cnx, path, TRUE, (void *) data,
+                       introspect_children_cb, introspect_children_data,
+                       get_datum, query_interface_cb);
+
+  g_ptr_array_add (cnx->registered_paths, new_path);
+  return new_path;
+}
+
+/*---------------------------------------------------------------------------*/
+
+void
+droute_path_add_interface (DRoutePath *path,
+                           const char *name,
+                           const char *introspect,
+                           const DRouteMethod *methods,
+                           const DRouteProperty *properties)
+{
+  gchar *itf;
+
+  g_return_if_fail (name != NULL);
+
+  itf = g_string_chunk_insert (path->chunks, name);
+  g_ptr_array_add (path->interfaces, itf);
+  g_ptr_array_add (path->introspection, (gpointer) introspect);
+
+  for (; methods != NULL && methods->name != NULL; methods++)
+    {
+      gchar *meth;
+
+      meth = g_string_chunk_insert (path->chunks, methods->name);
+      g_hash_table_insert (path->methods, str_pair_new (itf, meth), methods->func);
+    }
+
+  for (; properties != NULL && properties->name != NULL; properties++)
+    {
+      gchar *prop;
+      PropertyPair *pair;
+
+      prop = g_string_chunk_insert (path->chunks, properties->name);
+      pair = g_new (PropertyPair, 1);
+      pair->get = properties->get;
+      pair->set = properties->set;
+      g_hash_table_insert (path->properties, str_pair_new (itf, prop), pair);
+    }
+}
+
+/*---------------------------------------------------------------------------*/
+
+/* The data structures don't support an efficient implementation of GetAll
+ * and I don't really care.
+ */
+static DBusMessage *
+impl_prop_GetAll (DBusMessage *message,
+                  DRoutePath *path,
+                  const char *pathstr)
+{
+  DBusMessageIter iter, iter_dict, iter_dict_entry;
+  DBusMessage *reply;
+  DBusError error;
+  GHashTableIter prop_iter;
+
+  StrPair *key;
+  PropertyPair *value;
+  gchar *iface;
+
+  void *datum = path_get_datum (path, pathstr);
+  if (!datum)
+    return droute_object_does_not_exist_error (message);
+
+  dbus_error_init (&error);
+  if (!dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &iface, DBUS_TYPE_INVALID))
+    {
+      DBusMessage *ret;
+      ret = dbus_message_new_error (message, DBUS_ERROR_FAILED, error.message);
+      dbus_error_free (&error);
+      return ret;
+    }
+
+  if (path->query_interface_cb &&
+      !path->query_interface_cb (datum, iface))
+    return dbus_message_new_error (message, DBUS_ERROR_UNKNOWN_PROPERTY, "Property unavailable");
+
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    oom ();
+
+  dbus_message_iter_init_append (reply, &iter);
+  if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_dict))
+    oom ();
+
+  g_hash_table_iter_init (&prop_iter, path->properties);
+  while (g_hash_table_iter_next (&prop_iter, (gpointer *) &key, (gpointer *) &value))
+    {
+      if (!g_strcmp0 (key->one, iface))
+        {
+          if (!value->get)
+            continue;
+          if (!dbus_message_iter_open_container (&iter_dict, DBUS_TYPE_DICT_ENTRY, NULL, &iter_dict_entry))
+            oom ();
+          dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING,
+                                          &key->two);
+          (value->get) (&iter_dict_entry, datum);
+          if (!dbus_message_iter_close_container (&iter_dict, &iter_dict_entry))
+            oom ();
+        }
+    }
+
+  if (!dbus_message_iter_close_container (&iter, &iter_dict))
+    oom ();
+  return reply;
+}
+
+static DBusMessage *
+impl_prop_GetSet (DBusMessage *message,
+                  DRoutePath *path,
+                  const char *pathstr,
+                  gboolean get)
+{
+  DBusMessage *reply = NULL;
+  DBusError error;
+
+  StrPair pair;
+  PropertyPair *prop_funcs = NULL;
+
+  void *datum;
+
+  dbus_error_init (&error);
+  if (!dbus_message_get_args (message,
+                              &error,
+                              DBUS_TYPE_STRING,
+                              &(pair.one),
+                              DBUS_TYPE_STRING,
+                              &(pair.two),
+                              DBUS_TYPE_INVALID))
+    {
+      DBusMessage *ret;
+      ret = dbus_message_new_error (message, DBUS_ERROR_FAILED, error.message);
+      dbus_error_free (&error);
+      return ret;
+    }
+
+  _DROUTE_DEBUG ("DRoute (handle prop): %s|%s on %s\n", pair.one, pair.two, pathstr);
+
+  prop_funcs = (PropertyPair *) g_hash_table_lookup (path->properties, &pair);
+  if (!prop_funcs)
+    {
+      DBusMessage *ret;
+      ret = dbus_message_new_error (message, DBUS_ERROR_UNKNOWN_PROPERTY, "Property unavailable");
+      dbus_error_free (&error);
+      return ret;
+    }
+
+  datum = path_get_datum (path, pathstr);
+  if (!datum)
+    return droute_object_does_not_exist_error (message);
+
+  if (get && prop_funcs->get)
+    {
+
+      DBusMessageIter iter;
+
+      _DROUTE_DEBUG ("DRoute (handle prop Get): %s|%s on %s\n", pair.one, pair.two, pathstr);
+
+      reply = dbus_message_new_method_return (message);
+      dbus_message_iter_init_append (reply, &iter);
+      if (!(prop_funcs->get) (&iter, datum))
+        {
+          dbus_message_unref (reply);
+          reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Get failed");
+        }
+    }
+  else if (!get && prop_funcs->set)
+    {
+      DBusMessageIter iter;
+
+      _DROUTE_DEBUG ("DRoute (handle prop Get): %s|%s on %s\n", pair.one, pair.two, pathstr);
+
+      dbus_message_iter_init (message, &iter);
+      /* Skip the interface and property name */
+      dbus_message_iter_next (&iter);
+      dbus_message_iter_next (&iter);
+      (prop_funcs->set) (&iter, datum);
+
+      reply = dbus_message_new_method_return (message);
+    }
+  else if (!get)
+    {
+      reply = dbus_message_new_error (message, DBUS_ERROR_PROPERTY_READ_ONLY, "Property is read-only");
+    }
+  else
+    {
+      reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Getter or setter unavailable");
+    }
+
+  return reply;
+}
+
+static DBusHandlerResult
+handle_dbus (DBusConnection *bus,
+             DBusMessage *message,
+             const gchar *iface,
+             const gchar *member,
+             const gchar *pathstr)
+{
+  static int id = 1;
+  char *id_str = (char *) g_malloc (40);
+  DBusMessage *reply;
+
+  if (strcmp (iface, DBUS_INTERFACE_DBUS) != 0 ||
+      strcmp (member, "Hello") != 0)
+    {
+      g_free (id_str);
+      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    }
+
+  /* TODO: Fix this hack (we don't handle wrap-around, for instance) */
+  sprintf (id_str, ":1.%d", id++);
+  reply = dbus_message_new_method_return (message);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &id_str, DBUS_TYPE_INVALID);
+  dbus_connection_send (bus, reply, NULL);
+  dbus_connection_flush (bus);
+  dbus_message_unref (reply);
+  g_free (id_str);
+  return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusHandlerResult
+handle_properties (DBusConnection *bus,
+                   DBusMessage *message,
+                   DRoutePath *path,
+                   const gchar *iface,
+                   const gchar *member,
+                   const gchar *pathstr)
+{
+  DBusMessage *reply = NULL;
+  DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
+
+  if (!g_strcmp0 (member, "GetAll"))
+    reply = impl_prop_GetAll (message, path, pathstr);
+  else if (!g_strcmp0 (member, "Get"))
+    reply = impl_prop_GetSet (message, path, pathstr, TRUE);
+  else if (!g_strcmp0 (member, "Set"))
+    reply = impl_prop_GetSet (message, path, pathstr, FALSE);
+  else
+    result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+  if (reply)
+    {
+      dbus_connection_send (bus, reply, NULL);
+      dbus_message_unref (reply);
+    }
+
+  return result;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static const char *introspection_header =
+    "<?xml version=\"1.0\"?>\n";
+
+static const char *introspection_node_element =
+    "<node name=\"%s\">\n";
+
+static const char *introspection_footer =
+    "</node>";
+
+static DBusHandlerResult
+handle_introspection (DBusConnection *bus,
+                      DBusMessage *message,
+                      DRoutePath *path,
+                      const gchar *iface,
+                      const gchar *member,
+                      const gchar *pathstr)
+{
+  GString *output;
+  gchar *final;
+  gint i;
+  void *datum = NULL;
+
+  DBusMessage *reply;
+
+  _DROUTE_DEBUG ("DRoute (handle introspection): %s\n", pathstr);
+
+  if (g_strcmp0 (member, "Introspect"))
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+  output = g_string_new (introspection_header);
+
+  g_string_append_printf (output, introspection_node_element, pathstr);
+
+  if (!path->get_datum || (datum = path_get_datum (path, pathstr)) != NULL)
+    {
+      for (i = 0; i < path->introspection->len; i++)
+        {
+          gchar *interface = (gchar *) g_ptr_array_index (path->interfaces, i);
+          gchar *introspect = (gchar *) g_ptr_array_index (path->introspection, i);
+          if (path->query_interface_cb &&
+              !path->query_interface_cb (datum, interface))
+            continue;
+          g_string_append (output, introspect);
+        }
+    }
+
+  if (path->introspect_children_cb)
+    {
+      gchar *children = (*path->introspect_children_cb) (pathstr, path->introspect_children_data);
+      if (children)
+        {
+          g_string_append (output, children);
+          g_free (children);
+        }
+    }
+
+  g_string_append (output, introspection_footer);
+  final = g_string_free (output, FALSE);
+
+  reply = dbus_message_new_method_return (message);
+  if (!reply)
+    oom ();
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &final,
+                            DBUS_TYPE_INVALID);
+  dbus_connection_send (bus, reply, NULL);
+
+  dbus_message_unref (reply);
+  g_free (final);
+  return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static DBusHandlerResult
+handle_other (DBusConnection *bus,
+              DBusMessage *message,
+              DRoutePath *path,
+              const gchar *iface,
+              const gchar *member,
+              const gchar *pathstr)
+{
+  gint result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+  StrPair pair;
+  DRouteFunction func;
+  DBusMessage *reply = NULL;
+
+  void *datum;
+
+  pair.one = iface;
+  pair.two = member;
+
+  _DROUTE_DEBUG ("DRoute (handle other): %s|%s on %s\n", member, iface, pathstr);
+
+  func = (DRouteFunction) g_hash_table_lookup (path->methods, &pair);
+  if (func != NULL)
+    {
+      datum = path_get_datum (path, pathstr);
+      if (!datum)
+        reply = droute_object_does_not_exist_error (message);
+      else
+        reply = (func) (bus, message, datum);
+
+      /* All D-Bus method calls must have a reply.
+       * If one is not provided presume that the caller has already
+       * sent one.
+       */
+      if (reply)
+        {
+          dbus_connection_send (bus, reply, NULL);
+          dbus_message_unref (reply);
+        }
+      result = DBUS_HANDLER_RESULT_HANDLED;
+    }
+
+  _DROUTE_DEBUG ("DRoute (handle other) (reply): type %d\n",
+                 dbus_message_get_type (reply));
+  return result;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static DBusHandlerResult
+handle_message (DBusConnection *bus, DBusMessage *message, void *user_data)
+{
+  DRoutePath *path = (DRoutePath *) user_data;
+  const gchar *iface = dbus_message_get_interface (message);
+  const gchar *member = dbus_message_get_member (message);
+  const gint type = dbus_message_get_type (message);
+  const gchar *pathstr = dbus_message_get_path (message);
+
+  DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+  _DROUTE_DEBUG ("DRoute (handle message): %s|%s of type %d on %s\n", member, iface, type, pathstr);
+
+  /* Check for basic reasons not to handle */
+  if (type != DBUS_MESSAGE_TYPE_METHOD_CALL ||
+      member == NULL ||
+      iface == NULL)
+    return result;
+
+  if (!strcmp (pathstr, DBUS_PATH_DBUS))
+    result = handle_dbus (bus, message, iface, member, pathstr);
+  else if (!strcmp (iface, "org.freedesktop.DBus.Properties"))
+    result = handle_properties (bus, message, path, iface, member, pathstr);
+  else if (!strcmp (iface, "org.freedesktop.DBus.Introspectable"))
+    result = handle_introspection (bus, message, path, iface, member, pathstr);
+  else
+    result = handle_other (bus, message, path, iface, member, pathstr);
+#if 0
+    if (result == DBUS_HANDLER_RESULT_NOT_YET_HANDLED)
+        g_print ("DRoute | Unhandled message: %s|%s of type %d on %s\n", member, iface, type, pathstr);
+#endif
+
+  return result;
+}
+
+/*---------------------------------------------------------------------------*/
+
+static DBusMessage *
+droute_object_does_not_exist_error (DBusMessage *message)
+{
+  DBusMessage *reply;
+  gchar *errmsg;
+
+  errmsg = g_strdup_printf (
+      "Method \"%s\" with signature \"%s\" on interface \"%s\" could not be processed as object %s does not exist\n",
+      dbus_message_get_member (message),
+      dbus_message_get_signature (message),
+      dbus_message_get_interface (message),
+      dbus_message_get_path (message));
+  reply = dbus_message_new_error (message,
+                                  DBUS_ERROR_UNKNOWN_OBJECT,
+                                  errmsg);
+  g_free (errmsg);
+  return reply;
+}
+
+/*---------------------------------------------------------------------------*/
+
+DBusMessage *
+droute_not_yet_handled_error (DBusMessage *message)
+{
+  DBusMessage *reply;
+  gchar *errmsg;
+
+  errmsg = g_strdup_printf (
+      "Method \"%s\" with signature \"%s\" on interface \"%s\" doesn't exist\n",
+      dbus_message_get_member (message),
+      dbus_message_get_signature (message),
+      dbus_message_get_interface (message));
+  reply = dbus_message_new_error (message,
+                                  DBUS_ERROR_UNKNOWN_METHOD,
+                                  errmsg);
+  g_free (errmsg);
+  return reply;
+}
+
+DBusMessage *
+droute_out_of_memory_error (DBusMessage *message)
+{
+  DBusMessage *reply;
+  gchar *errmsg;
+
+  errmsg = g_strdup_printf (
+      "Method \"%s\" with signature \"%s\" on interface \"%s\" could not be processed due to lack of memory\n",
+      dbus_message_get_member (message),
+      dbus_message_get_signature (message),
+      dbus_message_get_interface (message));
+  reply = dbus_message_new_error (message,
+                                  DBUS_ERROR_NO_MEMORY,
+                                  errmsg);
+  g_free (errmsg);
+  return reply;
+}
+
+DBusMessage *
+droute_invalid_arguments_error (DBusMessage *message)
+{
+  DBusMessage *reply;
+  gchar *errmsg;
+
+  errmsg = g_strdup_printf (
+      "Method \"%s\" with signature \"%s\" on interface \"%s\" was supplied with invalid arguments\n",
+      dbus_message_get_member (message),
+      dbus_message_get_signature (message),
+      dbus_message_get_interface (message));
+  reply = dbus_message_new_error (message,
+                                  DBUS_ERROR_INVALID_ARGS,
+                                  errmsg);
+  g_free (errmsg);
+  return reply;
+}
+
+void
+droute_path_register (DRoutePath *path, DBusConnection *bus)
+{
+  if (path->prefix)
+    dbus_connection_register_fallback (bus, path->path, &droute_vtable, path);
+  else
+    dbus_connection_register_object_path (bus, path->path,
+                                          &droute_vtable, path);
+}
+
+void
+droute_path_unregister (DRoutePath *path, DBusConnection *bus)
+{
+  dbus_connection_unregister_object_path (bus, path->path);
+}
+
+void
+droute_context_register (DRouteContext *cnx, DBusConnection *bus)
+{
+  g_ptr_array_foreach (cnx->registered_paths, (GFunc) droute_path_register,
+                       bus);
+}
+
+void
+droute_context_unregister (DRouteContext *cnx, DBusConnection *bus)
+{
+  g_ptr_array_foreach (cnx->registered_paths, (GFunc) droute_path_unregister,
+                       bus);
+}
+
+void
+droute_context_deregister (DRouteContext *cnx, DBusConnection *bus)
+{
+  g_ptr_array_foreach (cnx->registered_paths, (GFunc) droute_path_unregister,
+                       bus);
+}
+
+void
+droute_intercept_dbus (DBusConnection *bus)
+{
+  dbus_connection_register_object_path (bus, DBUS_PATH_DBUS,
+                                        &droute_vtable, NULL);
+}
+
+void
+droute_unintercept_dbus (DBusConnection *bus)
+{
+  dbus_connection_unregister_object_path (bus, DBUS_PATH_DBUS);
+}
+
+/*END------------------------------------------------------------------------*/
diff --git a/droute/droute.h b/droute/droute.h
new file mode 100644 (file)
index 0000000..3d9e480
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ * Copyright 2008 Codethink Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _DROUTE_H
+#define _DROUTE_H
+
+#include <dbus/dbus.h>
+#include <glib.h>
+
+#include <droute/droute-variant.h>
+
+typedef DBusMessage *(*DRouteFunction) (DBusConnection *, DBusMessage *, void *);
+typedef dbus_bool_t (*DRoutePropertyFunction) (DBusMessageIter *, void *);
+typedef gchar *(*DRouteIntrospectChildrenFunction) (const char *, void *);
+
+typedef void *(*DRouteGetDatumFunction) (const char *, void *);
+typedef gboolean (*DRouteQueryInterfaceFunction) (void *, const char *);
+
+typedef struct _DRouteMethod DRouteMethod;
+struct _DRouteMethod
+{
+  DRouteFunction func;
+  const char *name;
+};
+
+typedef struct _DRouteProperty DRouteProperty;
+struct _DRouteProperty
+{
+  DRoutePropertyFunction get;
+  DRoutePropertyFunction set;
+  const char *name;
+};
+
+/*---------------------------------------------------------------------------*/
+
+typedef struct _DRouteContext DRouteContext;
+
+typedef struct _DRoutePath DRoutePath;
+
+/*---------------------------------------------------------------------------*/
+
+DRouteContext *
+droute_new ();
+
+void
+droute_free (DRouteContext *cnx);
+
+DRoutePath *
+droute_add_one (DRouteContext *cnx,
+                const char *path,
+                const void *data);
+
+DRoutePath *
+droute_add_many (DRouteContext *cnx,
+                 const char *path,
+                 const void *data,
+                 DRouteIntrospectChildrenFunction introspect_children_cb,
+                 void *introspect_children_data,
+                 const DRouteGetDatumFunction get_datum,
+                 const DRouteQueryInterfaceFunction query_interface_cb);
+
+void
+droute_path_add_interface (DRoutePath *path,
+                           const char *name,
+                           const char *introspect,
+                           const DRouteMethod *methods,
+                           const DRouteProperty *properties);
+
+DBusMessage *
+droute_not_yet_handled_error (DBusMessage *message);
+
+DBusMessage *
+droute_invalid_arguments_error (DBusMessage *message);
+
+DBusMessage *
+droute_out_of_memory_error (DBusMessage *message);
+
+void
+droute_path_register (DRoutePath *path, DBusConnection *bus);
+
+void
+droute_path_unregister (DRoutePath *path, DBusConnection *bus);
+
+void
+droute_context_register (DRouteContext *cnx, DBusConnection *bus);
+
+void
+droute_context_unregister (DRouteContext *cnx, DBusConnection *bus);
+
+void
+droute_intercept_dbus (DBusConnection *connection);
+
+void
+droute_unintercept_dbus (DBusConnection *connection);
+#endif /* _DROUTE_H */
diff --git a/droute/meson.build b/droute/meson.build
new file mode 100644 (file)
index 0000000..3a1128f
--- /dev/null
@@ -0,0 +1,18 @@
+droute_sources = [
+  'droute.c',
+  'droute-variant.c',
+  'droute-pairhash.c',
+]
+
+libdroute = static_library('droute', droute_sources,
+                           dependencies: [ glib_dep, libdbus_dep ],
+                           include_directories: root_inc)
+
+libdroute_dep = declare_dependency(link_with: libdroute,
+                                   dependencies: [ glib_dep, libdbus_dep ],
+                                   include_directories: include_directories('.'))
+
+droute_test = executable('droute-test', 'droute-test.c',
+                         dependencies: [ libdroute_dep, atspi_dep ],
+                         include_directories: root_inc)
+test('droute-test', droute_test)
index c566b25..22a5db2 100644 (file)
@@ -1,15 +1,17 @@
 project('at-spi2-core', 'c',
-        version: '2.44.1',
+        version: '2.51.90',
         license: 'LGPLv2.1+',
         default_options: [
           'buildtype=debugoptimized',
           'warning_level=1',
           'c_std=c99',
         ],
-        meson_version: '>= 0.46.0')
+        meson_version: '>= 0.63.0')
 
 add_project_arguments([ '-D_POSIX_C_SOURCE=200809L', '-D_DEFAULT_SOURCE' ], language: 'c')
 
+fs = import('fs')
+
 atspi_gir_ns = 'Atspi'
 
 cc = meson.get_compiler('c')
@@ -17,18 +19,93 @@ host_system = host_machine.system()
 
 soversion = '0.0.1'
 
+atspi_version = meson.project_version()
+version = atspi_version.split('.')
+atspi_major_version = version[0].to_int()
+atspi_minor_version = version[1].to_int()
+atspi_micro_version = version[2].to_int()
+
+atk_interface_age = 1
+atk_binary_age = 10000 * atspi_major_version + 100 * atspi_minor_version + 10 + atspi_micro_version
+
+atk_api_version = '1.0'
+atk_api_name = 'atk-@0@'.format(atk_api_version)
+atk_api_path = '@0@/atk'.format(atk_api_name)
+
+# Maintain version scheme with libtool
+atk_soversion = 0
+current = atk_binary_age - atk_interface_age
+atk_libversion = '@0@.@1@.@2@'.format(atk_soversion, current, atk_interface_age)
+darwin_versions = ['@0@'.format(current + 1), '@0@.@1@'.format(current + 1, atk_interface_age)]
+
+add_project_arguments([ '-DG_DISABLE_SINGLE_INCLUDES', '-DATK_DISABLE_SINGLE_INCLUDES' ], language: 'c')
+
+if cc.get_id() == 'msvc'
+  add_project_arguments(cc.get_supported_arguments(['-FImsvc_recommended_pragmas.h', '-utf-8']), language: 'c')
+endif
+
+# at-spi2-atk versions
+atk_bridge_version = meson.project_version()
+atk_bridge_soversion = 0
+atk_bridge_libversion = '0.0.0'
+
+# Compiler and linker flags
+common_cflags = []
+common_ldflags = []
+
+test_cflags = []
+
 at_spi_conf = configuration_data()
-at_spi_conf.set('GETTEXT_PACKAGE', meson.project_name())
+at_spi_conf.set_quoted('ATK_VERSION', atspi_version)
+at_spi_conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
+
+# Symbol visibility
+if get_option('default_library') != 'static'
+  if host_system == 'windows'
+    at_spi_conf.set('DLL_EXPORT', true)
+    at_spi_conf.set('_ATK_EXTERN', '__declspec(dllexport) extern')
+    if cc.get_id() != 'msvc'
+      test_cflags += ['-fvisibility=hidden']
+    endif
+  else
+    at_spi_conf.set('_ATK_EXTERN', '__attribute__((visibility("default"))) extern')
+    test_cflags += ['-fvisibility=hidden']
+  endif
+endif
+
+# Check all compiler flags
+common_cflags += cc.get_supported_arguments(test_cflags)
+
+# Linker flags
+if host_machine.system() == 'linux'
+  test_ldflags = [ '-Wl,-Bsymbolic', '-Wl,-z,relro', '-Wl,-z,now', ]
+  common_ldflags += cc.get_supported_link_arguments(test_ldflags)
+endif
+
+# Maintain compatibility with autotools on macOS
+if host_machine.system() == 'darwin'
+  common_ldflags += [ '-compatibility_version', darwin_versions[0], '-current_version', darwin_versions[1]]
+endif
+
+# Functions
+checked_funcs = [
+  'bind_textdomain_codeset',
+]
+
+foreach f: checked_funcs
+  if cc.has_function(f)
+    at_spi_conf.set('HAVE_' + f.underscorify().to_upper(), 1)
+  endif
+endforeach
 
 root_inc = include_directories('.')
+atk_inc = include_directories('atk')
 registryd_inc = include_directories('registryd')
 
 atspi_prefix = get_option('prefix')
 atspi_datadir = join_paths(atspi_prefix, get_option('datadir'))
 atspi_libexecdir = join_paths(atspi_prefix, get_option('libexecdir'))
 atspi_sysconfdir = join_paths(atspi_prefix, get_option('sysconfdir'))
-atspi_libdir = join_paths(atspi_prefix, get_option('libdir'))
-atspi_includedir = join_paths(atspi_prefix, get_option('includedir'))
 
 if get_option('dbus_services_dir') != 'default'
   dbus_services_dir = get_option('dbus_services_dir')
@@ -42,45 +119,52 @@ else
   systemd_user_dir = join_paths(get_option('prefix'), 'lib/systemd/user')
 endif
 
+at_spi_conf.set_quoted('ATSPI_LOCALEDIR', join_paths(atspi_datadir, 'locale'))
+
 # Dependencies
 libdbus_req_version = '>= 1.5'
-glib_req_version = '>= 2.62.0'
+glib_req_version = '>= 2.67.4'
 gobject_req_version = '>= 2.0.0'
+gmodule_req_version = '>= 2.0.0'
 gio_req_version = '>= 2.28.0'
-gir_req_version = '>= 0.6.7'
+libxml_req_version = '>= 2.9.1'
+libei_req_version = '>= 1.0.901'
+xkbcommon_req_version = '>= 1.0.0'
+
+if not get_option('atk_only')
+  libdbus_dep = dependency('dbus-1', version: libdbus_req_version)
+  # TODO: Possibly make libei optional and disable mutter support if not found
+  libei_dep = dependency('libei-1.0', version: libei_req_version)
+  xkbcommon_dep = dependency('xkbcommon', version: xkbcommon_req_version)
+endif
 
-libdbus_dep = dependency('dbus-1', version: libdbus_req_version)
 glib_dep = dependency('glib-2.0', version: glib_req_version)
 gobject_dep = dependency('gobject-2.0', version: gobject_req_version)
 gio_dep = dependency('gio-2.0', version: gio_req_version)
-if cc.has_function('dlopen')
-  dl_dep = []
-elif cc.has_function('dlopen', args: '-ldl')
-  dl_dep = cc.find_library('dl')
-else
-  error('Could not find a library with the dlopen function')
+if not get_option('atk_only')
+  if cc.has_function('dlopen')
+    dl_dep = []
+  elif cc.has_function('dlopen', args: '-ldl')
+    dl_dep = cc.find_library('dl')
+  else
+    error('Could not find a library with the dlopen function')
+  endif
 endif
+gmodule_dep = dependency('gmodule-2.0', version: gmodule_req_version)
+libxml_dep = dependency('libxml-2.0', version: libxml_req_version)
 
 x11_deps = []
-x11_option = get_option('x11')
-# ensure x11_dep is defined for use elsewhere, such as bus/meson.build
-x11_dep = dependency('', required: false)
-if x11_option != 'no'
-  x11_dep = dependency('x11', required: false)
-
-  if x11_dep.found()
-    x11_deps += x11_dep
-    at_spi_conf.set('HAVE_X11', 1)
-    xtest_dep = dependency('xtst')
-    x11_deps += xtest_dep
-
-    if cc.has_function('XkbGetMap', dependencies: x11_deps)
-      at_spi_conf.set('HAVE_XKB', 1)
-    endif
-
-    xinput_dep = dependency('xi')
-    x11_deps += xinput_dep
+x11_dep = dependency('x11', required: get_option('x11'))
+if x11_dep.found()
+  x11_deps += x11_dep
+  at_spi_conf.set('HAVE_X11', 1)
+  xtest_dep = dependency('xtst')
+  x11_deps += xtest_dep
+  if cc.has_function('XkbGetMap', dependencies: x11_deps)
+    at_spi_conf.set('HAVE_XKB', 1)
   endif
+  xinput_dep = dependency('xi')
+  x11_deps += xinput_dep
 endif
 
 # Alignments
@@ -94,40 +178,52 @@ dbus_alignments = [
   'dbus_int64_t',
 ]
 
-foreach a: dbus_alignments
-  at_spi_conf.set('ALIGNOF_' + a.underscorify().to_upper(),
-                  cc.alignment(a, prefix: '#include <dbus/dbus.h>', dependencies: libdbus_dep))
-endforeach
+if not get_option('atk_only')
+  foreach a: dbus_alignments
+    at_spi_conf.set('ALIGNOF_' + a.underscorify().to_upper(),
+                    cc.alignment(a, prefix: '#include <dbus/dbus.h>', dependencies: libdbus_dep))
+  endforeach
+endif
 
 at_spi_conf.set('ALIGNOF_DBIND_POINTER', cc.alignment('dbind_pointer', prefix: 'typedef void *dbind_pointer;'))
 at_spi_conf.set('ALIGNOF_DBIND_STRUCT', cc.alignment('dbind_struct', prefix: 'typedef struct { char s1; } dbind_struct;'))
 
 # introspection support
-have_gir = false
-
-introspection_option = get_option('introspection')
-if introspection_option != 'no'
-  gir_dep = dependency('gobject-introspection-1.0', version: gir_req_version, required: false)
-
-  if gir_dep.found()
-    have_gir = true
-  endif
-endif
+gir = find_program('g-ir-scanner', required : get_option('introspection'))
+have_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled())
 
 xgettext = find_program('xgettext', required : false)
 
 configure_file(output: 'config.h', configuration: at_spi_conf)
 
+pkgconfig = import('pkgconfig')
 gnome = import('gnome')
 
-subdir('dbind')
-subdir('atspi')
-subdir('bus')
-subdir('registryd')
-subdir('test')
+if get_option('disable_p2p')
+  p2p_cflags = [ '-DDISABLE_P2P' ]
+else
+  p2p_cflags = []
+endif
+
+subdir('atk')
+
+if not get_option('atk_only')
+  install_data('at-spi2-atk.desktop',
+               install_dir: join_paths(get_option('libdir'), 'gnome-settings-daemon-3.0', 'gtk-modules'))
+
+  subdir('xml')
+  subdir('dbind')
+  subdir('atspi')
+  subdir('bus')
+  subdir('registryd')
+  subdir('droute')
+  subdir('atk-adaptor')
+  subdir('tests')
+endif
 
 if get_option('docs')
-  subdir('doc/libatspi')
+  subdir('doc')
+  subdir('devel-docs')
 endif
 
 if xgettext.found()
index c8d5fd1..bfe3363 100644 (file)
@@ -15,6 +15,14 @@ option('default_bus',
        type: 'combo',
        choices: ['dbus-daemon', 'dbus-broker'],
        value: 'dbus-daemon')
+option('use_systemd',
+       description: 'Use systemd if available (needed for dbus-broker)',
+       type: 'boolean',
+       value: true)
+option('gtk2_atk_adaptor',
+       description: 'Build the runtime module loaded by GTK2',
+       type: 'boolean',
+       value: true)
 option('systemd_user_dir',
        description: 'Location of the systemd user services',
        type: 'string',
@@ -25,11 +33,18 @@ option('docs',
        value: false)
 option('introspection',
        description: 'Enable GObject Introspection (depends on GObject)',
-       type: 'combo',
-       choices: ['yes', 'no', 'auto'],
-       value: 'auto')
+       type: 'feature',
+       value: 'auto',
+       yield: true)
 option('x11',
        description: 'Enable X11 support',
-       type: 'combo',
-       choices: ['yes', 'no', 'auto'],
+       type: 'feature',
        value: 'auto')
+option('disable_p2p',
+       description: 'Disable peer-to-peer DBus connections for at-spi2-atk',
+       type: 'boolean',
+       value: false)
+option('atk_only',
+       description: 'Build only the ATK stub library without atspi or at-spi2-atk (UNSUPPORTED)',
+       type: 'boolean',
+       value: false)
index d590968..5068d42 100644 (file)
@@ -1,19 +1,29 @@
 ab
+af
+am
 an
+ar
 as
 ast
+az
 be
+be@latin
 bg
+bn
 bn_IN
 bs
 ca
 ca@valencia
+ckb
 cs
+cy
 da
 de
+dz
 el
 en_CA
 en_GB
+en@shaw
 eo
 es
 et
@@ -30,44 +40,63 @@ he
 hi
 hr
 hu
+hy
 id
 is
 it
 ja
+ka
 kk
 km
 kn
 ko
+ku
+li
 lt
 lv
+mai
+mk
 ml
+mn
 mr
 ms
 nb
 ne
 nl
+nn
 oc
 or
 pa
 pl
+ps
 pt
 pt_BR
 ro
 ru
+rw
+si
 sk
 sl
 sq
 sr
+sr@ije
 sr@latin
 sv
 ta
 te
 tg
+th
+tk
 tr
+tt
 ug
 uk
 uz@cyrillic
 vi
+wa
+xh
+yi
 zh_CN
 zh_HK
 zh_TW
+zu
index 9a29d19..0a471a0 100644 (file)
@@ -1,5 +1,8 @@
 # List of source files containing translatable strings.
 # Please keep this file sorted alphabetically.
+atk/atkhyperlink.c
+atk/atkobject.c
+atk/atkvalue.c
 atspi/atspi-accessible.c
 atspi/atspi-component.c
 atspi/atspi-event-listener.c
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
new file mode 100644 (file)
index 0000000..3fc014d
--- /dev/null
@@ -0,0 +1,3 @@
+# List of source files that should *not* be translated.
+# Please keep this file sorted alphabetically.
+tests/at-spi2-atk/atk_test_accessible.c
index 6f34b54..82c08e4 100644 (file)
--- a/po/ab.po
+++ b/po/ab.po
-# Abkhazian translation for at-spi2-core.
-# Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
-# This file is distributed under the same license as the at-spi2-core package.
-# Nart Tlisha <daniel.abzakh@gmail.com>, 2021.
-#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2021-08-16 13:50+0000\n"
-"Last-Translator: Nart Tlisha <daniel.abzakh@gmail.com>\n"
-"Language-Team: Abkhazian\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-01-25 15:54+0000\n"
+"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n"
+"Language-Team: Abkhazian <daniel.abzakh@gmail.com>\n"
 "Language: ab\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Иалху азхьарԥш"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Аԥырсалқәа рхыԥхьаӡара"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Уажәтәи аобиект AtkHyperlink иадҳәалоу аԥырсалқәа рхыԥхьаӡара"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Аиндекс анҵәамҭа"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Аобиект AtkHyperlink аиндекс анҵәамҭа"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Аиндекс алагамҭа"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Аобиект AtkHyperlink аиндекс алагамҭа"
+
+#: atk/atkobject.c:100
+msgid "invalid"
+msgstr "ззин ыҟам"
+
+#: atk/atkobject.c:101
+msgid "accelerator label"
+msgstr "арццакыга адырга"
+
+#: atk/atkobject.c:102
+msgid "alert"
+msgstr "ашәарҭадырга"
+
+#: atk/atkobject.c:103
+msgid "animation"
+msgstr "Анимациа"
+
+#: atk/atkobject.c:104
+msgid "arrow"
+msgstr "ахыц"
+
+#: atk/atkobject.c:105
+msgid "calendar"
+msgstr "амзар"
+
+#: atk/atkobject.c:106
+msgid "canvas"
+msgstr "канва"
+
+#: atk/atkobject.c:107
+msgid "check box"
+msgstr "апытҟәыр-абираҟ"
+
+#: atk/atkobject.c:108
+msgid "check menu item"
+msgstr "амениу аелемент-абираҟ"
+
+#: atk/atkobject.c:109
+msgid "color chooser"
+msgstr "Аԥштәы алхра"
+
+#: atk/atkobject.c:110
+msgid "column header"
+msgstr "Аиҵагыла ахы"
+
+#: atk/atkobject.c:111
+msgid "combo box"
+msgstr ""
+
+#: atk/atkobject.c:112
+msgid "dateeditor"
+msgstr "арыцхә аредактор"
+
+#: atk/atkobject.c:113
+msgid "desktop icon"
+msgstr "аусуратә ишәа адыргаҷ"
+
+#: atk/atkobject.c:114
+msgid "desktop frame"
+msgstr "аусуратә ишәа адаԥа"
+
+#: atk/atkobject.c:115
+msgid "dial"
+msgstr "аномер алхра"
+
+#: atk/atkobject.c:116
+msgid "dialog"
+msgstr "аиҿцәажәара"
+
+#: atk/atkobject.c:117
+msgid "directory pane"
+msgstr "аизакхьӡынҵа апанель"
+
+#: atk/atkobject.c:118
+msgid "drawing area"
+msgstr "аҭыхра аҵакыра"
+
+#: atk/atkobject.c:119
+msgid "file chooser"
+msgstr "афаил алхра"
+
+#: atk/atkobject.c:120
+msgid "filler"
+msgstr "ахарҭәаага"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:122
+msgid "fontchooser"
+msgstr "Ашрифт алхра"
+
+#: atk/atkobject.c:123
+msgid "frame"
+msgstr "адаԥа"
+
+#: atk/atkobject.c:124
+msgid "glass pane"
+msgstr "ицәцоу апанель"
+
+#: atk/atkobject.c:125
+msgid "html container"
+msgstr "html абызшәа змоу аҭаҵа"
+
+#: atk/atkobject.c:126
+msgid "icon"
+msgstr "адыргаҷа"
+
+#: atk/atkobject.c:127
+msgid "image"
+msgstr "аԥшранҵа"
+
+#: atk/atkobject.c:128
+msgid "internal frame"
+msgstr "аҩныҵаҟатәи адаԥа"
+
+#: atk/atkobject.c:129
+msgid "label"
+msgstr "ахҵара"
+
+#: atk/atkobject.c:130
+msgid "layered pane"
+msgstr "аҩаӡарақәа змоу апанель"
+
+#: atk/atkobject.c:131
+msgid "list"
+msgstr "ахьӡынҵа"
+
+#: atk/atkobject.c:132
+msgid "list item"
+msgstr "ахьӡынҵа аелемент"
+
+#: atk/atkobject.c:133
+msgid "menu"
+msgstr "амениу"
+
+#: atk/atkobject.c:134
+msgid "menu bar"
+msgstr "амениу ацәаҳәа"
+
+#: atk/atkobject.c:135
+msgid "menu button"
+msgstr "амениу апытҟәыр"
+
+#: atk/atkobject.c:136
+msgid "menu item"
+msgstr "амениу аелемент"
+
+#: atk/atkobject.c:137
+msgid "option pane"
+msgstr "аопциақәа рпанель"
+
+#: atk/atkobject.c:138
+msgid "page tab"
+msgstr "адаҟьа агәылаҵа"
+
+#: atk/atkobject.c:139
+msgid "page tab list"
+msgstr "адаҟьа агәылаҵақәа рыхьӡынца"
+
+#: atk/atkobject.c:140
+msgid "panel"
+msgstr "апанель"
+
+#: atk/atkobject.c:141
+msgid "password text"
+msgstr "ажәамаӡа"
+
+#: atk/atkobject.c:142
+msgid "popup menu"
+msgstr "ихыло амениу"
+
+#: atk/atkobject.c:143
+msgid "progress bar"
+msgstr "анагӡара аиндикатор"
+
+#: atk/atkobject.c:144
+msgid "push button"
+msgstr "изықәыӷәӷәо апатҟәыр"
+
+#: atk/atkobject.c:145
+msgid "radio button"
+msgstr "арадио-апатҟәыр"
+
+#: atk/atkobject.c:146
+msgid "radio menu item"
+msgstr "радио-аелемент мениу"
+
+#: atk/atkobject.c:147
+msgid "root pane"
+msgstr "адацтә панель"
+
+#: atk/atkobject.c:148
+msgid "row header"
+msgstr "ацәаҳәа ахы"
+
+#: atk/atkobject.c:149
+msgid "scroll bar"
+msgstr "аҭаргьежьга ацәаҳәа"
+
+#: atk/atkobject.c:150
+msgid "scroll pane"
+msgstr "аҭаргьежьга апанель"
+
+#: atk/atkobject.c:151
+msgid "separator"
+msgstr "аиҟәшага"
+
+#: atk/atkobject.c:152
+msgid "slider"
+msgstr "акәараҵа"
+
+#: atk/atkobject.c:153
+msgid "split pane"
+msgstr "иҩбатәу апанель"
+
+#: atk/atkobject.c:154
+msgid "spin button"
+msgstr "ахаҵәира апатҟәыр"
+
+#: atk/atkobject.c:155
+msgid "statusbar"
+msgstr "аҭагылазаашьа ацәаҳәа"
+
+#: atk/atkobject.c:156
+msgid "table"
+msgstr "аҭаӡҩыра"
+
+#: atk/atkobject.c:157
+msgid "table cell"
+msgstr "аҭаӡҩыра абларҭа"
+
+#: atk/atkobject.c:158
+msgid "table column header"
+msgstr "аҭаӡҩыра аҵагыла ахы"
+
+#: atk/atkobject.c:159
+msgid "table row header"
+msgstr "аҭаӡҩыра ацәаҳәа ахы"
+
+#: atk/atkobject.c:160
+msgid "tear off menu item"
+msgstr "еиԥырҟьам амениу аелемент"
+
+#: atk/atkobject.c:161
+msgid "terminal"
+msgstr "атерминал"
+
+#: atk/atkobject.c:162
+msgid "text"
+msgstr "атекст"
+
+#: atk/atkobject.c:163
+msgid "toggle button"
+msgstr "апатҟәыр-аиагага"
+
+#: atk/atkobject.c:164
+msgid "tool bar"
+msgstr "амаругақәа рпанель"
+
+#: atk/atkobject.c:165
+msgid "tool tip"
+msgstr "аҵаҳәа"
+
+#: atk/atkobject.c:166
+msgid "tree"
+msgstr "аҵла"
+
+#: atk/atkobject.c:167
+msgid "tree table"
+msgstr "Аҵла иеиԥшу аҭаӡҩыра"
+
+#: atk/atkobject.c:168
+msgid "unknown"
+msgstr "еилкаӡам"
+
+#: atk/atkobject.c:169
+msgid "viewport"
+msgstr "ахәаԥшра аҵакыра"
+
+#: atk/atkobject.c:170
+msgid "window"
+msgstr "аԥенџьыр"
+
+#: atk/atkobject.c:171
+msgid "header"
+msgstr "ахы"
+
+#: atk/atkobject.c:172
+msgid "footer"
+msgstr "аӷәраҵа"
+
+#: atk/atkobject.c:173
+msgid "paragraph"
+msgstr "абзац"
+
+#: atk/atkobject.c:174
+msgid "ruler"
+msgstr "аҵәаӷәага"
+
+#: atk/atkobject.c:175
+msgid "application"
+msgstr "аԥшьы"
+
+#: atk/atkobject.c:176
+msgid "autocomplete"
+msgstr "автоматикла ахарҭәаара"
+
+#: atk/atkobject.c:177
+msgid "edit bar"
+msgstr "аредакторазура ацәаҳәа"
+
+#: atk/atkobject.c:178
+msgid "embedded component"
+msgstr "Иалаҵәоу акомпонент"
+
+#: atk/atkobject.c:179
+msgid "entry"
+msgstr "анҵара"
+
+#: atk/atkobject.c:180
+msgid "chart"
+msgstr "адиаграмма"
+
+#: atk/atkobject.c:181
+msgid "caption"
+msgstr "ахы"
+
+#: atk/atkobject.c:182
+msgid "document frame"
+msgstr "адокумент адаԥа"
+
+#: atk/atkobject.c:183
+msgid "heading"
+msgstr "ахы"
+
+#: atk/atkobject.c:184
+msgid "page"
+msgstr "адаҟьа"
+
+#: atk/atkobject.c:185
+msgid "section"
+msgstr "аҟәша"
+
+#: atk/atkobject.c:186
+msgid "redundant object"
+msgstr "Имцхәу аобиект"
+
+#: atk/atkobject.c:187
+msgid "form"
+msgstr "аформа"
+
+#: atk/atkobject.c:188
+msgid "link"
+msgstr "азхьарԥш"
+
+#: atk/atkobject.c:189
+msgid "input method window"
+msgstr "аҭагалара аметод аԥенџьыр"
+
+#: atk/atkobject.c:190
+msgid "table row"
+msgstr "аҭаӡҩыра ацәаҳәа"
+
+#: atk/atkobject.c:191
+msgid "tree item"
+msgstr "аҵла аелемент"
+
+#: atk/atkobject.c:192
+msgid "document spreadsheet"
+msgstr "аелектронтә ҭаӡҩыра адокумент"
+
+#: atk/atkobject.c:193
+msgid "document presentation"
+msgstr "апрезентациа адокумент"
+
+#: atk/atkobject.c:194
+msgid "document text"
+msgstr "атексттә документ"
+
+#: atk/atkobject.c:195
+msgid "document web"
+msgstr "веб-документ"
+
+#: atk/atkobject.c:196
+msgid "document email"
+msgstr "аелектронтә цҳамҭа адокумент"
+
+#: atk/atkobject.c:197
+msgid "comment"
+msgstr "ажәеилыркка"
+
+#: atk/atkobject.c:198
+msgid "list box"
+msgstr "Ахьӡынҵатә еидкыла"
+
+#: atk/atkobject.c:199
+msgid "grouping"
+msgstr "аидгәыԥлара"
+
+#: atk/atkobject.c:200
+msgid "image map"
+msgstr "аԥшранҵа ахсаала"
+
+#: atk/atkobject.c:201
+msgid "notification"
+msgstr "ардырра"
+
+#: atk/atkobject.c:202
+msgid "info bar"
+msgstr "аинформациатә цәаҳәа"
+
+#: atk/atkobject.c:203
+msgid "level bar"
+msgstr ""
+
+#: atk/atkobject.c:204
+msgid "title bar"
+msgstr "Ахы апанель"
+
+#: atk/atkobject.c:205
+msgid "block quote"
+msgstr ""
+
+#: atk/atkobject.c:206
+msgid "audio"
+msgstr "абжьы"
+
+#: atk/atkobject.c:207
+msgid "video"
+msgstr "Авидео"
+
+#: atk/atkobject.c:208
+msgid "definition"
+msgstr "аилкаара"
+
+#: atk/atkobject.c:209
+msgid "article"
+msgstr "астатиа"
+
+#: atk/atkobject.c:210
+msgid "landmark"
+msgstr "азырхара"
+
+#: atk/atkobject.c:211
+msgid "log"
+msgstr "ажурнал"
+
+#: atk/atkobject.c:212
+msgid "marquee"
+msgstr "иҩуа ацәаҳәа"
+
+#: atk/atkobject.c:213
+msgid "math"
+msgstr "аматиматикатә ҳәахьа"
+
+#: atk/atkobject.c:214
+msgid "rating"
+msgstr "ахәшьара"
+
+#: atk/atkobject.c:215
+msgid "timer"
+msgstr "аамҭарбага"
+
+#: atk/atkobject.c:216
+msgid "description list"
+msgstr "ахцәажәарақәа рыхьӡынҵа"
+
+#: atk/atkobject.c:217
+msgid "description term"
+msgstr "ахцәажәарақәа атерм"
+
+#: atk/atkobject.c:218
+msgid "description value"
+msgstr "ахцәажәара аҵакы"
+
+#: atk/atkobject.c:390
+msgid "Accessible Name"
+msgstr "Ирмариоу ахьӡ"
+
+#: atk/atkobject.c:391
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:397
+msgid "Accessible Description"
+msgstr "Ирмариоу ахцәажәара"
+
+#: atk/atkobject.c:398
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:404
+msgid "Accessible Parent"
+msgstr "Изхылҵыз ирмарианы"
+
+#: atk/atkobject.c:405
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+
+#: atk/atkobject.c:421
+msgid "Accessible Value"
+msgstr "Ирмариоу аҵакы"
+
+#: atk/atkobject.c:422
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:430
+msgid "Accessible Role"
+msgstr "Ирмариоу ароль"
+
+#: atk/atkobject.c:431
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:438
+msgid "Accessible Layer"
+msgstr "Ирмариоу аҩаӡара"
+
+#: atk/atkobject.c:439
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:447
+msgid "Accessible MDI Value"
+msgstr "MDI ирмариоу аҵакы"
+
+#: atk/atkobject.c:448
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:464
+msgid "Accessible Table Caption"
+msgstr "Ирмариоу аҭаӡҩыра ахы"
+
+#: atk/atkobject.c:465
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:479
+msgid "Accessible Table Column Header"
+msgstr "Аҭаӡҩыра аихагыла ирмариоу ахы"
+
+#: atk/atkobject.c:480
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Table Column Description"
+msgstr "Аҭаӡҩыра аиҵагыла ирмариоу ахцәажәара"
+
+#: atk/atkobject.c:496
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:511
+msgid "Accessible Table Row Header"
+msgstr "Аҭаӡҩыра ацәаҳәа имариоу ахы "
+
+#: atk/atkobject.c:512
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:526
+msgid "Accessible Table Row Description"
+msgstr "Аҭаӡҩыра аиҵагыла ирмариоу ахцәажәара"
+
+#: atk/atkobject.c:527
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:533
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:534
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:540
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:541
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:547
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:548
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "даара иҧсыҽны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "иҧсыҽны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "иудукыларатә иҟоу"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "уақәгәыӷыртә иҟоуп"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "даара уақәгәыӷыртә иҟоуп"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "даара илаҟәуп"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "Абжьаратә"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "иҳараку"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "даара иҳараку"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "даара ихәарҭам"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "ихәарҭам"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "ибзиоуп"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "даара ибзиоуп"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "иреиӷьӡоу"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1077 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Аԥшьы уаҳа ыҟаӡам"
 
-#: ../atspi/atspi-misc.c:1777
 msgid "Attempted synchronous call where prohibited"
 msgstr "Синхронтәу асра аҟаҵара азин ыҟаӡам"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#, fuzzy
diff --git a/po/af.po b/po/af.po
new file mode 100644 (file)
index 0000000..6c9a961
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,542 @@
+# Afrikaans translation of ATK.
+# Copyright (C) 2002 COPYRIGHTHOLDER
+# This file is distributed under the same license as the atk package.
+# Stefan <servine_lauvi@hotmail.com>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk cvs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2002-12-05 16:08+0100\n"
+"Last-Translator: Stefan Lubbersen <servine_lauvi@hotmail.com>\n"
+"Language-Team: Afrikaans <servine_lauvi@hotmail.com>\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Geselekteerde verwysing"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Gee aan of die AtkHyperLink objek geselekteer is"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Aantal ankers"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Die aantal ankers wat met die AtkHyperlink objek is geassosieer"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Einde indeks"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Einde van die indeks van die AtkHyperlink objek"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Begin indeks"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Begin van die indeks van die AtkHyperlink objek"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "ongeldig"
+
+#: atk/atkobject.c:75
+#, fuzzy
+msgid "accelerator label"
+msgstr "sneltoetslabel"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "alarm"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "animasie"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "pyl"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "kalender"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "kanvas"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "aankruisvakkie"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "aankruis-spyskaart-item"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "kleurkieser"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "kolomtitel"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "keusevak"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "datum bewerk"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "burobladikoon"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "buroblad-frame"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "bel"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "dialoogvenster"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "mappepaneel"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "tekengebied"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "bestands-kieser"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "vuller"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "lettertiepe-kieser"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "frame"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "glaspaneel"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html-houer"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "ikoon"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "afbeelding"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "interne frame"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "gelaagde paneel"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "lys"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "lys-item"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "spyskaart"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "spyskaart-balk"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "spyskaart-item"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "opsies-paneel"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "bladsy-tabblad"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "bladsy-tabbladlys"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "paneel"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "wagwoordteks"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "popop-spyskaart"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "voorgangsbalk"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "drukknop"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "radioknop"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "radio-spyskaart-item"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "hoofpaneel"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "rytitel"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "skuifbalk"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "skuifpaneel"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "skeiding"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "skuiwer"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "gedeelde paneel"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "omhoog/omlaag-knop"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "statusbalk"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "tabel"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "tabel-sel"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "tabelkolomtitel"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "tabelrytitel"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "afneembaar spyskaart-item"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminaal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "teks"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "skakelknop"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "werkbalk"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "hulpballon"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "boom"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "boomtabel"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "onbekend"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "blikveld"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "venster"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "kop"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "voet"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraaf"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "alarm"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "program"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "outkompleet"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "spyskaart-balk"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "alarm"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "program"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "buroblad-frame"
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "kop"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "afbeelding"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "frame"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Toeganklike naam"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Naam van die objek, spesiaal opgemaak vir toegang van ondersteunende "
+"tegnologie"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Toeganklike beskrywing"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Beskrywing van die objek, spesiaal opgemaak vir toegang van ondersteunende "
+"tegnologie"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Toeganklike ouer"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Word gebruik om aan te gee dat die ouer is verander"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Toeganklike waarde"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Word gebruik om aan te gee dat die waarde is verander"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Toeganklike rol"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Die toeganklike rol van die objek"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Toeganklike laag"
+
+#: atk/atkobject.c:528
+#, fuzzy
+msgid "The accessible layer of this object"
+msgstr "Die toeganklike rol van die objek"
+
+#: atk/atkobject.c:536
+#, fuzzy
+msgid "Accessible MDI Value"
+msgstr "Toeganklike waarde"
+
+#: atk/atkobject.c:537
+#, fuzzy
+msgid "The accessible MDI value of this object"
+msgstr "Die toeganklike rol van die objek"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Toegankelijke tabeltitel"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Word gebruik om aan te gee dat die tabeltitel is verander (nie gebruik nie). "
+"U kan beter accessible-table-caption-objek gebruik."
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "tabelkolomtitel"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Word gebruik om aan te gee dat die kolomtitel is verander"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Toeganklike kolombeskrywing"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Word gebruik om aan te gee dat die kolombeskrywing is verander"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "tabelrytitel"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Word gebruik om aan te gee dat die rytitel is verander"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Toeganklike rybeskrywing"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Word gebruik om aan te gee dat die rybeskrywing is verander"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Toeganklike tabelsamenvatting"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Word gebruik om aan te gee dat die tabelsamenvatting is verander"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Toeganklik tabeltitelobjek"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Word gebruik om aan te gee dat die tabeltitel is verander"
+
+#: atk/atkobject.c:594
+#, fuzzy
+msgid "Number of Accessible Hypertext Links"
+msgstr "Toeganklike Hypertext aantal verwysings"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Die huidige aantal verwysings van die huidige AtkHypertext"
diff --git a/po/am.po b/po/am.po
new file mode 100644 (file)
index 0000000..1b96583
--- /dev/null
+++ b/po/am.po
@@ -0,0 +1,551 @@
+# Translations into the Amharic Language.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# Ge'ez Frontier Foundation <locales@geez.org>, 2002.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2003-01-08 07:44+EDT\n"
+"Last-Translator: Ge'ez Frontier Foundation <locales@geez.org>\n"
+"Language-Team: Amharic <locales@geez.org>\n"
+"Language: am\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr ""
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr ""
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr ""
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "የማይሰራ"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr ""
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr ""
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr ""
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "ቀስት"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "ቀን መቁጠሪያ"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr ""
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr ""
+
+#: atk/atkobject.c:82
+#, fuzzy
+msgid "check menu item"
+msgstr "ሜኑ-ዕቃ"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr ""
+
+#: atk/atkobject.c:84
+#, fuzzy
+msgid "column header"
+msgstr "ዐምድ-አናት"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr ""
+
+#: atk/atkobject.c:86
+#, fuzzy
+msgid "dateeditor"
+msgstr "ቀን-አርትዒ"
+
+#: atk/atkobject.c:87
+#, fuzzy
+msgid "desktop icon"
+msgstr "ሠሌዳ-ምልክት"
+
+#: atk/atkobject.c:88
+#, fuzzy
+msgid "desktop frame"
+msgstr "ሠሌዳ-ፍሬም"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr ""
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "መምረጫ"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr ""
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr ""
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr ""
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr ""
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "ፍሬም"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr ""
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr ""
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "ምልክት"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "ምስል"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr ""
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "መለያ"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr ""
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "ዝርዝር"
+
+#: atk/atkobject.c:106
+#, fuzzy
+msgid "list item"
+msgstr "ዝርዝር-ዕቃ"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "ሜኑ"
+
+#: atk/atkobject.c:108
+#, fuzzy
+msgid "menu bar"
+msgstr "ሜኑ-ባር"
+
+#: atk/atkobject.c:109
+#, fuzzy
+msgid "menu item"
+msgstr "ሜኑ-ዕቃ"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr ""
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr ""
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr ""
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "ፓነል"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr ""
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr ""
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr ""
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr ""
+
+#: atk/atkobject.c:118
+#, fuzzy
+msgid "radio button"
+msgstr "ሬዲዮ-ቁልፍ"
+
+#: atk/atkobject.c:119
+#, fuzzy
+msgid "radio menu item"
+msgstr "ሬዲዮ-ሜኑ-ዕቃ"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr ""
+
+#: atk/atkobject.c:121
+#, fuzzy
+msgid "row header"
+msgstr "ረድፍ-አናት"
+
+#: atk/atkobject.c:122
+#, fuzzy
+msgid "scroll bar"
+msgstr "መሸብለል-ባር"
+
+#: atk/atkobject.c:123
+#, fuzzy
+msgid "scroll pane"
+msgstr "መሸብለል-ባር"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "መለያ"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr ""
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr ""
+
+#: atk/atkobject.c:127
+#, fuzzy
+msgid "spin button"
+msgstr "ሬዲዮ-ቁልፍ"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "ስታተስባር"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "ሠንጠረዥ"
+
+#: atk/atkobject.c:130
+#, fuzzy
+msgid "table cell"
+msgstr "ሠንጠረዥ"
+
+#: atk/atkobject.c:131
+#, fuzzy
+msgid "table column header"
+msgstr "ዐምድ-አናት"
+
+#: atk/atkobject.c:132
+#, fuzzy
+msgid "table row header"
+msgstr "ረድፍ-አናት"
+
+#: atk/atkobject.c:133
+#, fuzzy
+msgid "tear off menu item"
+msgstr "ሬዲዮ-ሜኑ-ዕቃ"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "ተርሚናል"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "ጽሑፍ"
+
+#: atk/atkobject.c:136
+#, fuzzy
+msgid "toggle button"
+msgstr "ቀያያር-ቁልፍ"
+
+#: atk/atkobject.c:137
+#, fuzzy
+msgid "tool bar"
+msgstr "ቱል-ባር"
+
+#: atk/atkobject.c:138
+#, fuzzy
+msgid "tool tip"
+msgstr "ቱል-ፍንጭ"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "ዛፍ"
+
+#: atk/atkobject.c:140
+#, fuzzy
+msgid "tree table"
+msgstr "ዛፍ-ሠንጠረዥ"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "ያልታወቀ"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "መስኮት"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "የገጽ አናት"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "የገጽ ግርጌ"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "ምዕራፍ"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "ማስመሪያ"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "መጠቀሚያ ፕሮግራም"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr ""
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr ""
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "መጠቀሚያ ፕሮግራም"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "የገጽ አናት"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "ምስል"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "ፍሬም"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
index 40ed472..bbca966 100644 (file)
--- a/po/an.po
+++ b/po/an.po
@@ -1,11 +1,20 @@
+# #-#-#-#-#  an.po (at-spi2-core master)  #-#-#-#-#
 # Aragonese translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Daniel Martinez Cucalon <entaltoaragon@gmail.com>, 2011.
 # FULL NAME <EMAIL@ADDRESS>, 2011.
 #
+# #-#-#-#-#  an.po (atk master)  #-#-#-#-#
+# Aragonese translation for atk.
+# Copyright (C) 2013 atk's COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+# Jorge Pérez Pérez <jorgtum@gmail.com, 2013
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  an.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -18,6 +27,21 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.6.3\n"
+"#-#-#-#-#  an.po (atk master)  #-#-#-#-#\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-05-07 14:53+0000\n"
+"PO-Revision-Date: 2015-05-07 19:33+0200\n"
+"Last-Translator: Daniel <entaltoaragon@gmail.com>\n"
+"Language-Team: Aragonese <softaragones@googlegroups.com>\n"
+"Language: an\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.5.1.1\n"
+"X-POOTLE-MTIME: 1431023608.000000\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -27,3 +51,786 @@ msgstr "L'aplicacion ya no existe"
 #: ../atspi/atspi-misc.c:1777
 msgid "Attempted synchronous call where prohibited"
 msgstr "S'ha prohibiu l'intento de gritada sincrona"
+
+#: ../atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Vinclo seleccionau"
+
+#: ../atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica si l'obchecto AtlHyperlink ye seleccionau"
+
+#: ../atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Numero d'ancoras"
+
+#: ../atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "O numero d'ancoras asociadas con un obchecto AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Indiz final"
+
+#: ../atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "L'indiz final d'un obchecto AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Indiz inicial"
+
+#: ../atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "L'indiz inicial d'un obchecto AtkHyperlink"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "no valido"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "etiqueta de combinación de teclas"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "alvertencia"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "animación"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "flecha"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "calandario"
+
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "lienzo"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "caixeta de verificación"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "elemento de menú de verificación"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "selector de color"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "capitero d'a columna"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "caixa combinada"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "editor de calendata"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "icono de l'escritorio"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "marco de l'escritorio"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "marcador"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "dialogo"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "panel de directorio"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "aria de dibuixo"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "selector de fichers"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "replenador"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "selector de fuents"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "marco"
+
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "panel transparent"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "contenedor html"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "icono"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "imachen"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "marco interno"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "etiqueta"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "panel supermeso"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "lista"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "elemento de lista"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "menú"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "barra de menú"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "elemento de menú"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "panel d'opcions"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "pestanya de pachina"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "lista de pestanyas de pachina"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "texto de clau"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "menú emerchent"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "barra de progreso"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "botón de pulsación"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "botón de radio"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "elemento de menú de mena radio"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "panel radiz"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "capitero d'a ringlera"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "barra de desplazamiento"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "panel de desplazamiento"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "separador"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "eslizador"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "panel divisible"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "botón chirant"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "barra d'estau"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "tabla"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "celda de tabla"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "capitero de columna de tabla"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "capitero de ringlera de tabla"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "elemento de menú desprendible"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "texto"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "botón de selección"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "barra de ferramientas"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "sucherencia"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "arbol"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "tabla d'arbol"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "desconoixiu"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "puerto de visión"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "finestra"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "capitero"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "piet"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "paragrafo"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "regle"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "aplicación"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "autocompletau"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "barra d'edición"
+
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "component encrustau"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "dentrada"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "diagrama"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "leyenda"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "marco de documento"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "capitero"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "pachina"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "sección"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "obchecto redundant"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "formulario"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "vinclo"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "finestra de dentrada de metodo"
+
+#: ../atk/atkobject.c:186
+msgid "table row"
+msgstr "ringlera de tabla"
+
+#: ../atk/atkobject.c:187
+msgid "tree item"
+msgstr "elemento d'arbol"
+
+#: ../atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "documento de fuella de calculo"
+
+#: ../atk/atkobject.c:189
+msgid "document presentation"
+msgstr "documento de presentación"
+
+#: ../atk/atkobject.c:190
+msgid "document text"
+msgstr "documento de texto"
+
+#: ../atk/atkobject.c:191
+msgid "document web"
+msgstr "documento web"
+
+#: ../atk/atkobject.c:192
+msgid "document email"
+msgstr "documento de correu electronico"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "comentario"
+
+#: ../atk/atkobject.c:194
+msgid "list box"
+msgstr "caixa de lista"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "agrupación"
+
+#: ../atk/atkobject.c:196
+msgid "image map"
+msgstr "mapa d'imachen"
+
+#: ../atk/atkobject.c:197
+msgid "notification"
+msgstr "notificación"
+
+#: ../atk/atkobject.c:198
+msgid "info bar"
+msgstr "barra d'información"
+
+#: ../atk/atkobject.c:199
+msgid "level bar"
+msgstr "barra de libel"
+
+#: ../atk/atkobject.c:200
+msgid "title bar"
+msgstr "barra de titol"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr "cita de bloque"
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "audio"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "video"
+
+#: ../atk/atkobject.c:204
+msgid "definition"
+msgstr "definición"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "articlo"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr "marca"
+
+#: ../atk/atkobject.c:207
+msgid "log"
+msgstr "rechistro"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr "marquesina"
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr "formula matematica"
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "puntuación"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "temporizador"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "lista de descripción"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "termín de descripción"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "valorde descripción"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Nombre accesible"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"O nombre d'a instancia de l'obchecto formateyau pa l'acceso ta discapacitados"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Descripción accesible"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Descripción d'un obchecto, formateyau pa l'acceso ta discapacitados"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Pai accesible"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Pai de l'accesible actual tal como lo torna atk_object_get_parent()"
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Valor accesible"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Se fa servir ta notificar que a valor ha cambiau"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Paper accesible"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "O paper d'accesibilidat d'iste obchecto"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Capa accesible"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "A capa d'accesibilidat d'iste obchecto"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accesible"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "A valor accesible MDI d'iste obchecto"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Leyenda accesible d'a tabla"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Se fa servir ta notificar que a descripción d'a tabla ha cambiau; ista "
+"propiedat no debería usar-se. Cal fer servir accesible-table-caption-object "
+"en cuenta"
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Capitero de columna accesible d'a tabla"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Se fa servir ta notificar que o capitero de columna d'a tabla ha cambiau"
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Descripción accesible d'a columna d'a tabla"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Se fa servir ta notificar que a descripción d'a columna d'a tabla ha cambiau"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Capitero accesible d'a ringlera d'a tabla"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Se fa servir ta notificar que a ringlera d'o capitero d'a tabla ha cambiau"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Descripción accesible d'a ringlera d'a tabla"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Se fa servir ta notificar que a ringlera d'a descripción ha cambiau"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Resumen accesible d'a tabla"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Se fa servir ta notificar que o resumen d'a tabla ha cambiau"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Obchecto de leyenda d'a tabla accesible"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Se fa servir ta notificar que a leyenda d'a tabla ha cambiau"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Numero de vinclos d'hipertexto accesibles"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "O numero de vinclos que l'AtkHypertext actual tien"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "muit feble"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "feble"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+#| msgid "table"
+msgid "acceptable"
+msgstr "acceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "fuerte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "muit fuerte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "muit baixo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "meyo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "alto"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "muit alto"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "muit malo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "malo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "bueno"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "muit bueno"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "o millor"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Se fa servir ta notificar que o pai ha cambiau"
diff --git a/po/ar.po b/po/ar.po
new file mode 100644 (file)
index 0000000..6c02f70
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,534 @@
+# translation of atk.HEAD.ar.po to Arabic
+# translation of atk.HEAD.ar.po to
+# translation of atk.HEAD.ar.po to
+# This file is distributed under the same license as the atk.HEAD.ar package.
+# Copyright (C) 2003 THE atk.HEAD.ar'S COPYRIGHT HOLDER
+# Arafat Medini <lumina@silverpen.de>, 2003.
+# Arafat Medini <kinryu@silverpen.de>, 2004.
+# Djihed Afifi <djihed@gmail.com>, 2006.
+# Khaled Hosny <khaledhosny@eglug.org>, 2007, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: atk.HEAD.ar\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2009-07-11 02:07+0300\n"
+"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ar\n"
+"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
+"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
+"X-Generator: Virtaal 0.4.0-beta1\n"
+"X-Poedit-Language: Arabic\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "الوصلة المنتقاة"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "يحدد فيما اذا انتُقِيَ كائِن AtkHyperlink"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "عدد المثبتات"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "عدد المثبتات المرتبطة بكائن AtkHyperlink"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "الفهرس النهائي"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "الفهرس النهائي لكائن AtkHyperlink"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "فهرس البداية"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "فهرس البداية لكائن AtkHyperlink"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "غير صالح"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "شارة الاختصار"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "تنبيه"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "رسوم متحركة"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "سهم"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "تقويم"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "لوح رسم"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "صندوق ضبط"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "عنصر قائمة ضبط"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "مختار الألوان"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "رأس العمود"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "صندوق مركب"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "محرر التاريخ"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "أيقونة المكتب"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "إطار المكتب"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "اتصال"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "حوار"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "لوح الدلائل"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "مساحة الرسم"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "مختار الملفات"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "مملئ"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "مختار الخطوط"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "إطار"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "لوح بلوري"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "حاوي html"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "أيقونة"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "صورة"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "إطار داخلي"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "شارة"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "لوح ذي مستويات"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "قائمة"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "عنصر قائمة"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "قائمة"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "شريط قوائم"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "عنصر قائمة"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "لوح خيارات"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "لسان الصفحة"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "قائمة ألسنة الصفحات"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "شريط"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "نص كلمة السر"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "قائمة منبثقة"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "شريط التقدم"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "زر ضغط"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "زر مذياع"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "عنصر قائمة مذياعي"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "اللوح الجذر"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "رأس الصف"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "شريط اللف"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "لوح اللف"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "فاصل"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "مزلق"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "لوح الإنقسام"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "زر تدوير"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "شريط الحالة"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "جدول"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "خلية الجدول"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "رأس عمود الجدول"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "رأس صف الجدول"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "افصِل عنصر القائمة"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "طرفية"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "نص"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "زر تبديل"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "شريط الأدوات"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "تلميحة أداه"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "شجرة"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "جدول شجرة"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "مجهول"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "منفذ عرض"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "نافذة"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "ترويسة"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "هامش"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "فقرة"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "مسطرة"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "تطبيق"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "أكمل آليا"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "حرّر الشريط"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "مكوّن مضمّن"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "خانة"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "شكل"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "عنوان"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "إطار المستند"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "ترويس"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "صفحة"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "فصل"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "كائن فائض"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "نموذج"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr "رابط"
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr "نافذة طريقة الإدخال"
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "اسم ممكن النفاذ إليه"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "اسم نموذج الكائن المهيئ للاستخدام من قبل التقنية المعينة"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "وصف ممكن النفاذ إليه"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "وصف جسم، مهيئ للنفاذ عبره إلى تقنية مساعدة المعوقين"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "أب يمكن النفاذ إليه"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "يستخدم للتبليغ عن تغير الأب"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "قيمة يمكن النفاذ إليها"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "يستخدم للتبليغ عن تغير القيمة"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "دور ميسر"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "الدور الميسر لهذا الكائن"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "طبقة ميسرة"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "الطبقة الميسرة لهذا الكائن"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "قيمة MDI الميسرة"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "قيمة MDI الميسرة لهذا الجسم"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "العنوان الفرعي للجدول الداعم للاعانة"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"يستخدم للتبليغ عن تغيير العنوان الفرعي للجدول،من المفروض عدم استخدامهذه "
+"الخاصية. من المفروض استخدام accessible-table-caption-object عوضا عنها."
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "رأس عمود الجدول الميسر"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "يستخدم للتبليغ عن تغير رأس عمود الجدول"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "الوصف الميسر لعمود الجدول"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "يستخدم للتبليغ عن تغير وصف عمود الجدول"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "ترويسة صف الجدول الميسرة"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "يستخدم للتبليغ عن تغير ترويسة صف الجدول"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "الوصف الميسر لصف الجدول"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "يستخدم للتبليغ عن تغير وصف صف الجدول"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "خلاصة الجدول الميسرة"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "يستخدم للتبليغ عن تغير خلاصة الجدول"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "جسم العنوان الفرعي للجدول الداعم للإعانة"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "يستخدم للتبليغ عن تغيير العنوان الفرعي للجدول"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "عدد وصلات النّصّ الفائق الدّاعمة للإعانة"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "عدد الوصلات لـ AtkHypertext الحالي"
index e8bf4db..e7d3911 100644 (file)
--- a/po/as.po
+++ b/po/as.po
@@ -1,9 +1,22 @@
+# #-#-#-#-#  as.po  #-#-#-#-#
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Nilamdyuti Goswami <ngoswami@redhat.com>, 2011, 2014.
+# #-#-#-#-#  as.po (as)  #-#-#-#-#
+# translation of as.po to Assamese
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+#
+# SUNARAM PATIR <lkpatir@yahoo.co.in>, 2004.
+# Amitakhya Phukan <aphukan@redhat.com>, 2007.
+# Amitakhya Phukan <aphukan@fedoraproject.org>, 2009.
+# Nilamdyuti Goswami <ngoswami@redhat.com>, 2011, 2014.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  as.po  #-#-#-#-#\n"
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +30,20 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 1.5\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  as.po (as)  #-#-#-#-#\n"
+"Project-Id-Version: as\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-08-18 14:47+0000\n"
+"PO-Revision-Date: 2014-08-18 21:01+0530\n"
+"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
+"Language-Team: Assamese <kde-i18n-doc@kde.org>\n"
+"Language: as\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=(n!=1)\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -27,6 +54,785 @@ msgstr "এপ্লিকেচনৰ আৰু অস্তিত্ব না
 msgid "Attempted synchronous call where prohibited"
 msgstr "নিষিদ্ধ ঠাইত সংমিহলিত কলৰ চেষ্টা"
 
+#: ../atk/atkhyperlink.c:128
+msgid "Selected Link"
+msgstr "নিৰ্বাচিত লিঙ্ক"
+
+#: ../atk/atkhyperlink.c:129
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink object নিৰ্বাচিত হয় নে নহয় উল্লেখ কৰে"
+
+#: ../atk/atkhyperlink.c:135
+msgid "Number of Anchors"
+msgstr "সুত্ৰধাৰসমূহৰ সংখ্যা"
+
+#: ../atk/atkhyperlink.c:136
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টৰ লগত জড়িত সুত্ৰধাৰসমূহৰ সংখ্যা"
+
+#: ../atk/atkhyperlink.c:144
+msgid "End index"
+msgstr "শেষ সূচী"
+
+#: ../atk/atkhyperlink.c:145
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টৰ শেষ সূচী"
+
+#: ../atk/atkhyperlink.c:153
+msgid "Start index"
+msgstr "আৰম্ভণি সূচী"
+
+#: ../atk/atkhyperlink.c:154
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টৰ আৰম্ভণি সূচী"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "অবৈধ"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "ত্বৰক লেবেল"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "সতৰ্ক"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "জীৱন্তকৰণ"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "কাঁড়"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "কেলেন্ডাৰ"
+
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "চিত্ৰপট"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "চেক বাকচ"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "চেক তালিকা বস্তু"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "ৰং নিৰ্বাচক"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "স্তম্ভ হেডাৰ"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "কম্বো বাকচ"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "তাৰিখ সম্পাদক"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "ডেস্কটপ আইকন"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "ডেস্কটপ ফ্ৰেইম"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "ডায়েল"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "ডাইলগ"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "ডাইৰেকটৰি পেইন"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "অংকন স্থান"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "ফাইল নিৰ্বাচক"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "পূৰণকাৰী"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "আখৰ নিৰ্বাচক"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "ফ্ৰেইম"
+
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "গ্লাচ পেইন"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "html ধাৰক"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "আইকন"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "ছবি"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "অভ্যন্তৰীক ফ্ৰেইম"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "লেবেল"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "স্তৰীয় পেইন"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "তালিকা"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "তালিকা বস্তু"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "মেনু"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "মেনু বাৰ"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "মেনুৰ বস্তু"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "বিকল্পৰ পেইন"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "পৃষ্ঠা টেব"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "পৃষ্ঠা টেব তালিকা"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "পেনেল"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "পাছৱৰ্ড লিখনি"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "পপআপ মেনু"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "প্ৰগতি বাৰ"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "টিপা বুটাম"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "ৰেডিঅ' বুটাম"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "ৰেডিঅ' মেনুৰ বস্তু"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "ৰুট পেইন"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "শাৰী হেডাৰ"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "স্ক্ৰল বাৰ"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "স্ক্ৰল পেইন"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "বিভাজক"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "স্লাইডাৰ"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "বিভাজিত পেইন"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "ঘূৰ্ণন বুটাম"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "অৱস্থাবাৰ"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "টেবুল"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "টেবুল কোষ"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "টেবুল স্তম্ভ হেডাৰ"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "টেবুল শাৰী হেডাৰ"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "বিদাৰিত মেনুৰ বস্তু"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "টাৰ্মিনেল"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "লিখনি"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "অদল বদল বুটাম"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "সঁজুলি বাৰ"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "সঁজুলিৰ উপদেশ"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "ট্ৰি"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "ট্ৰিৰ টেবুল"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "অজ্ঞাত"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "ভিউপ'ৰ্ট"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "উইন্ডো"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "হেডাৰ"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "পাদটীকা"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "দফা"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "ৰুলাৰ"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "অনুপ্ৰয়োগ"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "স্ব-সম্পূৰ্ণ"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "সম্পাদন বাৰ"
+
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "অন্তৰ্ভুক্ত উপাদান"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "প্ৰবিষ্টি"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "ৰেখাচিত্ৰ"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "কেপষণ"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "দস্তাবেজৰ ফ্ৰেইম"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "হেডিং"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "পৃষ্ঠা"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "বিভাগ"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "ত্ৰুটিপূৰ্ণ অবজেক্ট"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "বিন্যাস"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "লিঙ্ক"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "ইনপুট পদ্ধতিৰ উইন্ডো"
+
+#: ../atk/atkobject.c:186
+msgid "table row"
+msgstr "টেবুল শাৰী"
+
+#: ../atk/atkobject.c:187
+msgid "tree item"
+msgstr "ট্ৰিৰ বস্তু"
+
+#: ../atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "দস্তাবেজ স্প্ৰেডশিট"
+
+#: ../atk/atkobject.c:189
+msgid "document presentation"
+msgstr "দস্তাবেজ পৰিৱেশন"
+
+#: ../atk/atkobject.c:190
+msgid "document text"
+msgstr "দস্তাবেজ লিখনি"
+
+#: ../atk/atkobject.c:191
+msgid "document web"
+msgstr "দস্তাবেজ ৱেব"
+
+#: ../atk/atkobject.c:192
+msgid "document email"
+msgstr "দস্তাবেজ ই-মেইল"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "মন্তব্য"
+
+#: ../atk/atkobject.c:194
+msgid "list box"
+msgstr "তালিকা বাকচ"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "দলীকৰণ"
+
+#: ../atk/atkobject.c:196
+msgid "image map"
+msgstr "ছবি মানচিত্ৰ"
+
+#: ../atk/atkobject.c:197
+msgid "notification"
+msgstr "অধিসূচনা"
+
+#: ../atk/atkobject.c:198
+msgid "info bar"
+msgstr "তথ্য বাৰ"
+
+#: ../atk/atkobject.c:199
+#| msgid "scroll bar"
+msgid "level bar"
+msgstr "স্তৰ বাৰ"
+
+#: ../atk/atkobject.c:200
+#| msgid "tool bar"
+msgid "title bar"
+msgstr "শীৰ্ষক বাৰ"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr "ব্লক কৌট"
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "অডিঅ'"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "ভিডিঅ'"
+
+#: ../atk/atkobject.c:204
+#| msgid "animation"
+msgid "definition"
+msgstr "বিৱৰণ"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "অধ্যায়"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr "লেণ্ডমাৰ্ক"
+
+#: ../atk/atkobject.c:207
+#| msgid "dialog"
+msgid "log"
+msgstr "লগ"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr "মাৰ্ক"
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr "মেথ"
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "ৰেটিং"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "টাইমাৰ"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "বিৱৰণৰ তালিকা"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "বিৱৰণ সংজ্ঞা"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "বিৱৰণ মান"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "অভিগম  নাম"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "সহায়ক প্ৰযুক্তিবিদ্যাৰ অভিগম্যতাৰ বাবে অবজেক্ট উদাহৰণৰ নাম ফৰমেট কৰা হ'ল"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "অভিগম বিৱৰণ"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "এটা অবজেক্টৰ বিৱৰণ, সহায়ক প্ৰযুক্তিবিদ্যাৰ অভিগম্যতাৰ বাবে ফৰমেট কৰা হ'ল"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "অভিগম উপধায়ক"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "atk_object_get_parent() দ্বাৰা প্ৰদান কৰা ধৰণে বৰ্তমান অভিগম্যৰ উপধায়ক"
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "অভিগম মান"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "মান সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "অভিগম ভূমিকা"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "এইটো অবজেক্টৰ অভিগম ভূমিকা"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "অভিগম স্তৰ"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "এই অবজেক্টৰ অভিগম্য স্তৰ"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "অভিগম্য  MDI মান"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "এইটো অবজেক্টৰ অভিগম্য  MDI মান"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "অভিগম টেবুল কেপষণ"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"টেবুল কেপষণ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়;  এই বৈশিষ্টটো ব্যৱহাৰ কৰা উচিত নহয় "
+"। ইয়াৰ সলনি অভিগম-টেবুল-কেপষণ-অবজেক্ট ব্যৱহাৰ কৰা উচিত"
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "অভিগম টেবুল স্তম্ভ হেডাৰ"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "টেবুল স্তম্ভ হেডাৰ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "অভিগম টেবুল স্তম্ভ বিৱৰণ"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "টেবুল স্তম্ভ বিৱৰণ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "অভিগম টেবুল শাৰী হেডাৰ"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "টেবুল শাৰী হেডাৰ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "অভিগম টেবুল শাৰী বিৱৰণ"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "টেবুল শাৰী বিৱৰণ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "অভিগম টেবুল সাৰাংশ"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "টেবুল সাৰাংশ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "অভিগম্য টেবুল কেপষণ বস্তু"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "টেবুল কেপষণ সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "অভিগম্য হাইপাৰটেক্সট লিঙ্কসমূহৰ সংখ্যা"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "বৰ্তমান AtkHypertext -ৰ লিঙ্কৰ সংখ্যা"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "অতি দুৰ্বল"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "দূৰ্বল"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+#| msgid "table"
+msgid "acceptable"
+msgstr "গ্ৰহণযোগ্য"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "শক্তিশালী"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "অতি শক্তিশালী"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "অতি কম"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "মধ্যম"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "উচ্চ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "অতি উচ্চ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "অতি বেয়া"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "বেয়া"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "ভাল"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "খুব ভাল"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "উত্তম"
+
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: RemoveAccessible -ৰ কাৰণে অজ্ঞাত স্বাক্ষৰ %s"
 
@@ -92,3 +898,6 @@ msgstr "নিষিদ্ধ ঠাইত সংমিহলিত কলৰ 
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "সংকেত %s -ৰ কাৰণে আন্তঃপৃষ্ট %s -ৰ পৰা অবৈধ স্বাক্ষৰ %s পোৱা গল\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "উপধায়ক সলনি হোৱা বুজাবলৈ ব্যৱহাৰ কৰা হয়"
index 8dc1d17..ca607e6 100644 (file)
--- a/po/ast.po
+++ b/po/ast.po
@@ -1,9 +1,18 @@
+# #-#-#-#-#  ast.po (at-spi2-core master)  #-#-#-#-#
 # Asturian translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Xandru Armesto <xandru@softastur.org>, 2011.
+# #-#-#-#-#  ast.po (atk master)  #-#-#-#-#
+# Asturian translation for atk.
+# Copyright (C) 2010 atk's COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ast.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +26,20 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Virtaal 0.5.2\n"
+"#-#-#-#-#  ast.po (atk master)  #-#-#-#-#\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-08-16 17:08+0000\n"
+"PO-Revision-Date: 2011-09-09 14:08+0100\n"
+"Last-Translator: ivarela <ivarela@softastur.org>\n"
+"Language-Team: Asturian <alministradores@softastur.org>\n"
+"Language: ast\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: asturian\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -39,8 +62,8 @@ msgid ""
 "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
 "signature %s"
 msgstr ""
-"AT-SPI: llamada a _atspi_dbus_return_accessible_from_message con una robla %"
-"s estraña"
+"AT-SPI: llamada a _atspi_dbus_return_accessible_from_message con una robla "
+"%s estraña"
 
 #: ../atspi/atspi-misc.c:616
 #, c-format
@@ -64,7 +87,8 @@ msgstr "L'aplicación yá nun esiste"
 #: ../atspi/atspi-misc.c:1062
 #, c-format
 msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-msgstr "AT-SPI: esperábase una variante al guetar %s de la interfaz %s; obtúvose %s\n"
+msgstr ""
+"AT-SPI: esperábase una variante al guetar %s de la interfaz %s; obtúvose %s\n"
 
 #: ../atspi/atspi-misc.c:1068
 #, c-format
@@ -95,3 +119,576 @@ msgstr ""
 #, c-format
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "Obtúvose una robla %s non válida pa la señal %s de la interfaz %s\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Enllaz seleicionáu"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica si l'oxetu AtlHyperlink ta seleicionáu"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Númberu d'ancles"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "El númberu d'ancles asociaes con un oxetu AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Índiz caberu"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "L'índiz caberu d'un oxetu AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Índiz d'aniciu"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "L'índiz d'entamu d'un oxetu AtkHyperlink"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "non válidu"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "etiqueta de combinación de tecles"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "avisu"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "animación"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "flecha"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "calendariu"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "llenzu"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "caxella de verificación"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "elementu de menú de verificación"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "seleicionador de color"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "cabecera de la columna"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "caxa combinada"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "editor de fecha"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "iconu del escritoriu"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "marcu del escritoriu"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "marcador"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "diálogu"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "panel de direutoriu"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "estaya de dibuxu"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "seleicionador de ficheros"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "completar"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "seleicionador de fonte"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "marcu"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "panel tresparente"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "contenedor html"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "iconu"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "imaxe"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "marcu internu"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "etiqueta"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "panel superpuestu"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "llista"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "elementu de llista"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "menú"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "barra de menú"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "elementu de menú"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "panel d'opciones"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "llingüeta de páxina"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "llista de llingüetes de páxina"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "testu de contraseña"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "menú emerxente"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "barra de progresu"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "botón de pulsación"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "botón de radiu"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "elementu de menú triba radio"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "panel raíz"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "cabecera de la filera"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "barra de desplazamientu"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "panel de desplazamientu"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "dixebrador"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "eslizador"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "panel dixebrable"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "botón xiratoriu"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "barra d'estáu"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "tabla"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "caxella de tabla"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "cabecera de columna de tabla"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "cabecera de filera de tabla"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "elementu de menú desprendible"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "testu"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "botón d'activación"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "barra d'estáu"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "suxerencia"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "árbol"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "tabla d'árbol"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "desconocíu"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "puertu de visión"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "ventana"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "cabecera"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "pie"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "párrafu"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "regla"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "aplicación"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "autocompletáu"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "barra d'edición"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "componente incrustáu"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "entrada"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "diagrama"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "descripción"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "marcu de documentu"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "cabecera"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "páxina"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "seición"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "Oxetu redundante"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "formulariu"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "enllaz"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ventana d'entrada de métodu"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "filera de tabla"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "elementu d'árbol"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "documentu de fueya de cálculu"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "documentu de presentación"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "documentu de testu"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "documentu web"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "documentu d'email"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "comentariu"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "caxa de llista"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "agrupación"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "mapa d'imaxe"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "notificación"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "barra d'info"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "Nome accesible"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "El nome de la instancia del oxetu formateáu p'accesu pa discapacitaos"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "Descripción accesible"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Descripción d'un oxetu, formateáu p'accesu pa discapacitaos"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "Antecesor accesible"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "Usáse pa notificar que l'antecesor camudó"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "Valor accesible"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "Usáse pa notificar que'l valor camudó"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "Rol accesible"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "El rol d'accesibilidá d'esti oxetu"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "Capa accesible"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "La capa d'accesibilidá d'esti oxetu"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accesible"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "El valor accesible MDI d'esti oxetu"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "Descripción accesible de la tabla"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Usáse pa notificar que la descripción de la tabla camudó; esta propiedá nun "
+"tendría que ser usada. Tien d'usase accesible-table-caption-object nel so "
+"llugar"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "Cabecera de columna accesible de la tabla"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "Usáse pa notificar que la cabecera de columna de la tabla camudó"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "Descripción accesible de la columna de la tabla"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "Usáse pa notificar que la descripción de la columna de la tabla camudó"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "Cabecera accesible de la filera de la tabla"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "Usáse pa notificar que la filera de la cabecera de la tabla camudó"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "Descripción accesible de la filera de la tabla"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "Usáse pa notificar que la filera de la descripción camudó"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "Resume accesible de la tabla"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "Usáse pa notificar que'l resume de la tabla camudó"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "Oxetu de títulu de la tabla accesible"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "Usáse pa notificar que'l títulu de la tabla camudó"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "Númberu d'enllaces d'hipertestu accesibles"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "El númberu d'enllaces que tien l'AtkHypertext actual"
diff --git a/po/az.po b/po/az.po
new file mode 100644 (file)
index 0000000..e627245
--- /dev/null
+++ b/po/az.po
@@ -0,0 +1,535 @@
+# translation of atk.HEAD.az.po to Azerbaijani
+# translation of atk.HEAD.az.po to Azerbaijani Turkish
+# Copyright (C) 2003 Mətin Əmirov
+# This file is distributed under the same license as the atk package.
+# Mətin Əmirov <metin@karegen.com>, 2003, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk.HEAD.az\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2004-08-18 20:10+0300\n"
+"Last-Translator: Mətin Əmirov <metin@karegen.com>\n"
+"Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
+"Language: az\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Seçili Körpü"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink cisminin seçildiyini bildirir"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Lövbər Sayı"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink cismi ilə əlaqələndirilmiş lövbər ədədini bildirir."
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Son indeks"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink cisminin son indeksi"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Başlanğıc indeksi"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink cisminin başlanğıc indeksi"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "hökmsüz"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "sür'ətləndirici etiketi"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "xəbərdarlıq"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "animasiya"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "ox"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "təqvim"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "kanvas"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "işarələmə qutusu"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "işarələmə menyusu üzvü"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "rəng seçicisi"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "sütun başlığı"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "kombo qutusu"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "tarix editoru"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "masa üstü timsalı"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "masa üstü çərçivəsi"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "zəng-et"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "dialoq"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "cərgə lövhəsi"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "rəsm sahəsi"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "fayl seçicisi"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "doldurucu"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "yazı növü seçicisi"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "çərçivə"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "ayna lövhəsi"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html konteyneri"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "timsal"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "şəkil"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "daxili çərçivə"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "etiket"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "laylanmış lövhə"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "siyahı"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "siyahı üzvü"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "menyu"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "menyu çubuğu"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "menyu üzvü"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "seçim lövhəsi"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "səhifə səkməsi"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "səhifə səkməsi siyahısı"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "şifrə mətni"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "popup menyu"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ilərləmə çubuğu"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "basma düyməsi"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "qərar düyməsi"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "qərar menyusu üzvü"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "kök lövhə"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "sətir başlığı"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "sürüşdürmə çubuğu"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "sürüşdürmə lövhəsi"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "ayırıcı"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "sürüşdürücü"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "ayırma lövhəsi"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "dönən düymə"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "vəziyyət-çubuğu"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "cədvəl"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "cədvəl hücrəsi"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "cədvəl sütun başlığı"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "cədvəl sətir başlığı"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "qopardıla bilən menyu üzvü"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "mətn"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "keçiş düyməsi"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "vasitə çubuğu"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "məsləhət"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "ağac"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "budaq cədvəli"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "namə'lum"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "nümayiş-lövhəsi"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "pəncərə"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "başlıq"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "altlıq"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paraqraf"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "xəbərdarlıq"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "tə'minat"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "avtomatik tamamlama"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "düzəlişlər çubuğu"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "daxili tərkib hissəsi"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "xəbərdarlıq"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "tə'minat"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "masa üstü çərçivəsi"
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "başlıq"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "şəkil"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "çərçivə"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Yetişilə Bilən Ad"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Yardımçı texnologiyalara yetişmə üçün şəkilləndilirmiş cismin adı"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Yetişilə Bilən İzahat"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Yardımçı texnologiyalara yetişmə üçün şəkilləndilirmiş cismin izahatı"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Yetişilə Bilən Valideyn"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Valideynin dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Yetişilə Bilən Qiymət"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Qiymətin dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Yetişilə Bilən Rol"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Bu üzvün yetişilə bilən rolu"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Yetişilə Bilən Lay"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Bu üzvün yetişilə bilən layı"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Yetişilə Bilən MDI Qiyməti"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Bu üzvün yetişilə bilən MDI qiyməti"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Yetişilə Bilən Cədvəl Etiketi"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Cədvəl etiketinin dəyişildiyini bildirmək üçün işlədilir. Bunun yerinə "
+"accessible-table-caption-object işlədilməlidir."
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Yetişilə Bilən Cədvəl Sütun Başlığı"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Cədvəl sütun başlığının dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Yetişilə Bilən Cədvəl Sütun İzahatı"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Cədvəl sütun izahatının dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Yetişilə Bilən Cədvəl Sətir Başlığı"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Cədvəl sətir başlığının dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Yetişilə Bilən Cədvəl Sətir İzahatı"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Cədvəl sətir izahatının dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Yetişilə Bilən Cədvəl Mündəricatı"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Cədvəl icmalının dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Yetişilə Bilən Cədvəl Etiket Obyekti"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Cədvəl etiketinin dəyişildiyini bildirmək üçün işlədilir"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Yetişilə Bilən Körpü Sayı"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Hazırkkı AtkHypertext-in malik olduğu körpü ədədi"
index f0991f3..ee7ca4f 100644 (file)
--- a/po/be.po
+++ b/po/be.po
@@ -1,6 +1,14 @@
+# #-#-#-#-#  be.po (ab10e6d45488175674299c2d7fc854f6)  #-#-#-#-#
 # Yuras Shumovich <shumovichy@gmail.com>, 2017.
+# #-#-#-#-#  be.po (ab10e6d45488175674299c2d7fc854f6)  #-#-#-#-#
+# Vital Khilko <vk@altlinux.ru>, 2003, 2005.
+# Alexander Nyakhaychyk <nyakhaychyk@gmail.com>, 2004, 2009.
+# Kasia Bondarava <kasia.bondarava@gmail.com>, 2012.
+# Yuras Shumovich <shumovichy@gmail.com>, 2017.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  be.po (ab10e6d45488175674299c2d7fc854f6)  #-#-#-#-#\n"
 "Project-Id-Version: ab10e6d45488175674299c2d7fc854f6\n"
 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
 "POT-Creation-Date: 2020-12-28 16:53+0000\n"
@@ -11,13 +19,37 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || n%10>=5 && n%10<=9 || n%100>=11 && n%100<=14 ? 2 : 3);\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || n%10>=5 && n%10<=9 || n"
+"%100>=11 && n%100<=14 ? 2 : 3);\n"
 "X-Generator: Poedit 1.8.11\n"
 "X-Crowdin-Project: ab10e6d45488175674299c2d7fc854f6\n"
 "X-Crowdin-Project-ID: 104\n"
 "X-Crowdin-Language: be\n"
-"X-Crowdin-File: /Localizations/Gnome/Gnome development/in/at-spi2-core.master.be.po\n"
+"X-Crowdin-File: /Localizations/Gnome/Gnome development/in/at-spi2-core."
+"master.be.po\n"
 "X-Crowdin-File-ID: 2608\n"
+"#-#-#-#-#  be.po (ab10e6d45488175674299c2d7fc854f6)  #-#-#-#-#\n"
+"Project-Id-Version: ab10e6d45488175674299c2d7fc854f6\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/atk/issues\n"
+"POT-Creation-Date: 2020-06-06 13:32+0000\n"
+"PO-Revision-Date: 2021-06-15 12:25\n"
+"Last-Translator: Yuras Shumovich <shumovichy@gmail.com>\n"
+"Language-Team: Belarusian\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || n%10>=5 && n%10<=9 || n"
+"%100>=11 && n%100<=14 ? 2 : 3);\n"
+"X-Generator: Poedit 1.8.11\n"
+"X-Project-Style: gnome\n"
+"X-Crowdin-Project: ab10e6d45488175674299c2d7fc854f6\n"
+"X-Crowdin-Project-ID: 104\n"
+"X-Crowdin-Language: be\n"
+"X-Crowdin-File: /Localizations/Gnome/Gnome development/in/atk.master.be.po\n"
+"X-Crowdin-File-ID: 2656\n"
 
 #: atspi/atspi-component.c:332 atspi/atspi-misc.c:1077 atspi/atspi-value.c:111
 msgid "The application no longer exists"
@@ -27,6 +59,783 @@ msgstr "Праграма больш не існуе"
 msgid "Attempted synchronous call where prohibited"
 msgstr "Спроба сінхроннага выкліку ў забароненым месцы"
 
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Абраная спасылка"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Вызначае, ці абраны аб'ект AtkHyperlink"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Колькасць якараў"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Колькасць якараў, звязаных з аб'ектам AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Канцавы індэкс"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Канцавы індэкс аб'екта AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Пачатковы індэкс"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Пачатковы індэкс аб'екта AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "хібны"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "адмеціна гарачай клавішы"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "сігнал"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "анімацыя"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "стрэлка"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "каляндар"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "палатно"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "пераключальнік"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "элемент меню з магчымасцю пераключэння"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "абіральнік колеру"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "загаловак слупка"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "выплыўное меню"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "рэдактар датаў"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "значок працоўнага стала"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "рамка працоўнага стала"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "лічбавы радок"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "дыялог"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "панэль каталога"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "вобласць адмалёўкі"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "абіральнік файла"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "запаўняльнік"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "абіральнік шрыфту"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "рамка"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "празрыстая панэль"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "кантэйнер html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "значок"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "выява"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "унутраная рамка"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "цэтлік"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "панэль з пластамі"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "спіс"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "элемент спіса"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "меню"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "радок меню"
+
+#: atk/atkobject.c:133
+msgid "menu item"
+msgstr "элемент меню"
+
+#: atk/atkobject.c:134
+msgid "option pane"
+msgstr "панэль параметраў"
+
+#: atk/atkobject.c:135
+msgid "page tab"
+msgstr "укладка старонкі"
+
+#: atk/atkobject.c:136
+msgid "page tab list"
+msgstr "спіс укладак старонкі"
+
+#: atk/atkobject.c:137
+msgid "panel"
+msgstr "панэль"
+
+#: atk/atkobject.c:138
+msgid "password text"
+msgstr "тэкст пароля"
+
+#: atk/atkobject.c:139
+msgid "popup menu"
+msgstr "выплыўное меню"
+
+#: atk/atkobject.c:140
+msgid "progress bar"
+msgstr "радок прагрэсу"
+
+#: atk/atkobject.c:141
+msgid "push button"
+msgstr "націскальная кнопка"
+
+#: atk/atkobject.c:142
+msgid "radio button"
+msgstr "кнопка выбару"
+
+#: atk/atkobject.c:143
+msgid "radio menu item"
+msgstr "элемент меню з магчымасцю выбару"
+
+#: atk/atkobject.c:144
+msgid "root pane"
+msgstr "каранёвая панэль"
+
+#: atk/atkobject.c:145
+msgid "row header"
+msgstr "загаловак радка"
+
+#: atk/atkobject.c:146
+msgid "scroll bar"
+msgstr "паласа пракруткі"
+
+#: atk/atkobject.c:147
+msgid "scroll pane"
+msgstr "панэль пракруткі"
+
+#: atk/atkobject.c:148
+msgid "separator"
+msgstr "падзяляльнік"
+
+#: atk/atkobject.c:149
+msgid "slider"
+msgstr "паўзунок"
+
+#: atk/atkobject.c:150
+msgid "split pane"
+msgstr "панэль падзелу"
+
+#: atk/atkobject.c:151
+msgid "spin button"
+msgstr "кнопка кручэння"
+
+#: atk/atkobject.c:152
+msgid "statusbar"
+msgstr "радок статусу"
+
+#: atk/atkobject.c:153
+msgid "table"
+msgstr "табліца"
+
+#: atk/atkobject.c:154
+msgid "table cell"
+msgstr "ячэйка табліцы"
+
+#: atk/atkobject.c:155
+msgid "table column header"
+msgstr "загаловак слупка табліцы"
+
+#: atk/atkobject.c:156
+msgid "table row header"
+msgstr "загаловак радка табліцы"
+
+#: atk/atkobject.c:157
+msgid "tear off menu item"
+msgstr "неадрыўны элемент меню"
+
+#: atk/atkobject.c:158
+msgid "terminal"
+msgstr "тэрмінал"
+
+#: atk/atkobject.c:159
+msgid "text"
+msgstr "тэкст"
+
+#: atk/atkobject.c:160
+msgid "toggle button"
+msgstr "кнопка-пераключальнік"
+
+#: atk/atkobject.c:161
+msgid "tool bar"
+msgstr "панэль інструментаў"
+
+#: atk/atkobject.c:162
+msgid "tool tip"
+msgstr "падказка"
+
+#: atk/atkobject.c:163
+msgid "tree"
+msgstr "дрэва"
+
+#: atk/atkobject.c:164
+msgid "tree table"
+msgstr "табліца ў выглядзе дрэва"
+
+#: atk/atkobject.c:165
+msgid "unknown"
+msgstr "невядома"
+
+#: atk/atkobject.c:166
+msgid "viewport"
+msgstr "вобласць прагляду"
+
+#: atk/atkobject.c:167
+msgid "window"
+msgstr "акно"
+
+#: atk/atkobject.c:168
+msgid "header"
+msgstr "загаловак"
+
+#: atk/atkobject.c:169
+msgid "footer"
+msgstr "ніжні калантытул"
+
+#: atk/atkobject.c:170
+msgid "paragraph"
+msgstr "абзац"
+
+#: atk/atkobject.c:171
+msgid "ruler"
+msgstr "лінейка"
+
+#: atk/atkobject.c:172
+msgid "application"
+msgstr "праграма"
+
+#: atk/atkobject.c:173
+msgid "autocomplete"
+msgstr "аўтадапаўненне"
+
+#: atk/atkobject.c:174
+msgid "edit bar"
+msgstr "панэль рэдагавання"
+
+#: atk/atkobject.c:175
+msgid "embedded component"
+msgstr "убудаваны кампанент"
+
+#: atk/atkobject.c:176
+msgid "entry"
+msgstr "запіс"
+
+#: atk/atkobject.c:177
+msgid "chart"
+msgstr "дыяграма"
+
+#: atk/atkobject.c:178
+msgid "caption"
+msgstr "подпіс"
+
+#: atk/atkobject.c:179
+msgid "document frame"
+msgstr "рамка дакумента"
+
+#: atk/atkobject.c:180
+msgid "heading"
+msgstr "загаловак"
+
+#: atk/atkobject.c:181
+msgid "page"
+msgstr "старонка"
+
+#: atk/atkobject.c:182
+msgid "section"
+msgstr "секцыя"
+
+#: atk/atkobject.c:183
+msgid "redundant object"
+msgstr "лішні аб'ект"
+
+#: atk/atkobject.c:184
+msgid "form"
+msgstr "форма"
+
+#: atk/atkobject.c:185
+msgid "link"
+msgstr "спасылка"
+
+#: atk/atkobject.c:186
+msgid "input method window"
+msgstr "акно метаду ўводу"
+
+#: atk/atkobject.c:187
+msgid "table row"
+msgstr "радок табліцы"
+
+#: atk/atkobject.c:188
+msgid "tree item"
+msgstr "элемент дрэва"
+
+#: atk/atkobject.c:189
+msgid "document spreadsheet"
+msgstr "аркуш электроннай табліцы"
+
+#: atk/atkobject.c:190
+msgid "document presentation"
+msgstr "прэзентацыя"
+
+#: atk/atkobject.c:191
+msgid "document text"
+msgstr "тэкставы дакумент"
+
+#: atk/atkobject.c:192
+msgid "document web"
+msgstr "сеціўны дакумент"
+
+#: atk/atkobject.c:193
+msgid "document email"
+msgstr "электронны ліст"
+
+#: atk/atkobject.c:194
+msgid "comment"
+msgstr "каментар"
+
+#: atk/atkobject.c:195
+msgid "list box"
+msgstr "спіс"
+
+#: atk/atkobject.c:196
+msgid "grouping"
+msgstr "групаванне"
+
+#: atk/atkobject.c:197
+msgid "image map"
+msgstr "мапа выявы"
+
+#: atk/atkobject.c:198
+msgid "notification"
+msgstr "апавяшчэнне"
+
+#: atk/atkobject.c:199
+msgid "info bar"
+msgstr "інфармацыйная панэль"
+
+#: atk/atkobject.c:200
+msgid "level bar"
+msgstr "панэль ўзроўняў"
+
+#: atk/atkobject.c:201
+msgid "title bar"
+msgstr "панэль загалоўка"
+
+#: atk/atkobject.c:202
+msgid "block quote"
+msgstr "блок цытавання"
+
+#: atk/atkobject.c:203
+msgid "audio"
+msgstr "аўдыё"
+
+#: atk/atkobject.c:204
+msgid "video"
+msgstr "відэа"
+
+#: atk/atkobject.c:205
+msgid "definition"
+msgstr "азначэнне"
+
+#: atk/atkobject.c:206
+msgid "article"
+msgstr "артыкул"
+
+#: atk/atkobject.c:207
+msgid "landmark"
+msgstr "арыентыр"
+
+#: atk/atkobject.c:208
+msgid "log"
+msgstr "журнал"
+
+#: atk/atkobject.c:209
+msgid "marquee"
+msgstr "бягучы радок"
+
+#: atk/atkobject.c:210
+msgid "math"
+msgstr "матэматычны выраз"
+
+#: atk/atkobject.c:211
+msgid "rating"
+msgstr "ацэнка"
+
+#: atk/atkobject.c:212
+msgid "timer"
+msgstr "таймер"
+
+#: atk/atkobject.c:213
+msgid "description list"
+msgstr "спіс апісанняў"
+
+#: atk/atkobject.c:214
+msgid "description term"
+msgstr "тэрмін апісання"
+
+#: atk/atkobject.c:215
+msgid "description value"
+msgstr "значэнне апісання"
+
+#: atk/atkobject.c:391
+msgid "Accessible Name"
+msgstr "Назва аб’екта адмысловых магчымасцяў"
+
+#: atk/atkobject.c:392
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Назва асобніка аб'екта для доступу пры дапамозе тэхналогій адмысловых "
+"магчымасцяў"
+
+#: atk/atkobject.c:398
+msgid "Accessible Description"
+msgstr "Апісанне аб’екта адмысловых магчымасцяў"
+
+#: atk/atkobject.c:399
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Апісанне аб'екта для доступу пры дапамозе тэхналогій адмысловых магчымасцяў"
+
+#: atk/atkobject.c:405
+msgid "Accessible Parent"
+msgstr "Бацькоўскі аб'ект адмысловых магчымасцяў"
+
+#: atk/atkobject.c:406
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Продак бягучага даступнага аб'екта, які вярнуў atk_object_get_parent()"
+
+#: atk/atkobject.c:422
+msgid "Accessible Value"
+msgstr "Значэнне аб’екта адмысловых магчымасцяў"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the value has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены значэння"
+
+#: atk/atkobject.c:431
+msgid "Accessible Role"
+msgstr "Роля аб’екта адмысловых магчымасцяў"
+
+#: atk/atkobject.c:432
+msgid "The accessible role of this object"
+msgstr "Роля гэтага аб'екта ў адмысловых магчымасцях"
+
+#: atk/atkobject.c:439
+msgid "Accessible Layer"
+msgstr "Узровень аб’екта адмысловых магчымасцяў"
+
+#: atk/atkobject.c:440
+msgid "The accessible layer of this object"
+msgstr "Узровень гэтага аб'екта ў адмысловых магчымасцях"
+
+#: atk/atkobject.c:448
+msgid "Accessible MDI Value"
+msgstr "Значэнне MDI у адмысловых магчымасцях"
+
+#: atk/atkobject.c:449
+msgid "The accessible MDI value of this object"
+msgstr "Значэнне MDI гэтага аб'екта ў адмысловых магчымасцях"
+
+#: atk/atkobject.c:465
+msgid "Accessible Table Caption"
+msgstr "Подпіс табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:466
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Выкарыстоўваецца, каб паведамляць пра змены подпісу табліцы; замест гэтай "
+"уласцівасці мусіць ужывацца accessible-table-caption-object"
+
+#: atk/atkobject.c:480
+msgid "Accessible Table Column Header"
+msgstr "Загаловак слупка табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:481
+msgid "Is used to notify that the table column header has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены загалоўка слупка табліцы"
+
+#: atk/atkobject.c:496
+msgid "Accessible Table Column Description"
+msgstr "Апісанне слупка табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:497
+msgid "Is used to notify that the table column description has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены апісання слупка табліцы"
+
+#: atk/atkobject.c:512
+msgid "Accessible Table Row Header"
+msgstr "Загаловак радка табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:513
+msgid "Is used to notify that the table row header has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены загалоўка радка табліцы"
+
+#: atk/atkobject.c:527
+msgid "Accessible Table Row Description"
+msgstr "Апісанне радка табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:528
+msgid "Is used to notify that the table row description has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены апісання радка табліцы"
+
+#: atk/atkobject.c:534
+msgid "Accessible Table Summary"
+msgstr "Зводка табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:535
+msgid "Is used to notify that the table summary has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены зводкі табліцы"
+
+#: atk/atkobject.c:541
+msgid "Accessible Table Caption Object"
+msgstr "Аб'ект загалоўка табліцы адмысловых магчымасцяў"
+
+#: atk/atkobject.c:542
+msgid "Is used to notify that the table caption has changed"
+msgstr "Выкарыстоўваецца, каб паведамляць пра змены загалоўка табліцы"
+
+#: atk/atkobject.c:548
+msgid "Number of Accessible Hypertext Links"
+msgstr "Колькасць гіпертэкставых спасылак адмысловых магчымасцяў"
+
+#: atk/atkobject.c:549
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Колькасць спасылак, якія мае бягучы аб’ект AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "вельмі слабы"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "слабы"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "прымальны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "моцны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "вельмі моцны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "вельмі нізкі"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "сярэдні"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "высокі"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "вельмі высокі"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "вельмі дрэнны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "дрэнны"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "добры"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "вельмі добры"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "найлепшы"
+
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Невядомы подпіс %s для RemoveAccessible"
 
@@ -79,3 +888,5 @@ msgstr "Спроба сінхроннага выкліку ў забаронен
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Атрыманы хібны подпіс %s для сігналу %s інтэрфейсу %s\n"
 
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Выкарыстоўваецца, каб паведамляць пра змены бацькоўскага аб'екта"
diff --git a/po/be@latin.po b/po/be@latin.po
new file mode 100644 (file)
index 0000000..8c62816
--- /dev/null
@@ -0,0 +1,813 @@
+# Biełaruski pierakład atk.HEAD.
+# Copyright (C) 2007 THE atk.HEAD'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk.HEAD package.
+# Alaksandar Navicki <zolak@lacinka.org>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk.HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-01-25 15:54+0000\n"
+"PO-Revision-Date: 2023-03-27 22:23+0200\n"
+"Last-Translator: Alaksandar Navicki <zolak@lacinka.org>\n"
+"Language-Team: i18n@mova.org <i18n@mova.org>\n"
+"Language: be@latin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Abranaja spasyłka"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Akreślivaje, ci zaznačany abjekt AtkHyperlink"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Kolkaść katvihaŭ"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Kolkaść katvihaŭ, źviazanych z abjektam AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Kancavy indeks"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Kancavy indeks abjektu AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Pačatkovy indeks"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Pačatkovy indeks abjektu AtkHyperlink"
+
+#: atk/atkobject.c:100
+msgid "invalid"
+msgstr "niapravilny"
+
+#: atk/atkobject.c:101
+msgid "accelerator label"
+msgstr "etykieta z klavišaj skarotu"
+
+#: atk/atkobject.c:102
+msgid "alert"
+msgstr "tryvoha"
+
+#: atk/atkobject.c:103
+msgid "animation"
+msgstr "animacyja"
+
+#: atk/atkobject.c:104
+msgid "arrow"
+msgstr "strełka"
+
+#: atk/atkobject.c:105
+msgid "calendar"
+msgstr "kalandar"
+
+#: atk/atkobject.c:106
+msgid "canvas"
+msgstr "pałatno"
+
+#: atk/atkobject.c:107
+msgid "check box"
+msgstr "pole vybaru"
+
+#: atk/atkobject.c:108
+msgid "check menu item"
+msgstr "element menu vybaru"
+
+#: atk/atkobject.c:109
+msgid "color chooser"
+msgstr "vybar koleraŭ"
+
+#: atk/atkobject.c:110
+msgid "column header"
+msgstr "šapka kalony"
+
+#: atk/atkobject.c:111
+msgid "combo box"
+msgstr "uvachod z opcyjami"
+
+#: atk/atkobject.c:112
+msgid "dateeditor"
+msgstr "redaktar dataŭ"
+
+#: atk/atkobject.c:113
+msgid "desktop icon"
+msgstr "ikona pultu"
+
+#: atk/atkobject.c:114
+msgid "desktop frame"
+msgstr "ramka pultu"
+
+#: atk/atkobject.c:115
+msgid "dial"
+msgstr "ličbavaje tabło"
+
+#: atk/atkobject.c:116
+msgid "dialog"
+msgstr "vakno dyjalohu"
+
+#: atk/atkobject.c:117
+msgid "directory pane"
+msgstr "abšar katalahu"
+
+#: atk/atkobject.c:118
+msgid "drawing area"
+msgstr "abšar rysavańnia"
+
+#: atk/atkobject.c:119
+msgid "file chooser"
+msgstr "akno vybaru fajłu"
+
+#: atk/atkobject.c:120
+msgid "filler"
+msgstr "zapaŭnialnik"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:122
+msgid "fontchooser"
+msgstr "akno vybaru šryftu"
+
+#: atk/atkobject.c:123
+msgid "frame"
+msgstr "ramka"
+
+#: atk/atkobject.c:124
+msgid "glass pane"
+msgstr "šklany abšar"
+
+#: atk/atkobject.c:125
+msgid "html container"
+msgstr "kantejner html"
+
+#: atk/atkobject.c:126
+msgid "icon"
+msgstr "ikona"
+
+#: atk/atkobject.c:127
+msgid "image"
+msgstr "vyjava"
+
+#: atk/atkobject.c:128
+msgid "internal frame"
+msgstr "unutranaja ramka"
+
+#: atk/atkobject.c:129
+msgid "label"
+msgstr "etykieta"
+
+#: atk/atkobject.c:130
+msgid "layered pane"
+msgstr "abšar słajoŭ"
+
+#: atk/atkobject.c:131
+msgid "list"
+msgstr "śpis"
+
+#: atk/atkobject.c:132
+msgid "list item"
+msgstr "element śpisu"
+
+#: atk/atkobject.c:133
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:134
+msgid "menu bar"
+msgstr "pałasa menu"
+
+#: atk/atkobject.c:135
+#, fuzzy
+#| msgid "push button"
+msgid "menu button"
+msgstr "knopka"
+
+#: atk/atkobject.c:136
+msgid "menu item"
+msgstr "element menu"
+
+#: atk/atkobject.c:137
+msgid "option pane"
+msgstr "abšar opcyjaŭ"
+
+#: atk/atkobject.c:138
+msgid "page tab"
+msgstr "zakładka staronki"
+
+#: atk/atkobject.c:139
+msgid "page tab list"
+msgstr "śpis zakładak staronak"
+
+#: atk/atkobject.c:140
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:141
+msgid "password text"
+msgstr "tekst parolu"
+
+#: atk/atkobject.c:142
+msgid "popup menu"
+msgstr "padručnaje menu"
+
+#: atk/atkobject.c:143
+msgid "progress bar"
+msgstr "pałasa prahresu"
+
+#: atk/atkobject.c:144
+msgid "push button"
+msgstr "knopka"
+
+#: atk/atkobject.c:145
+msgid "radio button"
+msgstr "adnarazovy vybar"
+
+#: atk/atkobject.c:146
+msgid "radio menu item"
+msgstr "element menu adnarazovaha vybaru"
+
+#: atk/atkobject.c:147
+msgid "root pane"
+msgstr "hałoŭny abšar"
+
+#: atk/atkobject.c:148
+msgid "row header"
+msgstr "šapka radka"
+
+#: atk/atkobject.c:149
+msgid "scroll bar"
+msgstr "pałasa prakrutki"
+
+#: atk/atkobject.c:150
+msgid "scroll pane"
+msgstr "abšar prakrutki"
+
+#: atk/atkobject.c:151
+msgid "separator"
+msgstr "separatar"
+
+#: atk/atkobject.c:152
+msgid "slider"
+msgstr "paŭzunok"
+
+#: atk/atkobject.c:153
+msgid "split pane"
+msgstr "abšar padziełu"
+
+#: atk/atkobject.c:154
+msgid "spin button"
+msgstr "ličbavy ŭvachod"
+
+#: atk/atkobject.c:155
+msgid "statusbar"
+msgstr "pałasa stanu"
+
+#: atk/atkobject.c:156
+msgid "table"
+msgstr "tablica"
+
+#: atk/atkobject.c:157
+msgid "table cell"
+msgstr "kamora tablicy"
+
+#: atk/atkobject.c:158
+msgid "table column header"
+msgstr "šapka kalonki tablicy"
+
+#: atk/atkobject.c:159
+msgid "table row header"
+msgstr "šapka radka tablicy"
+
+#: atk/atkobject.c:160
+msgid "tear off menu item"
+msgstr "punkt začapleńnia menu"
+
+#: atk/atkobject.c:161
+msgid "terminal"
+msgstr "terminał"
+
+#: atk/atkobject.c:162
+msgid "text"
+msgstr "nadpis"
+
+#: atk/atkobject.c:163
+msgid "toggle button"
+msgstr "pieraklučalnik"
+
+#: atk/atkobject.c:164
+msgid "tool bar"
+msgstr "pałasa pryładździa"
+
+#: atk/atkobject.c:165
+msgid "tool tip"
+msgstr "padkazka"
+
+#: atk/atkobject.c:166
+msgid "tree"
+msgstr "dreva"
+
+#: atk/atkobject.c:167
+msgid "tree table"
+msgstr "tablica-dreva"
+
+#: atk/atkobject.c:168
+msgid "unknown"
+msgstr "nieviadomy"
+
+#: atk/atkobject.c:169
+msgid "viewport"
+msgstr "abšar pakazu"
+
+#: atk/atkobject.c:170
+msgid "window"
+msgstr "akno"
+
+#: atk/atkobject.c:171
+msgid "header"
+msgstr "šapka"
+
+#: atk/atkobject.c:172
+msgid "footer"
+msgstr "padvał"
+
+#: atk/atkobject.c:173
+msgid "paragraph"
+msgstr "parahraf"
+
+#: atk/atkobject.c:174
+msgid "ruler"
+msgstr "liniejka"
+
+#: atk/atkobject.c:175
+msgid "application"
+msgstr "aplikacyja"
+
+#: atk/atkobject.c:176
+msgid "autocomplete"
+msgstr "aŭtazapaŭnieńnie"
+
+#: atk/atkobject.c:177
+msgid "edit bar"
+msgstr "pałasa redahavańnia"
+
+#: atk/atkobject.c:178
+msgid "embedded component"
+msgstr "ubudavany kampanent"
+
+#: atk/atkobject.c:179
+msgid "entry"
+msgstr "element"
+
+#: atk/atkobject.c:180
+msgid "chart"
+msgstr "schiema"
+
+#: atk/atkobject.c:181
+msgid "caption"
+msgstr "podpis"
+
+#: atk/atkobject.c:182
+msgid "document frame"
+msgstr "ramka dakumentu"
+
+#: atk/atkobject.c:183
+msgid "heading"
+msgstr "šapka"
+
+#: atk/atkobject.c:184
+msgid "page"
+msgstr "staronka"
+
+#: atk/atkobject.c:185
+msgid "section"
+msgstr "sekcyja"
+
+#: atk/atkobject.c:186
+msgid "redundant object"
+msgstr "zališni abjekt"
+
+#: atk/atkobject.c:187
+msgid "form"
+msgstr "forma"
+
+#: atk/atkobject.c:188
+msgid "link"
+msgstr "spasyłka"
+
+#: atk/atkobject.c:189
+msgid "input method window"
+msgstr "akno metadu ŭvodu"
+
+#: atk/atkobject.c:190
+msgid "table row"
+msgstr "radok tablicy"
+
+#: atk/atkobject.c:191
+msgid "tree item"
+msgstr "elemient dreva"
+
+#: atk/atkobject.c:192
+msgid "document spreadsheet"
+msgstr "arkuš elektronnaj tablicy"
+
+#: atk/atkobject.c:193
+msgid "document presentation"
+msgstr "prezientacyja"
+
+#: atk/atkobject.c:194
+msgid "document text"
+msgstr "tekstavy dakumient"
+
+#: atk/atkobject.c:195
+msgid "document web"
+msgstr "sieciŭny dakumient"
+
+#: atk/atkobject.c:196
+msgid "document email"
+msgstr "elektronny list"
+
+#: atk/atkobject.c:197
+msgid "comment"
+msgstr "kamientar"
+
+#: atk/atkobject.c:198
+msgid "list box"
+msgstr "spis"
+
+#: atk/atkobject.c:199
+msgid "grouping"
+msgstr "hrupavannie"
+
+#: atk/atkobject.c:200
+msgid "image map"
+msgstr "mapa vyjavy"
+
+#: atk/atkobject.c:201
+msgid "notification"
+msgstr "apaviaščennie"
+
+#: atk/atkobject.c:202
+msgid "info bar"
+msgstr "infarmacyjnaja panel"
+
+#: atk/atkobject.c:203
+msgid "level bar"
+msgstr "panel ŭzroŭniaŭ"
+
+#: atk/atkobject.c:204
+msgid "title bar"
+msgstr "panel zahałoŭka"
+
+#: atk/atkobject.c:205
+msgid "block quote"
+msgstr "błok cytavannia"
+
+#: atk/atkobject.c:206
+msgid "audio"
+msgstr "aŭdyjo"
+
+#: atk/atkobject.c:207
+msgid "video"
+msgstr "videa"
+
+#: atk/atkobject.c:208
+msgid "definition"
+msgstr "aznačennie"
+
+#: atk/atkobject.c:209
+msgid "article"
+msgstr "artykuł"
+
+#: atk/atkobject.c:210
+msgid "landmark"
+msgstr "aryjentyr"
+
+#: atk/atkobject.c:211
+msgid "log"
+msgstr "žurnał"
+
+#: atk/atkobject.c:212
+msgid "marquee"
+msgstr "biahučy radok"
+
+#: atk/atkobject.c:213
+msgid "math"
+msgstr "matematyčny vyraz"
+
+#: atk/atkobject.c:214
+msgid "rating"
+msgstr "tajmier"
+
+#: atk/atkobject.c:215
+msgid "timer"
+msgstr "tajmier"
+
+#: atk/atkobject.c:216
+msgid "description list"
+msgstr "spis apisanniaŭ"
+
+#: atk/atkobject.c:217
+msgid "description term"
+msgstr "termin apisannia"
+
+#: atk/atkobject.c:218
+msgid "description value"
+msgstr "značennie apisannia"
+
+#: atk/atkobject.c:390
+msgid "Accessible Name"
+msgstr "Nazva abjektu dastupnaści"
+
+#: atk/atkobject.c:391
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Nazva ekzemplaru abjektu, farmatavanaja dla technalohii dastupnaści"
+
+#: atk/atkobject.c:397
+msgid "Accessible Description"
+msgstr "Dastupnaje apisańnie"
+
+#: atk/atkobject.c:398
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Apisańnie abjektu, farmatavanaje dla technalohii dastupnaści"
+
+#: atk/atkobject.c:404
+msgid "Accessible Parent"
+msgstr "Abjekt dastupnaści vyšejšaha ŭzroŭniu"
+
+#: atk/atkobject.c:405
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Prodak biahučaha dastupnaha abjekta, jaki viarnuŭ atk_object_get_parent()"
+
+#: atk/atkobject.c:421
+msgid "Accessible Value"
+msgstr "Značeńnie dastupnaści"
+
+#: atk/atkobject.c:422
+msgid "Is used to notify that the value has changed"
+msgstr "Vykarystoŭvajecca, kab paviedamlać pra źmienu vartaści abjektu"
+
+#: atk/atkobject.c:430
+msgid "Accessible Role"
+msgstr "Rola dastupnaści"
+
+#: atk/atkobject.c:431
+msgid "The accessible role of this object"
+msgstr "Rola dastupnaści hetaha abjektu"
+
+#: atk/atkobject.c:438
+msgid "Accessible Layer"
+msgstr "Uzrovień dastupnaści"
+
+#: atk/atkobject.c:439
+msgid "The accessible layer of this object"
+msgstr "Uzrovień dastupnaści hetaha abjektu"
+
+#: atk/atkobject.c:447
+msgid "Accessible MDI Value"
+msgstr "Značeńnie dastupnaści MDI"
+
+#: atk/atkobject.c:448
+msgid "The accessible MDI value of this object"
+msgstr "Značeńnie dastupnaści MDI hetaha abjektu"
+
+#: atk/atkobject.c:464
+msgid "Accessible Table Caption"
+msgstr "Šapka tablicy dastupnaści"
+
+#: atk/atkobject.c:465
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Vykarystoŭvajecca, kab paviedamlać pra źmienu zahałoŭka tablicy; zamiest "
+"hetaj ułaścivaści treba ŭžyvać abjekt zahałoŭka tablicy dastupnaści"
+
+#: atk/atkobject.c:479
+msgid "Accessible Table Column Header"
+msgstr "Zahałovak kalony tablicy dastupnaści"
+
+#: atk/atkobject.c:480
+msgid "Is used to notify that the table column header has changed"
+msgstr "Vykarystoŭvajecca, kab paviedamlać pra źmienu zahałoŭka kalony tablicy"
+
+#: atk/atkobject.c:495
+msgid "Accessible Table Column Description"
+msgstr "Apisańnie kalony tablicy dastupnaści"
+
+#: atk/atkobject.c:496
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Vykarystoŭvajecca, kab paviedamlać pra źmienu apisańnia zahałoŭka ŭ kalonie "
+"tablicy"
+
+#: atk/atkobject.c:511
+msgid "Accessible Table Row Header"
+msgstr "Zahałovak radka tablicy dastupnaści"
+
+#: atk/atkobject.c:512
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Vykarystoŭvajecca, kab paviedamlać pra źmienu ŭ zahałoŭku radka tablicy"
+
+#: atk/atkobject.c:526
+msgid "Accessible Table Row Description"
+msgstr "Apisańnie radka tablicy dastupnaści"
+
+#: atk/atkobject.c:527
+msgid "Is used to notify that the table row description has changed"
+msgstr "Vykarystoŭvajecca, kab paviedamlać pra źmienu apisańnia radka tablicy"
+
+#: atk/atkobject.c:533
+msgid "Accessible Table Summary"
+msgstr "Źmiest tablicy dastupnaści"
+
+#: atk/atkobject.c:534
+msgid "Is used to notify that the table summary has changed"
+msgstr "Vykarystoŭvajecca, kab paviedamić pra źmienu źmiestu tablicy"
+
+#: atk/atkobject.c:540
+msgid "Accessible Table Caption Object"
+msgstr "Abjekt zahałoŭka tablicy dastupnaści"
+
+#: atk/atkobject.c:541
+msgid "Is used to notify that the table caption has changed"
+msgstr "Vykarystoŭvajecca, kab paviedamić pra źmienu zahałoŭka tablicy"
+
+#: atk/atkobject.c:547
+msgid "Number of Accessible Hypertext Links"
+msgstr "Kolkaść hipertekstavych spasyłak dastupnaści"
+
+#: atk/atkobject.c:548
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Kolkaść spasyłak, jakija maje dziejny abjekt AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "vielmi słaby"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "słaby"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "prymalny"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "mocny"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "vielmi mocny"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "vielmi nizki"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "siaredni"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "vysoki"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "vielmi vysoki"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "vielmi drenny"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "drenny"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "dobry"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "vielmi dobry"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "najlepšy"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1077 atspi/atspi-value.c:123
+msgid "The application no longer exists"
+msgstr "Prahrama bolš nie isnuje"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr ""
+#~ "Vykarystoŭvajecca, kab paviedamlać pra źmieny abjektu dastupnaści "
+#~ "vyšejšaha ŭzroŭniu"
index 44cc7f1..9d7ce69 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -1,15 +1,27 @@
 # Bulgarian translation of at-spi2-core po-file.
-# Copyright (C) 2011, 2015 Free Software Foundation
+# Copyright (C) 2002, 2004, 2005, 2006, 2009, 2011, 2015 Free Software Foundation
+# Copyright (C) 2015 Zahari Yurukov <zahari.yurukov@gmail.com>.
+# Copyright (C) 2022 Alexander Shopov <ash@kambanaria.org>
 # This file is distributed under the same license as the at-spi2-core package.
-# Alexander Shopov <ash@kambanaria.org>, 2011, 2015.
+# Yanko Kaneti <yaneti@declera.com>, 2002.
+# Alexander Shopov <ash@kambanaria.org>, 2004, 2005, 2006, 2009, 2011, 2015.
+# Zahari Yurukov <zahari.yurukov@gmail.com>, 2015.
+# Към всички преводачи - това са специални термини,
+# които трябва да са достъпни за потребители с
+# увреждания - например слепота. Преводът е ОПИСАТЕЛЕН,
+# за да може да се предаде на потребителя какво всъщност
+# има на екрана. Преводът не е идеален. Някои от
+# термините са силно обвързани с терминологията на Java.
+# За повече информация:
+# http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html 
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-09 19:17+0200\n"
-"PO-Revision-Date: 2015-03-09 19:17+0200\n"
-"Last-Translator:  Alexander Shopov <ash@kambanaria.org>\n"
+"Project-Id-Version: at-spi2-core main\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-09-11 19:01+0000\n"
+"PO-Revision-Date: 2022-09-12 18:00+0200\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
 "Language: bg\n"
 "MIME-Version: 1.0\n"
@@ -17,11 +29,792 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1037
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Избрана връзка"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Определя дали обектът AtkHyperlink е избран"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Брой котви"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Броят на котвите свързани с обект AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Краен индекс"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Крайният индекс на обект AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Начален индекс"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Началният индекс на обект AtkHyperlink"
+
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "невалиден"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr "етикет на ускорител"
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "внимание"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "анимация"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "стрелка"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "календар"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr "канава"
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr "поле за отметка"
+
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr "избираем елемент от меню"
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "избор на цвят"
+
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr "заглавие на колона"
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr "падащ списък"
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr "редактор на дата"
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "икона на работния плот"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr "рамка на работния плот"
+
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr "скала"
+
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "диалогов прозорец"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr "съдържание на папка"
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr "област за рисуване"
+
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr "избор на файл"
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr "пълнител"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr "избор на шрифт"
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "рамка"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr "най-предно поле"
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr "контейнер с html"
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "икона"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "изображение"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr "вътрешна рамка"
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "етикет"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr "рамка със слоеве обекти"
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "списък"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr "елемент от списък"
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "меню"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr "лента с менюта"
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "бутон в меню"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "елемент от меню"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr "панел с опции"
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr "етикет на подпрозорец"
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr "списък със подпрозорци"
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "панел"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr "текстово поле за парола"
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr "изскачащо меню"
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr "лента на напредъка"
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr "бутон"
+
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr "радио бутон"
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr "избираем елемент от меню"
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr "основна рамка"
+
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr "заглавие на ред"
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "лента за придвижване"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr "рамка, която се прелиства"
+
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "разделител"
+
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr "плъзгач"
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr "разделителна рамка"
+
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr "въртелив бутон"
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "лента за състояние"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "таблица"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "клетка от таблица"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr "заглавие на колона в таблица"
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr "заглавие на ред в таблица"
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr "отделим елемент от меню"
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "терминал"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "текст"
+
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr "превключващ бутон"
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "лента с инструменти"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr "подсказка"
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "дърво"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr "дървовидна таблица"
+
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "неизвестно"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr "видима част"
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "прозорец"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "горен колонтитул"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr "долен колонтитул"
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "абзац"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr "линийка"
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "приложение"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr "автоматично довършване"
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr "лента за редакция"
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr "вграден компонент"
+
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "поле за писане"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr "графика"
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr "надпис"
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr "рамка на документ"
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr "заглавие"
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "страница"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "раздел"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr "излишен обект"
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "формуляр"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "връзка"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr "избор на начина за въвеждане на текст"
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "ред в таблица"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "елемент от дърво"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "електронна таблица"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "презентация"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "текст"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr "уеб страница"
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr "е-писмо"
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "коментар"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr "списък"
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr "групиране"
+
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr "зонирано изображение"
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr "известяване"
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr "лента с информация"
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr "нивомер"
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr "заглавна лента"
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr "цитат в каре"
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr "аудио"
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr "видео"
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr "определение"
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr "статия"
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr "ориентир"
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr "журнал"
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr "движещ се текст"
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr "математика"
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr "оценка"
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr "хронометър"
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr "списък на описанията"
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr "термин"
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr "описание"
+
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr "Достъпно име"
+
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Име на обект от някакъв клас, форматирано за технологии за достъпност"
+
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr "Достъпно описание"
+
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Описание на обект, форматирано за технологии за достъпност"
+
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr "Достъпен родител"
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Родителят на текущия елемент, както е върнат от atk_object_get_parent()"
+
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr "Достъпна стойност"
+
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr "Използва се, за да се уведоми за промяна на стойността"
+
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr "Достъпен вид"
+
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr "Достъпният вид на този обект"
+
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr "Достъпен слой"
+
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr "Достъпният слой на този обект"
+
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr "Достъпна стойност на приложение с множество прозорци в един контейнер"
+
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr ""
+"Достъпна стойност на обект на приложение с множество прозорци в един "
+"контейнер"
+
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr "Достъпно заглавие на таблица"
+
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Използва се, за да се уведоми за промяна на заглавие на таблица. Това "
+"свойство не трябва да се използва. Вместо него се използва accessible-table-"
+"caption-object"
+
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr "Достъпно заглавие на колона на таблица"
+
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Използва се, за да се уведоми за промяна на заглавие на колона на таблица."
+
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr "Достъпно описание на колона в таблица"
+
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Използва се, за да се уведоми за промяна на описание на колона на таблица."
+
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr "Достъпно заглавие на ред на таблица"
+
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Използва се, за да се уведоми за промяна на заглавие на ред на таблица."
+
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr "Достъпно описание на ред в таблица"
+
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Използва се, за да се уведоми за промяна на описание на ред на таблица."
+
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr "Достъпно резюме на таблица"
+
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr "Използва се, за да се уведоми за промяна на резюме на таблица"
+
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr "Достъпен обект за заглавие на таблица"
+
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr "Използва се, за да се уведоми за промяна на заглавие на таблица"
+
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr "Брой достъпни връзки в хипертекст"
+
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Брой връзки в текущия обект AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "много слаба"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "слаба"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "приемлива"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "силна"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "много силна"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "много ниска"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "средна"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "висока"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "много висока"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "много лоша"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "лоша"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "добра"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "много добра"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "отлична"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Програмата вече не съществува"
-
-#: ../atspi/atspi-misc.c:1795
-msgid "Attempted synchronous call where prohibited"
-msgstr "Заявеното асинхронно действие е забранено"
diff --git a/po/bn.po b/po/bn.po
new file mode 100644 (file)
index 0000000..fe08a86
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,538 @@
+# The Bengali translation for ATK
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the ATK package.
+# Sayamindu Dasgupta <unmadindu@Softhome.net>, 2003.
+# Mahay Alam Khan <makl10n@yahoo.com>, 2005.
+# Samia Niamatullah <mailsamia2001@yahoo.com>, 2005.
+# Khandakar Mujahidul Islam <suzan@bengalinux.org>, 2006.
+# Loba Yeasmeen <loba@ankur.org.bd>, 2010.
+# Sadia Afroz <sadia@ankur.org.bd>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: bn\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2010-03-07 17:15+0600\n"
+"Last-Translator: Sadia Afroz <sadia@ankur.org.bd>\n"
+"Language-Team: Bengali <ankur-bd-l10n@googlegroups.com>\n"
+"Language: bn\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "নির্বাচিত লিংক"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink অবজেক্ট নির্বাচিত কিনা তা উল্লেখ করে"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "নোঙ্গরের সংখ্যা"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টের সাথে সংশ্লিষ্ট নোঙ্গরের সংখ্যা"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "শেষ ইনডেক্স"
+
+# sam: index  !=  সূচী so changing all index to ইনডেক্স
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টের শেষ ইনডেক্স"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "প্রারম্ভিক ইনডেক্স"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টের প্রারম্ভিক ইনডেক্স"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "অকার্যকর"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "গতিবর্ধক লেবেল"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "সতর্কবার্তা"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "অ্যানিমেশন "
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "তীর"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "ক্যালেন্ডার"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "চিত্রপট"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "চেক বাক্স"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "মেনু আইটেম পরীক্ষা করুন"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "রং বাছাইকারক"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "কলাম শীর্ষচরণ"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "কম্বো বাক্স"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "তারিখ সম্পাদক"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ডেস্কটপ আইকন"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ডেস্কটপ ফ্রেম"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "ডায়াল"
+
+# সাম: depends on the context.... ডায়ালগ in case of dialog box
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "ডায়ালগ"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ডিরেক্টরি পেন"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "আঁকার ক্ষেত্র"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ফাইল বাছাইকারক"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "পূরণকারী"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ফন্ট নির্বাচক"
+
+# sam: or ফ্রেম
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "ফ্রেম"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "গ্লাস পেন"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html ধারক"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "আইকন"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "ছবি"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "অভ্যন্তরীণ ফ্রেম"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "লেবেল"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "স্তরীকৃত পেন"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "তালিকা"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "তালিকার আইটেম"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "মেনু"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "মেনু বার"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "মেনু আইটেম"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "অপশন পেন"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "পৃষ্ঠা ট্যাব"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "পৃষ্ঠা ট্যাবের তালিকা"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "প্যানেল"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "পাসওয়ার্ড টেক্সট"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "পপ-আপ মেনু"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "অগ্রগতি বার"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "পুশ বোতাম"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "রেডিও বোতাম"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "রেডিও মেনু আইটেম"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "মূল পেন"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "সারি শীর্ষচরণ"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "স্ক্রল বার"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "স্ক্রল পেন"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "বিভাজক"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "স্লাইডার"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "বিভাজিত পেন"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "ঘুর্ণন বোতাম"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "স্ট্যাটাস বার"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "টেবিল"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "টেবিলের ঘর"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "টেবিল কলামের শীর্ষচরণ"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "টেবিল সারির শীর্ষচরণ"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "মেনু আইটেম আলাদা করা হবে"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "টার্মিনাল"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "টেক্সট"
+
+# :D
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "টগল বোতাম"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "টুল বার"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "টুল পরামর্শ"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "ট্রী"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "ট্রী টেবিল"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "অজানা"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "ভিউপোর্ট"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "উইন্ডো"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "শীর্ষচরণ"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "পাদচরণ"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "অনুচ্ছেদ"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "মাপকাঠি"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "অ্যাপ্লিকেশন"
+
+# ূওূ
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "স্বয়ংক্রিয়ভাবে সম্পন্ন"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "সম্পাদনা বার"
+
+# ূওূ
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "সন্নিবেশিত কম্পোনেন্ট"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "ভুক্তি"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "লেখচিত্র"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "ক্যাপশন"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "ডকুমেন্টের ফ্রেম"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "শিরোনাম"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "পৃষ্ঠা"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "বিভাগ"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "অনাবশ্যক অবজেক্ট"
+
+# sam: or ফ্রেম
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "ফর্ম"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr "লিংক"
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr "ইনপুট মেথড উইন্ডো"
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "প্রবেশযোগ্য নাম"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "সহকারী প্রযুক্তিতে প্রবেশের জন্য অবজেক্ট ইন্সটেন্সের নাম বিন্যাস করা হয়েছে"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "প্রবেশযোগ্য বিবরণ"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "একটি অবজেক্টের বিবরণ, যা সহকারী প্রযুক্তিতে প্রবেশের জন্য বিন্যাসকৃত"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "প্রবেশযোগ্য প্যারেন্ট"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "প্যারেন্ট পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "প্রবেশযোগ্য মান"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "মান পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "প্রবেশযোগ্য ভূমিকা"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "এই অবজেক্টের প্রবেশযোগ্য ভূমিকা"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "প্রবেশযোগ্য স্তর"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "এই অবজেক্টের প্রবেশযোগ্য স্তর"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "প্রবেশযোগ্য MDI মান"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "এই অবজেক্টের প্রবেশযোগ্য MDI মান"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "প্রবেশযোগ্য টেবিল শিরোনাম"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"টেবিলের শিরোনাম পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত; এই বৈশিষ্ট্য ব্যবহার করা "
+"উচিত নয়। এর পরিবর্তে প্রবেশযোগ্য-টেবিল-শিরোনাম-অবজেক্ট ব্যবহার করা উচিত"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "প্রবেশযোগ্য টেবিল কলামের শীর্ষচরণ"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "টেবিলটির কলামের শীর্ষচরণ পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "প্রবেশযোগ্য টেবিল কলামের বর্ণনা"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "টেবিলটির কলামের বর্ণনা পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "প্রবেশযোগ্য টেবিল সারির শীর্ষচরণ"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "টেবিল সারির শীর্ষচরণ পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "প্রবেশযোগ্য টেবিল সারির বর্ণনা"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "টেবিলটির সারির বর্ণনা পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "প্রবেশযোগ্য টেবিল সারসংক্ষেপ"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "টেবিলের সারসংক্ষেপ পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "প্রবেশযোগ্য টেবিল শিরোনামের অবজেক্ট"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "টেবিলের শিরোনাম পরিবর্তিত হয়েছে, তা জানানোর জন্য ব্যবহৃত"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "প্রবেশযোগ্য হাইপারটেক্সট লিংকের সংখ্যা"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "বর্তমান AtkHypertext-এ যত সংখ্যক লিংক রয়েছে"
index 4e58021..20138b9 100644 (file)
@@ -1,13 +1,27 @@
+# #-#-#-#-#  bn_IN.po (at-spi2-core master)  #-#-#-#-#
 # Bengali (India) translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # , 2011.
+# #-#-#-#-#  bn_IN.po (bn_IN)  #-#-#-#-#
+# translation of bn_IN.po to Bengali INDIA
+# The Bengali India (bn_IN) translation for ATK
+# Copyright (C) 2002, 2006, 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the ATK package.
+#
+# Sayamindu Dasgupta <unmadindu@Softhome.net>, 2003.
+# Mahay Alam Khan <makl10n@yahoo.com>, 2005.
+# Samia Niamatullah <mailsamia2001@yahoo.com>, 2005.
+# Runa Bhattacharjee <runabh@gmail.com>, 2006.
+# Runa Bhattacharjee <runab@redhat.com>, 2009, 2012.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  bn_IN.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
-"cgi?product=at-spi&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&component=general\n"
 "POT-Creation-Date: 2011-02-09 20:49+0000\n"
 "PO-Revision-Date: 2011-02-10 15:39+0530\n"
 "Last-Translator: \n"
@@ -18,6 +32,20 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 1.1\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  bn_IN.po (bn_IN)  #-#-#-#-#\n"
+"Project-Id-Version: bn_IN\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-09-11 11:03+0000\n"
+"PO-Revision-Date: 2012-03-19 17:34+0530\n"
+"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
+"Language-Team: Bengali (India) <anubad@lists.ankur.org.in>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Language: bn_IN\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -49,8 +77,8 @@ msgid ""
 "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
 "signature %s"
 msgstr ""
-"AT-SPI: অজানা স্বাক্ষর %s সহ _atspi_dbus_return_hyperlink_from_message কল "
-"à¦\95রা à¦¹à§\9fà§\87à¦\9bà§\87"
+"AT-SPI: অজানা স্বাক্ষর %s সহ _atspi_dbus_return_hyperlink_from_message কল করা "
+"হয়েছে"
 
 #: ../atspi/atspi-misc.c:641
 #, c-format
@@ -63,8 +91,7 @@ msgstr "AT-SPI: প্রদর্শন প্রাপ্ত করতে ব
 
 #: ../atspi/atspi-misc.c:844
 msgid "AT-SPI: Accessibility bus not found - Using session bus.\n"
-msgstr ""
-"AT-SPI: অ্যাকসেসিবিলিটি বাস পাওয়া যায়নি - সেশান বাস ব্যবহার করা হচ্ছে।\n"
+msgstr "AT-SPI: অ্যাকসেসিবিলিটি বাস পাওয়া যায়নি - সেশান বাস ব্যবহার করা হচ্ছে।\n"
 
 #: ../atspi/atspi-misc.c:848 ../atspi/atspi-misc.c:857
 #, c-format
@@ -91,8 +118,7 @@ msgstr ""
 #: ../atspi/atspi-misc.c:1136
 #, c-format
 msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
-msgstr ""
-"atspi_dbus_get_property: ধরন সঠিক নয়: %s প্রত্যাশিত, %c প্রাপ্ত হয়েছে\n"
+msgstr "atspi_dbus_get_property: ধরন সঠিক নয়: %s প্রত্যাশিত, %c প্রাপ্ত হয়েছে\n"
 
 #: ../atspi/atspi-misc.c:1279
 #, c-format
@@ -102,8 +128,7 @@ msgstr "AT-SPI: অজানা ইন্টারফেস %s"
 #: ../atspi/atspi-misc.c:1299
 #, c-format
 msgid "AT-SPI: expected 2 values in states array; got %d\n"
-msgstr ""
-"AT-SPI: states অ্যারের মধ্যে ২-টি মান প্রত্যাশিত; %d-টি প্রাপ্ত হয়েছে\n"
+msgstr "AT-SPI: states অ্যারের মধ্যে ২-টি মান প্রত্যাশিত; %d-টি প্রাপ্ত হয়েছে\n"
 
 #: ../atspi/atspi-accessible.c:997
 msgid "Streamable content not implemented"
@@ -120,3 +145,581 @@ msgstr ""
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "অবৈধ স্বাক্ষর %s প্রাপ্ত হয়েছে %s সিগন্যালের জন্য %s ইন্টারফেস থেকে\n"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "নির্বাচিত লিংক"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink অবজেক্ট নির্বাচিত কিনা চিহ্নিত করা হয়"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "অ্যাঙ্করে'র সংখ্যা"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টের সাথে যুক্ত অ্যাঙ্কর সংখ্যা"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "সমাপ্তি ইনডেক্স"
+
+# sam: index  !=  সূচী so changing all index to ইনডেক্স
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টের সমাপ্তি ইনডেক্স"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "প্রারম্ভিক ইনডেক্স"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink অবজেক্টের প্রারম্ভিক ইনডেক্স"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "অবৈধ"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "গতিবর্ধকের লেবেল"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "সতর্কতা"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "অ্যানিমেশন"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "তিরচিহ্ন"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "বর্ষপঞ্জি"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "ক্যানভাস"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "চেক-বক্স"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "মেনু বস্তু চেক চিহ্ন"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "রং নির্বাচন"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "কলামের শিরোনাম"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "কম্বো-বক্স"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "dateeditor"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ডেস্কটপ আইকন"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ডেস্কটপ ফ্রেম"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "dial"
+
+# সাম: depends on the context.... ডায়ালগ in case of dialog box
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "ডায়লগ"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ডিরেক্টরি পেইন"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "আঁকার ক্ষেত্র"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ফাইল নির্বাচক"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "পূর্ণকারী"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ফন্ট নির্বাচক"
+
+# sam: or ফ্রেম
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ফ্রেম"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "গ্লাস পেইন"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html ধারণকারী"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "আইকন"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "ছবি"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "অভ্যন্তরীণ ফ্রেম"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "লেবেল"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "স্তরযুক্ত পেইন"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "তালিকা"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "তালিকার বস্তু"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "মেনু"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "মেনু-বার"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "মেনুর বস্তু"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "বিকল্প উল্লেখকারী পেইন"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "পৃষ্ঠার ট্যাব"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "পৃষ্ঠা ট্যাবের তালিকা"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "প্যানেল"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "পাসওয়ার্ডের লেখনি"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "পপ-আপ মেনু"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "প্রগ্রতিসূচক-বার"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "পুশ-বাটন"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "রেডিও-বাটন"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "রেডিও মেনুর বস্তু"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "মূল পেইল"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "সারির শিরোনাম"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "স্ক্রোল-বার"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "স্ক্রোল-পেইন"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "বিভাজক"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "স্লাইডার"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "বিভাজিত পেইন"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "স্পিন-বাটন"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "অবস্থাসূচক-বার"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "টেবিল"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "টেবিলের সেল"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "টেবিলের কলামের শিরোনাম"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "টেবিল সারির শিরোনাম"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "মেনুর বস্তু বিচ্ছিন্ন করুন"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "টার্মিনাল"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "টেক্সট"
+
+# :D
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "অদলবদলকারী বাটন"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "টুল-বার"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "টুল-টিপ"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ট্রি"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ট্রি-টেবিল"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "অজানা"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "ভিউ-পোর্ট"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "উইন্ডো"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "হেডার"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "ফুটার"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "অনুচ্ছেদ"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "রুলার"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "অ্যাপ্লিকেশন"
+
+# ূওূ
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "স্বয়ংসম্পন্ন"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "সম্পাদনার-বার"
+
+# ূওূ
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "সন্নিবেশিত বস্তু"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "তথ্য"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "ছক"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "শীর্ষক"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "ডকুমেন্টের ফ্রেম"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "শিরোনাম"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "পৃষ্ঠা"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "বিভাগ"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "অবচিত বস্তু"
+
+# sam: or ফ্রেম
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ফর্ম"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "লিংক"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ইনপুট পদ্ধতির উইন্ডো"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "টেবিলের সারি"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "ট্রি-র সামগ্রী"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "ডকুমেন্ট স্প্রেড-শিট"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "ডকুমেন্ট উপস্থাপনা"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "ডকুমেন্ট টেক্সট"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "ডকুমেন্ট ওয়েব"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "ডকুমেন্ট ই-মেইল"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "মন্তব্য"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "লিস্ট বক্স"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "শ্রেণীবদ্ধকরণ"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "ইমেজ ম্যাপ"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "সূচনাপ্রদান"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "তথ্যের বার"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "ব্যবহারযোগ্য নাম"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "সহায়ক প্রযুক্তি ব্যবহারের উদ্দেশ্যে বিন্যস্ত অবজেক্ট ইনস্ট্যান্সের নাম"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "ব্যবহারযোগ্য বর্ণনা"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "সহায়ক প্রযুক্তি ব্যবহারের উদ্দেশ্যে বিন্যস্ত অবজেক্টের বর্ণনা"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "ব্যবহারযোগ্য ঊর্ধ্বস্থ বস্তু"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "ঊর্ধ্বস্থ বস্তুর পরিবর্তন সম্বন্ধে সূচিত করতে ব্যবহৃত"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "ব্যবহারযোগ্য মান"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "মান পরিবর্তন সম্বন্ধে সূচিত করতে ব্যবহৃত"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "ব্যবহারযোগ্য ভূমিকা"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "চিহ্নিত বস্তুর ব্যবহারযোগ্য ভূমিকা"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "ব্যবহারযোগ্য স্তর"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "চিহ্নিত বস্তুর ব্যবহারযোগ্য স্তর"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "ব্যবহারযোগ্য MDI মান"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "চিহ্নিত বস্তুর ব্যবহারযোগ্য MDI মান"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "টেবিলের ব্যবহারযোগ্য শীর্ষক"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"টেবিলের শীর্ষক পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত; এই বৈশিষ্ট্য ব্যবহার "
+"করা উচিত নয়। পরিবর্তে accessible-table-caption-object ব্যবহার করুন।"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "ব্যবহারযোগ্য টেবিলের কলামের শিরোনাম"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "টেবিলের কলামের শিরোনাম পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "ব্যবহারযোগ্য টেবিলের কলামের বর্ণনা"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "টেবিলের কলামের বর্ণনার পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "ব্যবহারযোগ্য টেবিলের সারির বর্ণনা"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "টেবিলের সারির শিরোনাম পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "ব্যবহারযোগ্য টেবিলের সারির বর্ণনা"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "টেবিলের সারির বর্ণনার পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "ব্যবহারযোগ্য টেবিলের সংক্ষিপ্ত বিবরণ"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "টেবিলের সংক্ষিপ্ত বিবরণের পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "ব্যবহারযোগ্য টেবিলের শীর্ষক অবজেক্ট"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "টেবিলের শীর্ষক পরিবর্তন সম্বন্ধে সূচনাপ্রদানের উদ্দেশ্যে ব্যবহৃত"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "ব্যবহারযোগ্য হাইপার-টেক্সট লিঙ্কের সংখ্যা"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "বর্তমান AtkHypertext'র মধ্য উপস্থিত লিঙ্কের সংখ্যা"
index bc864e8..c3529c8 100644 (file)
--- a/po/bs.po
+++ b/po/bs.po
@@ -1,10 +1,13 @@
+# #-#-#-#-#  bs.po (bosnianuniversetranslation)  #-#-#-#-#
 # Bosnian translation for bosnianuniversetranslation
 # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
 # This file is distributed under the same license as the bosnianuniversetranslation package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
 #
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  bs.po (bosnianuniversetranslation)  #-#-#-#-#\n"
 "Project-Id-Version: bosnianuniversetranslation\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -18,6 +21,20 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Launchpad-Export-Date: 2015-02-05 07:02+0000\n"
 "X-Generator: Launchpad (build 17331)\n"
+"#-#-#-#-#  bs.po (atk.HEAD.bs)  #-#-#-#-#\n"
+"Project-Id-Version: atk.HEAD.bs\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-02-27 03:51+0000\n"
+"PO-Revision-Date: 2015-02-04 15:38+0000\n"
+"Last-Translator: Samir Ribić <Unknown>\n"
+"Language-Team: Bosnian <lokal@linux.org.ba>\n"
+"Language: bs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2015-02-05 06:57+0000\n"
+"X-Generator: Launchpad (build 17331)\n"
 
 #: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1037
 #: ../atspi/atspi-value.c:111
@@ -27,3 +44,778 @@ msgstr "Program više ne postoji"
 #: ../atspi/atspi-misc.c:1795
 msgid "Attempted synchronous call where prohibited"
 msgstr "Pokušan sinhroni poziv kada je zabranjen"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Selected Link"
+msgstr "Izabrani link"
+
+#: ../atk/atkhyperlink.c:129
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Označava da li je izabran objekt AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:135
+msgid "Number of Anchors"
+msgstr "Broj sidara"
+
+#: ../atk/atkhyperlink.c:136
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Broj sidara združenih s objektom AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:144
+msgid "End index"
+msgstr "Završni indeks"
+
+#: ../atk/atkhyperlink.c:145
+msgid "The end index of the AtkHyperlink object"
+msgstr "Završni indeks objekta AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:153
+msgid "Start index"
+msgstr "Početni indeks"
+
+#: ../atk/atkhyperlink.c:154
+msgid "The start index of the AtkHyperlink object"
+msgstr "Početni indeks objekta AtkHyperlink"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "nevažeće"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "oznaka akceleratora"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "uzbuna"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "animacija"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "strelica"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "kalendar"
+
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "kanafas"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "kućica za potvrdu"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "stavka menija za izbor"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "birač boja"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "zaglavlje kolone"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "kombinovani okvir"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "editor datuma"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "desktop ikona"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "okvir za desktop"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "biranje broja"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "dijalog"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "okno za direktorije"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "područje za crtanje"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "birač datoteka"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "punjač"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "birač fontova"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "okvir"
+
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "stakleno okno"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "html spremište"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "ikona"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "slika"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "interni okvir"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "oznaka"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "okno sa slojevima"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "lista"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "stavka liste"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "meni"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "traka menija"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "stavka menija"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "okno za opcije"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "kartica"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "lista kartica"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "tekst šifre"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "popup meni"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "traka napredovanja"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "dugme"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "radio dugme"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "stavka radio menija"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "glavno okno"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "zaglavlje reda"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "traka s klizačem"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "okno sa klizačem"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "linija razdvajanja"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "klizač"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "razdijeljeno okno"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "spin dugme"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "statusna traka"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "tablica"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "polje tablice"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "zaglavlje kolone tablice"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "zaglavlje reda tablice"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "odvojiva stavka menija"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "tekst"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "dugme prekidač"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "traka s alatima"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "opis alata"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "stablo"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "tablica stabla"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "nepoznato"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "port pregleda"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "prozor"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "zaglavlje"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "tekst na dnu"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "paragraf"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "ravnalo"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "aplikacija"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "samodopuna"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "traka za izmjene"
+
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "ugrađena komponenta"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "stavka"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "tabela"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "natpis"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "okvir dokumenta"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "kurs"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "strana"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "odjeljak"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "suvišan objekat"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "formular"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "veza"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "prozor metode unosa"
+
+#: ../atk/atkobject.c:186
+msgid "table row"
+msgstr "red tabele"
+
+#: ../atk/atkobject.c:187
+msgid "tree item"
+msgstr "stavka stabla"
+
+#: ../atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "dokument proračunske tablice"
+
+#: ../atk/atkobject.c:189
+msgid "document presentation"
+msgstr "prezentacijski dokument"
+
+#: ../atk/atkobject.c:190
+msgid "document text"
+msgstr "dokument s tekstom"
+
+#: ../atk/atkobject.c:191
+msgid "document web"
+msgstr "dokument na webu"
+
+#: ../atk/atkobject.c:192
+msgid "document email"
+msgstr "dokument elektronske pošte"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "komentar"
+
+#: ../atk/atkobject.c:194
+msgid "list box"
+msgstr "lista izbora"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "grupisanje"
+
+#: ../atk/atkobject.c:196
+msgid "image map"
+msgstr "mapa slika"
+
+#: ../atk/atkobject.c:197
+msgid "notification"
+msgstr "notifikacija"
+
+#: ../atk/atkobject.c:198
+msgid "info bar"
+msgstr "informaciona traka"
+
+#: ../atk/atkobject.c:199
+msgid "level bar"
+msgstr "traka razine"
+
+#: ../atk/atkobject.c:200
+msgid "title bar"
+msgstr "naslovna traka"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr "blokiraj citiranje"
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "zvučni"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "video"
+
+#: ../atk/atkobject.c:204
+msgid "definition"
+msgstr "definicija"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "članak"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr "orjentir"
+
+#: ../atk/atkobject.c:207
+msgid "log"
+msgstr "zapis"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr "natpis"
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr "matematika"
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "rejting"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "štoperica"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "lista opisa"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "termin opisa"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "vrijednost opisa"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Dostupno ime"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Ime primjerka objekta je formatirano za dostup uz pomoćnu tehnologiju"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Dostupan opis"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Opis objekta, formatiran za dostup uz pomoćnu tehnologiju"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Dostupno porijeklo"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Roditelj od trenutnog pristupa je vračen by by atk_object_get_parent()"
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Dostupna vrijednost"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Koristi se za obavijest o promjeni vrijednosti"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Dostupna uloga"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "Dostupna uloga ovog objekta"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Dostupan sloj"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "Dostupan sloj ovog objekta"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Dostupna MDI vrijednost"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "Dostupna MDI vrijednost ovog objekta"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Dostupan natpis tablice"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Koristi se za obavijest o promjeni natpisa tablice. Ova osobina se ne bi "
+"trebala koristiti. Umjesto ovoga trebalo bi se koristiti accessible-table-"
+"caption-object"
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Dostupno zaglavlje kolone tablice"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "Koristi se za obavijest o promjeni zaglavlja kolone tablice"
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Dostupan opis kolone tablice"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "Koristi se za obavijest o promjeni opisa kolone tablice"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Dostupno zaglavlje reda tablice"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "Koristi se za obavijest o promjeni zaglavlja reda tablice"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Dostupni opis reda tablice"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Koristi se za obavijest da je opis reda tablice promjenjen"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Dostupni rezime tablice"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Koristi se za obavijest o promjeni rezimea tablice"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Dostupni objekt natpisa tablice"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Koristi se za obavijest o promjeni natpisa tablice"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Broj dostupnih hypertext linkova"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Broj linkova koje ima trenutni AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "vrlo slabo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "slabo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "može se pristupiti"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "jako"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "vrlo jako"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, prici) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "jako nisko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, prici) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "srednje"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, prici) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "visok"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, prici) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "vrlo visoko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "jako loše"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "loše"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "dobro"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "jako dobro"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "najbolji"
index 6e1116d..d30a417 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
+# #-#-#-#-#  ca.po (at-spi2-core master)  #-#-#-#-#
 # Catalan translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # David Planella <david.planella@gmail.com>, 2011.
 #
+# #-#-#-#-#  ca.po (atk 1.6.0)  #-#-#-#-#
+# Catalan messages for atk.
+# Copyright © 2002, 2003, 2004, 2006 Free Software Foundation Inc.
+# This file is distributed under the same license as the atk package.
+# Jordi Mallach <jordi@sindominio.net>, 2002, 2003, 2004, 2006.
+# Gil Forcada <gilforcada@guifi.net>, 2011.
+# Jordi Serratosa <jordis@softcatala.cat>, 2012.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-03-15 18:24+0000\n"
-"PO-Revision-Date: 2014-03-15 21:31+0100\n"
-"Last-Translator: Joan Montané <jmontane@softcatala.org>\n"
-"Language-Team: Catalan <gnome-dl@llistes.softcatala.org>\n"
+"Project-Id-Version: atk 1.6.0\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-09-04 05:44+0100\n"
+"Last-Translator: Jordi Mas i Herǹandez <jmas@softcatala.org>\n"
+"Language-Team: català; valencià <<tradgnome@softcatala.org>>\n"
 "Language: ca\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  ca.po (at-spi2-core master)  #-#-#-#-#\n"
+"#-#-#-#-#  ca.po (atk 1.6.0)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Enllaç seleccionat"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica si l'objecte AtkHyperlink és seleccionat"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Nombre d'àncores"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "El nombre d'àncores associades amb l'objecte AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Final de l'índex"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "El final de l'índex de l'objecte AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Inici de l'índex"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "L'inici de l'índex de l'objecte AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "no vàlid"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "etiqueta d'accelerador"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "alerta"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animació"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "fletxa"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "calendari"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "llenç"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "casella de selecció"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "element de menú de verificació"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "selector de color"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "capçalera de columna"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "quadre combinat"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "editor de data"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "icona d'escriptori"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "marc d'escriptori"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "disc selector"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "diàleg"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "quadre de directori"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "àrea de dibuix"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "selector de fitxers"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "farciment"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "selector de tipus de lletra"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "marc"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "quadre transparent"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "contenidor d'html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "icona"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "imatge"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "marc intern"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiqueta"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "quadre superposat"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "llista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "element de llista"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menú"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "barra de menú"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "botó de menú"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "element de menú"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "subfinestra d'opcions"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "pestanya de pàgina"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "llista de pestanyes de pàgina"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "quadre"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "text de contrasenya"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "menú emergent"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "barra de progrés"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "botó de pulsació"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "botó radial"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "element de menú radial"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "quadre arrel"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "capçalera de fila"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "barra de desplaçament"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "subfinestra de desplaçament"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "desplaçador"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "subfinestra partida"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "botó giratori"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "barra d'estat"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "taula"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "cel·la de taula"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "capçalera de columna de taula"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "capçalera de fila de taula"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "element de menú desacoblable"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "botó de selecció"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "barra d'eines"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "consell"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "arbre"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "taula d'arbre"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "desconegut"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "subàrea"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "finestra"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "capçalera"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "peu"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "paràgraf"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "regle"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplicació"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "completa automàticament"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "edita la barra"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "component incrustat"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "entrada"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagrama"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "títol"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "marc de document"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "encapçalament"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "pàgina"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "secció"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "objecte redundant"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formulari"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "enllaç"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "finestra del mètode d'entrada"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "fila de taula"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "element d'arbre"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "document de full de càlcul"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "document de presentació"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "document de text"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "document web"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "document de correu electrònic"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "comentari"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "caixa de llista"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "agrupació"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "mapa d'imatge"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "notificació"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "barra d'informació"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "barra de nivell"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "barra de títol"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "cita"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "àudio"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "vídeo"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definició"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "article"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "marca important"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "registre"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "marquesina"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matemàtiques"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "valoració"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "temporitzador"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "llista de descripció"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "terme de descripció"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "valor de descripció"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Nom accessible"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nom de la instància de l'objecte formatat per a l'accés de les tecnologies "
+"assistives"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Descripció accessible"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Descripció d'un objecte, formatat per a l'accés de les tecnologies assistives"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Pare accessible"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Pare de l'accessible actual com el retorna l'«atk_object_get_parent()»"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Valor accessible"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "S'utilitza per a notificar que el valor ha canviat"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Rol accessible"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "El rol accessible d'aquest objecte"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Capa accessible"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "La capa accessible d'aquest objecte"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accessible"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "El valor MDI accessible d'aquest objecte"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Títol de la taula accessible"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"S'utilitza per a notificar que el títol de la taula ha canviat; aquesta "
+"propietat no s'ha d'utilitzar. S'ha d'utilitzar accessible-table-caption-"
+"object en el seu lloc"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Capçalera de columna de taula accessible"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"S'utilitza per a notificar que la capçalera de la columna de la taula ha "
+"canviat"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Descripció de la columna de la taula accessible"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"S'utilitza per a notificar que la descripció de la columna de la taula ha "
+"canviat"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Capçalera de la fila de la taula accessible"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"S'utilitza per a notificar que la capçalera de la fila de la taula ha canviat"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Descripció de la fila de la taula accessible"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"S'utilitza per a notificar que la descripció de la fila de la taula ha "
+"canviat"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Resum de la taula accessible"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "S'utilitza per a notificar que el resum de la taula ha canviat"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Objecte de títol de taula accessible"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "S'utilitza per a notificar que el títol de la taula ha canviat"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Nombre d'enllaços d'hipertext accessibles"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "El nombre d'enllaços que té l'AtkHypertext actual"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "molt dèbil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "dèbil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "acceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "fort"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "molt fort"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "molt baix"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "mitjà"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "molt alt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "molt dolent"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "dolent"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "molt bo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "el millor"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "L'aplicació ja no existeix"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "S'ha intentat una crida síncrona on és prohibit"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "S'ha intentat una crida síncrona on és prohibit"
index ca0b97f..f1ef351 100644 (file)
@@ -1,10 +1,21 @@
+# #-#-#-#-#  ca@valencia.po (at-spi2-core master)  #-#-#-#-#
 # Catalan translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # David Planella <david.planella@gmail.com>, 2011.
 #
+# #-#-#-#-#  ca@valencia.po (atk 1.6.0)  #-#-#-#-#
+# Catalan messages for atk.
+# Copyright © 2002, 2003, 2004, 2006 Free Software Foundation Inc.
+# This file is distributed under the same license as the atk package.
+# Jordi Mallach <jordi@sindominio.net>, 2002, 2003, 2004, 2006.
+# Gil Forcada <gilforcada@guifi.net>, 2011.
+# Jordi Serratosa <jordis@softcatala.cat>, 2012.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ca@valencia.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=at-spi2-core\n"
@@ -16,6 +27,19 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  ca@valencia.po (atk 1.6.0)  #-#-#-#-#\n"
+"Project-Id-Version: atk 1.6.0\n"
+"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2017-09-11 09:07+0000\n"
+"PO-Revision-Date: 2014-03-21 05:44+0100\n"
+"Last-Translator: Xavi Ivars <xavi.ivars@gmail.com>\n"
+"Language-Team: català; valencià <<tradgnome@softcatala.org>>\n"
+"Language: ca-valencia\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
 
 #: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
 msgid "The application no longer exists"
@@ -24,3 +48,787 @@ msgstr "L'aplicació ja no existeix"
 #: atspi/atspi-misc.c:1843
 msgid "Attempted synchronous call where prohibited"
 msgstr "S'ha intentat una crida síncrona on és prohibit"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Enllaç seleccionat"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica si l'objecte AtkHyperlink és seleccionat"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Nombre d'àncores"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "El nombre d'àncores associades amb l'objecte AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Final de l'índex"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "El final de l'índex de l'objecte AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Inici de l'índex"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "L'inici de l'índex de l'objecte AtkHyperlink"
+
+#: atk/atkobject.c:97
+msgid "invalid"
+msgstr "no vàlid"
+
+#: atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "etiqueta d'accelerador"
+
+#: atk/atkobject.c:99
+msgid "alert"
+msgstr "alerta"
+
+#: atk/atkobject.c:100
+msgid "animation"
+msgstr "animació"
+
+#: atk/atkobject.c:101
+msgid "arrow"
+msgstr "fletxa"
+
+#: atk/atkobject.c:102
+msgid "calendar"
+msgstr "calendari"
+
+#: atk/atkobject.c:103
+msgid "canvas"
+msgstr "llenç"
+
+#: atk/atkobject.c:104
+msgid "check box"
+msgstr "casella de selecció"
+
+#: atk/atkobject.c:105
+msgid "check menu item"
+msgstr "element de menú de verificació"
+
+#: atk/atkobject.c:106
+msgid "color chooser"
+msgstr "selector de color"
+
+#: atk/atkobject.c:107
+msgid "column header"
+msgstr "capçalera de columna"
+
+#: atk/atkobject.c:108
+msgid "combo box"
+msgstr "quadre combinat"
+
+#: atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "editor de data"
+
+#: atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "icona d'escriptori"
+
+#: atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "marc d'escriptori"
+
+#: atk/atkobject.c:112
+msgid "dial"
+msgstr "disc selector"
+
+#: atk/atkobject.c:113
+msgid "dialog"
+msgstr "diàleg"
+
+#: atk/atkobject.c:114
+msgid "directory pane"
+msgstr "quadre de directori"
+
+#: atk/atkobject.c:115
+msgid "drawing area"
+msgstr "àrea de dibuix"
+
+#: atk/atkobject.c:116
+msgid "file chooser"
+msgstr "selector de fitxers"
+
+#: atk/atkobject.c:117
+msgid "filler"
+msgstr "farciment"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "selector de tipus de lletra"
+
+#: atk/atkobject.c:120
+msgid "frame"
+msgstr "marc"
+
+#: atk/atkobject.c:121
+msgid "glass pane"
+msgstr "quadre transparent"
+
+#: atk/atkobject.c:122
+msgid "html container"
+msgstr "contenidor d'html"
+
+#: atk/atkobject.c:123
+msgid "icon"
+msgstr "icona"
+
+#: atk/atkobject.c:124
+msgid "image"
+msgstr "imatge"
+
+#: atk/atkobject.c:125
+msgid "internal frame"
+msgstr "marc intern"
+
+#: atk/atkobject.c:126
+msgid "label"
+msgstr "etiqueta"
+
+#: atk/atkobject.c:127
+msgid "layered pane"
+msgstr "quadre superposat"
+
+#: atk/atkobject.c:128
+msgid "list"
+msgstr "llista"
+
+#: atk/atkobject.c:129
+msgid "list item"
+msgstr "element de llista"
+
+#: atk/atkobject.c:130
+msgid "menu"
+msgstr "menú"
+
+#: atk/atkobject.c:131
+msgid "menu bar"
+msgstr "barra de menú"
+
+#: atk/atkobject.c:132
+msgid "menu item"
+msgstr "element de menú"
+
+#: atk/atkobject.c:133
+msgid "option pane"
+msgstr "subfinestra d'opcions"
+
+#: atk/atkobject.c:134
+msgid "page tab"
+msgstr "pestanya de pàgina"
+
+#: atk/atkobject.c:135
+msgid "page tab list"
+msgstr "llista de pestanyes de pàgina"
+
+#: atk/atkobject.c:136
+msgid "panel"
+msgstr "quadre"
+
+#: atk/atkobject.c:137
+msgid "password text"
+msgstr "text de contrasenya"
+
+#: atk/atkobject.c:138
+msgid "popup menu"
+msgstr "menú emergent"
+
+#: atk/atkobject.c:139
+msgid "progress bar"
+msgstr "barra de progrés"
+
+#: atk/atkobject.c:140
+msgid "push button"
+msgstr "botó de pulsació"
+
+#: atk/atkobject.c:141
+msgid "radio button"
+msgstr "botó radial"
+
+#: atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "element de menú radial"
+
+#: atk/atkobject.c:143
+msgid "root pane"
+msgstr "quadre arrel"
+
+#: atk/atkobject.c:144
+msgid "row header"
+msgstr "capçalera de fila"
+
+#: atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "barra de desplaçament"
+
+#: atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "subfinestra de desplaçament"
+
+#: atk/atkobject.c:147
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:148
+msgid "slider"
+msgstr "desplaçador"
+
+#: atk/atkobject.c:149
+msgid "split pane"
+msgstr "subfinestra partida"
+
+#: atk/atkobject.c:150
+msgid "spin button"
+msgstr "botó giratori"
+
+#: atk/atkobject.c:151
+msgid "statusbar"
+msgstr "barra d'estat"
+
+#: atk/atkobject.c:152
+msgid "table"
+msgstr "taula"
+
+#: atk/atkobject.c:153
+msgid "table cell"
+msgstr "cel·la de taula"
+
+#: atk/atkobject.c:154
+msgid "table column header"
+msgstr "capçalera de columna de taula"
+
+#: atk/atkobject.c:155
+msgid "table row header"
+msgstr "capçalera de fila de taula"
+
+#: atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "element de menú desacoblable"
+
+#: atk/atkobject.c:157
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:158
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:159
+msgid "toggle button"
+msgstr "botó de selecció"
+
+#: atk/atkobject.c:160
+msgid "tool bar"
+msgstr "barra d'eines"
+
+#: atk/atkobject.c:161
+msgid "tool tip"
+msgstr "consell"
+
+#: atk/atkobject.c:162
+msgid "tree"
+msgstr "arbre"
+
+#: atk/atkobject.c:163
+msgid "tree table"
+msgstr "taula d'arbre"
+
+#: atk/atkobject.c:164
+msgid "unknown"
+msgstr "desconegut"
+
+#: atk/atkobject.c:165
+msgid "viewport"
+msgstr "subàrea"
+
+#: atk/atkobject.c:166
+msgid "window"
+msgstr "finestra"
+
+#: atk/atkobject.c:167
+msgid "header"
+msgstr "capçalera"
+
+#: atk/atkobject.c:168
+msgid "footer"
+msgstr "peu"
+
+#: atk/atkobject.c:169
+msgid "paragraph"
+msgstr "paràgraf"
+
+#: atk/atkobject.c:170
+msgid "ruler"
+msgstr "regle"
+
+#: atk/atkobject.c:171
+msgid "application"
+msgstr "aplicació"
+
+#: atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "completa automàticament"
+
+#: atk/atkobject.c:173
+msgid "edit bar"
+msgstr "edita la barra"
+
+#: atk/atkobject.c:174
+msgid "embedded component"
+msgstr "component incrustat"
+
+#: atk/atkobject.c:175
+msgid "entry"
+msgstr "entrada"
+
+#: atk/atkobject.c:176
+msgid "chart"
+msgstr "diagrama"
+
+#: atk/atkobject.c:177
+msgid "caption"
+msgstr "títol"
+
+#: atk/atkobject.c:178
+msgid "document frame"
+msgstr "marc de document"
+
+#: atk/atkobject.c:179
+msgid "heading"
+msgstr "encapçalament"
+
+#: atk/atkobject.c:180
+msgid "page"
+msgstr "pàgina"
+
+#: atk/atkobject.c:181
+msgid "section"
+msgstr "secció"
+
+#: atk/atkobject.c:182
+msgid "redundant object"
+msgstr "objecte redundant"
+
+#: atk/atkobject.c:183
+msgid "form"
+msgstr "formulari"
+
+#: atk/atkobject.c:184
+msgid "link"
+msgstr "enllaç"
+
+#: atk/atkobject.c:185
+msgid "input method window"
+msgstr "finestra del mètode d'entrada"
+
+#: atk/atkobject.c:186
+msgid "table row"
+msgstr "fila de taula"
+
+#: atk/atkobject.c:187
+msgid "tree item"
+msgstr "element d'arbre"
+
+#: atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "document de full de càlcul"
+
+#: atk/atkobject.c:189
+msgid "document presentation"
+msgstr "document de presentació"
+
+#: atk/atkobject.c:190
+msgid "document text"
+msgstr "document de text"
+
+#: atk/atkobject.c:191
+msgid "document web"
+msgstr "document web"
+
+#: atk/atkobject.c:192
+msgid "document email"
+msgstr "document de correu electrònic"
+
+#: atk/atkobject.c:193
+msgid "comment"
+msgstr "comentari"
+
+#: atk/atkobject.c:194
+msgid "list box"
+msgstr "caixa de llista"
+
+#: atk/atkobject.c:195
+msgid "grouping"
+msgstr "agrupació"
+
+#: atk/atkobject.c:196
+msgid "image map"
+msgstr "mapa d'imatge"
+
+#: atk/atkobject.c:197
+msgid "notification"
+msgstr "notificació"
+
+#: atk/atkobject.c:198
+msgid "info bar"
+msgstr "barra d'informació"
+
+#: atk/atkobject.c:199
+msgid "level bar"
+msgstr "barra de nivell"
+
+#: atk/atkobject.c:200
+msgid "title bar"
+msgstr "barra de títol"
+
+#: atk/atkobject.c:201
+msgid "block quote"
+msgstr "cita"
+
+#: atk/atkobject.c:202
+msgid "audio"
+msgstr "àudio"
+
+#: atk/atkobject.c:203
+msgid "video"
+msgstr "vídeo"
+
+#: atk/atkobject.c:204
+msgid "definition"
+msgstr "definició"
+
+#: atk/atkobject.c:205
+msgid "article"
+msgstr "article"
+
+#: atk/atkobject.c:206
+msgid "landmark"
+msgstr "marca important"
+
+#: atk/atkobject.c:207
+msgid "log"
+msgstr "registre"
+
+#: atk/atkobject.c:208
+msgid "marquee"
+msgstr "marquesina"
+
+#: atk/atkobject.c:209
+msgid "math"
+msgstr "matemàtiques"
+
+#: atk/atkobject.c:210
+msgid "rating"
+msgstr "valoració"
+
+#: atk/atkobject.c:211
+msgid "timer"
+msgstr "temporitzador"
+
+#: atk/atkobject.c:212
+msgid "description list"
+msgstr "llista de descripció"
+
+#: atk/atkobject.c:213
+msgid "description term"
+msgstr "terme de descripció"
+
+#: atk/atkobject.c:214
+msgid "description value"
+msgstr "valor de descripció"
+
+#: atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Nom accessible"
+
+#: atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nom de la instància de l'objecte formatat per a l'accés de les tecnologies "
+"assistives"
+
+#: atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Descripció accessible"
+
+#: atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Descripció d'un objecte, formatat per a l'accés de les tecnologies assistives"
+
+#: atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Pare accessible"
+
+#: atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Pare de l'accessible actual com el retorna l'«atk_object_get_parent()»"
+
+#: atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Valor accessible"
+
+#: atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "S'utilitza per notificar que el valor ha canviat"
+
+#: atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Rol accessible"
+
+#: atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "El rol accessible d'este objecte"
+
+#: atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Capa accessible"
+
+#: atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "La capa accessible d'este objecte"
+
+#: atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accessible"
+
+#: atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "El valor MDI accessible d'este objecte"
+
+#: atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Títol de la taula accessible"
+
+#: atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"S'utilitza per notificar que el títol de la taula ha canviat; esta propietat "
+"no s'ha d'utilitzar. S'ha d'utilitzar accessible-table-caption-object en el "
+"seu lloc"
+
+#: atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Capçalera de columna de taula accessible"
+
+#: atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"S'utilitza per notificar que la capçalera de la columna de la taula ha "
+"canviat"
+
+#: atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Descripció de la columna de la taula accessible"
+
+#: atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"S'utilitza per notificar que la descripció de la columna de la taula ha "
+"canviat"
+
+#: atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Capçalera de la fila de la taula accessible"
+
+#: atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"S'utilitza per notificar que la capçalera de la fila de la taula ha canviat"
+
+#: atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Descripció de la fila de la taula accessible"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"S'utilitza per notificar que la descripció de la fila de la taula ha canviat"
+
+#: atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Resum de la taula accessible"
+
+#: atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "S'utilitza per notificar que el resum de la taula ha canviat"
+
+#: atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Objecte de títol de taula accessible"
+
+#: atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "S'utilitza per notificar que el títol de la taula ha canviat"
+
+#: atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Nombre d'enllaços d'hipertext accessibles"
+
+#: atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "El nombre d'enllaços que té l'AtkHypertext actual"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "molt dèbil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "dèbil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "acceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "fort"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "molt fort"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "molt baix"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "mitjà"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "molt alt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "molt dolent"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "dolent"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "molt bo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "el millor"
diff --git a/po/ckb.po b/po/ckb.po
new file mode 100644 (file)
index 0000000..c6b2046
--- /dev/null
+++ b/po/ckb.po
@@ -0,0 +1,792 @@
+# Kurdish (Sorani) translation for atk1.0
+# Copyright (c) 2020 Rosetta Contributors and Canonical Ltd 2020
+# This file is distributed under the same license as the atk1.0 package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk1.0\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2020-01-30 11:30+0000\n"
+"PO-Revision-Date: 2020-03-05 19:36+0300\n"
+"Last-Translator: Jwtiyar Nariman <jwtiyar@gmail.com>\n"
+"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2020-03-05 16:00+0000\n"
+"X-Generator: Poedit 2.3\n"
+"Language: ckb\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "بەستەری هەڵبژێردراو"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "کۆتایی پێڕست"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "دەستپێکردنی پێڕست"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "هەڵەیە"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr ""
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "ئاگادارکردنەوە"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "خوڵاو"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "تیر"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "ڕۆژژمێر"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr ""
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr ""
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr ""
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "هەڵبژێرەری ڕەنگ"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "سەرەوەی ئەستوون"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr ""
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr ""
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "وێنۆچکەی ڕوومێز"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "چوارجێوەی ڕوومێز"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "dial"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr ""
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "بەشی پێڕست"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "ڕووبەری کێشراو"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "هەلبژێرەری پەڕگە"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "پڕکەرەوە"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "هەڵبژێرەری جۆرەپیت"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "چوارچیوە"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr ""
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr ""
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "وێنۆچکە"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "وێنە"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "چوارچیوەی ناوەکی"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "پێناسکراو"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "بەشی چینەکان"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "لیستە"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "بڕگەی لیستە"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "پێڕست"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "توڵی پێڕست"
+
+#: atk/atkobject.c:133
+msgid "menu item"
+msgstr "بڕگەی پێڕست"
+
+#: atk/atkobject.c:134
+msgid "option pane"
+msgstr "بەشی هەڵبژاردکەان"
+
+#: atk/atkobject.c:135
+msgid "page tab"
+msgstr "بازدەری پەڕە"
+
+#: atk/atkobject.c:136
+msgid "page tab list"
+msgstr "لیستەی بازدەری پەڕە"
+
+#: atk/atkobject.c:137
+msgid "panel"
+msgstr "بەش"
+
+#: atk/atkobject.c:138
+msgid "password text"
+msgstr "دەق تێپەڕەووشە"
+
+#: atk/atkobject.c:139
+msgid "popup menu"
+msgstr ""
+
+#: atk/atkobject.c:140
+msgid "progress bar"
+msgstr ""
+
+#: atk/atkobject.c:141
+msgid "push button"
+msgstr ""
+
+#: atk/atkobject.c:142
+msgid "radio button"
+msgstr "دوگمەی ڕادیۆ"
+
+#: atk/atkobject.c:143
+msgid "radio menu item"
+msgstr "بڕگەی پێڕستی ڕادیۆ"
+
+#: atk/atkobject.c:144
+msgid "root pane"
+msgstr "بەشی ڕەها"
+
+#: atk/atkobject.c:145
+msgid "row header"
+msgstr "سەرەوەی ڕیز"
+
+#: atk/atkobject.c:146
+msgid "scroll bar"
+msgstr ""
+
+#: atk/atkobject.c:147
+msgid "scroll pane"
+msgstr ""
+
+#: atk/atkobject.c:148
+msgid "separator"
+msgstr "جیاکەرەوە"
+
+#: atk/atkobject.c:149
+msgid "slider"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "split pane"
+msgstr "بەش جیابکەرەوە"
+
+#: atk/atkobject.c:151
+msgid "spin button"
+msgstr "دوگمەی خولانەوە"
+
+#: atk/atkobject.c:152
+msgid "statusbar"
+msgstr "توڵی ئاگانامەکان"
+
+#: atk/atkobject.c:153
+msgid "table"
+msgstr "خشتە"
+
+#: atk/atkobject.c:154
+msgid "table cell"
+msgstr "خانەکانی خشتە"
+
+#: atk/atkobject.c:155
+msgid "table column header"
+msgstr "ستوونی سەرەوەی خشتە"
+
+#: atk/atkobject.c:156
+msgid "table row header"
+msgstr "ڕیزی سەرەوەی خشتە"
+
+#: atk/atkobject.c:157
+msgid "tear off menu item"
+msgstr ""
+
+#: atk/atkobject.c:158
+msgid "terminal"
+msgstr "تێڕمیناڵ"
+
+#: atk/atkobject.c:159
+msgid "text"
+msgstr "دەق"
+
+#: atk/atkobject.c:160
+msgid "toggle button"
+msgstr ""
+
+#: atk/atkobject.c:161
+msgid "tool bar"
+msgstr "توڵامراز"
+
+#: atk/atkobject.c:162
+msgid "tool tip"
+msgstr ""
+
+#: atk/atkobject.c:163
+msgid "tree"
+msgstr "درەخت"
+
+#: atk/atkobject.c:164
+msgid "tree table"
+msgstr "خشتەی درەخت"
+
+#: atk/atkobject.c:165
+msgid "unknown"
+msgstr "نەزانراو"
+
+#: atk/atkobject.c:166
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:167
+msgid "window"
+msgstr "پەنجەرە"
+
+#: atk/atkobject.c:168
+msgid "header"
+msgstr "سەرپەڕە"
+
+#: atk/atkobject.c:169
+msgid "footer"
+msgstr "پێپەرە"
+
+#: atk/atkobject.c:170
+msgid "paragraph"
+msgstr "بەند"
+
+#: atk/atkobject.c:171
+msgid "ruler"
+msgstr "ڕاستە"
+
+#: atk/atkobject.c:172
+msgid "application"
+msgstr "داوانامە"
+
+#: atk/atkobject.c:173
+msgid "autocomplete"
+msgstr "تەواوکەری خۆکار"
+
+#: atk/atkobject.c:174
+msgid "edit bar"
+msgstr "توڵی دەستکاریکردن"
+
+#: atk/atkobject.c:175
+msgid "embedded component"
+msgstr "پێکهاتەی تێهەڵکێشکراو"
+
+#: atk/atkobject.c:176
+msgid "entry"
+msgstr "تێخستن"
+
+#: atk/atkobject.c:177
+msgid "chart"
+msgstr "هێڵکاری"
+
+#: atk/atkobject.c:178
+msgid "caption"
+msgstr "سەردێڕ"
+
+#: atk/atkobject.c:179
+msgid "document frame"
+msgstr "چوارجێوەی بەڵگەنامە"
+
+#: atk/atkobject.c:180
+msgid "heading"
+msgstr "سەرەوە"
+
+#: atk/atkobject.c:181
+msgid "page"
+msgstr "پەڕە"
+
+#: atk/atkobject.c:182
+msgid "section"
+msgstr "بەش"
+
+#: atk/atkobject.c:183
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:184
+msgid "form"
+msgstr "فۆرم"
+
+#: atk/atkobject.c:185
+msgid "link"
+msgstr "بەستەر"
+
+#: atk/atkobject.c:186
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:187
+msgid "table row"
+msgstr "ڕێزی خشتە"
+
+#: atk/atkobject.c:188
+msgid "tree item"
+msgstr "بڕگەی درەخت"
+
+#: atk/atkobject.c:189
+msgid "document spreadsheet"
+msgstr "بەڵگەنامەی خشتەیی"
+
+#: atk/atkobject.c:190
+msgid "document presentation"
+msgstr "بەڵگەنامەی پێشکەشکردن"
+
+#: atk/atkobject.c:191
+msgid "document text"
+msgstr "بەڵگەنامەی دەق"
+
+#: atk/atkobject.c:192
+msgid "document web"
+msgstr "بەڵگەنامەی وێب"
+
+#: atk/atkobject.c:193
+msgid "document email"
+msgstr "بەڵگەنامەی پۆستی ئەلکترۆنی"
+
+#: atk/atkobject.c:194
+msgid "comment"
+msgstr "لێدوان"
+
+#: atk/atkobject.c:195
+msgid "list box"
+msgstr "چوارچیوەی لیستە"
+
+#: atk/atkobject.c:196
+msgid "grouping"
+msgstr "گرووپکردن"
+
+#: atk/atkobject.c:197
+msgid "image map"
+msgstr "نەخشەی وێنە"
+
+#: atk/atkobject.c:198
+msgid "notification"
+msgstr "ئاگانامە"
+
+#: atk/atkobject.c:199
+msgid "info bar"
+msgstr "توڵی زانیاری"
+
+#: atk/atkobject.c:200
+msgid "level bar"
+msgstr "توڵی ئاست"
+
+#: atk/atkobject.c:201
+msgid "title bar"
+msgstr "توڵی ناونیشان"
+
+#: atk/atkobject.c:202
+msgid "block quote"
+msgstr ""
+
+#: atk/atkobject.c:203
+msgid "audio"
+msgstr "دەنگ"
+
+#: atk/atkobject.c:204
+msgid "video"
+msgstr "ڤیدیۆ"
+
+#: atk/atkobject.c:205
+msgid "definition"
+msgstr "پێناسە"
+
+#: atk/atkobject.c:206
+msgid "article"
+msgstr "بابەت"
+
+#: atk/atkobject.c:207
+msgid "landmark"
+msgstr "هێمای بازرگانی"
+
+#: atk/atkobject.c:208
+msgid "log"
+msgstr "تۆمار"
+
+#: atk/atkobject.c:209
+msgid "marquee"
+msgstr ""
+
+#: atk/atkobject.c:210
+msgid "math"
+msgstr "بیرکاری"
+
+#: atk/atkobject.c:211
+msgid "rating"
+msgstr "پلەبەندی"
+
+#: atk/atkobject.c:212
+msgid "timer"
+msgstr "کاتپێو"
+
+#: atk/atkobject.c:213
+msgid "description list"
+msgstr "لیستەی کورتە"
+
+#: atk/atkobject.c:214
+msgid "description term"
+msgstr "بڕگەی کورتە"
+
+#: atk/atkobject.c:215
+msgid "description value"
+msgstr "نرخی کورتە"
+
+#: atk/atkobject.c:391
+msgid "Accessible Name"
+msgstr "ناوی پەردەوژ"
+
+#: atk/atkobject.c:392
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:398
+msgid "Accessible Description"
+msgstr "دەربارەی پەردەوژ"
+
+#: atk/atkobject.c:399
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:405
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:406
+msgid ""
+"Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+
+#: atk/atkobject.c:422
+msgid "Accessible Value"
+msgstr "نرخی پەردەوژ"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the value has changed"
+msgstr "بەکاردەهێنرێت بۆ ئەوەی ئاگادارت بکاتەوە کە نرخێ بگۆڕدرێت"
+
+#: atk/atkobject.c:431
+msgid "Accessible Role"
+msgstr "ڕۆڵی پەردەوژ"
+
+#: atk/atkobject.c:432
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:439
+msgid "Accessible Layer"
+msgstr "چینی پەردوژ"
+
+#: atk/atkobject.c:440
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:448
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:449
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:465
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:466
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:480
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:481
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:497
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:512
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:513
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:534
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:535
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:541
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:542
+msgid "Is used to notify that the table caption has changed"
+msgstr "بەکارێت بۆ ئاگادارکردنەوە لە کاتی گۆڕینی سەردێڕی خشتە"
+
+#: atk/atkobject.c:548
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:549
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "زۆر لاوازە"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "لاواز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "گونجاوە"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "بەهێز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "زۆر بەهێز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "زۆر کەمە"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "ناوەند"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "بەرز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "زۆر بەرز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "زۆر خراپ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "خراپ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "باشە"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "زۆر باشە"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "باشترینە"
index 406ebc5..a118389 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -1,15 +1,19 @@
 # Czech translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
+#
+# Michal Bukovjan <bukm@centrum.cz>, 2002.
+# Miloslav Trmac <mitr@volny.cz>, 2003, 2004, 2005.
+# Petr Tomeš <ptomes@gmail.com>, 2006.
+# Lucas Lommer <llommer@svn.gnome.org>, 2008, 2009, 2011.
 # Marek Černocký <marek@manet.cz>, 2011, 2014.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-02-08 07:39+0100\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-25 14:51+0200\n"
 "Last-Translator: Marek Černocký <marek@manet.cz>\n"
 "Language-Team: Czech <gnome-cs-list@gnome.org>\n"
 "Language: cs\n"
@@ -19,11 +23,788 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "X-Generator: Gtranslator 2.91.6\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Vybraný odkaz"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Určuje, jestli je objekt AtkHyperlink vybrán"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Počet ukotvení"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Počet ukotvení asociovaných s objektem AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Index konce"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Index konce objektu AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Index začátku"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Indek začátku objektu AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "neplatný"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "popisek klávesové zkratky"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "upozornění"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animace"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "šipka"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalendář"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "plátno"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "zaškrtávací políčko"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "zaškrtávací položka nabídky"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "výběr barvy"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "záhlaví sloupce"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "kombo box"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "editor data"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "ikona pracovní plochy"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "rám pracovní plochy"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "číselník"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "dialog"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "panel adresářů"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "kreslicí oblast"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "výběr souboru"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "plnič"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "výběr písma"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "rám"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "skleněný panel"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "kontejner html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikona"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "obrázek"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "interní rám"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "popisek"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "vrstvený panel"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "seznam"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "položka seznamu"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "nabídka"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "panel nabídky"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "tlačítko nabídky"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "položka nabídky"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "panel voleb"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "záložka stránky"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "seznam záložek stránky"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "text hesla"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "vyskakovací nabídka"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "lišta průběhu"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "tlačítko"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "rádiové tlačítko"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "přepínací položka nabídky"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "kořenový panel"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "záhlaví řádku"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "posuvná lišta"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "posuvný panel"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "oddělovač"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "posunovač"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "oddělený panel"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "otáčecí tlačítko"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "stavová-lišta"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tabulka"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "buňka tabulky"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "záhlaví sloupce tabulky"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "záhlaví řádku tabulky"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "odtrhávací položka nabídky"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminál"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "přepínač"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "nástrojová lišta"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "tip"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "strom"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "stromová tabulka"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "neznámý"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "pohled"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "okno"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "záhlaví"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "zápatí"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "odstavec"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "pravítko"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplikace"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "autodoplnění"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "editační lišta"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "vložená komponenta"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "vstupní pole"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "graf"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "titulek"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "rám dokumentu"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "záhlaví"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "strana"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "oddíl"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "redundantní objet"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formulář"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "odkaz"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "okno vstupní metody"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "řádek tabulky"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "položka stromu"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "tabulka v dokumentu"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "prezentace v dokumentu"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "text v dokumentu"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "webová stránka v dokumentu"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "e-mail dokumentu"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "komentář"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "seznam"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "skupiny"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "obrázková mapa"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "oznámení"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "informační lišta"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "ukazatel úrovně"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "záhlaví"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "citace"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "zvuk"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definice"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "článek"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "orientační bod"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "záznam"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "běžící text"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematika"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "hodnocení"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "časovač"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "seznam definic"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "termín definice"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "hodnota definice"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Zpřístupněný název"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Název instance objektu formátovaný pro použití technologiemi zpřístupnění"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Zpřístupněný popis"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Popis objektu formátovaný pro použití technologiemi zpřístupnění"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Zpřístupněný rodič"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Rodič aktuálního zpřístupnění, tak jak jej vrací funkce "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Zpřístupněná hodnota"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Používá se pro upozornění, že hodnota byla změněna"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Zpřístupněná role"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Zpřístupněná role tohoto objektu"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Zpřístupněná vrstva"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Zpřístupněná vrstva tohoto objektu"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Zpřístupněná hodnota MDI"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Zpřístupněná hodnota MDI tohoto objektu"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Zpřístupněný nadpis tabulky"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Používá se pro upozornění, že nadpis tabulky byl změněn; tato vlastnost by "
+"se neměla používat. Místo toho by se mělo používat accessible-table-caption-"
+"object"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Zpřístupněné záhlaví sloupce tabulky"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Používá se pro upozornění, že záhlaví sloupce tabulky bylo změněno"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Zpřístupněný popis sloupce tabulky"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Používá se pro upozornění, že popis sloupce tabulky byl změněn"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Zpřístupněné záhlaví řádku tabulky"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Používá se pro upozornění, že záhlaví řádku tabulky bylo změněno"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Zpřístupněný popis řádku tabulky"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Používá se pro upozornění, že popis řádku tabulky byl změněn"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Zpřístupněný souhrn tabulky"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Používá se pro upozornění, že souhrn tabulky byl změněn"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Zpřístupněný objekt nadpisu tabulky"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Používá se pro upozornění, že nadpis tabulky byl změněn"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Počet zpřístupněných odkazů hypertextu"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Počet odkazů, které má aktuální AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "velmi slabé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "slabé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "přijatelné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "silné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "velmi silné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "velmi nízké"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "střední"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "vysoké"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "velmi vysoké"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "velmi špatné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "špatné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "dobré"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "velmi dobré"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "nejlepší"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Aplikace již neexistuje"
-
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Pokus o synchronní volání tam, kde je zakázáno"
diff --git a/po/cy.po b/po/cy.po
new file mode 100644 (file)
index 0000000..835d331
--- /dev/null
+++ b/po/cy.po
@@ -0,0 +1,543 @@
+# atk yn Gymraeg.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the ATK package.
+# Dafydd Harries <daf@muse.19inch.net>, 2003 2004.
+# Rhys Jones <rhys@sucs.org>, 2003.
+# Iestyn Pryce <dylunio@gmail.com>, 2009.
+#
+# [rhys] Caption -> 'capsiwn' yn hytrach na 'pennawd', er mwyn gwahaniaethu
+# rhwng 'caption' a 'header' (cyfieithir 'header' fel 'pennawd'). Hefyd
+# mae 'pennawd' yn awgrymu rhywbeth ar ben eitem; nid yw hyn o hyd yn wir
+# am 'caption' (yn enwedig pan yn sôn am dablau)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2009-07-30 21:50+0100\n"
+"Last-Translator: Iestyn Pryce <dylunio@gmail.com>\n"
+"Language-Team: Welsh <gnome-cy@pengwyn.linux.org.uk>\n"
+"Language: cy\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Dolen Ddewisedig"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Penodi a yw'r gwrthrych AtkHyperlink wedi ei ddewis"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Nifer yr Angorau"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Nifer yr angorau sy'n gysylltiedig a'r gwrthrych AtkHyperlink"
+
+# EFALLAI
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Rhif mynegai olaf"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Rhif mynegai olaf y gwrthrych AtkHyperlink"
+
+# EFALLAI
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Rhif mynegai cyntaf"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Rhif mynegai cyntaf y gwrthrych AtkHyperlink"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "annilys"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "label cyflymu"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "rhybudd"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "animeiddiad"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "saeth"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "calendr"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "cynfas"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "blwch dewis"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "eitem dewislen dewis"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "dewiswr lliw"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "pennawd colofn"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "blwch cyfun"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "newidydd dyddiad"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "eicon bwrdd gwaith"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ffrâm bwrdd gwaith"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "deial"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "deialog"
+
+# EFALLAI
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "chwarel cyfeiriadur"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "ardal arlunio"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "dewiswr ffeiliau"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "llenwydd"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "dewiswr ffont"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "ffrâm"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "chwarel-wydr"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "cynhwysydd html"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "eicon"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "delwedd"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ffrâm fewnol"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "chwarel wedi haenu"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "rhestr"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "eitem rhestr"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "dewislen"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "bar dewislen"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "eitem dewislen"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "chwarel opsiwn"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "tab tudalen"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "rhestr tab tudalen"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "testun cyfrinair"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "naidlen"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "bar cynnydd"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "botwm gwasgu"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "botwm radio"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "eitem dewislen radio"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "chwarel gwraidd"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "pennawd rhes"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "bar sgrolio"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "chwarel sgrolio"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "gwahanwr"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "llithrwr"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "chwarel hollt"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "botwm troelli"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "bar-statws"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "tabl"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "cell tabl"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "pennawd colofn tabl"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "pennawd rhes tabl"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "eitem dewislen rhwygadwy"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terfynell"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "testun"
+
+# EFALLAI
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "botwm togl"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "bar offer"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "cyngor offer"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "coeden"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "tabl coeden"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "anhysbys"
+
+# EFALLAI
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "porth-golwg"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "ffenest"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "penawd"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "troedyn"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraff"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "mesur"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "rhaglen"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "cwblhad awtomatig"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "bar golygu"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "cydran mewnosodied"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "cofnod"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "siart"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "capsiwn"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "ffrâm ddogfen"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "pennawd"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "tudalen"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "adran"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "gwrthrych diangen"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "ffurflen"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr "cyswllt"
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr "ffenest modd mewnbwn"
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Enw Hygyrchol"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Enw'r enghraifft gwrthrych wedi ei fformadu er mwyn ei ddefnyddio gyda "
+"technoleg hygyrchol"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Disgrifiad Hygyrchol"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Disgrifiad gwrthrych, wedi ei fformadu er mwyn ei ddefnyddio gyda technoleg "
+"hygyrchol"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Rhiant Hygyrchol"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Defnyddir er mwyn hysbysu fod y rhiant wedi newid"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Gwerth Hygyrchol"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Defnyddir er mwyn hysbysu fod y gwerth wedi newid"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Rôl Hygyrchol"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Rôl hygyrchol y gwrthrych hwn"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Haen Hygyrchol"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Haen hygyrchol y gwrthrych hwn"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Gwerth MDI Hygyrchol"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Gwerth MDI Hygyrchol y gwrthrych hwn"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Capsiwn Tabl Hygyrchol"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Defnyddir er mwyn hysbysu fod capsiwn y tabl wedi newid; ni ddylid "
+"defnyddio'r nodwedd hon. Dylid defnyddio accessible-table-caption-object yn "
+"ei lle"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Pennawd Colofn Tabl Hygyrchol"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Defnyddir er mwyn hysbysu fod pennawd colofn y tabl wedi newid"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Disgrifiad Colofn Tabl Hygyrchol"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Defnyddir er mwyn hysbysu fod disgrifiad colofn y tabl wedi newid"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Pennawd Rhes Tabl Hygyrchol"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Defnyddir er mwyn hysbysu fod pennawd rhes y tabl wedi newid"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Disgrifiad Rhes Tabl Hygyrchol"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Defnyddir er mwyn hysbysu fod disgrifiad rhes y tabl wedi newid"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Crynodeb Tabl Hygyrchol"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Defnyddir er mwyn hysbysu fod crynodeb y tabl wedi newid"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Gwrthrych Capsiwn Tabl Hygyrchol"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Defnyddir er mwyn hysbysu fod capsiwn y tabl wedi newid"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Nifer Cysylltion y Gordestun Hygyrchol"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Nifer y cysylltion sydd gan yr AtkHypertext cyfredol"
index 1724397..15083a1 100644 (file)
--- a/po/da.po
+++ b/po/da.po
+# #-#-#-#-#  da.po (at-spi2-core master)  #-#-#-#-#
 # Danish translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Kris Thomsen <lakristho@gmail.com>, 2011.
 #
+# #-#-#-#-#  da.po (atk)  #-#-#-#-#
+# Danish translation of ATK.
+# Copyright (C) 2002-2007, 2014 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# Ole Laursen <olau@hardworking.dk>, 2002, 03, 04, 06.
+# Martin Willemoes Hansen <mwh@sysrq.dk>, 2004.
+# Kenneth Nielsen <k.nielsen81@gmail.com>
+# flemming christensen <fc@stromata.dk>, 2011.
+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2014, 2022.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: "
-"https://bugzilla.gnome.org/enter_bug.cgi?product=at-spi&keywords=I18N+L10N&component=at-spi2-core\n"
-"POT-Creation-Date: 2017-06-27 21:34+0000\n"
-"PO-Revision-Date: 2014-03-15 14:12+0100\n"
-"Last-Translator: Kris Thomsen <lakristho@gmail.com>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-27 20:22+0200\n"
+"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
 "Language: da\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  da.po (at-spi2-core master)  #-#-#-#-#\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"#-#-#-#-#  da.po (atk)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Valgt henvisning"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Angiver om AtkHyperlink-objektet er valgt"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Antal ankre"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Antallet af ankre der er associeret med AtkHyperlink-objektet"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Slutindeks"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Slutindeks for AtkHyperlink-objektet"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Startindeks"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Startindeks for AtkHyperlink-objektet"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "ugyldig"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "genvejsetiket"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "advarsel"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animation"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "pil"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalender"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "lærred"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "afkrydsningsboks"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "afkrydsningsmenupunkt"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "farvevælger"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "kolonnetitel"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "kombinationsboks"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "datoredigering"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "skrivebordsikon"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "skrivebordsramme"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "opkald"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "dialog"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "mappepanel"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "tegneområde"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "filvælger"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "udfylder"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "skrifttypevælger"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "ramme"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "glaspanel"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html-beholder"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikon"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "billede"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "intern ramme"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiket"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "lagdelt panel"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "liste"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "listepunkt"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "menulinje"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "menuknap"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "menupunkt"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "indstillingspanel"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "sidefaneblad"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "sidefanebladsliste"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "adgangskodetekst"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "pop-op-menu"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "fremgangslinje"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "trykknap"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "radioknap"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "radiomenupunkt"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "rodpanel"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "rækketitel"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "rulleskakt"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "rullepanel"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "adskiller"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "skyder"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "delt panel"
+
+# dækker betydningen
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "rulleknap"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "statuslinje"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tabel"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "tabelcelle"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "tabelkolonnetitel"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "tabelrækketitel"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "afrivningsmenupunkt"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "tekst"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "skifteknap"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "værktøjslinje"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "værktøjstip"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "træ"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "trætabel"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "ukendt"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "visningsområde"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "vindue"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "sidehoved"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "sidefod"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "afsnit"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "lineal"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "program"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "autofuldførelse"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "redigér linje"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "indlejret komponent"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "felt"
 
-#: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagram"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "tekst"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "dokumentramme"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "overskrift"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "side"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "sektion"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "redundant objekt"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formular"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "henvisning"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "vindue for indtastningsmetode"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "tabelrække"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "træelement"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "dokumentregneark"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "dokumentpræsentation"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "dokumenttekst"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "dokumentweb"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "dokument-e-mail"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "kommentar"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "listeboks"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "gruppering"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "billedkort"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "påmindelse"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "informationsbjælke"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "niveaubjælke"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "titelbjælke"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "citatblok"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "lyd"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definition"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "artikel"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "landmærke"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "log"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "titelskilt"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematik"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "bedømmelse"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "timer"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "beskrivelsesliste"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "beskrivelsesbegreb"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "beskrivelsesværdi"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Tilgængeligt navn"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Objektinstansens navn formateret til tilgængelighedsteknologier"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Tilgængelig beskrivelse"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Beskrivelse af et objekt, formateret til tilgængelighedsteknologier"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Ophavselement for tilgængeligt object"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Ophavselement for det nuværende tilgængelige objekt som returneret af "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Tilgængelig værdi"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Bruges til at bekendtgøre at værdien er ændret"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Tilgængelig rolle"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Tilgængelighedsrolle for dette objekt"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Tilgængelighedslag"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Tilgængelighedslaget for dette objekt"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Tilgængeligheds-MDI-værdi"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Tilgængeligheds-MDI-værdien for dette objekt"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Tilgængelighedstabeltitel"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Bruges til at bekendtgøre at tabeltitlen er ændret; denne egenskab bør ikke "
+"benyttes. accessible-table-caption-object bør bruges i stedet"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Tilgængelighedstabelkolonnetitel"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Bruges til at bekendtgøre at tabelkolonnetitlen er ændret"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Tilgængelighedstabelkolonnebeskrivelse"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Bruges til at bekendtgøre at tabelkolonnebeskrivelsen er ændret"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Tilgængelighedstabelrækkebeskrivelse"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Bruges til at bekendtgøre at tabelrækketitlen er ændret"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Tilgængelighedstabelrækkebeskrivelse"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Bruges til at bekendtgøre at tabelrækkebeskrivelsen er ændret"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Tilgængelighedstabelsammendrag"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Bruges til at bekendtgøre at tabelsammendraget er ændret"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Tilgængelighedstabeltitelobjekt"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Bruges til at bekendtgøre at tabeltitlen er ændret"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Antal tilgængelighedshypertekst-henvisninger"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Antallet af henvisninger som den aktuelle AtkHypertext har"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "meget svag"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "svag"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "rimelig"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "stærk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "meget stærk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "meget lav"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "mellem"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "høj"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "meget høj"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "meget dårlig"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "dårlig"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "god"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "meget god"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "bedst"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Programmet findes ikke længere"
 
-#: atspi/atspi-misc.c:1843
-msgid "Attempted synchronous call where prohibited"
-msgstr "Et forsøgt synkront kald blev forbudt"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Et forsøgt synkront kald blev forbudt"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Ukendt signatur %s for RemoveAccessible"
@@ -56,8 +849,8 @@ msgstr "Et forsøgt synkront kald blev forbudt"
 #~ msgid ""
 #~ "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
 #~ msgstr ""
-#~ "AT-SPI: forventede en variant under hentning af %s fra grænseflade %s; fik "
-#~ "%s\n"
+#~ "AT-SPI: forventede en variant under hentning af %s fra grænseflade %s; "
+#~ "fik %s\n"
 
 #~ msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
 #~ msgstr "atspi_dbus_get_property: Forkert type: forventede %s, fik %c\n"
@@ -74,10 +867,11 @@ msgstr "Et forsøgt synkront kald blev forbudt"
 #~ msgid ""
 #~ "called atspi_event_listener_register_from_callback with a NULL event_type"
 #~ msgstr ""
-#~ "kaldte atspi_event_listener_register_from_callback event_type med en "
-#~ "NULL-værdi"
+#~ "kaldte atspi_event_listener_register_from_callback event_type med en NULL-"
+#~ "værdi"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Modtog ugyldig signatur %s for signalet %s fra grænseflade %s\n"
 
-
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Bruges til at bekendtgøre at ophavet er ændret"
index 5f0bdff..1179de1 100644 (file)
--- a/po/de.po
+++ b/po/de.po
+# #-#-#-#-#  de.po (at-spi2-core master)  #-#-#-#-#
 # German translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011.
 # Mario Blättermann <mariobl@gnome.org>, 2011.
 # Wolfgang Stöggl <c72578@yahoo.de>, 2014.
+# Jürgen Benvenuti <gastornis@posteo.org>, 2022.
+#
+# #-#-#-#-#  de.po (atk 1.5.4)  #-#-#-#-#
+# German atk translation.
+# Copyright (C) 2002-2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# Christian Neumair <chris@gnome-de.org>, 2002-2004.
+# Hendrik Richter <hendrikr@gnome.org>, 2004, 2005, 2006.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-08-14 08:27+0100\n"
-"Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
-"Language-Team: Deutsch <gnome-de@gnome.org>\n"
+"Project-Id-Version: atk 1.5.4\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-11 18:31+0200\n"
+"Last-Translator: Jürgen Benvenuti <gastornis@posteo.org>\n"
+"Language-Team: German <gnome-de@gnome.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.6.7\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Ausgewählter Link"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Gibt an, ob das AtkHyperlink-Objekt ausgewählt ist"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Ankeranzahl"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Die Anzahl der mit dem AtkHyperlink-Objekt assoziierten Anker"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Endindex"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Der Endindex des AtkHyperlink-Objekts"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Anfangsindex"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Der Anfangsindex des AtkHyperlink-Objekts"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "ungültig"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "Kürzelbeschriftung"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "Alarm"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "Animation"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "Pfeil"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "Kalender"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "Leinwand"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "Kontrollkästchen"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "Kontrollmenüobjekt"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "Farbwähler"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "Spaltenkopf"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "Kombinationsfeld"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "Datumseditor"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "Desktop-Symbol"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "Desktop-Rahmen"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "Drehknopf"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "Dialog"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "Verzeichnisleiste"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "Zeichenfeld"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "Dateiwähler"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "Füller"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "Schriftwähler"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "Rahmen"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "Glasleiste"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "HTML-Container"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "Symbol"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "Bild"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "interner Rahmen"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "Beschriftung"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "Schichtleiste"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "Liste"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "Listenobjekt"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "Menü"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "Menüleiste"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "Menüknopf"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "Menüobjekt"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "Optionsleiste"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "Seitenreiter"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "Seitenreiter-Liste"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "Panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "Passworttext"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "Popup-Menü"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "Fortschrittsleiste"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "Druckknopf"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "Radioknopf"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "Radiomenüobjekt"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "Wurzelleiste"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "Zeilenkopf"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "Rollbalken"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "Rollleiste"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "Trennlinie"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "Schieber"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "geteilte Leiste"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "Einstellknopf"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "Statusleiste"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "Tabelle"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "Tabellenzelle"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "Spaltenkopf einer Tabelle"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "Zeilenkopf einer Tabelle"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "Objekt in Abrissmenü"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "Terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "Text"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "Auslöseknopf"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "Werkzeugleiste"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "Minihilfe"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "Baum"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "Baumtabelle"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "unbekannt"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "Sichtfeld"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "Fenster"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "Kopfzeile"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "Fußzeile"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "Absatz"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "Lineal"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "Anwendung"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "Auto-Vervollständigung"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "Bearbeitungsleiste"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "eingebettete Komponente"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "Eingabefeld"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "Diagramm"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "Beschriftung"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "Dokumenten-Rahmen"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "Überschrift"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "Seite"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "Abschnitt"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "Redundantes Objekt"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "Formular"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "Verknüpfung"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "Fenster mit Eingabemöglichkeit"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "Tabellenzeile"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "Baumobjekt"
+
+# Bug 728557
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "Tabellendokument"
+
+# Bug 728557
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "Präsentation"
+
+# Bug 728557
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "Textdokument"
+
+# Bug 728557
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "Internetseite"
+
+# Bug 728557
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "E-Mail"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "Kommentar"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "Listenbox"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "Gruppierung"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "Bildkarte"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "Benachrichtigung"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "Statusleiste"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "Pegelbalken"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "Titelleiste"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "Blockzitat"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "Audio"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "Video"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "Definition"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "Artikel"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "Orientierungshilfe"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "Protokoll"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "Markise"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "Mathematik"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "Bewertung"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "Rückwärtszähler"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "Beschreibungsliste"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "Beschreibungsbegriff"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "Beschreibungswert"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Barrierefreier Name"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Name der Objektinstanz, formatiert für den Zugriff durch Hilfstechnologien"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Barrierefreie Beschreibung"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Beschreibung eines Objekts, formatiert für den Zugriff durch "
+"Hilfstechnologien"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Barrierefreies Eltern-Element"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Eltern-Element des aktuellen barrierefreien wie von atk_object_get_parent() "
+"zurückgegeben"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Barrierefreier Wert"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Wird zur Benachrichtigung bei Wertänderungen verwendet"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Barrierefreie Rolle"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Die barrierefreie Rolle dieses Objekts"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Barrierefreie Ebene"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Die barrierefreie Ebene dieses Objekts"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Barrierefreier MDI-Wert"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Der barrierefreie MDI-Wert dieses Objekts"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Barrierefreie Tabellenüberschrift"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen der Tabellenbeschriftung verwendet; "
+"statt dieser Eigenschaft sollte »accessible-table-caption-object« verwendet "
+"werden"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Barrierefreie Überschrift der Tabellenspalte"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen an der Überschrift der "
+"Tabellenspalte verwendet"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Barrierefreie Beschreibung der Tabellenspalte"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen an der Beschreibung der "
+"Tabellenspalte verwendet"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Barrierefreie Überschrift der Tabellenzeile"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen an der Überschrift der "
+"Tabellenzeile verwendet"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Barrierefreie Beschreibung der Tabellenzeile"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen an der Beschreibung der "
+"Tabellenzeile verwendet"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Barrierefreie Tabellenzusammenfassung"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen an der Tabellenzusammenfassung "
+"verwendet"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Barrierefreies Objekt zur Tabellenbeschriftung"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+"Wird zur Benachrichtigung bei Änderungen an der Tabellenbeschriftung "
+"verwendet"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Anzahl der barrierefreien Hypertext-Links"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Die Anzahl der Links, die der derzeitige AtkHypertext hat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "sehr schwach"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "schwach"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "akzeptabel"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "stark"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "sehr stark"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "sehr niedrig"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "mittel"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "hoch"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "sehr hoch"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "sehr schlecht"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "schlecht"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "gut"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "sehr gut"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "am besten"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Die Anwendung existiert nicht mehr"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Versuchter synchroner Aufruf an verbotener Stelle"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Versuchter synchroner Aufruf an verbotener Stelle"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Unbekannte Signatur »%s« für RemoveAccessible"
@@ -100,3 +908,7 @@ msgstr "Versuchter synchroner Aufruf an verbotener Stelle"
 
 #~ msgid "AT-SPI: Couldn't register with bus: %s\n"
 #~ msgstr "AT-SPI: Es konnte nicht am Bus registriert werden: %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr ""
+#~ "Wird zur Benachrichtigung bei Änderungen am Eltern-Element verwendet"
diff --git a/po/dz.po b/po/dz.po
new file mode 100644 (file)
index 0000000..c012923
--- /dev/null
+++ b/po/dz.po
@@ -0,0 +1,537 @@
+# Dzongkha translation of atk
+# Copyright @ 2006 Free Software Foundation, Inc.
+# Mindu Dorji
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk.HEAD.dz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2006-06-12 16:08+0530\n"
+"Last-Translator: Mindu Dorji\n"
+"Language-Team: DZONGKHA <pgeyleg@dit.gov.bt>\n"
+"Language: dz\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Dzongkha\n"
+"X-Poedit-Country: BHUTAN\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2;plural=(n!=1);\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "སེལ་འཐུ་འབད་མི་འབྲེལ་ལམ།"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "ཨེ་ཊི་ཀེ་ཧའི་པར་ལིངཀ་དངོས་པོ་དེ་ སེལ་འཐུ་འབད་མ་འབད་ གསལ་བཀོད་འབདཝ་ཨིན།"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "ཨེན་ཀོར་གྱི་གྱངས་ཁ།"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "ཨེ་ཊི་ཀེ་ཧའི་པར་ལིངཀ་ དངོས་པོ་དང་འབྲེལ་བའི་ ཨེན་ཀོར་གྱི་གྱངས་ཁ།"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "མཇུག་གི་ཟུར་ཐོ།"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "ཨེ་ཊི་ཀེ་ཧའི་པར་ལིངཀ་ དངོས་པོའི་མཇུག་གི་ཟུར་ཐོ།"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "འགོ་བཙུགས་ཟུར་ཐོ།"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "ཨེ་ཊི་ཀེ་ཧའི་པར་ལིངཀ་ དངོས་པོའི་འགོ་བཙུགས་ཟུར་ཐོ།"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "ནུས་མེད།"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "མགྱོགས་འཕྲུལ་ཁ་ཡིག"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "དྲན་བརྡ།"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "བསྒུལ་བཟོ།"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "མདའ་རྟགས།"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "ཟླ་ཐོ།"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "འབྲི་གཞི།"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "དཔྱད་སྒྲོམ།"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "དཀར་ཆག་རྣམ་གྲངས་ཞིབ་དཔྱད་འབད།"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "ཚོས་གཞི་འདེམས་བྱེད།"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "ཀེར་ཐིག་མགོ་ཡིག"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "བརྟག་སྒྲོམ།"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "ཚེས་གྲངས་ཞུན་དགཔ།"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ཌེཀསི་ཊོཔ་ ངོས་དཔར།"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ཌེཀསི་ཊོཔ་ གཞི་ཁྲམ།"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "འཁོར་མིག"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "ཌའི་ལོག"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "སྣོད་ཐོའི་པེན།"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "འབྲི་སའི་མངའ་ཁོངས།"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ཡོག་སྣོད་འདེམས་བྱེད།"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "བཀང་མི།"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ཡིག་གཟུགས་འདེམས་བྱེད།"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "གཞི་ཁྲམ།"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "ཤེལ་གྱི་པེན།"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "ཨེཆ་ཊི་ཨེམ་ཨེལ་འཛིན་སྣོད།"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "ངོས་དཔར།"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "གཟུགས་བརྙན།"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ནང་འཁོད་གཞི་ཁྲམ།"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "ཁ་ཡིག"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "བང་རིམ་ཅན་གྱི་པེན།"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "ཐོ་ཡིག"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "ཐོ་ཡིག་རྣམ་གྲངས།"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "དཀར་ཆག"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "དཀར་ཆག་ཕྲ་རིང།"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "དཀར་ཆག་རྣམ་གྲངས།"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "གདམ་ཁའི་པེན།"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "ཤོག་ལེབ་མཆོང་ལྡེ།"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "ཤོག་ལེབ་མཆོང་ལྡེའི་ཐོ་ཡིག"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "པེ་ནཱལ།"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "ཆོག་ཡིག་གི་ཚིག་ཡིག"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "དཀར་ཆག་པོཔ་ཨཔ་འབད།"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ཡར་འཕེལ་ཕྲ་རིང།"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "འཕུལ་རྟ།"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "སྒྲ་རླབས་ཨེབ་རྟ།"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "སྒྲ་རླབས་དཀར་ཆག་རྣམ་གྲངས།"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "རྩ་བའི་པེན།"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "གྲལ་ཐིག་མགོ་ཡིག"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "བཤུད་ཕྲ༌།"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "བཤུད་སྒྲིལ་པེན།"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "དབྱེ་བྱེད།"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "གཡོ་བྱེད།"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "པེན་གཤག"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "བསྒྱིར་རྟ།"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "གནས་ཚད་ཕྲ་རིང༌།"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "ཐིག་ཁྲམ།"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "ཐིག་ཁྲམ་གྱི་ནང་ཐིག"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "ཐིག་ཁྲམ་ཀེར་ཐིག་གི་མགོ་ཡིག"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "ཐིག་ཁྲམ་གྲལ་ཐིག་གི་མགོ་ཡིག"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "ཧྲལ་གཏང་དཀར་ཆག་རྣམ་གྲངས།"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "ཊར་མི་ནཱལ།"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "ཚིག་ཡིག"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "སོར་སྟོན་ཨེབ་རྟ།"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "ལག་ཆས་ཕྲ་རིང༌།"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "ལག་ཆས་ཕན་བསླབ།"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "རྩ་འབྲེལ།"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "རྩ་འབྲེལ་ཐིག་ཁྲམ།"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "མ་ཤེས་པ།"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "མཐོང་སྣང་འདྲེན་ལམ།"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "སྒོ་སྒྲིག"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "མགོ་ཡིག"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "མཇུག་ཡིག"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "དོན་མཚམས།"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "དྲན་བརྡ།"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "འཇུག་སྤྱོད།"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "རང་བཞིན་ཡོངས་རྫོགས།"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "ཞུན་དག་ཕྲ་རིང༌།"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "གནས་འདྲེན་ཆ་ཤས།"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "ཐོ་བཀོད།"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "ཚད་རིས།"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "པར་བཤད།"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "ཡིག་ཆའི་གཞི་ཁྲམ།"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "མགུ་རྒྱན།"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "ཤོག་ལེབ།"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "དབྱེ་ཚན།"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "མང་དྲགས་འཔི་དངོས་པོ།"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "འབྲི་ཤོག"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "འཛུལ་སྤྱོད་འབད་བཏུབ་པའི་མིང༌།"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"ཕན་ཐབས་་འཕྲུལ་རིག་ལུ་ འཛུལ་སྤྱོད་འབད་ནི་གི་དོན་ལུ་ དངོས་པོའི་དཔེར་བརྗོད་ཀྱི་མིང་ རྩ་སྒྲིག་འབད་ཡོདཔ།"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་འགྲེལ་བཤད།"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "དངོས་པོའི་འགྲེལ་བཤད་ ཕན་ཐབས་འཕྲུལ་རིག་ལུ་ འཛུལ་སྤྱོད་འབད་ནི་གི་དོན་ལས་ རྩ་སྒྲིག་འབད་ཡོདཔ།"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་རྩ་ལག"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "རྩ་ལག་དེ་བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་འབད་ནིའི་དོན་ལུ་ ལག་ལེན་འཐབ་ཨིན།"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་བེ་ལུ།"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "བེ་ལུ་དེ་བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་འབད་ནིའི་དོན་ལས་ ལག་ལེན་འཐབ་ཨིན།"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ལས་འགན།"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "དངོས་པོ་འདི་གི་ འཛུལ་སྤྱོད་བཏུབ་པའི་ལས་འགན།"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་བང་རིམ།"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "དངོས་པོ་འདི་གི་ འཛུལ་སྤྱོད་བཏུབ་པའི་བང་རིམ།"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཨེམ་དྲི་ཨའི་བེ་ལུ།"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "དངོས་པོ་འདི་གི་ འཛུལ་སྤྱོད་བཏུབ་པའི་ ཨེམ་དྲི་ཨའི་བེ་ལུ།"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཐིག་ཁྲམ་གྱི་འགོ་བརྗོད། "
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ཐིག་ཁྲམ་གྱི་འགོ་བརྗོད་དེ་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་བྱིན་ནི་ལུ་ ལག་ལེན་འཐབ་ཨིན། རྒྱུ་དངོས་འདི་ལག་"
+"ལེན་འཐབ་ནི་མི་འོང༌། འདི་གི་ཚབ་ལུ་ འཛུལ་སྤྱོད་བཏུབ་པའི་-ཐིག་ཁྲམ་ -འགོ་བརྗོད་ -དངོས་པོ་ ལག་ལེན་འཐབ་"
+"དགོ"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཐིག་ཁྲམ་གྱི་ཀེར་ཐིག་མགོ་ཡིག"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"ཐིག་ཁྲམ་གྱི་ཀེར་ཐིག་མགོ་ཡིག་དེ་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་བྱིན་ནིའི་དོན་ལུ་ ལག་ལེན་འཐབ་ཨིན།"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཐིག་ཁྲམ་གྱི་ ཀེར་ཐིག་འགྲེལ་བཤད།"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"ཐིག་ཁྲམ་གྱི་ ཀེར་ཐིག་འགྲེལ་བཤད་དེ་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་བྱིན་ནིའི་དོན་ལུ་ ལག་ལེན་འཐབ་ཨིན།"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཐིག་ཁྲམ་གྱི་ གྲལ་ཐིག་མགོ་ཡིག"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"ཐིག་ཁྲམ་གྱི་ གྲལ་ཐིག་མགོ་ཡིག་དེ་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་བྱིན་ནིའི་དོན་ལུ་ ལག་ལེན་འཐབ་ཨིན།"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཐིག་ཁྲམ་གྱི་ གྲལ་ཐིག་འགྲེལ་བཤད།"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"ཐིག་ཁྲམ་གྱ་ི གྲལ་ཐིག་འགྲེལ་བཤད་དེ་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་འབད་ནི་གི་དོན་ལུ་ ལག་ལེན་འཐབ་"
+"ཨིན།"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཐིག་ཁྲམ་གྱི་བཅུད་སྡུད།"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "ཐིག་ཁྲམ་བཅུད་སྡུད་དེ་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་འབད་ནིའི་དོན་ལུ་ ལག་ལེན་འཐབ་ཨིན།"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "འཛུལ་སྤྱོད་བཏུཔ་པའི་ ཐིག་ཁྲམ་འགོ་བརྗོད་ཀྱི་དངོས་པོ།"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "ཐིག་ཁྲམ་འགོ་བརྗོད་འདི་ བསྒྱུར་བཅོས་སོང་ཡོད་པའི་ བརྡ་བསྐུལ་བྱིན་ནིའི་དོན་ལུ་ ལག་ལེན་འཐབ་ཨིན། "
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "འཛུལ་སྤྱོད་བཏུབ་པའི་ ཧའི་པར་ཊེགསི་འབྲེལ་ལམ་གྱི་གྱངས་ཁ།"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ཨེ་ཊི་ཀེ་ཧའི་པར་ཊེགསི་ལུ་ཡོད་པའི་ ད་ལྟོའི་འབྲེལ་ལམ་གྱི་གྱངས་ཁ།"
index 4ea573c..fc025eb 100644 (file)
--- a/po/el.po
+++ b/po/el.po
+# #-#-#-#-#  el.po (at-spi2-core master)  #-#-#-#-#
 # Greek translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Michael Kotsarinis <mk73628@gmail.com>, 2011.
+# #-#-#-#-#  el.po (el)  #-#-#-#-#
+# translation of el.po to
+# translation of el.po to Greek
+# atk.
+# Copyright (C) Free Software Foundation Inc. 2002, 2003, 2004.
+# This file is distributed under the same license as the atk package.
+# Kostas Papadimas <pkst@gnome.org>, 2002, 2003, 2004, 2006.
+# Nikos Charonitakis <charosn@her.forthnet.gr>, 2004.
+# Jennie Petoumenou <epetoumenou@gmail.com>, 2009.
+# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2013.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-03-07 11:54+0000\n"
-"PO-Revision-Date: 2014-03-06 16:40+0200\n"
-"Last-Translator: maria thukididu <marablack3@gmail.com>\n"
-"Language-Team: team@gnome.gr\n"
+"Project-Id-Version: el\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-01-25 15:54+0000\n"
+"PO-Revision-Date: 2023-08-02 20:55+0300\n"
+"Last-Translator: Efstathios Iosifidis <eiosifidis@gnome.org>\n"
+"Language-Team: team@lists.gnome.gr\n"
 "Language: el\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Virtaal 0.6.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+"X-Generator: Poedit 1.6.5\n"
+"X-Project-Style: gnome\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Επιλεγμένος σύνδεσμος"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Διευκρινίζει αν το αντικείμενο AtkHyperlink είναι επιλεγμένο"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Αριθμός αγκυρών"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Ο αριθμός αγκυρών που συνδέονται με το αντικείμενο AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Τέλος ευρετηρίου"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Το τέλος ευρετηρίου του αντικειμένου AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Αρχή ευρετηρίου"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Η αρχή ευρετηρίου του αντικειμένου AtkHyperlink"
+
+#: atk/atkobject.c:100
+msgid "invalid"
+msgstr "άκυρο"
+
+#: atk/atkobject.c:101
+msgid "accelerator label"
+msgstr "ετικέτα επιταχυντή"
+
+#: atk/atkobject.c:102
+msgid "alert"
+msgstr "ειδοποίηση"
+
+#: atk/atkobject.c:103
+msgid "animation"
+msgstr "κινούμενο σχέδιο"
+
+#: atk/atkobject.c:104
+msgid "arrow"
+msgstr "βέλος"
+
+#: atk/atkobject.c:105
+msgid "calendar"
+msgstr "ημερολόγιο"
+
+#: atk/atkobject.c:106
+msgid "canvas"
+msgstr "καμβάς"
+
+#: atk/atkobject.c:107
+msgid "check box"
+msgstr "πλαίσιο επιλογής"
+
+#: atk/atkobject.c:108
+msgid "check menu item"
+msgstr "αντικείμενο μενού επιλογής"
+
+#: atk/atkobject.c:109
+msgid "color chooser"
+msgstr "επιλογέας χρώματος"
+
+#: atk/atkobject.c:110
+msgid "column header"
+msgstr "κεφαλίδα στήλης"
+
+#: atk/atkobject.c:111
+msgid "combo box"
+msgstr "πλαίσιο πολλαπλών επιλογών"
+
+#: atk/atkobject.c:112
+msgid "dateeditor"
+msgstr "επεξεργαστής ημερομηνίας"
+
+#: atk/atkobject.c:113
+msgid "desktop icon"
+msgstr "εικονίδιο επιφάνειας εργασίας"
+
+#: atk/atkobject.c:114
+msgid "desktop frame"
+msgstr "πλαίσιο επιφάνειας εργασίας"
+
+#: atk/atkobject.c:115
+msgid "dial"
+msgstr "καντράν"
+
+#: atk/atkobject.c:116
+msgid "dialog"
+msgstr "διάλογος"
+
+#: atk/atkobject.c:117
+msgid "directory pane"
+msgstr "παράθυρο καταλόγου"
+
+#: atk/atkobject.c:118
+msgid "drawing area"
+msgstr "περιοχή σχεδίασης"
+
+#: atk/atkobject.c:119
+msgid "file chooser"
+msgstr "επιλογέας αρχείου"
+
+#: atk/atkobject.c:120
+msgid "filler"
+msgstr "συμπληρωτής"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:122
+msgid "fontchooser"
+msgstr "επιλογέας γραμματοσειράς"
+
+#: atk/atkobject.c:123
+msgid "frame"
+msgstr "πλαίσιο"
+
+#: atk/atkobject.c:124
+msgid "glass pane"
+msgstr "γυάλινο παράθυρο"
+
+#: atk/atkobject.c:125
+msgid "html container"
+msgstr "περιέκτης html"
+
+#: atk/atkobject.c:126
+msgid "icon"
+msgstr "εικονίδιο"
+
+#: atk/atkobject.c:127
+msgid "image"
+msgstr "εικόνα"
+
+#: atk/atkobject.c:128
+msgid "internal frame"
+msgstr "εσωτερικό πλαίσιο"
+
+#: atk/atkobject.c:129
+msgid "label"
+msgstr "ετικέτα"
+
+#: atk/atkobject.c:130
+msgid "layered pane"
+msgstr "παράθυρο με στρώσεις"
+
+#: atk/atkobject.c:131
+msgid "list"
+msgstr "λίστα"
+
+#: atk/atkobject.c:132
+msgid "list item"
+msgstr "αντικείμενο λίστας"
+
+#: atk/atkobject.c:133
+msgid "menu"
+msgstr "μενού"
+
+#: atk/atkobject.c:134
+msgid "menu bar"
+msgstr "εργαλειοθήκη μενού"
+
+#: atk/atkobject.c:135
+msgid "menu button"
+msgstr "κουμπί μενού"
+
+#: atk/atkobject.c:136
+msgid "menu item"
+msgstr "αντικείμενο μενού"
+
+#: atk/atkobject.c:137
+msgid "option pane"
+msgstr "παράθυρο επιλογών"
+
+#: atk/atkobject.c:138
+msgid "page tab"
+msgstr "στήλη σελίδας"
+
+#: atk/atkobject.c:139
+msgid "page tab list"
+msgstr "λίστα στηλών σελίδας"
+
+#: atk/atkobject.c:140
+msgid "panel"
+msgstr "πίνακας"
+
+#: atk/atkobject.c:141
+msgid "password text"
+msgstr "κείμενο κωδικού πρόσβασης"
+
+#: atk/atkobject.c:142
+msgid "popup menu"
+msgstr "αναδυόμενο μενού"
+
+#: atk/atkobject.c:143
+msgid "progress bar"
+msgstr "γραμμή προόδου"
+
+#: atk/atkobject.c:144
+msgid "push button"
+msgstr "πιεζόμενο κουμπί"
+
+#: atk/atkobject.c:145
+msgid "radio button"
+msgstr "κουμπί επιλογής"
+
+#: atk/atkobject.c:146
+msgid "radio menu item"
+msgstr "αντικείμενο μενού επιλογής"
+
+#: atk/atkobject.c:147
+msgid "root pane"
+msgstr "αρχικό παράθυρο"
+
+#: atk/atkobject.c:148
+msgid "row header"
+msgstr "κεφαλίδα γραμμής"
+
+#: atk/atkobject.c:149
+msgid "scroll bar"
+msgstr "γραμμή κύλισης"
+
+#: atk/atkobject.c:150
+msgid "scroll pane"
+msgstr "παράθυρο κύλισης"
+
+#: atk/atkobject.c:151
+msgid "separator"
+msgstr "διαχωριστής"
+
+#: atk/atkobject.c:152
+msgid "slider"
+msgstr "γραμμή κύλισης"
+
+#: atk/atkobject.c:153
+msgid "split pane"
+msgstr "παράθυρο διαχωρισμού"
+
+#: atk/atkobject.c:154
+msgid "spin button"
+msgstr "κουμπί αυξομείωσης"
+
+#: atk/atkobject.c:155
+msgid "statusbar"
+msgstr "γραμμή κατάστασης"
+
+#: atk/atkobject.c:156
+msgid "table"
+msgstr "πίνακας"
+
+#: atk/atkobject.c:157
+msgid "table cell"
+msgstr "κελί πίνακα"
+
+#: atk/atkobject.c:158
+msgid "table column header"
+msgstr "κεφαλίδα στήλης πίνακα"
+
+#: atk/atkobject.c:159
+msgid "table row header"
+msgstr "κεφαλίδα γραμμής πίνακα"
+
+#: atk/atkobject.c:160
+msgid "tear off menu item"
+msgstr "αντικείμενο αποσπώμενου μενού"
+
+#: atk/atkobject.c:161
+msgid "terminal"
+msgstr "τερματικό"
+
+#: atk/atkobject.c:162
+msgid "text"
+msgstr "κείμενο"
+
+#: atk/atkobject.c:163
+msgid "toggle button"
+msgstr "κουμπί εναλλαγής"
+
+#: atk/atkobject.c:164
+msgid "tool bar"
+msgstr "εργαλειοθήκη"
+
+#: atk/atkobject.c:165
+msgid "tool tip"
+msgstr "αναδυόμενη συμβουλή"
+
+#: atk/atkobject.c:166
+msgid "tree"
+msgstr "δένδρο"
+
+#: atk/atkobject.c:167
+msgid "tree table"
+msgstr "πίνακας δένδρου"
+
+#: atk/atkobject.c:168
+msgid "unknown"
+msgstr "άγνωστο"
+
+#: atk/atkobject.c:169
+msgid "viewport"
+msgstr "περιοχή προβολής"
+
+#: atk/atkobject.c:170
+msgid "window"
+msgstr "παράθυρο"
+
+#: atk/atkobject.c:171
+msgid "header"
+msgstr "κεφαλίδα"
+
+#: atk/atkobject.c:172
+msgid "footer"
+msgstr "υποσέλιδο"
+
+#: atk/atkobject.c:173
+msgid "paragraph"
+msgstr "παράγραφος"
+
+#: atk/atkobject.c:174
+msgid "ruler"
+msgstr "κανόνας"
+
+#: atk/atkobject.c:175
+msgid "application"
+msgstr "εφαρμογή"
+
+#: atk/atkobject.c:176
+msgid "autocomplete"
+msgstr "αυτόματη συμπλήρωση"
+
+#: atk/atkobject.c:177
+msgid "edit bar"
+msgstr "γραμμή επεξεργασίας"
+
+#: atk/atkobject.c:178
+msgid "embedded component"
+msgstr "ενσωματωμένο στοιχείο"
+
+#: atk/atkobject.c:179
+msgid "entry"
+msgstr "καταχώρηση"
+
+#: atk/atkobject.c:180
+msgid "chart"
+msgstr "γράφημα"
+
+#: atk/atkobject.c:181
+msgid "caption"
+msgstr "λεζάντα"
+
+#: atk/atkobject.c:182
+msgid "document frame"
+msgstr "πλαίσιο εγγράφου"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:183
+msgid "heading"
+msgstr "κεφαλίδα"
+
+#: atk/atkobject.c:184
+msgid "page"
+msgstr "σελίδα"
+
+#: atk/atkobject.c:185
+msgid "section"
+msgstr "ενότητα"
+
+#: atk/atkobject.c:186
+msgid "redundant object"
+msgstr "πλεονάζον αντικείμενο"
+
+#: atk/atkobject.c:187
+msgid "form"
+msgstr "φόρμα"
+
+#: atk/atkobject.c:188
+msgid "link"
+msgstr "σύνδεσμος"
+
+#: atk/atkobject.c:189
+msgid "input method window"
+msgstr "παράθυρο μεθόδου εισαγωγής"
+
+#: atk/atkobject.c:190
+msgid "table row"
+msgstr "γραμμή πίνακα"
+
+#: atk/atkobject.c:191
+msgid "tree item"
+msgstr "αντικείμενο δένδρου"
+
+#: atk/atkobject.c:192
+msgid "document spreadsheet"
+msgstr "έγγραφο λογιστικού φύλλου"
+
+#: atk/atkobject.c:193
+msgid "document presentation"
+msgstr "εγγράφο παρουσίασης"
+
+#: atk/atkobject.c:194
+msgid "document text"
+msgstr "έγγραφο κειμένου"
+
+#: atk/atkobject.c:195
+msgid "document web"
+msgstr "έγγραφο ιστού"
+
+#: atk/atkobject.c:196
+msgid "document email"
+msgstr "έγγραφο ηλεκτρονικής αλληλογγραφίας"
+
+#: atk/atkobject.c:197
+msgid "comment"
+msgstr "σχόλιο"
+
+#: atk/atkobject.c:198
+msgid "list box"
+msgstr "πλαίσιο λίστας"
+
+#: atk/atkobject.c:199
+msgid "grouping"
+msgstr "ομαδοποίηση"
+
+#: atk/atkobject.c:200
+msgid "image map"
+msgstr "χάρτης εικόνας"
+
+#: atk/atkobject.c:201
+msgid "notification"
+msgstr "ειδοποίηση"
+
+#: atk/atkobject.c:202
+msgid "info bar"
+msgstr "γραμμή πληροφοριών"
+
+#: atk/atkobject.c:203
+msgid "level bar"
+msgstr "γραμμή επιπέδου"
+
+#: atk/atkobject.c:204
+msgid "title bar"
+msgstr "γραμμή τίτλου"
+
+#: atk/atkobject.c:205
+msgid "block quote"
+msgstr "μεγάλη παράθεση"
+
+#: atk/atkobject.c:206
+msgid "audio"
+msgstr "ήχος"
+
+#: atk/atkobject.c:207
+msgid "video"
+msgstr "βίντεο"
+
+#: atk/atkobject.c:208
+msgid "definition"
+msgstr "ορισμός"
+
+#: atk/atkobject.c:209
+msgid "article"
+msgstr "άρθρο"
+
+#: atk/atkobject.c:210
+msgid "landmark"
+msgstr "ορόσημο"
+
+#: atk/atkobject.c:211
+msgid "log"
+msgstr "καταγραφή"
+
+#: atk/atkobject.c:212
+msgid "marquee"
+msgstr "κυλιόμενο κείμενο"
+
+#: atk/atkobject.c:213
+msgid "math"
+msgstr "μαθηματικά"
+
+#: atk/atkobject.c:214
+msgid "rating"
+msgstr "αξιολόγηση"
+
+#: atk/atkobject.c:215
+msgid "timer"
+msgstr "χρονόμετρο"
+
+#: atk/atkobject.c:216
+msgid "description list"
+msgstr "λίστα περιγραφής"
+
+#: atk/atkobject.c:217
+msgid "description term"
+msgstr "όρος περιγραφής"
+
+#: atk/atkobject.c:218
+msgid "description value"
+msgstr "τιμή περιγραφής"
+
+#: atk/atkobject.c:390
+msgid "Accessible Name"
+msgstr "Προσβάσιμο όνομα"
+
+#: atk/atkobject.c:391
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Το όνομα του αντίτυπου του αντικειμένου, μορφοποιημένο για πρόσβαση μέσω "
+"βοηθητικής τεχνολογίας"
+
+#: atk/atkobject.c:397
+msgid "Accessible Description"
+msgstr "Προσβάσιμη περιγραφή"
+
+#: atk/atkobject.c:398
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Περιγραφή αντικειμένου, μορφοποιημένη για πρόσβαση μέσω βοηθητικής "
+"τεχνολογίας"
+
+#: atk/atkobject.c:404
+msgid "Accessible Parent"
+msgstr "Προσβάσιμο γονικό"
+
+#: atk/atkobject.c:405
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Το γονικό του τρέχοντος προσβάσιμου όπως επιστρέφεται από το "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:421
+msgid "Accessible Value"
+msgstr "Προσβάσιμη τιμή"
+
+#: atk/atkobject.c:422
+msgid "Is used to notify that the value has changed"
+msgstr "Χρησιμοποιείται για ειδοποίηση ότι η τιμή έχει αλλάξει"
+
+#: atk/atkobject.c:430
+msgid "Accessible Role"
+msgstr "Προσβάσιμος ρόλος"
+
+#: atk/atkobject.c:431
+msgid "The accessible role of this object"
+msgstr "Ο προσβάσιμος ρόλος του αντικειμένου"
+
+#: atk/atkobject.c:438
+msgid "Accessible Layer"
+msgstr "Προσβάσιμο στρώμα"
+
+#: atk/atkobject.c:439
+msgid "The accessible layer of this object"
+msgstr "Το προσβάσιμο στρώμα του αντικειμένου"
+
+#: atk/atkobject.c:447
+msgid "Accessible MDI Value"
+msgstr "Προσβάσιμη τιμή MDI"
+
+#: atk/atkobject.c:448
+msgid "The accessible MDI value of this object"
+msgstr "Η προσβάσιμη τιμή MDI του αντικειμένου"
+
+#: atk/atkobject.c:464
+msgid "Accessible Table Caption"
+msgstr "Προσβάσιμη λεζάντα πίνακα"
+
+#: atk/atkobject.c:465
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Χρησιμοποιείται για να ενημερώσει ότι η λεζάντα πίνακα έχει αλλάξει· αυτή η "
+"ιδιότητα δεν πρέπει να χρησιμοποιείται. Αντ' αυτής, χρησιμοποιήστε το "
+"accessible-table-caption-object"
+
+#: atk/atkobject.c:479
+msgid "Accessible Table Column Header"
+msgstr "Προσβάσιμη κεφαλίδα στήλης πίνακα"
+
+#: atk/atkobject.c:480
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Χρησιμοποιείται για να ενημερώσει ότι η κεφαλίδα στήλης πίνακα έχει αλλάξει"
+
+#: atk/atkobject.c:495
+msgid "Accessible Table Column Description"
+msgstr "Προσβάσιμη περιγραφή στήλης πίνακα"
+
+#: atk/atkobject.c:496
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Χρησιμοποιείται για να ενημερώσει ότι η περιγραφή στήλης πίνακα έχει αλλάξει"
+
+#: atk/atkobject.c:511
+msgid "Accessible Table Row Header"
+msgstr "Προσβάσιμη κεφαλίδα γραμμής πίνακα"
+
+#: atk/atkobject.c:512
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Χρησιμοποιείται για να ενημερώσει ότι η κεφαλίδα γραμμής πίνακα έχει αλλάξει"
+
+#: atk/atkobject.c:526
+msgid "Accessible Table Row Description"
+msgstr "Προσβάσιμη περιγραφή γραμμής πίνακα"
+
+#: atk/atkobject.c:527
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Χρησιμοποιείται για να ενημερώσει ότι η περιγραφή γραμμής πίνακα έχει αλλάξει"
+
+#: atk/atkobject.c:533
+msgid "Accessible Table Summary"
+msgstr "Προσβάσιμη περίληψη πίνακα"
+
+#: atk/atkobject.c:534
+msgid "Is used to notify that the table summary has changed"
+msgstr "Χρησιμοποιείται για να ενημερώσει ότι η περίληψη πίνακα έχει αλλάξει"
+
+#: atk/atkobject.c:540
+msgid "Accessible Table Caption Object"
+msgstr "Προσβάσιμο αντικείμενο λεζάντας πίνακα"
+
+#: atk/atkobject.c:541
+msgid "Is used to notify that the table caption has changed"
+msgstr "Χρησιμοποιείται για να ενημερώσει ότι η λεζάντα πίνακα έχει αλλάξει"
+
+#: atk/atkobject.c:547
+msgid "Number of Accessible Hypertext Links"
+msgstr "Αριθμός προσβάσιμων συνδέσμων υπερκειμένου"
+
+#: atk/atkobject.c:548
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Ο αριθμός των συνδέσμων που έχει το τρέχον AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "πολύ ασθενές"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "ασθενές"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "αποδεκτό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "ισχυρό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "πολύ ισχυρό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "πολύ χαμηλό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "μεσαίο"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "υψηλό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "πολύ υψηλό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "πολύ κακό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "κακό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "καλό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "πολύ καλό"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "το καλύτερο"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1077 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Η εφαρμογή δεν υπάρχει πλέον"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "Απόπειρα συγχρονισμένης κλήσης όπου απαγορεύεται"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Απόπειρα συγχρονισμένης κλήσης όπου απαγορεύεται"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Άγνωστη υπογραφή %s για RemoveAccessible"
@@ -89,3 +889,6 @@ msgstr "Απόπειρα συγχρονισμένης κλήσης όπου απ
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Ελήφθη μη έγκυρη υπογραφή %s για το σήμα %s από τη διεπαφή %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Χρησιμοποιείται για ειδοποίηση ότι το μητρικό έχει αλλαξει"
diff --git a/po/en@shaw.po b/po/en@shaw.po
new file mode 100644 (file)
index 0000000..47f5033
--- /dev/null
@@ -0,0 +1,526 @@
+# Shavian translation for atk.
+# Copyright (C) 2009 The Gnome Foundation.
+# Thomas Thurman <tthurman@gnome.org>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=atk&component=general\n"
+"POT-Creation-Date: 2010-05-11 17:35+0000\n"
+"PO-Revision-Date: 2010-05-12 18:35 -0400\n"
+"Last-Translator: Thomas Thurman <tthurman@gnome.org>\n"
+"Language-Team: Shavian <ubuntu-l10n-en-shaw@launchpad.net>\n"
+"Language: en@shaw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "𐑕𐑩𐑤𐑧𐑒𐑑𐑩𐑛 𐑤𐑦𐑙𐑒"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "𐑕𐑐𐑧𐑕𐑦𐑓𐑲𐑟 𐑢𐑧𐑞𐑼 𐑞 AtkHyperlink 𐑪𐑚𐑡𐑧𐑒𐑑 𐑦𐑟 𐑕𐑩𐑤𐑧𐑒𐑑𐑩𐑛"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "𐑯𐑳𐑥𐑚𐑼 𐑝 𐑨𐑙𐑒𐑻𐑟"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "𐑞 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑨𐑙𐑒𐑻𐑟 𐑩𐑕𐑴𐑖𐑦𐑱𐑑𐑩𐑛 𐑢𐑦𐑞 𐑞 AtkHyperlink 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "𐑧𐑯𐑛 𐑦𐑯𐑛𐑧𐑒𐑕"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "𐑞 𐑧𐑯𐑛 𐑦𐑯𐑛𐑧𐑒𐑕 𐑝 𐑞 AtkHyperlink 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "𐑕𐑑𐑸𐑑 𐑦𐑯𐑛𐑧𐑒𐑕"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "𐑞 𐑕𐑑𐑸𐑑 𐑦𐑯𐑛𐑧𐑒𐑕 𐑝 𐑞 AtkHyperlink 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "𐑦𐑯𐑝𐑨𐑤𐑦𐑛"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "𐑨𐑒𐑕𐑧𐑤𐑼𐑱𐑑𐑼 𐑤𐑱𐑚𐑩𐑤"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "𐑩𐑤𐑻𐑑"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "𐑨𐑯𐑩𐑥𐑱𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "𐑨𐑮𐑴"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "𐑒𐑨𐑤𐑩𐑯𐑛𐑼"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "𐑒𐑨𐑯𐑝𐑩𐑕"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "𐑗𐑧𐑒 𐑚𐑪𐑒𐑕"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "𐑗𐑧𐑒 𐑥𐑧𐑯𐑿 𐑲𐑑𐑩𐑥"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "𐑒𐑳𐑤𐑼 𐑗𐑵𐑟𐑼"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "𐑒𐑪𐑤𐑩𐑥 𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "𐑒𐑭𐑥𐑚𐑴 𐑚𐑪𐑒𐑕"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "𐑛𐑱𐑑𐑧𐑛𐑦𐑑𐑼"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑲𐑒𐑪𐑯"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "𐑛𐑧𐑕𐑒𐑑𐑪𐑐 𐑓𐑮𐑱𐑥"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "𐑛𐑲𐑤"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "𐑛𐑲𐑩𐑤𐑪𐑜"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "𐑛𐑲𐑮𐑧𐑒𐑑𐑼𐑦 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "𐑛𐑮𐑷𐑦𐑙 𐑺𐑦𐑩"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "𐑓𐑲𐑤 𐑗𐑵𐑟𐑼"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "𐑓𐑦𐑤𐑻"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "𐑓𐑪𐑯𐑑 𐑗𐑵𐑟𐑼"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "𐑓𐑮𐑱𐑥"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "𐑜𐑤𐑭𐑕 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "HTML 𐑒𐑩𐑯𐑑𐑱𐑯𐑼"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "𐑲𐑒𐑪𐑯"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "𐑦𐑥𐑦𐑡"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "𐑦𐑯𐑑𐑻𐑯𐑩𐑤 𐑓𐑮𐑱𐑥"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "𐑤𐑱𐑚𐑩𐑤"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "𐑤𐑱𐑻𐑛 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "𐑤𐑦𐑕𐑑"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "𐑤𐑦𐑕𐑑 𐑲𐑑𐑩𐑥"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "𐑥𐑧𐑯𐑿"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "𐑥𐑧𐑯𐑿 𐑚𐑸"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "𐑥𐑧𐑯𐑿 𐑲𐑑𐑩𐑥"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "𐑪𐑐𐑖𐑩𐑯 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "𐑐𐑱𐑡 𐑑𐑨𐑚"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "𐑐𐑱𐑡 𐑑𐑨𐑚 𐑤𐑦𐑕𐑑"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "𐑐𐑨𐑯𐑩𐑤"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "𐑐𐑭𐑕𐑢𐑼𐑛 𐑑𐑧𐑒𐑕𐑑"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "𐑐𐑪𐑐𐑳𐑐 𐑥𐑧𐑯𐑿"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "𐑐𐑮𐑩𐑜𐑮𐑧𐑕 𐑚𐑸"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "𐑐𐑫𐑖 𐑚𐑳𐑑𐑩𐑯"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "𐑮𐑱𐑛𐑦𐑴 𐑚𐑳𐑑𐑩𐑯"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "𐑮𐑱𐑛𐑦𐑴 𐑥𐑧𐑯𐑿 𐑲𐑑𐑩𐑥"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "𐑮𐑵𐑑 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "𐑮𐑴 𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "𐑕𐑒𐑮𐑴𐑤 𐑚𐑸"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "𐑕𐑒𐑮𐑴𐑤 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "𐑕𐑧𐑐𐑼𐑱𐑑𐑼"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "𐑕𐑤𐑲𐑛𐑼"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "𐑕𐑐𐑤𐑦𐑑 𐑐𐑱𐑯"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "𐑕𐑐𐑦𐑯 𐑚𐑳𐑑𐑩𐑯"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "𐑕𐑑𐑱𐑑𐑫𐑕𐑚𐑸"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "𐑑𐑱𐑚𐑩𐑤"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "𐑑𐑱𐑚𐑩𐑤 𐑕𐑧𐑤"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "𐑑𐑱𐑚𐑩𐑤 𐑒𐑪𐑤𐑩𐑥 𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "𐑑𐑱𐑚𐑩𐑤 𐑮𐑴 𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "𐑑𐑺 𐑪𐑓 𐑥𐑧𐑯𐑿 𐑲𐑑𐑩𐑥"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "𐑑𐑻𐑥𐑦𐑯𐑩𐑤"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "𐑑𐑧𐑒𐑕𐑑"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "𐑑𐑪𐑜𐑩𐑤 𐑚𐑳𐑑𐑩𐑯"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "𐑑𐑵𐑤 𐑚𐑸"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "𐑑𐑵𐑤 𐑑𐑦𐑐"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "𐑑𐑮𐑰"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "𐑑𐑮𐑰 𐑑𐑱𐑚𐑩𐑤"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "𐑳𐑯𐑴𐑯"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "𐑝𐑿𐑐𐑹𐑑"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "𐑢𐑦𐑯𐑛𐑴"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "𐑓𐑫𐑑𐑼"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "𐑐𐑨𐑮𐑩𐑜𐑮𐑭𐑓"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "𐑮𐑵𐑤𐑼"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "𐑩𐑐𐑤𐑦𐑒𐑱𐑕𐑩𐑯"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "𐑷𐑑𐑴𐑒𐑪𐑥𐑐𐑤𐑰𐑑"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "𐑧𐑛𐑦𐑑 𐑚𐑸"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "𐑧𐑥𐑚𐑧𐑛𐑦𐑛 𐑒𐑩𐑥𐑐𐑴𐑯𐑩𐑯𐑑"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "𐑧𐑯𐑑𐑮𐑦"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "𐑗𐑸𐑑"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "𐑒𐑨𐑐𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "𐑛𐑪𐑒𐑿𐑥𐑩𐑯𐑑 𐑓𐑮𐑱𐑥"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "𐑣𐑧𐑛𐑦𐑙"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "𐑐𐑱𐑡"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "𐑕𐑧𐑒𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "𐑮𐑦𐑛𐑩𐑯𐑛𐑩𐑯𐑑 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "𐑓𐑹𐑥"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "𐑤𐑦𐑙𐑒"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "𐑦𐑯𐑐𐑫𐑑 𐑥𐑧𐑔𐑩𐑛 𐑢𐑦𐑯𐑛𐑴"
+
+#: ../atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑯𐑱𐑥"
+
+#: ../atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "𐑩𐑚𐑡𐑧𐑒𐑑 𐑦𐑯𐑕𐑑𐑨𐑯𐑕𐑧𐑟 𐑯𐑱𐑥 𐑓𐑹𐑥𐑨𐑑𐑩𐑛 𐑓𐑹 𐑩𐑕𐑦𐑕𐑑𐑦𐑝 𐑑𐑧𐑒𐑯𐑭𐑤𐑩𐑡𐑰 𐑨𐑒𐑕𐑧𐑕"
+
+#: ../atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯 𐑝 𐑩𐑯 𐑪𐑚𐑡𐑧𐑒𐑑, 𐑓𐑹𐑥𐑨𐑑𐑩𐑛 𐑓𐑹 𐑩𐑕𐑦𐑕𐑑𐑦𐑝 𐑑𐑧𐑒𐑯𐑭𐑤𐑩𐑡𐑰 𐑨𐑒𐑕𐑧𐑕"
+
+#: ../atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑐𐑺𐑩𐑯𐑑"
+
+#: ../atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑐𐑺𐑩𐑯𐑑 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑝𐑨𐑤𐑿"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑝𐑨𐑤𐑿 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑮𐑴𐑤"
+
+#: ../atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "𐑞 𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑮𐑴𐑤 𐑝 𐑞𐑦𐑕 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑤𐑱𐑼"
+
+#: ../atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "𐑞 𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑤𐑱𐑼 𐑝 𐑞𐑦𐑕 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 MDI 𐑝𐑨𐑤𐑿"
+
+#: ../atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "𐑞 𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 MDI 𐑝𐑨𐑤𐑿 𐑝 𐑞𐑦𐑕 𐑪𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑒𐑨𐑐𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑒𐑨𐑐𐑖𐑩𐑯 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛; 𐑞𐑦𐑕 𐑐𐑮𐑪𐑐𐑼𐑑𐑦 𐑖𐑫𐑛 𐑯𐑪𐑑 𐑚𐑰 𐑿𐑟𐑛. "
+"𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤-𐑑𐑱𐑚𐑩𐑤-𐑒𐑨𐑐𐑖𐑩𐑯-𐑩𐑚𐑡𐑧𐑒𐑑 𐑖𐑫𐑛 𐑚𐑰 𐑿𐑟𐑛 𐑦𐑯𐑕𐑑𐑧𐑛"
+
+#: ../atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑒𐑪𐑤𐑩𐑥 𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑒𐑪𐑤𐑩𐑥 𐑣𐑧𐑛𐑼 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑒𐑪𐑤𐑩𐑥 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑒𐑪𐑤𐑩𐑥 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑮𐑴 𐑣𐑧𐑛𐑼"
+
+#: ../atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑮𐑴 𐑣𐑧𐑛𐑼 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑮𐑴 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯"
+
+#: ../atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑮𐑴 𐑛𐑦𐑕𐑒𐑮𐑦𐑐𐑖𐑩𐑯 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑕𐑳𐑥𐑼𐑦"
+
+#: ../atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑕𐑳𐑥𐑼𐑦 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑑𐑱𐑚𐑩𐑤 𐑒𐑨𐑐𐑖𐑩𐑯 𐑩𐑚𐑡𐑧𐑒𐑑"
+
+#: ../atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "𐑦𐑟 𐑿𐑟𐑛 𐑑 𐑯𐑴𐑑𐑦𐑓𐑲 𐑞𐑨𐑑 𐑞 𐑑𐑱𐑚𐑩𐑤 𐑒𐑨𐑐𐑖𐑩𐑯 𐑣𐑨𐑟 𐑗𐑱𐑯𐑡𐑛"
+
+#: ../atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "𐑯𐑳𐑥𐑚𐑼 𐑝 𐑨𐑒𐑕𐑧𐑕𐑩𐑚𐑩𐑤 𐑣𐑲𐑐𐑻𐑑𐑧𐑒𐑕𐑑 𐑤𐑦𐑙𐑒𐑕"
+
+#: ../atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "𐑞 𐑯𐑳𐑥𐑚𐑼 𐑝 𐑤𐑦𐑙𐑒𐑕 𐑢𐑦𐑗 𐑞 𐑒𐑳𐑮𐑩𐑯𐑑 AtkHypertext 𐑣𐑨𐑟"
+
index b1277f3..163d25a 100644 (file)
@@ -1,10 +1,20 @@
+# #-#-#-#-#  en_CA.po (at-spi 2-core)  #-#-#-#-#
 # English translations for at-spi package.
 # Copyright (C) 2011 THE at-spi'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi package.
 # Tiffany <tiffany.antopolski@gmail.com>, 2011.
 #
+# #-#-#-#-#  en_CA.po (atk)  #-#-#-#-#
+# English/Canada translation of atk.
+# Copyright (C) 2004 Adam Weinberger and the GNOME Foundation
+# This file is distributed under the same licence as the atk package.
+# Adam Weinberger <adamw@gnome.org>, 2004.
+#
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  en_CA.po (at-spi 2-core)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi 2-core\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2011-09-16 19:03-0400\n"
@@ -16,9 +26,530 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"#-#-#-#-#  en_CA.po (atk)  #-#-#-#-#\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2004-09-24 18:16-0500\n"
+"Last-Translator: Adam Weinberger <adamw@gnome.org>\n"
+"Language-Team: Canadian English <adamw@gnome.org>\n"
+"Language: en_CA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
 
 #: ../atspi/atspi-component.c:313 ../atspi/atspi-misc.c:941
 #: ../atspi/atspi-misc.c:992 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "The application no longer exists"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Selected Link"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifies whether the AtkHyperlink object is selected"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Number of Anchors"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "The number of anchors associated with the AtkHyperlink object"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "End index"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "The end index of the AtkHyperlink object"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Start index"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "The start index of the AtkHyperlink object"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "invalid"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "accelerator label"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "alert"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "animation"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "arrow"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "calendar"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "canvas"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "check box"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "check menu item"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "colour chooser"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "column header"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "combo box"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "date editor"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "desktop icon"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "desktop frame"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "dial"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "dialogue"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "directory pane"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "drawing area"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "file chooser"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "filler"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "fontchooser"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "frame"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "glass pane"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html container"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "icon"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "image"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "internal frame"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "layered pane"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "list"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "list item"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "menu bar"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "menu item"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "option pane"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "page tab"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "page tab list"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "password text"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "popup menu"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "progress bar"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "push button"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "radio button"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "radio menu item"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "root pane"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "row header"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "scroll bar"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "scroll pane"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "separator"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "slider"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "split pane"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "spin button"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "statusbar"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "table"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "table cell"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "table column header"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "table row header"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "tear-off menu item"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "toggle button"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "tool bar"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "tool tip"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "tree"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "tree table"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "unknown"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "viewport"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "window"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "header"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "footer"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraph"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "alert"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "application"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "autocomplete"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "edit bar"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "embedded component"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "entry"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "chart"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "caption"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "document frame"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "heading"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "page"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "section"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "redundant object"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "form"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Accessible Name"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Object instance’s name, formatted for assistive technology access"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Accessible Description"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Description of an object, formatted for assistive technology access"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Accessible Parent"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Used to notify that the parent has changed"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Accessible Value"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Used to notify that the value has changed"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Accessible Role"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "The accessible role of this object"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Accessible Layer"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "The accessible layer of this object"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Accessible MDI Value"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "The accessible MDI value of this object"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Accessible Table Caption"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Used to notify that the table caption has changed. This property should not "
+"be used; accessible-table-caption-object should be used instead"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Accessible Table Column Header"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Used to notify that the table column header has changed"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Accessible Table Column Description"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Used to notify that the table column description has changed"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Accessible Table Row Header"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Used to notify that the table row header has changed"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Accessible Table Row Description"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Used to notify that the table row description has changed"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Accessible Table Summary"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Used to notify that the table summary has changed"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Accessible Table Caption Object"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Used to notify that the table caption has changed"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Number of Accessible Hypertext Links"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "The number of links which the current AtkHypertext has"
index d8f362f..75cf5e3 100644 (file)
@@ -1,9 +1,19 @@
+# #-#-#-#-#  en_GB.po (at-spi2-core)  #-#-#-#-#
 # British English translationn of at-spi2-core
 # Copyright (C) 2011 at-spi2-core'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Bruce Cowan <bruce@bcowan.me.uk>, 2011.
+# #-#-#-#-#  en_GB.po (atk)  #-#-#-#-#
+# English (British) translation.
+# Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+# Abigail Brady <morwen@evilmagic.org>, Bastien Nocera <hadess@hadess.net>,
+# Gareth Owen <gowen72@yahoo.com> 2004.
+# Bruce Cowan <bruce@bcowan.me.uk>, 2011.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  en_GB.po (at-spi2-core)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +27,20 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Virtaal 0.6.1\n"
+"#-#-#-#-#  en_GB.po (atk)  #-#-#-#-#\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2016-08-15 08:36+0000\n"
+"PO-Revision-Date: 2016-09-18 12:37+0200\n"
+"Last-Translator: David King <amigadave@amigadave.com>\n"
+"Language-Team: British English <en@li.org>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1-beta1\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -27,6 +51,781 @@ msgstr "The application no longer exists"
 msgid "Attempted synchronous call where prohibited"
 msgstr "Attempted synchronous call where prohibited"
 
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Selected Link"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifies whether the AtkHyperlink object is selected"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Number of Anchors"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "The number of anchors associated with the AtkHyperlink object"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "End index"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "The end index of the AtkHyperlink object"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Start index"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "The start index of the AtkHyperlink object"
+
+#: atk/atkobject.c:97
+msgid "invalid"
+msgstr "invalid"
+
+#: atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "accelerator label"
+
+#: atk/atkobject.c:99
+msgid "alert"
+msgstr "alert"
+
+#: atk/atkobject.c:100
+msgid "animation"
+msgstr "animation"
+
+#: atk/atkobject.c:101
+msgid "arrow"
+msgstr "arrow"
+
+#: atk/atkobject.c:102
+msgid "calendar"
+msgstr "calendar"
+
+#: atk/atkobject.c:103
+msgid "canvas"
+msgstr "canvas"
+
+#: atk/atkobject.c:104
+msgid "check box"
+msgstr "check box"
+
+#: atk/atkobject.c:105
+msgid "check menu item"
+msgstr "check menu item"
+
+#: atk/atkobject.c:106
+msgid "color chooser"
+msgstr "colour chooser"
+
+#: atk/atkobject.c:107
+msgid "column header"
+msgstr "column header"
+
+#: atk/atkobject.c:108
+msgid "combo box"
+msgstr "combo box"
+
+#: atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "dateeditor"
+
+#: atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "desktop icon"
+
+#: atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "desktop frame"
+
+#: atk/atkobject.c:112
+msgid "dial"
+msgstr "dial"
+
+#: atk/atkobject.c:113
+msgid "dialog"
+msgstr "dialogue"
+
+#: atk/atkobject.c:114
+msgid "directory pane"
+msgstr "directory pane"
+
+#: atk/atkobject.c:115
+msgid "drawing area"
+msgstr "drawing area"
+
+#: atk/atkobject.c:116
+msgid "file chooser"
+msgstr "file chooser"
+
+#: atk/atkobject.c:117
+msgid "filler"
+msgstr "filler"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "fontchooser"
+
+#: atk/atkobject.c:120
+msgid "frame"
+msgstr "frame"
+
+#: atk/atkobject.c:121
+msgid "glass pane"
+msgstr "glass pane"
+
+#: atk/atkobject.c:122
+msgid "html container"
+msgstr "html container"
+
+#: atk/atkobject.c:123
+msgid "icon"
+msgstr "icon"
+
+#: atk/atkobject.c:124
+msgid "image"
+msgstr "image"
+
+#: atk/atkobject.c:125
+msgid "internal frame"
+msgstr "internal frame"
+
+#: atk/atkobject.c:126
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:127
+msgid "layered pane"
+msgstr "layered pane"
+
+#: atk/atkobject.c:128
+msgid "list"
+msgstr "list"
+
+#: atk/atkobject.c:129
+msgid "list item"
+msgstr "list item"
+
+#: atk/atkobject.c:130
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:131
+msgid "menu bar"
+msgstr "menu bar"
+
+#: atk/atkobject.c:132
+msgid "menu item"
+msgstr "menu item"
+
+#: atk/atkobject.c:133
+msgid "option pane"
+msgstr "option pane"
+
+#: atk/atkobject.c:134
+msgid "page tab"
+msgstr "page tab"
+
+#: atk/atkobject.c:135
+msgid "page tab list"
+msgstr "page tab list"
+
+#: atk/atkobject.c:136
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:137
+msgid "password text"
+msgstr "password text"
+
+#: atk/atkobject.c:138
+msgid "popup menu"
+msgstr "popup menu"
+
+#: atk/atkobject.c:139
+msgid "progress bar"
+msgstr "progress bar"
+
+#: atk/atkobject.c:140
+msgid "push button"
+msgstr "push button"
+
+#: atk/atkobject.c:141
+msgid "radio button"
+msgstr "radio button"
+
+#: atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "radio menu item"
+
+#: atk/atkobject.c:143
+msgid "root pane"
+msgstr "root pane"
+
+#: atk/atkobject.c:144
+msgid "row header"
+msgstr "row header"
+
+#: atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "scroll bar"
+
+#: atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "scroll pane"
+
+#: atk/atkobject.c:147
+msgid "separator"
+msgstr "separator"
+
+#: atk/atkobject.c:148
+msgid "slider"
+msgstr "slider"
+
+#: atk/atkobject.c:149
+msgid "split pane"
+msgstr "split pane"
+
+#: atk/atkobject.c:150
+msgid "spin button"
+msgstr "spin button"
+
+#: atk/atkobject.c:151
+msgid "statusbar"
+msgstr "statusbar"
+
+#: atk/atkobject.c:152
+msgid "table"
+msgstr "table"
+
+#: atk/atkobject.c:153
+msgid "table cell"
+msgstr "table cell"
+
+#: atk/atkobject.c:154
+msgid "table column header"
+msgstr "table column header"
+
+#: atk/atkobject.c:155
+msgid "table row header"
+msgstr "table row header"
+
+#: atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "tear off menu item"
+
+#: atk/atkobject.c:157
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:158
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:159
+msgid "toggle button"
+msgstr "toggle button"
+
+#: atk/atkobject.c:160
+msgid "tool bar"
+msgstr "tool bar"
+
+#: atk/atkobject.c:161
+msgid "tool tip"
+msgstr "tool tip"
+
+#: atk/atkobject.c:162
+msgid "tree"
+msgstr "tree"
+
+#: atk/atkobject.c:163
+msgid "tree table"
+msgstr "tree table"
+
+#: atk/atkobject.c:164
+msgid "unknown"
+msgstr "unknown"
+
+#: atk/atkobject.c:165
+msgid "viewport"
+msgstr "viewport"
+
+#: atk/atkobject.c:166
+msgid "window"
+msgstr "window"
+
+#: atk/atkobject.c:167
+msgid "header"
+msgstr "header"
+
+#: atk/atkobject.c:168
+msgid "footer"
+msgstr "footer"
+
+#: atk/atkobject.c:169
+msgid "paragraph"
+msgstr "paragraph"
+
+#: atk/atkobject.c:170
+msgid "ruler"
+msgstr "ruler"
+
+#: atk/atkobject.c:171
+msgid "application"
+msgstr "application"
+
+#: atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "autocomplete"
+
+#: atk/atkobject.c:173
+msgid "edit bar"
+msgstr "edit bar"
+
+#: atk/atkobject.c:174
+msgid "embedded component"
+msgstr "embedded component"
+
+#: atk/atkobject.c:175
+msgid "entry"
+msgstr "entry"
+
+#: atk/atkobject.c:176
+msgid "chart"
+msgstr "chart"
+
+#: atk/atkobject.c:177
+msgid "caption"
+msgstr "caption"
+
+#: atk/atkobject.c:178
+msgid "document frame"
+msgstr "document frame"
+
+#: atk/atkobject.c:179
+msgid "heading"
+msgstr "heading"
+
+#: atk/atkobject.c:180
+msgid "page"
+msgstr "page"
+
+#: atk/atkobject.c:181
+msgid "section"
+msgstr "section"
+
+#: atk/atkobject.c:182
+msgid "redundant object"
+msgstr "redundant object"
+
+#: atk/atkobject.c:183
+msgid "form"
+msgstr "form"
+
+#: atk/atkobject.c:184
+msgid "link"
+msgstr "link"
+
+#: atk/atkobject.c:185
+msgid "input method window"
+msgstr "input method window"
+
+#: atk/atkobject.c:186
+msgid "table row"
+msgstr "table row"
+
+#: atk/atkobject.c:187
+msgid "tree item"
+msgstr "tree item"
+
+#: atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "document spreadsheet"
+
+#: atk/atkobject.c:189
+msgid "document presentation"
+msgstr "document presentation"
+
+#: atk/atkobject.c:190
+msgid "document text"
+msgstr "document text"
+
+#: atk/atkobject.c:191
+msgid "document web"
+msgstr "document web"
+
+#: atk/atkobject.c:192
+msgid "document email"
+msgstr "document e-mail"
+
+#: atk/atkobject.c:193
+msgid "comment"
+msgstr "comment"
+
+#: atk/atkobject.c:194
+msgid "list box"
+msgstr "list box"
+
+#: atk/atkobject.c:195
+msgid "grouping"
+msgstr "grouping"
+
+#: atk/atkobject.c:196
+msgid "image map"
+msgstr "image map"
+
+#: atk/atkobject.c:197
+msgid "notification"
+msgstr "notification"
+
+#: atk/atkobject.c:198
+msgid "info bar"
+msgstr "info bar"
+
+#: atk/atkobject.c:199
+msgid "level bar"
+msgstr "level bar"
+
+#: atk/atkobject.c:200
+msgid "title bar"
+msgstr "title bar"
+
+#: atk/atkobject.c:201
+msgid "block quote"
+msgstr "block quote"
+
+#: atk/atkobject.c:202
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:203
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:204
+msgid "definition"
+msgstr "definition"
+
+#: atk/atkobject.c:205
+msgid "article"
+msgstr "article"
+
+#: atk/atkobject.c:206
+msgid "landmark"
+msgstr "landmark"
+
+#: atk/atkobject.c:207
+msgid "log"
+msgstr "log"
+
+#: atk/atkobject.c:208
+msgid "marquee"
+msgstr "marquee"
+
+#: atk/atkobject.c:209
+msgid "math"
+msgstr "math"
+
+#: atk/atkobject.c:210
+msgid "rating"
+msgstr "rating"
+
+#: atk/atkobject.c:211
+msgid "timer"
+msgstr "timer"
+
+#: atk/atkobject.c:212
+msgid "description list"
+msgstr "description list"
+
+#: atk/atkobject.c:213
+msgid "description term"
+msgstr "description term"
+
+#: atk/atkobject.c:214
+msgid "description value"
+msgstr "description value"
+
+#: atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Accessible Name"
+
+#: atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Object instance’s name formatted for assistive technology access"
+
+#: atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Accessible Description"
+
+#: atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Description of an object, formatted for assistive technology access"
+
+#: atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Accessible Parent"
+
+#: atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Parent of the current accessible as returned by atk_object_get_parent()"
+
+#: atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Accessible Value"
+
+#: atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Is used to notify that the value has changed"
+
+#: atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Accessible Role"
+
+#: atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "The accessible role of this object"
+
+#: atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Accessible Layer"
+
+#: atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "The accessible layer of this object"
+
+#: atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Accessible MDI Value"
+
+#: atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "The accessible MDI value of this object"
+
+#: atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Accessible Table Caption"
+
+#: atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+
+#: atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Accessible Table Column Header"
+
+#: atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "Is used to notify that the table column header has changed"
+
+#: atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Accessible Table Column Description"
+
+#: atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "Is used to notify that the table column description has changed"
+
+#: atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Accessible Table Row Header"
+
+#: atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "Is used to notify that the table row header has changed"
+
+#: atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Accessible Table Row Description"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Is used to notify that the table row description has changed"
+
+#: atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Accessible Table Summary"
+
+#: atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Is used to notify that the table summary has changed"
+
+#: atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Accessible Table Caption Object"
+
+#: atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Is used to notify that the table caption has changed"
+
+#: atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Number of Accessible Hypertext Links"
+
+#: atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "The number of links which the current AtkHypertext has"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "very weak"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "weak"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "acceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "strong"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "very strong"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "very low"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "medium"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "high"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "very high"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "very bad"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "bad"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "good"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "very good"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "best"
+
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Unknown signature %s for RemoveAccessible"
 
@@ -89,3 +888,6 @@ msgstr "Attempted synchronous call where prohibited"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Got invalid signature %s for signal %s from interface %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Is used to notify that the parent has changed"
index 3212f05..dc26736 100644 (file)
--- a/po/eo.po
+++ b/po/eo.po
 # Esperanto translation for at-spi2-core.
 # Copyright (C) 2011 Free Software Foundation, Inc.
 # This file is distributed under the same license as the at-spi2-core package.
-# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011.
+# Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>, 2011-2023.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2011-05-14 17:03+0000\n"
-"PO-Revision-Date: 2011-05-15 15:32+0200\n"
+"Project-Id-Version: atk 1.3.4\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-08-05 16:00+0000\n"
+"PO-Revision-Date: 2023-09-15 19:23+0200\n"
 "Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
-"Language-Team: Esperanto <ubuntu-l10n-eo@lists.launchpad.net>\n"
+"Language-Team: Esperanto <gnome-eo-list@gnome.org>\n"
 "Language: eo\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 42.0\n"
+"X-Project-Style: gnome\n"
 
-#: ../atspi/atspi-misc.c:937 ../atspi/atspi-misc.c:988
-#: ../atspi/atspi-misc.c:1029
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Elektita ligilo"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifas ĉu la AtkHyperlink-objekto estas elektita"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Nombro da ankroj"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "La nombro da ankroj asociita kun la AtkHyperlink-objekto"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Finindekso"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "La finindekso de la AtkHyperlink-objekto"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Komencindekso"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "La komencindekso de la AtkHyperlink-objekto"
+
+#: atk/atkobject.c:268
+msgid "Accessible Name"
+msgstr "Atingebla nomo"
+
+#: atk/atkobject.c:269
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Nomo de objekta eksemplero formatita por asist-teknologia atingo"
+
+#: atk/atkobject.c:275
+msgid "Accessible Description"
+msgstr "Atingebla priskribo"
+
+#: atk/atkobject.c:276
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Priskribo de objekto, formatita por formatita por asist-teknologia atingo"
+
+#: atk/atkobject.c:282
+msgid "Accessible Parent"
+msgstr "Atingebla gepatro"
+
+#: atk/atkobject.c:283
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Gepatro de la nuna alireblo kiel resendita de atk_object_get_parent()"
+
+#: atk/atkobject.c:299
+msgid "Accessible Value"
+msgstr "Atingebla valoro"
+
+#: atk/atkobject.c:300
+msgid "Is used to notify that the value has changed"
+msgstr "Uzita por avizi ke la valororo ŝanĝiĝis"
+
+#: atk/atkobject.c:308
+msgid "Accessible Role"
+msgstr "Atingebla rolo"
+
+#: atk/atkobject.c:309
+msgid "The accessible role of this object"
+msgstr "La atingebla rolo de ĉi tiu objekto"
+
+#: atk/atkobject.c:316
+msgid "Accessible Layer"
+msgstr "Atingebla tavolo"
+
+#: atk/atkobject.c:317
+msgid "The accessible layer of this object"
+msgstr "La atingebla tavolo de ĉi tiu objekto"
+
+#: atk/atkobject.c:325
+msgid "Accessible MDI Value"
+msgstr "Atingebla MDI-valoro"
+
+#: atk/atkobject.c:326
+msgid "The accessible MDI value of this object"
+msgstr "La atingebla MDI-valoro de ĉi tiu objekto"
+
+#: atk/atkobject.c:342
+msgid "Accessible Table Caption"
+msgstr "Atingebla tabela apudskribo"
+
+#: atk/atkobject.c:343
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Uzita por avizi ke la tabela apudskribo ŝanĝiĝis; ĉi tiu eco ne devas esti "
+"uzita. la \"accessible-table-caption\"-objekto devus esti uzita anstataŭ"
+
+#: atk/atkobject.c:357
+msgid "Accessible Table Column Header"
+msgstr "Atingebla tabela kolumna ĉapo"
+
+#: atk/atkobject.c:358
+msgid "Is used to notify that the table column header has changed"
+msgstr "Uzita por avizi ke la tabela kolumna ĉapo ŝanĝiĝis"
+
+#: atk/atkobject.c:373
+msgid "Accessible Table Column Description"
+msgstr "Atingebla tabela kolumna priskribo"
+
+#: atk/atkobject.c:374
+msgid "Is used to notify that the table column description has changed"
+msgstr "Uzita por avizi ke la tabela kolumna priskribo ŝanĝiĝis"
+
+#: atk/atkobject.c:389
+msgid "Accessible Table Row Header"
+msgstr "Atingebla tabela vica ĉapo"
+
+#: atk/atkobject.c:390
+msgid "Is used to notify that the table row header has changed"
+msgstr "Uzita por avizi ke la tabela vica ĉapo ŝanĝiĝis"
+
+#: atk/atkobject.c:404
+msgid "Accessible Table Row Description"
+msgstr "Atingebla tabela vica priskribo"
+
+#: atk/atkobject.c:405
+msgid "Is used to notify that the table row description has changed"
+msgstr "Uzita por avizi ke la tabela vica priskribo ŝanĝiĝis"
+
+#: atk/atkobject.c:411
+msgid "Accessible Table Summary"
+msgstr "Atingebla tabela resumo"
+
+#: atk/atkobject.c:412
+msgid "Is used to notify that the table summary has changed"
+msgstr "Uzita por avizi ke la tabela resumo ŝanĝiĝis"
+
+#: atk/atkobject.c:418
+msgid "Accessible Table Caption Object"
+msgstr "Atingebla tabela apudskriba objekto"
+
+#: atk/atkobject.c:419
+msgid "Is used to notify that the table caption has changed"
+msgstr "Uzita por avizi ke la tabela apudskribo ŝanĝiĝis"
+
+#: atk/atkobject.c:425
+msgid "Number of Accessible Hypertext Links"
+msgstr "Nombro da atingeblaj hipertekstaj ligiloj"
+
+#: atk/atkobject.c:426
+msgid "The number of links which the current AtkHypertext has"
+msgstr "La nombro da ligiloj kiujn havas la aktuala \"AtkHypertext\""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "tre malforte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "malforte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "akcepteble"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "tre forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "tre malalte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "meze"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "alte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "tre alte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "tre malbone"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "malbone"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "bone"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "tre bone"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "plej bone"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1229 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "La aplikaĵo ne plu ekzistas"
+
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "nevalide"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "rapidig-etikedo"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "averto"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "animacio"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "sago"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "kalendaro"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "kanvaso"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "markobutono"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "mark-menuero"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "kolor-elektilo"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "kolumn-ĉapo"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "fallisto"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "dat-redaktilo"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "labortabla piktogramo"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "labortabla framo"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "diskelektilo"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "dialogo"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "dosieruja panelo"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "desegna areo"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "dosierelektilo"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "plenigilo"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "font-elektilo"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "kadro"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "vitra panelo"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html-ujo"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "piktogramo"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "bildo"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "interna framo"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "etikedo"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "tavola panelo"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "listo"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "listero"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "menuo"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "menubreto"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "menubutono"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "menuero"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "opcio-panelo"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "paĝa langeto"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "paĝa langetlisto"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "panelo"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "pasvorta teksto"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "ŝprucmenuo"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "plenumskalo"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "prembutono"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "radiobutono"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "radiomenuero"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "radika panelo"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "vica ĉapo"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "rulumskalo"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "rulumpanelo"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "disigilo"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "ŝovilo"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "divida panelo"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "ŝpinbutono"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "statobreto"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "tabelo"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "tabela ĉelo"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "tabela kolumna ĉapo"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "tabela vica ĉapo"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "deŝirebla menuero"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminalo"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "teksto"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "baskula butono"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "ilobreto"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "ŝpruchelpilo"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "arbo"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "arba tabelo"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "nekonate"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "vidujo"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "fenestro"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "ĉapo"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "paĝopiedo"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "alineo"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "mezurilo"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "aplikaĵo"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "aŭtomate kompletigi"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "redaktobreto"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "enkorpigita komponanto"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "ero"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "diagramo"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "apudskribo"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "dokumenta framo"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "ĉapo"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "paĝo"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "sekcio"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "redunda objekto"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "formularo"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "ligilo"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "enigmetodejo"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "tabela vico"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "arba elemento"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "tabela dokumento"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "prezentaĵo"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "dokumenta teksto"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "retpaĝo"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "retpoŝt-mesaĝo"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "komento"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "listujo"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "grupado"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "bildomapo"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "sciigo"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "informobreto"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "nivelbreto"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "titolbreto"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "bloka citaĵo"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "sono"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "difino"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "artikolo"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "orientilo"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "protokolo"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "markezo"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "matematiko"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "pritakso"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "tempmezurilo"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "priskribo-listo"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "priskribo-termino"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "priskribo-valoro"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Uzita por avizi ke la gepatro ŝanĝiĝis"
index 666ad58..5bc1c9c 100644 (file)
--- a/po/es.po
+++ b/po/es.po
+# #-#-#-#-#  es.po (at-spi2-core master)  #-#-#-#-#
+# #-#-#-#-#  es.po (at-spi2-core master)  #-#-#-#-#
 # Spanish translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Jorge González <jorgegonz@svn.gnome.org>, 2011.
 # Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2014.
 #
+# #-#-#-#-#  es.po (atk.HEAD)  #-#-#-#-#
+# translation of atk.HEAD.po to Español
+# ATK Spanish Translation.
+# Copyright (C) 2002 The GNOME Software foundation
+# This file is distributed under the same license as the atk package.
+#
+# Pablo Gonzalo del Campo <pablodc@bigfoot.com>, 2002.
+# Francisco Javier F. Serrador <serrador@arrakis.es>, 2003.
+# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004.
+# Jorge González <jorgegonz@svn.gnome.org>, 2008, 2011.
+# Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2013, 2014.
+#
+# #-#-#-#-#  es.po (atk.HEAD)  #-#-#-#-#
+# translation of atk.HEAD.po to Español
+# ATK Spanish Translation.
+# Copyright (C) 2002 The GNOME Software foundation
+# This file is distributed under the same license as the atk package.
+#
+# Pablo Gonzalo del Campo <pablodc@bigfoot.com>, 2002.
+# Francisco Javier F. Serrador <serrador@arrakis.es>, 2003.
+# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004.
+# Jorge González <jorgegonz@svn.gnome.org>, 2008, 2011.
+# Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2013, 2014.
+# Daniel Mustieles García <daniel.mustieles@gmail.com>, 2022.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-02-05 13:08+0100\n"
-"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
-"Language-Team: Español <gnome-es-list@gnome.org>\n"
-"Language: es\n"
+"Project-Id-Version: atk.HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-01 13:45+0200\n"
+"Last-Translator: Daniel Mustieles García <daniel.mustieles@gmail.com>\n"
+"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
+"Language: es_ES\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  es.po (at-spi2-core master)  #-#-#-#-#\n"
+"#-#-#-#-#  es.po (at-spi2-core master)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 42.0\n"
+"#-#-#-#-#  es.po (atk.HEAD)  #-#-#-#-#\n"
+"X-Generator: Gtranslator 2.91.5\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"#-#-#-#-#  es.po (atk.HEAD)  #-#-#-#-#\n"
 "X-Generator: Gtranslator 2.91.5\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Enlace seleccionado"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica si el objeto AtlHyperlink está seleccionado"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Número de anclas"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "El número de anclas asociadas con un objeto AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Índice final"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "El índice final de un objeto AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Índice inicial"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "El índice inicial de un objeto AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "no válido"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "etiqueta de atajo del teclado"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "alerta"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animación"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "flecha"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "calendario"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "lienzo"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "casilla de verificación"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "elemento de menú de verificación"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "seleccionador de color"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "cabecera de la columna"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "caja combinada"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "editor de fecha"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "icono del escritorio"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "marco del escritorio"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "marcador"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "diálogo"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "panel de directorio"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "área de dibujo"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "seleccionador de archivos"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "completador"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "seleccionador de tipografía"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "marco"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "panel transparente"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "contenedor html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "icono"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "imagen"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "marco interno"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiqueta"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "panel superpuesto"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "elemento de lista"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menú"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "barra de menú"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "botón del menú"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "elemento de menú"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "panel de opciones"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "pestaña de página"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lista de pestañas de página"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "texto de contraseña"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "menú emergente"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "barra de progreso"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "botón de pulsación"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "botón de radio"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "elemento de menú tipo radio"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "panel raíz"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "cabecera de la fila"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "barra de desplazamiento"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "panel de desplazamiento"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "deslizador"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "panel divisible"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "botón giratorio"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "barra de estado"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tabla"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "celda de tabla"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "cabecera de columna de tabla"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "cabecera de fila de tabla"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "elemento de menú desprendible"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "texto"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "botón de activación"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "barra de estado"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "sugerencia"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "árbol"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "tabla de árbol"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "desconocido"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "puerto de visión"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "ventana"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "cabecera"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "pie"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "párrafo"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "regla"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplicación"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "autocompletado"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "barra de edición"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "componente incrustado"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "entrada"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagrama"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "descripción"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "marco de documento"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "cabecera"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "página"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "sección"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "Objeto redundante"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formulario"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "enlace"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "ventana de entrada de método"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "fila de tabla"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "elemento de árbol"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "documento de hoja de cálculo"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "documento de presentación"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "documento de texto"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "documento web"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "documento de correo electrónico"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "comentario"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "caja de lista"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "agrupación"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "mapa de imagen"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "notificación"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "barra de información"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "barra de nivel"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "barra de título"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "bloque de cita"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "sonido"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "vídeo"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definición"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "artículo"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "marcador"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "registro"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "marquesina"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "fórmula matemática"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "puntuación"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "temporizador"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "lista de descripciones"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "término de la descripción"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "valor de la descripción"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Nombre accesible"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"El nombre de la instancia del objeto formateado para acceso para "
+"discapacitados"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Descripción accesible"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Descripción de un objeto, formateado para acceso para discapacitados"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Antecesor accesible"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Padre del accesible actual, tal como lo devuelve atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Valor accesible"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Se usa para notificar que el valor ha cambiado"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Rol accesible"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "El rol de accesibilidad de este objeto"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Capa accesible"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "La capa de accesibilidad de este objeto"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accesible"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "El valor accesible MDI de este objeto"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Descripción accesible de la tabla"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Se usa para notificar que la descripción de la tabla ha cambiado; esta "
+"propiedad no debería ser usada. Debe usarse accesible-table-caption-object "
+"en su lugar"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Cabecera de columna accesible de la tabla"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Se usa para notificar que la cabecera de columna de la tabla ha cambiado"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Descripción accesible de la columna de la tabla"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Se usa para notificar que la descripción de la columna de la tabla ha "
+"cambiado"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Cabecera accesible de la fila de la tabla"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Se usa para notificar que la fila de la cabecera de la tabla ha cambiado"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Descripción accesible de la fila de la tabla"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Se usa para notificar que la fila de la descripción ha cambiado"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Resumen accesible de la tabla"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Se usa para notificar que el resumen de la tabla ha cambiado"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Objeto de título de la tabla accesible"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Se usa para notificar que el título de la tabla ha cambiado"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Número de enlaces de hipertexto accesibles"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "El número de enlaces que el AtkHypertext actual tiene"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "muy débil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "débil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "aceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "fuerte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "muy fuerte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "muy bajo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "medio"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alto"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "muy alto"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "muy malo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "malo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bueno"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "muy bueno"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "el mejor"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "La aplicación ya no existe"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Se ha prohibido el intento de llamada síncrona"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Se ha prohibido el intento de llamada síncrona"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: firma %s desconocida para RemoveAccessible"
@@ -100,3 +918,6 @@ msgstr "Se ha prohibido el intento de llamada síncrona"
 
 #~ msgid "AT-SPI: Got error: %s\n"
 #~ msgstr "AT-SPI: error obtenido: %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Se usa para notificar que el antecesor ha cambiado"
index e1f67bd..57f2797 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -1,10 +1,25 @@
+# #-#-#-#-#  et.po (at-spi2-core master)  #-#-#-#-#
 # Estonian translation for at-spi2-core.
 # Copyright (C) 2012 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Mattias Põldaru <mahfiaz@gmail.com>, 2012, 2015.
 #
+# #-#-#-#-#  et.po (atk HEAD)  #-#-#-#-#
+# Atk eesti keele tõlge.
+# Estonian translation of Atk.
+#
+# Copyright (C) 1999, 2003, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2007, The GNOME Project.
+# This file is distributed under the same license as the atk package.
+#
+# Priit Laes <amd@store20.com>, 2003, 2007
+# Ivar Smolin <okul@linux.ee>, 2005, 2006.
+# Mattias Põldaru <mahfiaz@gmail.com>, 2012.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  et.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -18,9 +33,445 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 "X-Generator: Poedit 1.5.4\n"
+"#-#-#-#-#  et.po (atk HEAD)  #-#-#-#-#\n"
+"Project-Id-Version: atk HEAD\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2012-02-26 02:21+0000\n"
+"PO-Revision-Date: 2012-02-27 11:28+0200\n"
+"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
+"Language-Team: Estonian <>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bits\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
 msgid "The application no longer exists"
 msgstr "Seda rakendust pole enam olemas"
 
 msgid "Attempted synchronous call where prohibited"
 msgstr "Üritati teha sünkroonne kutse, kuid see keelati"
+
+msgid "Selected Link"
+msgstr "Valitud viit"
+
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Määrab, milline AtkHyperlink on valitud"
+
+msgid "Number of Anchors"
+msgstr "Ankrute arv"
+
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink objektiga seotud ankrute arv"
+
+msgid "End index"
+msgstr "Lõpuindeks"
+
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink objekti lõpuindeks"
+
+msgid "Start index"
+msgstr "Algusindeks"
+
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink objekti algusindeks"
+
+msgid "invalid"
+msgstr "vigane"
+
+msgid "accelerator label"
+msgstr "kiirklahvi silt"
+
+msgid "alert"
+msgstr "häire"
+
+msgid "animation"
+msgstr "animatsioon"
+
+msgid "arrow"
+msgstr "nool"
+
+msgid "calendar"
+msgstr "kalender"
+
+msgid "canvas"
+msgstr "lõuend"
+
+msgid "check box"
+msgstr "märkeruut"
+
+msgid "check menu item"
+msgstr "märgitav menüükirje"
+
+msgid "color chooser"
+msgstr "värvivalija"
+
+msgid "column header"
+msgstr "veeru päis"
+
+msgid "combo box"
+msgstr "valikukast"
+
+msgid "dateeditor"
+msgstr "kuupäevaredaktor"
+
+msgid "desktop icon"
+msgstr "töölaua ikoon"
+
+msgid "desktop frame"
+msgstr "töölaua raam"
+
+msgid "dial"
+msgstr "häälestusnupp"
+
+msgid "dialog"
+msgstr "dialoog"
+
+msgid "directory pane"
+msgstr "kataloogipaan"
+
+msgid "drawing area"
+msgstr "joonistamise ala"
+
+msgid "file chooser"
+msgstr "failivalija"
+
+msgid "filler"
+msgstr "täitja"
+
+#. I know it looks wrong but that is what Java returns
+msgid "fontchooser"
+msgstr "kirjatüübivalija"
+
+msgid "frame"
+msgstr "raam"
+
+msgid "glass pane"
+msgstr "klaaspaan"
+
+msgid "html container"
+msgstr "html konteiner"
+
+msgid "icon"
+msgstr "ikoon"
+
+msgid "image"
+msgstr "pilt"
+
+msgid "internal frame"
+msgstr "sisemine raam"
+
+msgid "label"
+msgstr "silt"
+
+msgid "layered pane"
+msgstr "kihiline paan"
+
+msgid "list"
+msgstr "nimekiri"
+
+msgid "list item"
+msgstr "nimekirja element"
+
+msgid "menu"
+msgstr "menüü"
+
+msgid "menu bar"
+msgstr "menüüriba"
+
+msgid "menu item"
+msgstr "menüüelement"
+
+msgid "option pane"
+msgstr "valikupaan"
+
+msgid "page tab"
+msgstr "leheküljesakk"
+
+msgid "page tab list"
+msgstr "leheküljesakkide nimekiri"
+
+msgid "panel"
+msgstr "paneel"
+
+msgid "password text"
+msgstr "parooli tekst"
+
+msgid "popup menu"
+msgstr "hüpikmenüü"
+
+msgid "progress bar"
+msgstr "edenemisriba"
+
+msgid "push button"
+msgstr "lülitamisnupp"
+
+msgid "radio button"
+msgstr "raadionupp"
+
+msgid "radio menu item"
+msgstr "raadionupuga menüükirje"
+
+msgid "root pane"
+msgstr "põhipaan"
+
+msgid "row header"
+msgstr "rea päis"
+
+msgid "scroll bar"
+msgstr "kerimisriba"
+
+msgid "scroll pane"
+msgstr "kerimispaan"
+
+msgid "separator"
+msgstr "eraldaja"
+
+msgid "slider"
+msgstr "liugur"
+
+msgid "split pane"
+msgstr "poolitamispaan"
+
+msgid "spin button"
+msgstr "kerimisnupp"
+
+msgid "statusbar"
+msgstr "olekuriba"
+
+msgid "table"
+msgstr "tabel"
+
+msgid "table cell"
+msgstr "tabeli lahter"
+
+msgid "table column header"
+msgstr "tabeli veerupäis"
+
+msgid "table row header"
+msgstr "tabeli reapäis"
+
+msgid "tear off menu item"
+msgstr "rebi-küljest menüüelement"
+
+msgid "terminal"
+msgstr "terminal"
+
+msgid "text"
+msgstr "tekst"
+
+msgid "toggle button"
+msgstr "lülitinupp"
+
+msgid "tool bar"
+msgstr "tööriistariba"
+
+msgid "tool tip"
+msgstr "tööriistavihje"
+
+msgid "tree"
+msgstr "puu"
+
+msgid "tree table"
+msgstr "puutabel"
+
+msgid "unknown"
+msgstr "tundmatu"
+
+msgid "viewport"
+msgstr "vaatepunkt"
+
+msgid "window"
+msgstr "aken"
+
+msgid "header"
+msgstr "päis"
+
+msgid "footer"
+msgstr "jalus"
+
+msgid "paragraph"
+msgstr "lõik"
+
+msgid "ruler"
+msgstr "joonlaud"
+
+msgid "application"
+msgstr "rakendus"
+
+msgid "autocomplete"
+msgstr "automaatlõpetus"
+
+msgid "edit bar"
+msgstr "redigeerimisriba"
+
+msgid "embedded component"
+msgstr "põimitud komponent"
+
+msgid "entry"
+msgstr "sisestus"
+
+msgid "chart"
+msgstr "tabel"
+
+msgid "caption"
+msgstr "seletus"
+
+msgid "document frame"
+msgstr "dokumendi raam"
+
+msgid "heading"
+msgstr "päis"
+
+msgid "page"
+msgstr "lehekülg"
+
+msgid "section"
+msgstr "osa"
+
+msgid "redundant object"
+msgstr "üleliigne objekt"
+
+msgid "form"
+msgstr "vorm"
+
+msgid "link"
+msgstr "viit"
+
+msgid "input method window"
+msgstr "sisestusmeetodi aken"
+
+msgid "table row"
+msgstr "tabeli rida"
+
+msgid "tree item"
+msgstr "puu element"
+
+msgid "document spreadsheet"
+msgstr "dokument, arvututabel"
+
+msgid "document presentation"
+msgstr "dokument, esitlus"
+
+msgid "document text"
+msgstr "dokument, tekst"
+
+msgid "document web"
+msgstr "dokument, veebileht"
+
+msgid "document email"
+msgstr "dokument, e-kiri"
+
+msgid "comment"
+msgstr "kommentaar"
+
+msgid "list box"
+msgstr "nimekirja kast"
+
+msgid "grouping"
+msgstr "grupeerimine"
+
+msgid "image map"
+msgstr "hüperpilt"
+
+msgid "notification"
+msgstr "teade"
+
+msgid "info bar"
+msgstr "inforiba"
+
+msgid "Accessible Name"
+msgstr "Kasutatav nimi"
+
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Objekti nimetus vormindatuna abistava tehnikaga kasutamiseks"
+
+msgid "Accessible Description"
+msgstr "Kasutatav kirjeldus"
+
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Objekti kirjeldus vormindatuna abistava tehnikaga kasutamiseks"
+
+msgid "Accessible Parent"
+msgstr "Kasutatav vanem"
+
+msgid "Is used to notify that the parent has changed"
+msgstr "Kasutatakse vanema muutustest teavitamiseks"
+
+msgid "Accessible Value"
+msgstr "Kasutatav väärtus"
+
+msgid "Is used to notify that the value has changed"
+msgstr "Kasutatakse väärtuse muutustest teavitamiseks"
+
+msgid "Accessible Role"
+msgstr "Kasutatav roll"
+
+msgid "The accessible role of this object"
+msgstr "Objekti kasutatav roll"
+
+msgid "Accessible Layer"
+msgstr "Kasutatav kiht"
+
+msgid "The accessible layer of this object"
+msgstr "Objekti kasutatav kiht"
+
+msgid "Accessible MDI Value"
+msgstr "Kasutatav MDI väärtus"
+
+msgid "The accessible MDI value of this object"
+msgstr "Objekti kasutatav MDI (mitme dokumendi liides) väärtus"
+
+msgid "Accessible Table Caption"
+msgstr "Kasutatav tabeli seletus"
+
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Kasutatakse tabeli seletuuse muutustest teavitamiseks; seda omadust oleks "
+"soovitatav mitte kasutada. Selle asmele võiks kasutada accessible-table-"
+"caption-object omadust"
+
+msgid "Accessible Table Column Header"
+msgstr "Kasutatav tabeli veeru päis"
+
+msgid "Is used to notify that the table column header has changed"
+msgstr "Kasutatakse tabeli veeru päise muutustest teavitamiseks"
+
+msgid "Accessible Table Column Description"
+msgstr "Kasutatav tabeli veeru kirjeldus"
+
+msgid "Is used to notify that the table column description has changed"
+msgstr "Kasutatakse tabeli veeru kirjelduse muutustest teavitamiseks"
+
+msgid "Accessible Table Row Header"
+msgstr "Kasutatav tabeli rea päis"
+
+msgid "Is used to notify that the table row header has changed"
+msgstr "Kasutatakse tabeli rea päise muutustest teavitamiseks"
+
+msgid "Accessible Table Row Description"
+msgstr "Kasutatav tabeli rea kirjeldus"
+
+msgid "Is used to notify that the table row description has changed"
+msgstr "Kasutatakse tabeli rea kirjelduse muutustest teavitamiseks"
+
+msgid "Accessible Table Summary"
+msgstr "Kasutatav tabeli kokkuvõte"
+
+msgid "Is used to notify that the table summary has changed"
+msgstr "Kasutatakse tabeli kokkuvõtte muutustest teavitamiseks"
+
+msgid "Accessible Table Caption Object"
+msgstr "Kasutatav tabeli seletuse objekt"
+
+msgid "Is used to notify that the table caption has changed"
+msgstr "Kasutatakse tabeli seletuse muutustest teavitamiseks"
+
+msgid "Number of Accessible Hypertext Links"
+msgstr "Kasutatavate viitade arv"
+
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Käesoleva AtkHypertext'i viitade arv"
index 863613e..c764ff0 100644 (file)
--- a/po/eu.po
+++ b/po/eu.po
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2011, 2014.
+# Hizkuntza Politikarako Sailburuordetza <hizpol@ej-gv.es>, 2004.
+# Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2007, 2011, 2014.
+# Asier Sarasua Garmendia  <asiersarasua@ni.eus>, 2022.
+#
 msgid ""
-msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-03-30 12:10+0200\n"
-"PO-Revision-Date: 2014-03-30 12:12+0200\n"
-"Last-Translator: Iñaki Larrañaga Murgoitio <dooteo@zundan.com>\n"
-"Language-Team: Basque <librezale@librezale.org>\n"
+msgstr "Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-07-31 18:58+0100\n"
+"Last-Translator: Asier Sarasua Garmendia <asiersarasua@ni.eus>\n"
+"Language-Team: Basque <librezale@librezale.eus>\n"
 "Language: eu\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.4\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Hautatutako esteka"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink objektua hautatuta dagoen den edo ez zehazten du"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Aingura kopurua"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink objektuarekin asoziatutako aingura kopurua"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Amaierako indizea"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink objektuaren amaierako indizea"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Hasierako indizea"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink objektuaren hasierako indizea"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "baliogabea"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "bizkortze-etiketa"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "abisua"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animazioa"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "gezia"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "egutegia"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "oihala"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "kontrol-laukia"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "egiaztatu menu-elementua"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "kolore-hautatzailea"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "zutabe-goiburua"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "konbinazio-koadroa"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "data-editorea"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "mahaigaineko ikonoa"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "mahaigaineko markoa"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "markatu"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "elkarrizketa"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "direktorio-panela"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "marrazte-area"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "fitxategi-hautatzailea"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "betegarria"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "letra-tipoen hautatzailea"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "markoa"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "panel gardena"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html-edukiontzia"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikonoa"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "irudia"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "barneko markoa"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiketa"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "geruzadun panela"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "zerrenda"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "zerrenda-elementua"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menua"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "menu-barra"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "menu-botoia"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "menu-elementua"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "aukera-panela"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "orrialde-fitxa"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "orrialde-fitxen zerrenda"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panela"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "pasahitzaren testua"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "laster-menua"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "progresio-barra"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "sakatze-botoia"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "irrati-botoia"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "irratiaren menu-elementua"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "erro-panela"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "errenkada-goiburua"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "korritze-barra"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "korritze-panela"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "bereizlea"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "graduatzailea"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "zatitze-panela"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "biratze-botoia"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "egoera-barra"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "taula"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "taulako gelaxka"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "taulako zutabe-goiburua"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "taulako errenkada-goiburua"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "menu askagarriko elementua"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminala"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "testua"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "txandakatze-botoia"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "tresna-barra"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "aholkua"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "zuhaitza"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "zuhaitz-taula"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "ezezaguna"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "leihatila"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "leihoa"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "goiburua"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "orri-oina"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "paragrafoa"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "erregela"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplikazioa"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "auto-osatzea"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "edizio-barra"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "kapsulatutako osagaia"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "sarrera"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagrama"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "epigrafea"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "dokumentuaren markoa"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "izenburua"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "orria"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "atala"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "objektu erredundanteak"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "inprimakia"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "esteka"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "sarrerako metodoaren leihoa"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "taulako errenkada"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "zuhaitzeko elementua"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "kalkulu-orriaren dokumentua"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "aurkezpenaren dokumentua"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "testu-dokumentua"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "web dokumentua"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "posta elektronikoaren dokumentua"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "iruzkina"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "zerrenda-koadroa"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "elkartzea"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "irudi-mapa"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "jakinarazpena"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "informazio-barra"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "maila-barra"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "titulu-barra"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "aipuaren blokea"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "audioa"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "bideoa"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definizioa"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "artikulua"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "erreferentzia puntua"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "erregistroa"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "markesina"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematikak"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "puntuazioa"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "kronometroa"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "azalpenen zerrenda"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "azalpenaren terminoa"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "azalpenaren balioa"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Izen erabilgarria"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Objektuaren instatziaren izena, erabilgarritasunaren laguntza-euskarriarentzako formateatuta"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Azalpen erabilgarria"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Objektu baten azalpena, erabilgarritasunaren laguntza-euskarriarentzako formateatuta"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Guraso erabilgarria"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Uneko elementu atzigarriaren gurasoa 'atk_object_get_parent()'-ek itzulita"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Balio erabilgarria"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Balioa aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Egiteko erabilgarria"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Objektu honen egiteko erabilgarria"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Geruza erabilgarria"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Objektu honentzako geruza erabilgarria"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "MDI balio erabilgarria"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Objektu honentzako MDI balio erabilgarria"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Taularen epigrafe erabilgarria"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr "Taularen epigrafea aldatu dela adierazteko erabiltzen da; propietate hau ez litzateke erabili behar. Honen ordez erabili accessible-table-caption-object behar da"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Taularen zutabe-goiburu erabilgarria"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Taularen zutabe-goiburua aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Taularen zutabe-azalpen erabilgarria"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Taularen zutabe-azalpena aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Taularen errenkada-goiburu erabilgarria"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Taularen errenkada-goiburua aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Taularen errenkada-azalpen erabilgarria"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Taularen errenkada-azalpena aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Taularen laburpen erabilgarria"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Taularen laburpena aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Taularen epigrafe-objektu erabilgarria"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Taularen epigrafea aldatu dela adierazteko erabiltzen da"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Hipertestu-esteka erabilgarrien kopurua"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Uneko AtkHypertext-ek duen esteka kopurua"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "oso ahula"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "ahula"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "onargarria"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "sendoa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "oso sendoa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "oso baxua"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "ertaina"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "altua"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "oso altua"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "oso txarra"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "txarra"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "ona"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "oso ona"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "onena"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Aplikazioa ez da gehiago existitzen"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "Dei sinkronizatuen saiakera debekatuta dago"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Dei sinkronizatuen saiakera debekatuta dago"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: RemoveAccessible-ren %s sinadura ezezaguna"
@@ -81,3 +854,6 @@ msgstr "Dei sinkronizatuen saiakera debekatuta dago"
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr ""
 #~ "%2$s seinalearen baliogabeko %1$s sinadura lortu da %3$s interfazetik\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Gurasoa aldatu dela adierazteko erabiltzen da"
index d857288..e21156c 100644 (file)
--- a/po/fa.po
+++ b/po/fa.po
@@ -1,16 +1,21 @@
 # Persian translation for at-spi2-core.
 # Copyright (C) 2011 Iranian Free Software Users Group (IFSUG.org)translation team.
-# This file is distributed under the same license as the at-spi2-core package.
+# Copyright (C) Iranian Free Software Users Group (IFSUG.org)translation team, 2010.
+# This file is distributed under the same license as the atk package.
+# Roozbeh Pournader <roozbeh@farsiweb.info>, 2003.
+# Elnaz Sarbar <elnaz@farsiweb.info>, 2005.
+# Meelad Zakaria <meelad@farsiweb.info>, 2005.
+# Mahyar Moghimi <mahyar.moqimi@gmail.com>, 2010.
 # Arash Mousavi <mousavi.arash@gmail.com>, 2011.
+# Danial Behzadi <dani.behzi@gmail.com>, 2021-2022.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2015-09-16 23:23+0430\n"
-"Last-Translator: Arash Mousavi <mousavi.arash@gmail.com>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-07-26 13:04+0430\n"
+"Last-Translator: Danial Behzadi <dani.behzi@ubuntu.com>\n"
 "Language-Team: Persian <translate@ifsug.org>\n"
 "Language: fa\n"
 "MIME-Version: 1.0\n"
@@ -18,16 +23,793 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Poedit-SourceCharset: utf-8\n"
-"X-Generator: Poedit 1.8.4\n"
+"X-Generator: Poedit 3.1\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "پیوند گزیده"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "مشخص می‌کند شی AtkHyperlink گزیده شده یا نه"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "تعداد لنگرها"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "تعداد لنگرهای وابسته به شی AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "نمایهٔ پایان"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "نمایهٔ پایان شی AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "نمایهٔ آغاز"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "نمایهٔ آغاز شی AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "نامعتبر"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "برچسب شتاب‌ده"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "آژیر"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "پویانمایی"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "پیکان"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "تقویم"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "بوم"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "جعبهٔ تیک‌دار"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "مورد فهرست تیک‌دار"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "گزینشگر رنگ"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "سرستون"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "جعبه ترکیب"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "ویرایشگر تاریخ"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "شمایل رومیزی"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "قاب رومیزی"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "شماره‌گیری"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "گفت‌وگو"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "قاب شاخه"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "ناحیهٔ رسم"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "گزینشگر پرونده"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "پرکننده"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "گزینشگر قلم"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "قاب"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "قاب شیشه‌ای"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "بارگنج html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "نقشک"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "تصویر"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "قاب داخلی"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "برچسب"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "قاب لایه‌دار"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "سیاهه"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "مورد سیاهه"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "فهرست"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "نوار فهرست"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "دکمهٔ فهرست"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "مورد فهرست"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "قاب گزینه"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "زبانهٔ صفحه"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "سیاههٔ زبانه‌های صفحه"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "تابلو"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "متن گذرواژه"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "فهرست واشو"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "نوار پیشرفت"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "دکمهٔ فشاری"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "دکمهٔ رادیویی"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "مورد فهرست رادیویی"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "قاب ریشه"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "سرسطر"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "نوار لغزش"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "قاب لغزش"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "جداساز"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "لغزنده"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "قاب تقسیم کننده"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "دگمه دوار"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "نوار وضعیت"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "جدول"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "خانهٔ جدول"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "سرستون جدول"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "سرسطر جدول"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "مورد فهرست جداشدنی"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "پایانه"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "متن"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "دکمهٔ ضامن"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "نوار ابزار"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "راهنمای آنی"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "درخت"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "جدول درخت"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "نامعلوم"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "دیدگاه"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "پنجره"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "سرصفحه"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "پاصفحه"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "پاراگراف"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "خط‌کش"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "برنامه"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "تکمیل خودکار"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "نوار ویرایش"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "مؤلفهٔ تعبیه‌شده"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "مدخل"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "نمودار"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "عنوان"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "قاب سند"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "سرفصل"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "صفحه"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "بخش"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "شئ زیادی"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "فرم"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "پیوند"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "پنجرهٔ روش ورودی"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "سطر جدول"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "مورد درخت"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "سند صفحه‌گسترده"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "سند ارئه"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "سند متنی"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "سند وب"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "سند پست‌الکترونیکی"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "توضیح"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "جعبهٔ سیاهه"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "درحال گروه کردن"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "نقشه تصویر"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "اعلان"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "نوار اطلاعات"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "نوار سطح"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "نوار عنوان"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "نقل قول بلوکی"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "صدا"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "ویدیو"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "تعریف"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "مقاله"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "نشانه"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "گزارش"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "چادر"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "ریاضی"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "رتبه‌بندی"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "زمان‌سنج"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "سیاههٔ شرح"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "عبارت شرح"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "مقدار شرح"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "نام دسترسی‌پذیری"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "نام نمونهٔ شی که برای دسترسی به فناوری یاری‌دهنده قالب‌بندی شده"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "شرح دسترسی‌پذیری"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "شرح یک شی، که برای دسترسی به فناوری یاری‌دهنده قالب‌بندی شده"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "والد دسترسی‌پذیری"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"والد دسترسی‌پذیری کنونی، آن‌گونه که به دست ‪atk_object_get_parent()‬ بازگشته"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "مقدار برای دسترسی‌پذیری"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "برای اطلاع دادن از تغییر مقدار استفاده می‌شود"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "نقش دسترسی‌پذیری"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "نقش دسترسی‌پذیری این شی"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "لایهٔ دسترسی‌پذیری"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "لایهٔ دسترسی‌پذیری این شی"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "مقدار MDI دسترسی‌پذیری"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "مقدار MDI دسترسی‌پذیری این شی"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "عنوان جدول دسترسی‌پذیری"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"برای آگاهی از تغییر عنوان جدول استفاده می‌شود. این ویژگی نباید استفاده شود. "
+"به جایش باید از accessible-table-caption-object استفاده شود"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "سرستون جدول دسترسی‌پذیری"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "برای اطلاع دادن از تغیر سرستون جدول استفاده می‌شود"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "شرح ستون جدول برای دسترسی‌پذیری"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "برای اطلاع دادن از تغییر شرح ستون جدول استفاده می‌شود"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "سرسطر جدول دسترسی‌پذیری"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "برای اطلاع دادن از تغییر سرسطر جدول استفاده می‌شود"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "شرح سطر جدول دسترسی‌پذیری"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "برای اطلاع دادن از تغییر شرح سطر جدول استفاده می‌شود"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "خلاصهٔ جدول دسترسی‌پذیری"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "برای اطلاع دادن از تغییر خلاصه جدول استفاده می‌شود"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "شی عنوان جدول برای دسترسی‌پذیری"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "برای اطلاع دادن از تغییر عنوان جدول استفاده می‌شود"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "تعداد پیوند‌های Hypertext دسترسی‌پذیری"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "تعداد پیوندهایی که AtkHypertext فعلی دارد"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "خیلی ضعیف"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "ضعیف"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "پذیرفتنی"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "قوی"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "خیلی قوی"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "خیلی پایین"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "متوسّط"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "بالا"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "خیلی بالا"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "خیلی بد"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "بد"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "خوب"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "خیلی خوب"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "بهترین"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "برنامه دیگر وجود ندارد"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "تلاش برای تماس همزمان ممنوع است"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "تلاش برای تماس همزمان ممنوع است"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: امضا ناشناس %s برای RemoveAccessible"
@@ -49,17 +831,21 @@ msgstr "تلاش برای تماس همزمان ممنوع است"
 #~ "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
 #~ "signature %s"
 #~ msgstr ""
-#~ "AT-SPI: فراخوانی _atspi_dbus_return_hyperlink_from_message همراه با امضا %s"
+#~ "AT-SPI: فراخوانی _atspi_dbus_return_hyperlink_from_message همراه با امضا "
+#~ "%s"
 
 #~ msgid "AT-SPI: AddAccessible with unknown signature %s\n"
 #~ msgstr "AT-SPI: AddAccessible همراه با امضا ناشناس %s\n"
 
-#~ msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
+#~ msgid ""
+#~ "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
 #~ msgstr ""
-#~ "AT-SPI: انتظار نوع دیگری در هنگام آوردن %s از رابط %s بود؛ اما %s دریافت شد\n"
+#~ "AT-SPI: انتظار نوع دیگری در هنگام آوردن %s از رابط %s بود؛ اما %s دریافت "
+#~ "شد\n"
 
 #~ msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
-#~ msgstr "atspi_dbus_get_property: نوع اشتباه: مورد انتظار %s، دریافت شده %c\n"
+#~ msgstr ""
+#~ "atspi_dbus_get_property: نوع اشتباه: مورد انتظار %s، دریافت شده %c\n"
 
 #~ msgid "AT-SPI: Unknown interface %s"
 #~ msgstr "AT-SPI: رابط ناشناس %s"
@@ -73,8 +859,8 @@ msgstr "تلاش برای تماس همزمان ممنوع است"
 #~ msgid ""
 #~ "called atspi_event_listener_register_from_callback with a NULL event_type"
 #~ msgstr ""
-#~ "مورد atspi_event_listener_register_from_callback با یک event_type نوع NULL "
-#~ "فراخوانده شد"
+#~ "مورد atspi_event_listener_register_from_callback با یک event_type نوع "
+#~ "NULL فراخوانده شد"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "یک امضا نادرست %s برای سیگنال %s از رابط %s دریافت شد\n"
@@ -84,10 +870,14 @@ msgstr "تلاش برای تماس همزمان ممنوع است"
 
 #~ msgid "AT-SPI: Accessibility bus not found - Using session bus.\n"
 #~ msgstr ""
-#~ "AT-SPI: گذرگاه دسترسی‌پذیری قابل یافت نیست - درحال استفاده از گذرگاه نشست.\n"
+#~ "AT-SPI: گذرگاه دسترسی‌پذیری قابل یافت نیست - درحال استفاده از گذرگاه "
+#~ "نشست.\n"
 
 #~ msgid "AT-SPI: Couldn't connect to bus: %s\n"
 #~ msgstr "AT-SPI: عدم توانایی در اتصال به گذرگاه: %s\n"
 
 #~ msgid "AT-SPI: Couldn't register with bus: %s\n"
 #~ msgstr "AT-SPI: عدم امکان در ثبت همراه گذرگاه: %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "برای اطلاع دادن از تغییر والد استفاده می‌شود"
index faf8a8c..2660ff2 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -1,14 +1,27 @@
+# #-#-#-#-#  fi.po (at-spi2-core)  #-#-#-#-#
 # Finnish messages for at-spi2-core
 # Copyright (C) 2011 Tommi Vainikainen
 # This file is distributed under the same license as the package.
 # Tommi Vainikainen <thv@iki.fi>, 2011.
 #
 # Gnome 2012-03 Finnish translation sprint participants:
+# #-#-#-#-#  fi.po (atk)  #-#-#-#-#
+# atk Finnish translation.
+# Suomennos: http://gnome-fi.sourceforge.net/
+# Copyright (C) 2003-2009 Free Software Foundation, Inc.
+#
+# Pauli Virtanen <pauli.virtanen@hut.fi>, 2003-2004.
+# Ilkka Tuohela <hile@iki.fi>, 2005-2009.
+# Lasse Liehu <lasse.liehu@gmail.com>, 2014.
+# Jiri Grönroos <jiri.gronroos+l10n@iki.fi>, 2015.
+#
+#, fuzzy
 msgid ""
 msgstr ""
-""
+"#-#-#-#-#  fi.po (at-spi2-core)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-spi&keywords=I18N+L10N&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&keywords=I18N+L10N&component=general\n"
 "POT-Creation-Date: 2011-12-15 02:37+0000\n"
 "PO-Revision-Date: 2012-03-12 08:36:41+0000\n"
 "Last-Translator: Tommi Vainikainen <thv@iki.fi>\n"
@@ -20,9 +33,822 @@ msgstr ""
 "X-POT-Import-Date: 2012-02-19 13:23:54+0000\n"
 "X-Generator: MediaWiki 1.20alpha (r113129); Translate 2012-03-02\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"#-#-#-#-#  fi.po (atk)  #-#-#-#-#\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-03-13 15:51+0000\n"
+"PO-Revision-Date: 2015-03-13 18:00+0200\n"
+"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
+"Language-Team: suomi <gnome-fi-laatu@lists.sourceforge.net>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"sourceforge.net>\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 2.91.6\n"
 
 #: ../atspi/atspi-component.c:313 ../atspi/atspi-misc.c:985
 #: ../atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Sovellusta ei enää ole"
 
+#: ../atk/atkhyperlink.c:128
+msgid "Selected Link"
+msgstr "Valittu linkki"
+
+#: ../atk/atkhyperlink.c:129
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Määrittelee, onko AtkHyperlink-olio valittu"
+
+#: ../atk/atkhyperlink.c:135
+msgid "Number of Anchors"
+msgstr "Ankkureiden määrä"
+
+#: ../atk/atkhyperlink.c:136
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink-olioon kytkettyjen ankkureiden määrä"
+
+#: ../atk/atkhyperlink.c:144
+msgid "End index"
+msgstr "Loppuindeksi"
+
+#: ../atk/atkhyperlink.c:145
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink-olion loppuindeksi"
+
+#: ../atk/atkhyperlink.c:153
+msgid "Start index"
+msgstr "Alkuindeksi"
+
+#: ../atk/atkhyperlink.c:154
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink-olion alkuindeksi"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "virheellinen"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "pikavalintanimiö"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "hälytys"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "animaatio"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "nuoli"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "kalenteri"
+
+# Huomaa, että "piirtoalue" on drawing-area.
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "kangas"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "valintaruutu"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "valintaruutu valikon kohtana"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "värivalitsin"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "sarakkeen otsake"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "yhdistelmäruutu"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "päiväysmuokkain"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "työpöydän kuvake"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "työpöytäkehys"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "arvosäädin"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "valintaikkuna"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "kansiopaneeli"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "piirtoalue"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "tiedostovalitsin"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "täyte"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "fonttivalitsin"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "kehys"
+
+# According to the documentation:
+# A pane that is guaranteed to be painted on top of all panes beneath it
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "päällimmäinen paneeli"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "html-säilö"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "kuvake"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "kuva"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "sisäinen kehys"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "nimiö"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "kerrospaneeli"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "luettelo"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "luettelon kohta"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "valikko"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "valikkopalkki"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "valikon kohta"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "valintapaneeli"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "välilehti"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "välilehtiluettelo"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "paneeli"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "salasanateksti"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "ponnahdusvalikko"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "edistymispalkki"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "painike"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "vaihtoehtonappi"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "vaihtoehtonappi valikon kohtana"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "juuripaneeli"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "riviotsake"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "vierityspalkki"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "vierityspaneeli"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "erotin"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "liukusäädin"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "jaettu paneeli"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "pyöröpainike"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "tilarivi"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "taulukko"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "taulukon solu"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "taulukon sarakkeen otsake"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "taulukon rivin otsake"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "valikon irrotuskohta"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "pääte"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "teksti"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "vipupainike"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "työkalupalkki"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "vinkki"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "puu"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "puutaulukko"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "tuntematon"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "näköaukko"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "ikkuna"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "ylätunniste"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "alatunniste"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "kappale"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "viivain"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "sovellus"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "automaattitäydennys"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "muokkauspalkki"
+
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "upotettu komponentti"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "kohta"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "kaavio"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "kuvateksti"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "asiakirjakehys"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "ylätunniste"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "sivu"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "kappale"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "liiallinen kohde"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "kaavake"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "linkki"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "syöttätavan ikkuna"
+
+#: ../atk/atkobject.c:186
+#| msgid "table row header"
+msgid "table row"
+msgstr "taulukon rivi"
+
+#: ../atk/atkobject.c:187
+#, fuzzy
+#| msgid "tree table"
+msgid "tree item"
+msgstr "puutaulukko"
+
+#: ../atk/atkobject.c:188
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "taulukkoasiakirja"
+
+#: ../atk/atkobject.c:189
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "esitysasiakirja"
+
+#: ../atk/atkobject.c:190
+#| msgid "document frame"
+msgid "document text"
+msgstr "tekstiasiakirja"
+
+#: ../atk/atkobject.c:191
+#| msgid "document frame"
+msgid "document web"
+msgstr "verkkoasiakirja"
+
+#: ../atk/atkobject.c:192
+#| msgid "document frame"
+msgid "document email"
+msgstr "sähköpostiasiakirja"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "kommentti"
+
+#: ../atk/atkobject.c:194
+#, fuzzy
+#| msgid "list"
+msgid "list box"
+msgstr "luettelo"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "ryhmittely"
+
+#: ../atk/atkobject.c:196
+#| msgid "image"
+msgid "image map"
+msgstr "kuvakartta"
+
+#: ../atk/atkobject.c:197
+#| msgid "animation"
+msgid "notification"
+msgstr "ilmoitus"
+
+#: ../atk/atkobject.c:198
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "tietopalkki"
+
+#: ../atk/atkobject.c:199
+#, fuzzy
+#| msgid "scroll bar"
+msgid "level bar"
+msgstr "vierityspalkki"
+
+#: ../atk/atkobject.c:200
+#, fuzzy
+#| msgid "tool bar"
+msgid "title bar"
+msgstr "työkalupalkki"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr ""
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "ääni"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "video"
+
+#: ../atk/atkobject.c:204
+#| msgid "animation"
+msgid "definition"
+msgstr "määritelmä"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "artikkeli"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr ""
+
+#: ../atk/atkobject.c:207
+#, fuzzy
+#| msgid "dialog"
+msgid "log"
+msgstr "valintaikkuna"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr ""
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr ""
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "arvostelu"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "ajastin"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "kuvausluettelo"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "kuvaustermi"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "kuvausarvo"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Esteetön nimi"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Olion ilmentymän nimi muotoiltuna apuvälinesovelluksia varten"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Esteetön kuvaus"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Olion kuvaus muotoiltuna apuvälinesovelluksia varten"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Esteetön emo"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Esteetön arvo"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Käytetään huomauttamaan, että arvo on muuttunut"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Esteettömyysrooli"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "Tämän olion esteettömyysrooli"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Esteettömyyskerros"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "Tämän olion esteettömyyskerros"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Esteetön MDI-arvo"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "Tämän olion esteetön MDI-arvo"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Esteetön taulukon otsake"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Käytetään huomauttamaan, että taulukon otsake on muuttunut. Tämän "
+"ominaisuuden sijaan tulisi käyttää ominaisuutta \"accessible-table-caption-"
+"object\"."
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Esteetön taulukon sarakkeen otsake"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "Käytetään huomauttamaan, että taulukon sarakkeen otsake on muuttunut"
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Esteetön taulukon sarakkeen kuvaus"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "Käytetään huomauttamaan, että taulukon sarakkeen kuvaus on muuttunut"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Esteetön taulukon rivin otsake"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "Käytetään huomauttamaan, että taulukon rivin otsake on muuttunut"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Esteetön taulukon rivin kuvaus"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Käytetään huomauttamaan, että taulukon rivin kuvaus on muuttunut"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Esteetön taulukon yhteenveto"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Käytetään huomauttamaan, että taulukon yhteenveto on muuttunut"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Esteetön taulukon otsakeolio"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Käytetään huomauttamaan, että taulukon otsake on muuttunut"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Esteettömien hyperlinkkien määrä"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "AtkHypertext-olion linkkien määrä"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "erittäin heikko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "heikko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+#| msgid "table"
+msgid "acceptable"
+msgstr "hyväksyttävä"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "vahva"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "erittäin vahva"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "erittäin matala"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "tavallinen"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "korkea"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "erittäin korkea"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "erittäin huono"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "huono"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "hyvä"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "erittäin hyvä"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "paras"
index f0eb565..bf57fe8 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
+# #-#-#-#-#  fr.po (at-spi2-core master)  #-#-#-#-#
 # French translation for at-spi2-core.
 # Copyright (C) 2011 Listed translators
 # This file is distributed under the same license as the at-spi2-core package.
 # Claude Paroz <claude@2xlibre.net>, 2011.
 # Charles Monzat <charles.monzat@numericable.fr>, 2018.
 #
+# #-#-#-#-#  fr.po (atk HEAD)  #-#-#-#-#
+# French translation of atk.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# This file is distributed under GNU Library General Public License Version 2.
+#
+# Jean-Michel Ardantz <jmardantz@ifrance.com>, 2002-2006.
+# Christophe Merlet <redfox@redfoxcenter.org>, 2004-2006.
+# Robert-André Mauchin <zebob.m@pengzone.org>, 2007.
+# Claude Paroz <claude@2xlibre.net>, 2011-2014
+# Charles Monzat <charles.monzat@free.fr>, 2018-2019.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
+"Project-Id-Version: atk HEAD\n"
 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
-"POT-Creation-Date: 2018-10-05 04:46+0000\n"
-"PO-Revision-Date: 2018-11-14 18:35+0100\n"
-"Last-Translator: Charles Monzat <charles.monzat@numericable.fr>\n"
-"Language-Team: français <gnomefr@traduc.org>\n"
+"POT-Creation-Date: 2022-09-12 16:02+0000\n"
+"PO-Revision-Date: 2022-09-16 08:11+0200\n"
+"Last-Translator: Guillaume Bernard <associations@guillaume-bernard.fr>\n"
+"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Gtranslator 3.30.0\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Gtranslator 3.32.1\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Lien sélectionné"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Indique si l’objet AtkHyperlink est sélectionné"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Nombre d’ancres"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Le nombre d’ancres associés avec l’objet AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Fin d’index"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "La fin de l’index de l’objet AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Début d’index"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Le début de l’index de l’objet AtkHyperlink"
+
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "non valide"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr "étiquette du raccourci"
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "alerte"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "animation"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "pointeur"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "calendrier"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr "canevas"
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr "case à cocher"
+
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr "élément de menu avec case à cocher"
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "sélecteur de couleurs"
+
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr "en-tête de colonne"
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr "liste déroulante"
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr "éditeur de dates"
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "icône du bureau"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr "cadre du bureau"
+
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr "afficheur circulaire"
+
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "boîte de dialogue"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr "panneau des répertoires"
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr "zone de dessin"
+
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr "sélecteur de fichiers"
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr "objet de remplissage"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr "sélecteur de polices"
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "cadre"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr "panneau de verre"
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr "conteneur html"
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "icône"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "image"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr "cadre interne"
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "étiquette"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr "panneau superposé"
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "liste"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr "élément de liste"
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr "barre de menus"
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "bouton de menu"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "élément de menu"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr "panneau d’options"
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr "onglet de page"
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr "liste d’onglets de page"
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "tableau de bord"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr "champ de mot de passe"
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr "menu contextuel"
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr "barre de progression"
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr "bouton"
+
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr "bouton radio"
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr "élément de menu avec bouton radio"
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr "panneau racine"
+
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr "en-tête de ligne"
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "barre de défilement"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr "panneau de défilement"
+
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "séparateur"
+
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr "glissière"
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr "panneau divisible"
+
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr "bouton de réglage"
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "barre d’état"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "tableau"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "cellule de tableau"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr "en-tête de colonne de tableau"
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr "en-tête de ligne de tableau"
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr "élément de menu détachable"
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "console"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "texte"
+
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr "bouton à deux états"
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "barre d’outils"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr "infobulle"
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "arbre"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr "tableau arborescent"
+
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "inconnu"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr "fenêtre de travail"
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "fenêtre"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "en-tête de page"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr "bas de page"
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "paragraphe"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr "ligne"
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "application"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr "autocomplétion"
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr "barre d’édition"
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr "composant incorporé"
+
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "zone de saisie"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr "graphique"
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr "légende"
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr "cadre du document"
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr "en-tête"
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "page"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "section"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr "objet redondant"
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "formulaire"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "lien"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr "fenêtre de méthode de saisie"
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "ligne de tableau"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "élément arborescent"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "document tableur"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "document présentation"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "document texte"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr "document web"
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr "document courriel"
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "commentaire"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr "liste déroulante"
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr "groupement"
+
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr "carte image"
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr "notification"
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr "barre d’informations"
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr "barre de niveau"
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr "barre de titre"
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr "bloc de citation"
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr "vidéo"
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr "définition"
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr "article"
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr "point de repère"
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr "journal"
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr "zone défilante"
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr "math"
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr "notation"
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr "chronomètre"
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr "liste descriptive"
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr "terme décrit"
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr "valeur de description"
+
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr "Nom accessible"
+
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nom d’une instance d’objet formaté pour être accessible par les aides "
+"techniques"
+
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr "Description accessible"
+
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Description d’un objet, formaté pour être accessible par les aides techniques"
+
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr "Parent accessible"
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Parent de l’élément accessible actuel renvoyé par atk_object_get_parent()"
+
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr "Valeur accessible"
+
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr "Est utilisé pour notifier que la valeur a changé"
+
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr "Rôle accessible"
+
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr "Le rôle accessible de cet objet"
+
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr "Couche accessible"
+
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr "La couche accessible de cet objet"
+
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr "Valeur MDI accessible"
+
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr "La valeur MDI accessible de cet objet"
+
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr "Légende de tableau accessible"
+
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Est utilisé pour notifier que la légende du tableau a changé ; cette "
+"propriété ne devrait pas être utilisée. La propriété accessible-table-"
+"caption-object devrait être utilisée à la place"
+
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr "En-tête de colonne de tableau accessible"
+
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Est utilisé pour notifier que l’en-tête de la colonne du tableau a changé"
+
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr "Description de colonne de tableau accessible"
+
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Est utilisé pour notifier que la description de la colonne du tableau a "
+"changé"
+
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr "En-tête de rangée de tableau accessible"
+
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Est utilisé pour notifier que l’en-tête de la rangée du tableau a changé"
+
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr "Description de rangée de tableau accessible"
+
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Est utilisé pour notifier que la description de la rangée du tableau a changé"
+
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr "Résumé de tableau accessible"
+
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr "Est utilisé pour notifier que le résumé du tableau a changé"
+
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr "Objet légende de tableau accessible"
+
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr "Est utilisé pour notifier que la légende du tableau a changé"
+
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr "Nombre de liens hypertextes accessibles"
+
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Le nombre de liens contenus par le AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "très faible"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "faible"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "acceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "fort"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "très fort"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "très bas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "moyen"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "élevé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "très élevé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "très mauvais"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "mauvais"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "très bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "optimal"
 
-#: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "L’application n’existe plus"
 
-#: atspi/atspi-misc.c:1850
-msgid "Attempted synchronous call where prohibited"
-msgstr "La tentative d’appel synchrone est interdite"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "La tentative d’appel synchrone est interdite"
index 54b7bad..5fa4a3e 100644 (file)
--- a/po/fur.po
+++ b/po/fur.po
+# #-#-#-#-#  fur.po (at-spi2-core gnome-3-8)  #-#-#-#-#
 # Friulian translation for at-spi2-core.
 # Copyright (C) 2013 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Fabio Tomat <f.t.public@gmail.com>, 2022.
+#
+# #-#-#-#-#  fur.po (atk master)  #-#-#-#-#
+# Friulian translation for atk.
+# Copyright (C) 2016 atk's COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+# Fabio Tomat <f.t.public@gmail.com>, 2022.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core gnome-3-8\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2016-03-23 15:57+0000\n"
-"PO-Revision-Date: 2016-03-23 18:16+0100\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-09-17 14:43+0000\n"
+"PO-Revision-Date: 2022-09-28 07:22+0200\n"
 "Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
 "Language-Team: Friulian <fur@li.org>\n"
 "Language: fur\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.5\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Poedit 1.8.12\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Colegament selezionât"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifiche se l'ogjet AtkHyperlink al è selezionât"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Numar di Ancuris"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Il numar di ancuris associadis cun l'ogjet AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Indiç finâl"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "L'indiç finâl dal ogjet AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Indiç iniziâl"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "L'indiç iniziâl dal ogjet AtkHyperlink"
+
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "no valit"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr "etichete aceleradôr"
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "alerte"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "animazion"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "frece"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "calendari"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr "tele"
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr "casele di discrosâ"
+
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr "vôs di menù di discrosâ"
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "seletôr colôr"
+
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr "intestazion colone"
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr "casele cumbinade"
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr "editôr di date"
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "icone dal scritori"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr "curnîs de scrivanie"
+
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr "cuadrant circolâr"
+
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "dialic"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr "ricuadri cartele"
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr "aree di disen"
+
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr "seletôr file"
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr "jempladôr"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr "seletôr gjenar di caratar"
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "curnîs"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr "ricuadri trasparent"
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr "contignidôr html"
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "icone"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "imagjin"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr "curnîs interne"
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "etichete"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr "ricuadri a nivei"
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "liste"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr "vôs di liste"
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "menù"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr "sbare menù"
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "boton menù"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "vôs di menù"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr "ricuadri opzion"
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr "schede"
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr "liste di schedis"
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr "test password"
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr "menù a comparî"
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr "sbare di avanzament"
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr "boton di fracâ"
+
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr "boton radio"
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr "vôs di menù radio"
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr "ricuadri lidrîs"
+
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr "intestazion rie"
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "sbare di scoriment"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr "ricuadri di scoriment"
+
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "separadôr"
+
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr "control dal scori"
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr "ricuadri dividût"
+
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr "boton che al zire"
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "sbare di stât"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "tabele"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "cele tabele"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr "intestazion colone tabele"
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr "intestazion rie tabele"
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr "vôs di menù distacabil"
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "terminâl"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "test"
+
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr "boton di comutazion"
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "sbare dai struments"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr "sugjeriment"
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "arbul"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr "tabele a arbul"
+
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "no cognossût"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr "aree de viodude"
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "barcon"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "intestazion"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr "da pît de pagjine"
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr "rie"
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "aplicazion"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr "completament automatic"
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr "sbare di modifiche"
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr "component incorporât"
+
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "cjamp inseriment"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr "diagram"
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr "didascalie"
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr "curnîs document"
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr "intestazion"
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "pagjine"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "sezion"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr "ogjet ridondant"
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "modul"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "colegament"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr "barcon metodi di input"
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "rie di tabele"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "element arbul"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "document sfuei di calcul"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "document presentazion"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "document test"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr "document web"
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr "document e-mail"
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "coment"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr "casele liste"
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr "intropament"
+
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr "mape imagjin"
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr "notifiche"
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr "sbare informazions"
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr "sbare nivel"
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr "sbare dal titul"
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr "bloc di citazion"
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr "definizion"
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr "articul"
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr "pont di riferiment"
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr "regjistri"
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr "tendon"
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr "matematiche"
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr "valutazion"
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr "timer"
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr "liste descrizion"
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr "tiermin descrizion"
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr "valôr descrizion"
+
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr "Non acessibil"
+
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Il non de istance dal ogjet formatât pal acès cun la tecnologjie di jutori"
+
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr "Descrizion acessibil"
+
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Descrizion di un ogjet, formatade pal acès cun la tecnologjie di jutori"
+
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr "Gjenitôr acessibil"
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Il gjenitôr dal atuâl acessibil come tornât di atk_object_get_parent()"
+
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr "Valôr acessibil"
+
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr "Doprât par notificâ che il valôr al è cambiât"
+
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr "Rûl acessibil"
+
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr "Il rûl acessibil di chest ogjet"
+
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr "Strât acessibil"
+
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr "Il strât acessibil di chest ogjet"
+
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr "Valôr MDI acessibil"
+
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr "Il valôr MDI acessibil di chest ogjet"
+
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr "Didascalie acessibil de tabele"
+
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Doprât par notificâ che la descrizion de tabele e je cambiade; no si varès "
+"di doprâ cheste proprietât. Si varès di doprâ invezit accessible-table-"
+"caption-object"
+
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr "Intestazion acessibil de colone de tabele"
+
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr "Doprade par notificâ che la intestazion de colone de tabele"
+
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr "Descrizion acessibil de colone de tabele"
+
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Doprade par notificâ che la descrizion de colone de tabele e je cambiade"
+
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr "Intestazion acessibil de rie de tabel"
+
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr "Doprade par notificâ che la intestazion de rie de tabele e je cambiade"
+
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr "Descrizion acessibil de rie de tabele"
+
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr "Doprade par notificâ che la descrizion de rie de tabele e je cambiade"
+
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr "Sintesi acessibil de tabele"
+
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr "Doprade par notificâ che la sintesi de tabele e je cambiade"
+
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr "Ogjet didascalie acessibil de tabele"
+
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr "Doprade par notificâ che la didascalie de tabele e je cambiade"
+
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr "Numar di colegaments acessibii tal ipertest"
+
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Il numar di colegaments presints tal AtkHypertext atuâl"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "une vore debule"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "debule"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "passabile"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "fuarte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "une vore fuarte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "une vore bas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "medi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "une vore alt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "mâl"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "no bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "une vore bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "il miôr"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1072
-#: ../atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Le aplicazion no esist plui"
 
-#: ../atspi/atspi-misc.c:1831
-msgid "Attempted synchronous call where prohibited"
-msgstr "Proibît tentatîf di clamade sincrone"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Proibît tentatîf di clamade sincrone"
index f69b8c1..61da247 100644 (file)
--- a/po/ga.po
+++ b/po/ga.po
@@ -1,10 +1,18 @@
+# #-#-#-#-#  ga.po (at-spi2-core.master)  #-#-#-#-#
 # Irish translations for at-spi2-core package.
 # Copyright (C) 2013 Free Software Foundation, Inc.
 # This file is distributed under the same license as the at-spi2-core package.
 # Seán de Búrca <leftmostcat@gmail.com>, 2013.
 #
+# #-#-#-#-#  ga.po (atk HEAD)  #-#-#-#-#
+# Irish Translation of atk
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Paul Duffy <dubhthach@frink.nuigalway.ie>, 2003.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ga.po (at-spi2-core.master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core.master\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-08-26 03:17-0600\n"
@@ -17,8 +25,541 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : "
 "4;\n"
+"#-#-#-#-#  ga.po (atk HEAD)  #-#-#-#-#\n"
+"Project-Id-Version: atk HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2003-06-05 19:30+0100\n"
+"Last-Translator: Paul Duffy <dubhthach@frink.nuigalway.ie>\n"
+"Language-Team: Irish\n"
+"Language: ga\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
 
 #: ../atspi/atspi-component.c:313 ../atspi/atspi-misc.c:1085
 #: ../atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Níl an feidhmchlár ann a thuilleadh"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr ""
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr ""
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr ""
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "easlán"
+
+#: atk/atkobject.c:75
+#, fuzzy
+msgid "accelerator label"
+msgstr "lipéad-accel"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "airdeallach"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "beochan"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "saighead"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "féilire"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "canbhás"
+
+#: atk/atkobject.c:81
+#, fuzzy
+msgid "check box"
+msgstr "bosca-seiceáil"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr ""
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr ""
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr ""
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr ""
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr ""
+
+#: atk/atkobject.c:87
+#, fuzzy
+msgid "desktop icon"
+msgstr "dealbh as an deasc"
+
+#: atk/atkobject.c:88
+#, fuzzy
+msgid "desktop frame"
+msgstr "framá as an deasc"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "diail"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "agallamh"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr ""
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr ""
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr ""
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr ""
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "framá"
+
+#: atk/atkobject.c:98
+#, fuzzy
+msgid "glass pane"
+msgstr "gloinefuinneoige"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr ""
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "dealbh"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "íomha"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr ""
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "lipéad"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr ""
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "liosta"
+
+#: atk/atkobject.c:106
+#, fuzzy
+msgid "list item"
+msgstr "liosta"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "roghchlár"
+
+#: atk/atkobject.c:108
+#, fuzzy
+msgid "menu bar"
+msgstr "roghchlár"
+
+#: atk/atkobject.c:109
+#, fuzzy
+msgid "menu item"
+msgstr "roghchlár"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr ""
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr ""
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr ""
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "painéal"
+
+#: atk/atkobject.c:114
+#, fuzzy
+msgid "password text"
+msgstr "téasc an passfhocal"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr ""
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr ""
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr ""
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr ""
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr ""
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr ""
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr ""
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr ""
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr ""
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "scartóir"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr ""
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr ""
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr ""
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr ""
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "tábla"
+
+#: atk/atkobject.c:130
+#, fuzzy
+msgid "table cell"
+msgstr "cealla i tábla"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr ""
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr ""
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr ""
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminéal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "téasc"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr ""
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr ""
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr ""
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "crann"
+
+#: atk/atkobject.c:140
+#, fuzzy
+msgid "tree table"
+msgstr "tábla an crann"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "gan aithnid"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "fuinneog"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr ""
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr ""
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "rialóir"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "feidhmchlár"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr ""
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "airdeallach"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "feidhmchlár"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr ""
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "íomha"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "framá"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
index df7e04b..84d497e 100644 (file)
--- a/po/gd.po
+++ b/po/gd.po
@@ -1,9 +1,17 @@
+# #-#-#-#-#  gd.po (at-spi2-core master)  #-#-#-#-#
 # Scottish Gaelic translation for at-spi2-core.
 # Copyright (C) 2016 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # GunChleoc <fios@foramnagaidhlig.net>, 2016.
+# #-#-#-#-#  gd.po (atk master)  #-#-#-#-#
+# Scottish Gaelic translation for atk.
+# Copyright (C) 2016 atk's COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+# GunChleoc <fios@foramnagaidhlig.net>, 2016, 2018.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  gd.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -19,6 +27,22 @@ msgstr ""
 "(n > 2 && n < 20) ? 2 : 3;\n"
 "X-Generator: Virtaal 0.7.1\n"
 "X-Project-Style: gnome\n"
+"#-#-#-#-#  gd.po (atk master)  #-#-#-#-#\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2017-09-11 09:07+0000\n"
+"PO-Revision-Date: 2018-03-01 10:25+0100\n"
+"Last-Translator: GunChleoc <fios@foramnagaidhlig.net>\n"
+"Language-Team: Fòram na Gàidhlig\n"
+"Language: gd\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
+"(n > 2 && n < 20) ? 2 : 3;\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Project-Style: gnome\n"
 
 #: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1072
 #: ../atspi/atspi-value.c:111
@@ -28,3 +52,797 @@ msgstr "Chan eil an aplacaid seo ann tuilleadh"
 #: ../atspi/atspi-misc.c:1831
 msgid "Attempted synchronous call where prohibited"
 msgstr "Chaidh gairm shioncronaichte a dhiùltadh"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Ceangal air a thaghadh"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+"Sònraichidh seo an deach an t-oibseact AtkHyperlink a thaghadh gus nach deach"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Àireamh de dh’acairean"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+"An àireamh de dh’acairean a tha co-cheangailte ris an oibseact AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Deireadh an inneics"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Deireadh an inneics aig an oibseict AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Toiseach an inneics"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Toiseach an inneics aig an oibseict AtkHyperlink"
+
+#: atk/atkobject.c:97
+msgid "invalid"
+msgstr "mì-dhligheach"
+
+#: atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "leubail luathachaidh"
+
+#: atk/atkobject.c:99
+msgid "alert"
+msgstr "caismeachd"
+
+#: atk/atkobject.c:100
+msgid "animation"
+msgstr "beòthachadh"
+
+#: atk/atkobject.c:101
+msgid "arrow"
+msgstr "saighead"
+
+#: atk/atkobject.c:102
+msgid "calendar"
+msgstr "mìosachan"
+
+#: atk/atkobject.c:103
+msgid "canvas"
+msgstr "canabhas"
+
+#: atk/atkobject.c:104
+msgid "check box"
+msgstr "bogsa-cromaige"
+
+#: atk/atkobject.c:105
+msgid "check menu item"
+msgstr "nì clàir-thaice cromaige"
+
+#: atk/atkobject.c:106
+msgid "color chooser"
+msgstr "roghnaichear dhathan"
+
+#: atk/atkobject.c:107
+msgid "column header"
+msgstr "bann-cinn cuilbh"
+
+#: atk/atkobject.c:108
+msgid "combo box"
+msgstr "bogsa combo"
+
+#: atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "deasaiche dàta"
+
+#: atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "ìomhaigheag an deasg"
+
+#: atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "frèam an deasg"
+
+#: atk/atkobject.c:112
+msgid "dial"
+msgstr "daitheal"
+
+#: atk/atkobject.c:113
+msgid "dialog"
+msgstr "còmhradh"
+
+#: atk/atkobject.c:114
+msgid "directory pane"
+msgstr "leòsan pasgain"
+
+#: atk/atkobject.c:115
+msgid "drawing area"
+msgstr "raon tarraing"
+
+#: atk/atkobject.c:116
+msgid "file chooser"
+msgstr "roghnaichear fhaidhlichean"
+
+#: atk/atkobject.c:117
+msgid "filler"
+msgstr "lìonadair"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "roghnaichear chruthan-chlò"
+
+#: atk/atkobject.c:120
+msgid "frame"
+msgstr "frèam"
+
+#: atk/atkobject.c:121
+msgid "glass pane"
+msgstr "leòsan glainne"
+
+#: atk/atkobject.c:122
+msgid "html container"
+msgstr "soitheach html"
+
+#: atk/atkobject.c:123
+msgid "icon"
+msgstr "ìomhaigheag"
+
+#: atk/atkobject.c:124
+msgid "image"
+msgstr "dealbh"
+
+#: atk/atkobject.c:125
+msgid "internal frame"
+msgstr "frèam taobh a-staigh"
+
+#: atk/atkobject.c:126
+msgid "label"
+msgstr "leubail"
+
+#: atk/atkobject.c:127
+msgid "layered pane"
+msgstr "leòsan fillte"
+
+#: atk/atkobject.c:128
+msgid "list"
+msgstr "liosta"
+
+#: atk/atkobject.c:129
+msgid "list item"
+msgstr "nì liosta"
+
+#: atk/atkobject.c:130
+msgid "menu"
+msgstr "clàr-taice"
+
+#: atk/atkobject.c:131
+msgid "menu bar"
+msgstr "bàr clàir-thaice"
+
+#: atk/atkobject.c:132
+msgid "menu item"
+msgstr "nì clàir-thaice"
+
+#: atk/atkobject.c:133
+msgid "option pane"
+msgstr "leòsan roghainnean"
+
+#: atk/atkobject.c:134
+msgid "page tab"
+msgstr "taba dhuilleagan"
+
+#: atk/atkobject.c:135
+msgid "page tab list"
+msgstr "liosta taba dhuilleagan"
+
+#: atk/atkobject.c:136
+msgid "panel"
+msgstr "panail"
+
+#: atk/atkobject.c:137
+msgid "password text"
+msgstr "teacsa facail-fhaire"
+
+#: atk/atkobject.c:138
+msgid "popup menu"
+msgstr "priob-chlàr-taice"
+
+#: atk/atkobject.c:139
+msgid "progress bar"
+msgstr "bàr adhartais"
+
+#: atk/atkobject.c:140
+msgid "push button"
+msgstr "putain putaidh"
+
+#: atk/atkobject.c:141
+msgid "radio button"
+msgstr "putan rèidio"
+
+#: atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "nì clàir-thaice rèidio"
+
+#: atk/atkobject.c:143
+msgid "root pane"
+msgstr "leòsan freumha"
+
+#: atk/atkobject.c:144
+msgid "row header"
+msgstr "bann-cinn ràigh"
+
+#: atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "bàr-sgrolaidh"
+
+#: atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "leòsan-sgrolaidh"
+
+#: atk/atkobject.c:147
+msgid "separator"
+msgstr "sgaradair"
+
+#: atk/atkobject.c:148
+msgid "slider"
+msgstr "sleamhnachan"
+
+#: atk/atkobject.c:149
+msgid "split pane"
+msgstr "leòsan sgoilte"
+
+#: atk/atkobject.c:150
+msgid "spin button"
+msgstr "putan-toinneimh"
+
+#: atk/atkobject.c:151
+msgid "statusbar"
+msgstr "bàr-staide"
+
+#: atk/atkobject.c:152
+msgid "table"
+msgstr "clàr"
+
+#: atk/atkobject.c:153
+msgid "table cell"
+msgstr "cealla clàir"
+
+#: atk/atkobject.c:154
+msgid "table column header"
+msgstr "bann-cinn colbh clàir"
+
+#: atk/atkobject.c:155
+msgid "table row header"
+msgstr "bann-cinn ràgh clàir"
+
+#: atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "nì clàir-thaice sracaidh dheth"
+
+#: atk/atkobject.c:157
+msgid "terminal"
+msgstr "tèirmineal"
+
+#: atk/atkobject.c:158
+msgid "text"
+msgstr "teacsa"
+
+#: atk/atkobject.c:159
+msgid "toggle button"
+msgstr "putan toglachaidh"
+
+#: atk/atkobject.c:160
+msgid "tool bar"
+msgstr "bàr-inneal"
+
+#: atk/atkobject.c:161
+msgid "tool tip"
+msgstr "gliocas-sgrìn"
+
+#: atk/atkobject.c:162
+msgid "tree"
+msgstr "craobh"
+
+#: atk/atkobject.c:163
+msgid "tree table"
+msgstr "clàr-craoibhe"
+
+#: atk/atkobject.c:164
+msgid "unknown"
+msgstr "chan eil fhios"
+
+#: atk/atkobject.c:165
+msgid "viewport"
+msgstr "port-seallaidh"
+
+#: atk/atkobject.c:166
+msgid "window"
+msgstr "uinneag"
+
+#: atk/atkobject.c:167
+msgid "header"
+msgstr "bann-cinn"
+
+#: atk/atkobject.c:168
+msgid "footer"
+msgstr "bann-coise"
+
+#: atk/atkobject.c:169
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:170
+msgid "ruler"
+msgstr "rùilear"
+
+#: atk/atkobject.c:171
+msgid "application"
+msgstr "aplacaid"
+
+#: atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "fèin-choileanadh"
+
+#: atk/atkobject.c:173
+msgid "edit bar"
+msgstr "bàr deasachaidh"
+
+#: atk/atkobject.c:174
+msgid "embedded component"
+msgstr "co-phàirt leabaichte"
+
+#: atk/atkobject.c:175
+msgid "entry"
+msgstr "innteart"
+
+#: atk/atkobject.c:176
+msgid "chart"
+msgstr "cairt"
+
+#: atk/atkobject.c:177
+msgid "caption"
+msgstr "caipsean"
+
+#: atk/atkobject.c:178
+msgid "document frame"
+msgstr "frèam sgrìobhainne"
+
+#: atk/atkobject.c:179
+msgid "heading"
+msgstr "ceann-sgrìobhaidh"
+
+#: atk/atkobject.c:180
+msgid "page"
+msgstr "duilleag"
+
+#: atk/atkobject.c:181
+msgid "section"
+msgstr "earrann"
+
+#: atk/atkobject.c:182
+msgid "redundant object"
+msgstr "oibseact anabarrach"
+
+#: atk/atkobject.c:183
+msgid "form"
+msgstr "foirm"
+
+#: atk/atkobject.c:184
+msgid "link"
+msgstr "ceangal"
+
+#: atk/atkobject.c:185
+msgid "input method window"
+msgstr "uinneag dòigh ion-chuir"
+
+#: atk/atkobject.c:186
+msgid "table row"
+msgstr "ràgh clàir"
+
+#: atk/atkobject.c:187
+msgid "tree item"
+msgstr "nì craoibhe"
+
+#: atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "sgrìobhainn cliath-dhuilleige"
+
+#: atk/atkobject.c:189
+msgid "document presentation"
+msgstr "sgrìobhainn taisbeanaidh"
+
+#: atk/atkobject.c:190
+msgid "document text"
+msgstr "sgrìobhainn teacsa"
+
+#: atk/atkobject.c:191
+msgid "document web"
+msgstr "sgrìobhainn-lìn"
+
+#: atk/atkobject.c:192
+msgid "document email"
+msgstr "sgrìobhainn puist-d"
+
+#: atk/atkobject.c:193
+msgid "comment"
+msgstr "beachd"
+
+#: atk/atkobject.c:194
+msgid "list box"
+msgstr "bogsa-liosta"
+
+#: atk/atkobject.c:195
+msgid "grouping"
+msgstr "buidhneachadh"
+
+#: atk/atkobject.c:196
+msgid "image map"
+msgstr "mapa dhealbhan"
+
+#: atk/atkobject.c:197
+msgid "notification"
+msgstr "brath"
+
+#: atk/atkobject.c:198
+msgid "info bar"
+msgstr "bàr-fiosrachaidh"
+
+#: atk/atkobject.c:199
+msgid "level bar"
+msgstr "bàr-leibheil"
+
+#: atk/atkobject.c:200
+msgid "title bar"
+msgstr "bàr-tiotail"
+
+#: atk/atkobject.c:201
+msgid "block quote"
+msgstr "bloc-iomradh"
+
+#: atk/atkobject.c:202
+msgid "audio"
+msgstr "fuaim"
+
+#: atk/atkobject.c:203
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:204
+msgid "definition"
+msgstr "deifinisean"
+
+#: atk/atkobject.c:205
+msgid "article"
+msgstr "artaigeal"
+
+#: atk/atkobject.c:206
+msgid "landmark"
+msgstr "comharra-tìre"
+
+#: atk/atkobject.c:207
+msgid "log"
+msgstr "loga"
+
+#: atk/atkobject.c:208
+msgid "marquee"
+msgstr "teacsa ’na ruith"
+
+#: atk/atkobject.c:209
+msgid "math"
+msgstr "matamataig"
+
+#: atk/atkobject.c:210
+msgid "rating"
+msgstr "rangachadh"
+
+#: atk/atkobject.c:211
+msgid "timer"
+msgstr "tìmear"
+
+#: atk/atkobject.c:212
+msgid "description list"
+msgstr "liosta thuairisgeulan"
+
+#: atk/atkobject.c:213
+msgid "description term"
+msgstr "abairt tuairisgeil"
+
+#: atk/atkobject.c:214
+msgid "description value"
+msgstr "luach tuairisgeil"
+
+#: atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Ainm so-ruigsinneach"
+
+#: atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"An t-ainm air ionstans an oibseict fòrmatadh a chum teicneolas so-"
+"ruigsinneachd"
+
+#: atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Tuairisgeul so-ruigsinneach"
+
+#: atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"An tuairisgeul air ionstans an oibseict fòrmatadh a chum teicneolas so-"
+"ruigsinneachd"
+
+#: atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Pàrant so-ruigsinneach"
+
+#: atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Pàrant an nì so-ruigsinnich làithrich mar a thilleas atk_object_get_parent()"
+
+#: atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Luach so-ruigsinneach"
+
+#: atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Thèid a chleachdadh gus fios a leigeil gun deach an luach atharrachadh"
+
+#: atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Dreuchd so-ruigsinneach"
+
+#: atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "Dreuchd so-ruigsinneach an oibseict seo"
+
+#: atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Breath so-ruigsinneach"
+
+#: atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "Breath so-ruigsinneach an oibseict seo"
+
+#: atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Luach MDI so-ruigsinneach"
+
+#: atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "Luach MDI so-ruigsinneach an oibseict seo"
+
+#: atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Caipsean clàir so-ruigsinneach"
+
+#: atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach caipsean a’ chlàir "
+"atharrachadh; cha bu chòir an roghainn seo a chleachdadh. Cleachd accessible-"
+"table-caption-object ’na àite"
+
+#: atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Bann-cinn colbh clàir so-ruigsinneach"
+
+#: atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach bann-cinn aig colbh clàir "
+"atharrachadh"
+
+#: atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Tuairisgeul colbh clàir so-ruigsinneach"
+
+#: atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach tuairisgeul aig colbh clàir "
+"atharrachadh"
+
+#: atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Bann-cinn ràgh clàir so-ruigsinneach"
+
+#: atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach bann-cinn aig ràgh clàir "
+"atharrachadh"
+
+#: atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Tuairisgeul ràgh clàir so-ruigsinneach"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach tuairisgeul aig ràgh clàir "
+"atharrachadh"
+
+#: atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Gearr-chunntas clàir so-ruigsinneach"
+
+#: atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach gearr-chunntas aig ràgh "
+"clàir atharrachadh"
+
+#: atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Oibseact caipsean clàir so-ruigsinneach"
+
+#: atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+"Thèid a chleachdadh gus fios a leigeil gun deach caipsean aig clàr "
+"atharrachadh"
+
+#: atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Àireamh dhe cheanglaichean-lìn so-ruigsinneach"
+
+#: atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "An àireamh dhe cheanglaichean a tha aig an AtkHypertext làithreach"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "glè lag"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "lag"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "ceart gu leòr"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "làidir"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "glè làidir"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "glè ìosal"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "meadhanach"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "àrd"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "glè àrd"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "glè dhona"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "dona"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "math"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "glè mhath"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "as fhearr"
index ed8f1fd..1485222 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
+# #-#-#-#-#  gl.po (at-spi 2-core)  #-#-#-#-#
 # Galician translations for at-spi package.
 # Copyright (C) 2011 THE at-spi'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi package.
 # Fran Diéguez <frandieguez@gnome.org>, 2011.
-# Fran Dieguez <frandieguez@gnome.org>, 2014.
+# #-#-#-#-#  gl.po (gl)  #-#-#-#-#
+# Galician translation of atk.
+# This file is distributed under the same license as the ATK package.
+# Copyright (C) 2010 Fran Diéguez <frandieguez@ubuntu.com>
+# Proxecto Trasno - Adaptación do software libre á lingua galega:  Se desexas
+# colaborar connosco, podes atopar máis información en http://www.trasno.net
+# Ignacio Casal Quinteiro <nacho.resa@gmail.com>, 2005, 2006.
+# Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009.
+# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011.
+# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
+# Fran Dieguez <frandieguez@gnome.org>, 2013-2022.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi 2-core\n"
+"Project-Id-Version: gl\n"
 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
-"POT-Creation-Date: 2020-12-28 16:53+0000\n"
-"PO-Revision-Date: 2019-12-25 05:11+0100\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-21 17:15+0200\n"
 "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
-"Language-Team: Proxecto Trasno <proxecto@trasno.gal>\n"
+"Language-Team: Galician <proxecto@trasno.gal>\n"
 "Language: gl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  gl.po (at-spi 2-core)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 40.0\n"
+"#-#-#-#-#  gl.po (gl)  #-#-#-#-#\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Poedit 2.2.4\n"
+"X-DL-Team: gl\n"
+"X-DL-Module: at-spi2-core\n"
+"X-DL-Branch: main\n"
+"X-DL-Domain: po\n"
+"X-DL-State: Translating\n"
 
-#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1077 atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Ligazón seleccionada"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica se o obxecto AtkHyperlink está seleccionado"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Número de áncoras"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "O número de áncoras asociadas ao obxecto AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Índice final"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "O índice final do obxecto AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Índice inicial"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "O índice inicial do obxecto AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "non válido"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "etiqueta de tecla rápida"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "alerta"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animación"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "frecha"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "calendario"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "lenzo"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "caixa de verificación"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "elemento de menú de verificación"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "selector de cor"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "cabeceira de columna"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "caixa de combinación"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "editor de data"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "icona de escritorio"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "marco de escritorio"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "marcador"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "diálogo"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "panel de directorio"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "área de debuxo"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "selector de ficheiros"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "recheo"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "selector de tipo de letra"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "marco"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "panel transparente"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "contedor html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "icona"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "imaxe"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "marco interno"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiqueta"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "panel en capas"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "elemento de lista"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menú"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "barra de menú"
+
+#: atk/atkobject.c:133
+#| msgid "push button"
+msgid "menu button"
+msgstr "botón de menú"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "elemento de menú"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "panel de opcións"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "lapela de páxina"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lista de lapelas de páxina"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "texto de contrasinal"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "menú emerxente"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "barra de progreso"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "botón de premer"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "botón de opción"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "elemento de menú de opción"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "panel raíz"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "cabeceira de fila"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "barra de desprazamento"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "panel de desprazamento"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "control desprazábel"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "panel dividido"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "botón de axuste"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "barra de estado"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "táboa"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "cela de táboa"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "cabeceira de columna de táboa"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "cabeceira de fila de táboa"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "elemento de menú desprazábel"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "texto"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "botón de estado"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "barra de ferramentas"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "ferramenta de suxestións"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "árbore"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "táboa en árbore"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "descoñecido"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "área de visualización"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "xanela"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "cabeceira"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "pé de páxina"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "parágrafo"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "regra"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplicación"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "completar automaticamente"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "barra de edición"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "compoñente incorporado"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "entrada"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "gráfica"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "lenda"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "marco de documento"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "título"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "páxina"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "sección"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "obxecto redundante"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formulario"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "ligazón"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "xanela de método de entrada"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "fila de táboa"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "elemento de árbore"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "documento da folla de cálculo"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "documento de presentación"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "documento de texto"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "documento web"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "documento de correo electrónico"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "comentario"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "caixa de lista"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "agrupación"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "mapa de imaxe"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "notificación"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "barra de información"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "barra de nivel"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "barra de título"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "bloque de cita"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "son"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "vídeo"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definición"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "artigo"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "punto de referencia"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "rexistro"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "marquesiña"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matemáticas"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "puntuación"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "temporizador"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "lista de descricións"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "termo de descrición"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "valor de descrición"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Nome accesíbel"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"O nome da instancia do obxecto formatado para o acceso a tecnoloxías "
+"adaptadas"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Descrición accesíbel"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"A descrición dun obxecto formatado para o acceso a tecnoloxías adaptadas"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Pai accesíbel"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "O pai do accesíbel actual como o devolve atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Valor accesíbel"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Úsase para notificar que o valor cambiou"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Rol accesíbel"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "O rol accesíbel deste obxecto"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Capa accesíbel"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "A capa accesíbel deste obxecto"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accesíbel"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "O valor MDI accesíbel deste obxecto"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Título da táboa accesíbel"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Úsase para notificar que o título da táboa cambiou. Esta propiedade non se "
+"debe usar. En troques, debe usarse accessible-table-caption-object"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Cabeceira de columna da táboa accesíbel"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Úsase para notificar que a cabeceira de columna da táboa cambiou"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Descrición de columna da táboa accesíbel"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Úsase para notificar que a descrición de columna da táboa cambiou"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Cabeceira de fila de táboa accesíbel"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Úsase para notificar que a cabeceira de fila da táboa cambiou"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Descrición de fila da táboa accesíbel"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Úsase para notificar que a descrición de fila da táboa cambiou"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Resumo de táboa accesíbel"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Úsase para notificar que o resumo da táboa cambiou"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Obxecto de título de táboa accesíbel"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Úsase para notificar que o título da táboa cambiou"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Número de ligazóns de hipertexto accesíbeis"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "O número de ligazóns que ten o AtkHypertext actual"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "moi débil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "débil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "aceptábel"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "moi forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "moi baixa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "media"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "moi alta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "moi mala"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "mala"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "boa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "moi mala"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "a mellor"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "A aplicación xa non existe"
 
-#: atspi/atspi-misc.c:1855
-msgid "Attempted synchronous call where prohibited"
-msgstr "Tentouse unha chamada síncrona onde estaba prohibida"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Tentouse unha chamada síncrona onde estaba prohibida"
index 6fa0d65..a6c88b2 100644 (file)
--- a/po/gu.po
+++ b/po/gu.po
@@ -1,13 +1,24 @@
+# #-#-#-#-#  gu.po (gu)  #-#-#-#-#
 # translation of gu.po to Gujarati
 # Gujarati translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Sweta Kothari <swkothar@redhat.com>, 2011.
+# #-#-#-#-#  gu.po (atk.HEAD.gu)  #-#-#-#-#
+# translation of atk.HEAD.gu.po to Gujarati
+# Copyright (C) 2004, 2005, 2006, 2009 Free Software Foundation, Inc.
+# MagNet <magnet@magnet-i.com>, 2004.
+# Ankit Patel <ankit@redhat.com>, 2004.
+# Ankit Patel <ankit644@yahoo.com>, 2005, 2006.
+# Sweta Kothari <swkothar@redhat.com>, 2009, 2011.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  gu.po (gu)  #-#-#-#-#\n"
 "Project-Id-Version: gu\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-spi&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&component=general\n"
 "POT-Creation-Date: 2011-02-07 18:52+0000\n"
 "PO-Revision-Date: 2011-02-08 12:04+0530\n"
 "Last-Translator: Sweta Kothari <swkothar@redhat.com>\n"
@@ -18,6 +29,25 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"#-#-#-#-#  gu.po (atk.HEAD.gu)  #-#-#-#-#\n"
+"Project-Id-Version: atk.HEAD.gu\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-09-11 11:03+0000\n"
+"PO-Revision-Date: 2011-09-21 16:45+0000\n"
+"Last-Translator: \n"
+"Language-Team: gu_IN <kde-i18n-doc@kde.org>\n"
+"Language: gu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"<magnet@magnet-i.com>\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"\n"
+"\n"
+"\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -39,14 +69,18 @@ msgstr "AT-SPI: GetItems માં ભૂલ, sender=%s, error=%s"
 msgid ""
 "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
 "signature %s"
-msgstr "AT-SPI: વિચિત્ર હસ્તાક્ષર %s સાથે Called _atspi_dbus_return_accessible_from_message"
+msgstr ""
+"AT-SPI: વિચિત્ર હસ્તાક્ષર %s સાથે Called "
+"_atspi_dbus_return_accessible_from_message"
 
 #: ../atspi/atspi-misc.c:616
 #, c-format
 msgid ""
 "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
 "signature %s"
-msgstr "AT-SPI: વિચિત્ર હસ્તાક્ષર %s સાથે Called _atspi_dbus_return_hyperlink_from_message"
+msgstr ""
+"AT-SPI: વિચિત્ર હસ્તાક્ષર %s સાથે Called "
+"_atspi_dbus_return_hyperlink_from_message"
 
 #: ../atspi/atspi-misc.c:641
 #, c-format
@@ -79,7 +113,9 @@ msgstr "કાર્યક્રમ લાંબા સમય સુધા અ
 #: ../atspi/atspi-misc.c:1130
 #, c-format
 msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-msgstr "AT-SPI: ફેરફાર (ભિન્નતા) ની ઇચ્છા રાખેલ છે જ્યારે ઇન્ટરફેસ %s માંથી %s ને લાવી રહ્યા હોય; %s મળ્યુ\n"
+msgstr ""
+"AT-SPI: ફેરફાર (ભિન્નતા) ની ઇચ્છા રાખેલ છે જ્યારે ઇન્ટરફેસ %s માંથી %s ને લાવી રહ્યા "
+"હોય; %s મળ્યુ\n"
 
 #: ../atspi/atspi-misc.c:1136
 #, c-format
@@ -101,11 +137,584 @@ msgid "Streamable content not implemented"
 msgstr "Streamable સમાવિષ્ટનું અમલીકરણ થયેલ નથી"
 
 #: ../atspi/atspi-event-listener.c:510
-msgid "called atspi_event_listener_register_from_callback with a NULL event_type"
-msgstr "NULL event_type સાથે atspi_event_listener_register_from_callback કોલ થયેલ છે"
+msgid ""
+"called atspi_event_listener_register_from_callback with a NULL event_type"
+msgstr ""
+"NULL event_type સાથે atspi_event_listener_register_from_callback કોલ થયેલ છે"
 
 #: ../atspi/atspi-event-listener.c:777
 #, c-format
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "ઇન્ટરફેસ %s માંથી સંકેત %s માટે અયોગ્ય હસ્તાક્ષર %s મળ્યુ\n"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "પસેદ કરેલ કડી"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "સ્પષ્ટ કરો કે એટીકેહાઈપરલિંક વસ્તુ પસંદ કરેલ છે"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "એકંરોની સંખ્યા"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "એટીકેહાઈપરલિંક વસ્તુ સાથે સંકળાયેલ એકંરોની સંખ્યા"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "અનુક્રમણિકાનો અંત"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "એટીકેહાઈપરલિંક વસ્તુની અનુક્રમણિકાનો અંત"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "અનુક્રમણિકાની શરુઆત"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "એટીકેહાઈપરલિંક વસ્તુની અનુક્રમણિકાનો શરુઆત"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "અયોગ્ય"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "પ્રવેગિત લેબલ"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "સાવધાન"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "એનીમેશન"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "તીર"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "કેલેન્ડર"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "કેનવાસ"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "ચૅક-બૉકસ"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "ચૅક બૉકસવાળી મેનુની વસ્તુ"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "રંગ પસંદ કરનાર"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "સ્તંભ હેડર"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "કોમ્બો બૉક્સ"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "તારીખ સંપાદક"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ડેસ્કટોપ ચિહ્ન"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ડેસ્કટોપ ચોકઠુ"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "ડાયલ"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "સંવાદ"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ડિરેક્ટરી તક્તી"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "ચિત્રકામનો વિસ્તાર"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ફાઇલ પસંદ કરનાર"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "ભરનાર"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ફોન્ટ પસંદ કરનાર"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ચોકઠુ"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "કાચની તકતી"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html સમાવનાર"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ચિહ્ન"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "ચિત્ર"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "આંતરિક ચોકઠુ"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "લેબલ"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "સ્તરવાળી તકતી"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "યાદી"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "યાદીની વસ્તુઓ"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "મેનુ"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "મેનુ પટ્ટી"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "મેનુની વસ્તુ"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "વિકલ્પ-તકતી"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "પાનાનું ટેબ"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "પાનાના ટેબની યાદી"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "પેનલ"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "પાસવર્ડ-લખાણ"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "પૉપઅપ મેનુ"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "પ્રગતિદર્શક-પટ્ટી"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "દબાતુ બટન"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "રેડિયો બટન"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "રેડિયો બટનવાળી મેનુની વસ્તુઓ"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "રુટ તકતી"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "હરોળ હેડર"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "ખસેડવાની પટ્ટી"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "ખસેડવા માટેની તકતી"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "વિભાજક"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "સરકપટ્ટી"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "છૂટુ પાડવા માટેની તકતી"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "ફેરવવાનું બટન"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "સ્થિતિદર્શકપટ્ટી"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "કોષ્ટક"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "કોષ્ટક ખાનુ"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "કોષ્ટકના સ્તંભનું હેડર"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "કોષ્ટકની હરોળનું હેડર"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "મેનુની વસ્તુને કાઢી નાખો"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "ટર્મિનલ"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "લખાણ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ફેરબદલી કરવાનું બટન"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "સાધન પટ્ટી"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "સાધન માટેની મદદ"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ટ્રી"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ટ્રી કોષ્ટક"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "અજાણ્યુ"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "દ્રશ્ય પ્રદેશ"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "વિન્ડો"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "હેડર"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "ફુટર"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "ફકરો"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "નિયમ બનાવનાર"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "કાર્યક્રમ"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "આપોઆપ પૂરુ"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "ફેરફાર કરવાની પટ્ટી"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "જડિત ભાગો"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "પ્રવેશ"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "આલેખ"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "કેપ્શન"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "દસ્તાવેજ ચોકઠું"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "મથાળું"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "પાનું"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "વિભાગ"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "રીડન્ડન્ટ ઓબ્જેક્ટ"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ફોર્મ"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "કડી"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ઇનપુટ પદ્દત્તિ વિન્ડો"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "કોષ્ટકની હરોળ"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "ટ્રી વસ્તુ"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "દસ્તાવેજ સ્પ્રેડશીટ"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "દસ્તાવેજ રજૂઆત"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "દસ્તાવેજ લખાણ"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "દસ્તાવેજ વેબ"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "દસ્તાવેજ ઇમેઇલ"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "ટિપ્પણી"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "યાદી બોક્સ"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "સમૂહીકરણ"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "ચિત્ર નક્ષો"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "સૂચના"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "જાણકારી પટ્ટી"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "પ્રાપ્ત થઇ શકે તેવુ નામ"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "સહાયક તકનીકને પ્રાપ્ત કરવા માટે વસ્તુના નમૂનાના નામનુ બંધારણ કર્યુ"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "પ્રાપ્ત થઇ શકે તેવુ વર્ણન"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "વસ્તુનુ વર્ણન, સહાયક તકનીકને પ્રાપ્ત કરવા માટે બંધારણ કર્યુ"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "પ્રાપ્ત થઇ શકે તેવો પિતૃ"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "શું તે પિતૃ બદલાઇ ગયો તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "પ્રાપ્ત થઇ શકે તેવી કિંમત"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "શું તે કિંમત બદલાઇ ગયો તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "પ્રાપ્ત થઇ શકે તેવો રોલ"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "આ વસ્તુનો પ્રાપ્ત થઇ શકે તેવો રોલ"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "પ્રાપ્ત થઇ શકે તેવુ સ્તર"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "આ વસ્તુનુ પ્રાપ્ત થઇ શકે તેવુ સ્તર"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "પ્રાપ્ત થઇ શકે તેવી MDI કિંમત"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "આ વસ્તુની પ્રાપ્ત થઇ શકે તેવી MDI કિંમત"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "પ્રાપ્ત થઇ શકે તેવુ કોષ્ટકનુ નામ"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"શું તે કોષ્ટકનુ નામ બદલાઇ ગયુ છે તેની નોંધ માટે વપરાય છે; આ ગુણધર્મનો ઉપયોગ થવો જોઇએ નહિ. "
+"તેની જગ્યાએ પ્રાપ્ત થઇ શકે તેવુ-કોષ્ટક-નામ-વસ્તુ વાપરવુ જોઇએ"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "પ્રાપ્ત થઇ શકે તેવુ કોષ્ટક સ્તંભ હેડર"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "શું તે કોષ્ટકના સ્તંભના હેડરનુ નામ બદલાઇ ગયુ છે તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "પ્રાપ્ત થઇ શકે તેવા કોષ્ટકના સ્તંભનુ વર્ણન"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "શું તે કોષ્ટકના સ્તંભનુ વર્ણન બદલાઇ ગયુ છે તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "પ્રાપ્ત થઇ શકે તેવા કોષ્ટકની હરોળનુ હેડર"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "શું તે કોષ્ટકના હરોળની હેડરનુ નામ બદલાઇ ગયુ છે તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "પ્રાપ્ત થઇ શકે તેવા કોષ્ટકની હરોળનુ વર્ણન"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "શું તે કોષ્ટકના હરોળનુ વર્ણન બદલાઇ ગયુ છે તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "પ્રાપ્ત થઇ શકે તેવા કોષ્ટકનો સારાંશ"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "શું તે કોષ્ટકનો સારાંશ બદલાઇ ગયો છે તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "પ્રાપ્ત થઇ શકે તેવા કોષ્ટકના નામની વસ્તુ"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "શું તે કોષ્ટકનુ નામ બદલાઇ ગયુ છે તેની નોંધ માટે વપરાય છે"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "પ્રાપ્ત થઇ શકે તેવી હાઇપરલખાણની કડીઓની સંખ્યા"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "વર્તમાન એટીકેહાઇપરલખાણ ધરાવે છે તે કડીઓની સંખ્યા"
index 771620b..b4cc373 100644 (file)
--- a/po/he.po
+++ b/po/he.po
+# #-#-#-#-#  he.po (at-spi2-core)  #-#-#-#-#
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # Yaron Shahrabani <sh.yaron@gmail.com>, 2011.
+# #-#-#-#-#  he.po (atk.HEAD.he)  #-#-#-#-#
+# translation of atk.HEAD.he.po to Hebrew
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# Gil 'Dolfin' Osher <dolfin@rpg.org.il>, 2002
+# Yosef Or Boczko <yoseforb@gmail.com>, 2014-2024.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-03-06 10:15+0200\n"
-"PO-Revision-Date: 2014-03-06 10:15+0200\n"
+"Project-Id-Version: atk.HEAD.he\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2024-01-03 22:53+0000\n"
+"PO-Revision-Date: 2024-01-06 17:43+0200\n"
 "Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
-"Language-Team: Gezer (Hebrew)\n"
+"Language-Team: Hebrew <yoseforb@gmail.com>\n"
 "Language: he\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Virtaal 0.7.0-beta4\n"
+"#-#-#-#-#  he.po (at-spi2-core)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"X-Generator: Gtranslator 45.3\n"
 "X-Poedit-Language: Hebrew\n"
 "X-Poedit-Country: ISRAEL\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 "X-Project-Style: default\n"
+"#-#-#-#-#  he.po (atk.HEAD.he)  #-#-#-#-#\n"
+"X-Generator: Gtranslator 2.91.6\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Selected Link"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifies whether the AtkHyperlink object is selected"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Number of Anchors"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "The number of anchors associated with the AtkHyperlink object"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "End index"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "The end index of the AtkHyperlink object"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Start index"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "The start index of the AtkHyperlink object"
+
+#: atk/atkobject.c:272
+msgid "Accessible Name"
+msgstr "Accessible Name"
+
+#: atk/atkobject.c:273
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Object instance’s name formatted for assistive technology access"
+
+#: atk/atkobject.c:279
+msgid "Accessible Description"
+msgstr "Accessible Description"
+
+#: atk/atkobject.c:280
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Description of an object, formatted for assistive technology access"
+
+#: atk/atkobject.c:286
+msgid "Accessible Parent"
+msgstr "Accessible Parent"
+
+#: atk/atkobject.c:287
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Parent of the current accessible as returned by atk_object_get_parent()"
+
+#: atk/atkobject.c:303
+msgid "Accessible Value"
+msgstr "Accessible Value"
+
+#: atk/atkobject.c:304
+msgid "Is used to notify that the value has changed"
+msgstr "Is used to notify that the value has changed"
+
+#: atk/atkobject.c:312
+msgid "Accessible Role"
+msgstr "Accessible Role"
+
+#: atk/atkobject.c:313
+msgid "The accessible role of this object"
+msgstr "The accessible role of this object"
+
+#: atk/atkobject.c:320
+msgid "Accessible Layer"
+msgstr "Accessible Layer"
+
+#: atk/atkobject.c:321
+msgid "The accessible layer of this object"
+msgstr "The accessible layer of this object"
+
+#: atk/atkobject.c:329
+msgid "Accessible MDI Value"
+msgstr "Accessible MDI Value"
+
+#: atk/atkobject.c:330
+msgid "The accessible MDI value of this object"
+msgstr "The accessible MDI value of this object"
+
+#: atk/atkobject.c:346
+msgid "Accessible Table Caption"
+msgstr "Accessible Table Caption"
+
+#: atk/atkobject.c:347
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+
+#: atk/atkobject.c:361
+msgid "Accessible Table Column Header"
+msgstr "Accessible Table Column Header"
+
+#: atk/atkobject.c:362
+msgid "Is used to notify that the table column header has changed"
+msgstr "Is used to notify that the table column header has changed"
+
+#: atk/atkobject.c:377
+msgid "Accessible Table Column Description"
+msgstr "Accessible Table Column Description"
+
+#: atk/atkobject.c:378
+msgid "Is used to notify that the table column description has changed"
+msgstr "Is used to notify that the table column description has changed"
+
+#: atk/atkobject.c:393
+msgid "Accessible Table Row Header"
+msgstr "Accessible Table Row Header"
+
+#: atk/atkobject.c:394
+msgid "Is used to notify that the table row header has changed"
+msgstr "Is used to notify that the table row header has changed"
+
+#: atk/atkobject.c:408
+msgid "Accessible Table Row Description"
+msgstr "Accessible Table Row Description"
+
+#: atk/atkobject.c:409
+msgid "Is used to notify that the table row description has changed"
+msgstr "Is used to notify that the table row description has changed"
+
+#: atk/atkobject.c:415
+msgid "Accessible Table Summary"
+msgstr "Accessible Table Summary"
+
+#: atk/atkobject.c:416
+msgid "Is used to notify that the table summary has changed"
+msgstr "Is used to notify that the table summary has changed"
+
+#: atk/atkobject.c:422
+msgid "Accessible Table Caption Object"
+msgstr "Accessible Table Caption Object"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the table caption has changed"
+msgstr "Is used to notify that the table caption has changed"
+
+#: atk/atkobject.c:429
+msgid "Number of Accessible Hypertext Links"
+msgstr "Number of Accessible Hypertext Links"
+
+#: atk/atkobject.c:430
+msgid "The number of links which the current AtkHypertext has"
+msgstr "The number of links which the current AtkHypertext has"
+
+#: atk/atkobject.c:439
+msgid "Accessible ID"
+msgstr "Accessible ID"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:440
+msgid "ID for the accessible; useful for automated testing"
+msgstr "ID for the accessible; useful for automated testing"
+
+#: atk/atkobject.c:446
+msgid "Help text"
+msgstr "Help text"
+
+#: atk/atkobject.c:447
+msgid "Help text associated with the accessible"
+msgstr "Help text associated with the accessible"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "חלש מאוד"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "חלש"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "קביל"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "חזק"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "חזק מאוד"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "נמוך מאוד"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "בינוני"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "גבוה"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "גבוה מאוד"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "רע מאוד"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "רע"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "טוב"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "טוב מאוד"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "הטוב ביותר"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "The application no longer exists"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "Attempted synchronous call where prohibited"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "invalid"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "accelerator label"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "alert"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "animation"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "arrow"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "calendar"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "canvas"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "check box"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "check menu item"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "color chooser"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "column header"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "combo box"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "dateeditor"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "desktop icon"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "desktop frame"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "dial"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "dialog"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "directory pane"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "drawing area"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "file chooser"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "filler"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "fontchooser"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "frame"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "glass pane"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html container"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "icon"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "image"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "internal frame"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "label"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "layered pane"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "list"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "list item"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "menu"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "menu bar"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "menu button"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "menu item"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "option pane"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "page tab"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "page tab list"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "panel"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "password text"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "popup menu"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "progress bar"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "push button"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "radio button"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "radio menu item"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "root pane"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "row header"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "scroll bar"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "scroll pane"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "separator"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "slider"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "split pane"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "spin button"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "statusbar"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "table"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "table cell"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "table column header"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "table row header"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "tear off menu item"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminal"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "text"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "toggle button"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "tool bar"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "tool tip"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "tree"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "tree table"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "unknown"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "viewport"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "window"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "header"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "footer"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "paragraph"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "ruler"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "application"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "autocomplete"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "edit bar"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "embedded component"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "entry"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "chart"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "caption"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "document frame"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "heading"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "page"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "section"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "redundant object"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "form"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "link"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "input method window"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "table row"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "tree item"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "document spreadsheet"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "document presentation"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "document text"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "document web"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "document email"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "comment"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "list box"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "grouping"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "image map"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "notification"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "info bar"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "level bar"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "title bar"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "block quote"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "audio"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "definition"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "article"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "landmark"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "log"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "marquee"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "math"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "rating"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "timer"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "description list"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "description term"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "description value"
+
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Attempted synchronous call where prohibited"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Unknown signature %s for RemoveAccessible"
@@ -92,3 +897,6 @@ msgstr "Attempted synchronous call where prohibited"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Got invalid signature %s for signal %s from interface %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Is used to notify that the parent has changed"
index b1fc96b..c06ae19 100644 (file)
--- a/po/hi.po
+++ b/po/hi.po
@@ -1,11 +1,23 @@
+# #-#-#-#-#  hi.po (at-spi2-core.po.master.hi)  #-#-#-#-#
 # translation of at-spi2-core.po.master.hi.po to Hindi
 # Hindi translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # chandankumar(ciypro) <chandankumar.093047@gmail.com>, 2012.
+# #-#-#-#-#  hi.po (hi)  #-#-#-#-#
+# translation of hi.po to Hindi
+# Copyright (C) 2003, G Karunakar
+# This file is distributed under the same license as the atk package.
+#
+# G Karunakar <karunakar@freedomink.org>, 2003.
+# Ravishankar Shrivastava <raviratlami@yahoo.com>, 2004.
+# Rajesh Ranjan <rranjan@redhat.com>, 2005, 2006, 2009.
+# chandankumar(ciypro) <chandankumar.093047@gmail.com>, 2012.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  hi.po (at-spi2-core.po.master.hi)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core.po.master.hi\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -19,9 +31,601 @@ msgstr ""
 "X-Generator: Lokalize 1.2\n"
 "Language: hi\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  hi.po (hi)  #-#-#-#-#\n"
+"Project-Id-Version: hi\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-09-11 11:03+0000\n"
+"PO-Revision-Date: 2012-03-26 15:41+0530\n"
+"Last-Translator: chandankumar(ciypro) <chandankumar.093047@gmail.com>\n"
+"Language-Team: Hindi <kde-i18n-doc@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"Language: hi\n"
 
 #: ../atspi/atspi-misc.c:937 ../atspi/atspi-misc.c:988
 #: ../atspi/atspi-misc.c:1029
 msgid "The application no longer exists"
 msgstr "अनुप्रयोग अब मौजूद नहीं है"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "चयनित लिंक"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "उल्लेखित करता है कि क्या एटीके-हायपरलिंक वस्तु चयनित है"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "लंगर की संख्या"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "एटीके-हायपरलिंक वस्तु के साथ सम्बद्ध लंगर की संख्या"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "अंतिम सूची"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "एटीके-हायपरलिंक वस्तु की अंतिम सूची"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "प्रारंभ सूची"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "एटीके-हायपरलिंक वस्तु का प्रारंभ सूची"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "अवैध"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "त्वरक लेबल"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "सावधान"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "चल छवि"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "तीर"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "पंचांग"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "कैनवास"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "जाँच पेटी"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "चेक मेन्यू मद"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "रंग चयनक"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "स्तंभ शीर्षिका"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "कॉम्बो पेटी"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "तिथि-सम्पादक"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "डेस्कटॉप प्रतीक"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "डेस्कटॉप फ्रेम"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "डायल"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "संवाद"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "निर्देशिका फलक"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "आरेखण-क्षेत्र"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "फ़ाइल-चयनक"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "भरनेवाला"
+
+#  I know it looks wrong but that is what Java returns
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "फ़ॉन्ट-चयनक"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "फ्रेम"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "काँच-फलक"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "एचटीएमएल-धारक"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "प्रतीक"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "छवि"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "आन्तरिक फ्रेम"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "लेबल"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "स्तरित फलक"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "सूची"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "सूची मद"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "मेन्यू"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "मेन्यू पट्टी"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "मेन्यू मद"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "विकल्प फलक"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "पृष्ठ टैब"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "पृष्ठ टैब सूची"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "पटल"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "पासवर्ड पाठ"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "पॉपअप मेन्यू"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "प्रगति पट्टी"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "पुश बटन"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "रेडियो बटन"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "रेडियो मेन्यू मद"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "रूट फलक"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "पंक्ति शीर्षिका"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "स्क्रॉल पट्टी"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "स्क्रॉल फलक"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "विभाजक"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "स्लाइडर"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "कटा फलक"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "स्पिन बटन"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "स्थिति-पट्टी"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "सारणी"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "सारणी कोष्ठ"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "सारणी स्तंभ शीर्षिका"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "सारणी पंक्ति शीर्षिका"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "टीयर ऑफ मेन्यू मद"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "टर्मिनल"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "पाठ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "टॉगल बटन"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "औज़ार पट्टी"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "औज़ार युक्ति"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ट्री"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "तरू-सारणी"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "अज्ञात"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "व्यूपोर्ट"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "विंडो"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "शीर्षिका"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "फुटर"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "अनुच्छेद"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "रूलर"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "अनुप्रयोग"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "स्वतः समाप्त"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "संपादन पट्टी"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "एंबेडेड घटक"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "प्रविष्टि"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "चार्ट"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "शीर्षक"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "दस्तावेज़ ढांचा"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "शीर्षक"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "पृष्ठ"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "खंड"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "वैकल्पिक वस्तु"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "प्रपत्र"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "कड़ी"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "इनपुट विधि विंडो"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "सारणी पंक्ति"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "ट्री मद"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "दस्तावेज़ स्प्रेडशीट"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "दस्तावेज़ प्रस्तुतीकरण"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "दस्तावेज़ पाठ"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "दस्तावेज़ वेब"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "दस्तावेज़ ईमेल"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "टिप्पणी"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "सूची बॉक्स"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "समूहबद्धता"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "छवि नक़्शा"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "अधिसूचना"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "जानकारी पट्टी"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "पंहुचयोग्य नाम"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "मददगार तकनीक पँहुच हेतु प्रारूपित वस्तु उदाहरण नाम"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "पहुँच योग्य वर्णन"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "मददगार तकनीक पँहुच हेतु प्रारूपित वस्तु का वर्णन"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "पहुँच योग्य जनक"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "जनक बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "पहुँच योग्य मूल्य"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "मान बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "पहुँच योग्य भूमिका"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "इस वस्तु की पहुँच योग्य भूमिका"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "पहुँच योग्य परत"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "इस वस्तु की पहुँच योग्य परत"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "पहुँच योग्य एमडीआई मूल्य"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "इस वस्तु का पहुँच योग्य एमडीआई मूल्य"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "पहुँच योग्य सारणी शीर्षक"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"सारणी शीर्षक बदल चुका है यह बताने हेतु उपयोग में आता है, यह गुण उपयोग में नहीं लेना चाहिए. "
+"बदले में पहुँच योग्य-सारणी-शीर्षक-वस्तु उपयोग में लेना चाहिए"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "पहुँच योग्य सारणी स्तंभ शीर्षिका"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "सारणी स्तंभ शीर्षिका बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "पहुँच योग्य सारणी स्तंभ वर्णन"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "पहुँच योग्य सारणी स्तंभ वर्णन बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "पहुँच योग्य सारणी पंक्ति शीर्षिका"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "सारणी पंक्ति शीर्षिका बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "पहुँच योग्य सारणी पंक्ति वर्णन"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "पहुँच योग्य सारणी पंक्ति वर्णन बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "पहुँच योग्य सारणी सारांश"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "सारणी स्तंभ सारांश बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "पहुँच योग्य सारणी शीर्षक वस्तु"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "सारणी शीर्षक बदल चुका है यह बताने हेतु उपयोग में आता है"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "पहुँच योग्य हायपरटेक्स्ट कड़ी की संख्या"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "कड़ी की संख्या जो कि वर्तमान एटीके-हायपरटेक्स्ट में हैं"
index a808b12..8725834 100644 (file)
--- a/po/hr.po
+++ b/po/hr.po
+# #-#-#-#-#  hr.po (at-spi2-core master)  #-#-#-#-#
 # Croatian translation for at-spi2-core.
 # Copyright (C) 2016 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
+# #-#-#-#-#  hr.po (atk 0)  #-#-#-#-#
+# Translation of atk to Croatian
+# Copyright (C) Croatian team
+# This file is distributed under the same license as the ATK package.
+# Translators: Automatski Prijevod <>,Robert Sedak <robert.sedak@sk.t-com.hr>,
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=at-spi2-core\n"
-"POT-Creation-Date: 2016-09-21 16:49+0000\n"
-"PO-Revision-Date: 2016-09-24 12:21+0200\n"
-"Language-Team: Croatian <hr@li.org>\n"
+"Project-Id-Version: atk 0\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-13 00:23+0200\n"
+"Last-Translator: gogo <trebelnik2@gmail.com>\n"
+"Language-Team: Croatian <lokalizacija@linux.hr>\n"
 "Language: hr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"Last-Translator: gogo <trebelnik2@gmail.com>\n"
-"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Launchpad-Export-Date: 2018-03-17 15:36+0000\n"
+"X-Generator: Poedit 2.0.6\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Odabrana poveznica"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Određuje je li odabran objekt AtkHyperlink"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Broj sidara"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Broj sidara povezanih sa objektom AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Završetak sadržaja"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Završni sadržaj objekta AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Početak sadržaja"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Početni sadržaj objekta AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "neispravno"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "oznaka ubrzivača"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "upozorenje"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animacija"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "strelica"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalendar"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "platno"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "okvir odabira"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "okvir izbornika odbira"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "odabiratelj boja"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "zaglavlje stupca"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "padajući izbornik"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "uređivač datuma"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "ikona radne površine"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "okvir radne površine"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "biraj"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "dijalog"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "površina direktorija"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "područje crtanja"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "odabiratelj datoteka"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "popunjivač"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "odabiratelj slova"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "okvir"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "staklena površina"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "spremnik html kôda"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikona"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "slika"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "unutarnji okvir"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "naslov"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "slojevita površina"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "popis"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "popis stavaka"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "izbornik"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "traka izbornika"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "tipka izbornika"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "stavka izbornika"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "površina mogućnosti"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "kartica stranice"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "popis kartica stranice"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "tekst lozinke"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "skočni izbornik"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "traka napredka"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "tipka na pritisak"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "tipka kružića odabira"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "stavka izbornika kružića odabira"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "korijenska površina"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "zaglavlje retka"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "klizač"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "pomična površina"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "razdjelnik"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "klizač"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "razdijeljena površina"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "okretajuća tipka"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "traka stanja"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tablica"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "ćelija tablice"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "zaglavlje stupca u tablici"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "zaglavlje redka u tablici"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "stavka izbornika za odvajanje stavki"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "tekst"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "preklopna tipka"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "alatna traka"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "savjet"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "stablo"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "tablica stabla"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "nepoznato"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "početni prikaz"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "prozor"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "zaglavlje"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "podnožje"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "odlomak"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "ravnalo"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplikacija"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "samodopuna"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "traka uređivanja"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "ugrađena komponenta"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "zapis"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "grafikon"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "opis slike"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "okvir dokumenta"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "zaglavlje"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "stranica"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "odlomak"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "suvišan objekt"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "obrazac"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "poveznica"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "prozor načina unosa"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "redak tablice"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "stavka stabla"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "proračunska tablica dokumenta"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "prezentacija dokumenta"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "tekst dokumenta"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "web dokumenta"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "e-pošta dokumenta"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "komentar"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "okvir popisa"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "grupiranje"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "karta slike"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "obavijest"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "info traka"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "traka razine"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "naslovna traka"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "citat bloka"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "zvuk"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "video snimka"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definicija"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "članak"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "orijentir"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "zapis"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "pomični tekst"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematika"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "ocjenjivanje"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "odbrojavanje"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "popis opisa"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "izraz opisa"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "vrijednost opisa"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Dostupan naziv"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Naziv primjera objekta oblikovanog za pristup pomoćnim tehnologijama"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Dostupan opis"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Opis objekta, oblikovanog za pristup pomoćnim tehnologijama"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Dostupan sadržaj"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Sadržaj trenutno dostupan vraćena od strane atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Dostupana vrijednost"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Koristi se za obavijesti da je vrijednost promijenjena"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Dostupna namjena"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Dostupna namjena za ovaj objekt"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Dostupan sloj"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Dostupan sloj za ovaj objekt"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Dostupna MDI vrijednost"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Dostupna MDI vrijednost za ovaj objekt"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Dostupan naslov tablice"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Koristi se za obavijesti da je promijenjen naslov tablice; ovo svojstvo se "
+"ne bi trebalo koristiti. Umjesto toga bi trebalo koristiti accessible-table-"
+"caption-object"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Dostupno zaglavlje stupca tablice"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Koristi se za obavijesti da je promijenjeno zaglavlje stupca tablice"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Dostupan opis stupca tablice"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Koristi se za obavijesti da je promijenjen opis stupca tablice"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Dostupno zaglavlje retka tablice"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Koristi se za obavijesti da je promijenjeno zaglavlje retka tablice"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Dostupan opis retka tablice"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Koristi se za obavijesti da je promijenjen opis retka tablice"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Dostupan sažetak tablice"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Koristi se za obavijesti da je promijenjen sažetak tablice"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Dostupan objekt naslova tablice"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Koristi se za obavijesti da je promijenjen naslov tablice"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Broj dostupnih poveznica hiperteksta"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Broj poveznica koje ima trenutni AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "vrlo slaba"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "slaba"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "prihvatljiva"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "snažna"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "vrlo snažna"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "vrlo slaba"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "srednja"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "visoka"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "vrlo visoka"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "vrlo loša"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "loša"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "dobra"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "vrlo dobra"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "najbolja"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1073
-#: ../atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Aplikacija više ne postoji"
 
-#: ../atspi/atspi-misc.c:1832
-msgid "Attempted synchronous call where prohibited"
-msgstr "Pokušaj usklađenog poziva gdje je zabranjeno"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Pokušaj usklađenog poziva gdje je zabranjeno"
index d8b5b9a..e1f152e 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
+# hu.po (at-spi2-core master)
 # Hungarian translation of at-spi2-core
 # Copyright (C) 2011. Free Software Foundation, Inc.
 # This file is distributed under the same license as the at-spi2-core package
 #
 # Gabor Kelemen <kelemeng at gnome dot hu>, 2011.
 # Balázs Úr <urbalazs at gmail dot com>, 2014.
+# hu.po (atk master)
+# Hungarian translation of atk.
+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2011, 2012 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+#
+#
+#
+# Andras Timar <timar at gnome dot hu>, 2002, 2003.
+# Laszlo Dvornik <dvornik at gnome dot hu>, 2004.
+# Szabolcs Varga <shirokuma at shirokuma dot hu>, 2005.
+# Gabor Kelemen <kelemeng at gnome dot hu>, 2005, 2006, 2008, 2009, 2011, 2014.
+# Balázs Meskó <meskobalazs at gmail dot com>, 2011.
+# Attila Hammer <hammera at pickup dot hu>, 2012, 2014, 2022.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-02-23 16:09+0100\n"
-"Last-Translator: Balázs Úr <urbalazs at gmail dot com>\n"
-"Language-Team: Hungarian <gnome at fsf dot hu>\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-04 11:58+0200\n"
+"Last-Translator: Attila Hammer <hammera at pickup dot hu>\n"
+"Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n"
 "Language: hu\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.2\n"
-"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.6\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Kijelölt hivatkozás"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Megadja, hogy ki van-e jelölve az AtkHyperlink objektum"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Horgonyok száma"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Az AtkHyperlink objektumhoz rendelt horgonyok száma"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Befejező index"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Az AtkHyperlink objektum befejező indexe"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Kezdő index"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Az AtkHyperlink objektum kezdő indexe"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "érvénytelen"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "gyorsítócímke"
+
+# Megjegyzés: ez a szöveg nem jelenik meg a képernyőn, viszont ez inkább nem értesítést jelent?
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "értesítés"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animáció"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "nyíl"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "naptár"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "rajzvászon"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "jelölőnégyzet"
+
+# Megjegyzés: korábban az Orkában ezt jelölőelemnek fordítottuk, megváltoztathatjuk itt? Ez a szöveg nem jelenik meg a képernyőn. Használhatnánk esetleg a
+# jelölőmenü vezérlőelem megnevezést, ez rövidebb.
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "jelölőelem"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "színválasztó"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "oszlopfejléc"
+
+# Megjegyzés: Korábban okrában ezt kombinált listamezőnek fordítottuk, igazodva a többi képernyőolvasóhoz (JAWS, NVDA). Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "kombinált listamező"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "dátumszerkesztő"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "asztali ikon"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "asztali keret"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "tárcsa"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "párbeszédablak"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "könyvtár-ablaktábla"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "rajzterület"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "fájlválasztó"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "kitöltő"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "betűkészlet-választó"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "keret"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "üveg-ablaktábla"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html-konténer"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikon"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "kép"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "belső keret"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "címke"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "réteges ablaktábla"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "listaelem"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menü"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "menüsor"
+
+# Korábban erre a vezérlőelemre Orkában a gomb fordítást használtuk, igazodva más képernyőolvasókhoz (JAWS, NVDA). Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:133
+#| msgid "push button"
+msgid "menu button"
+msgstr "menügomb"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "menüelem"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "beállítás-ablaktábla"
+
+# Megjegyzés: korábban Orkában ezt a vezérlőelemet lapfülre fordítottuk, igazodva más képernyőolvasókhoz (JAWS, NVDA). Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "lapfül"
+
+# Ezt inkább érdemesebb laplistára fordítani, mivel más ernyőolvasók is ezt használják, korábban az Orkában is ezt a fordítást használtuk. Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "laplista"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+# A jelszó beviteli mező mindig egy szerkesztőmezőként jelenik meg, más ernyőolvasók ezt a fordítást használják. Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "jelszó szerkesztőmező"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "helyi menü"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "folyamatjelző"
+
+# Korábban erre a vezérlőelemre Orkában a gomb fordítást használtuk, igazodva más képernyőolvasókhoz (JAWS, NVDA). Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "gomb"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "választógomb"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "választógomb-elem"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "gyökér-ablaktábla"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "sorfejléc"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "gördítősáv"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "gördíthető ablaktábla"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "elválasztó"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "csúszka"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "felosztott ablaktábla"
+
+# Megjegyzés: korábban Orkában a léptetőgomb fordítást használtuk, igazodva más képernyőolvasókhoz (JAWS, NVDA). Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "léptetőgomb"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "állapotsor"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "táblázat"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "táblázatcella"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "táblázat-oszlopfejléc"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "táblázat-sorfejléc"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "leválasztható menüelem"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminál"
+
+# Korábban erre a vezérlőelemre Orkában a szerkesztőmező fordítást használtuk, igazodva más képernyőolvasókhoz (JAWS, NVDA). Ez a szöveg nem jelenik meg a képernyőn.
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "szerkesztőmező"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "kapcsológomb"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "eszköztár"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "buboréksúgó"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "fa"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "fatáblázat"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "ismeretlen"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "munkalap"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "ablak"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "élőfej"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "élőláb"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "bekezdés"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "vonalzó"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "alkalmazás"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "automatikus kiegészítés"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "szerkesztősáv"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "beágyazott komponens"
+
+# Megjegyzés: Itt a gtk.entry vezérlőelemet jelölik, ezt korábban szerkesztőmezőként fordítottuk. Ez a szöveg nem fog megjelenni a képernyőn.
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "szerkesztőmező"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagram"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "felirat"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "dokumentumkeret"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "címsor"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "oldal"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "szakasz"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "redundáns objektum"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "űrlap"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "hivatkozás"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "bemeneti módszer ablak"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "táblázatsor"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "faelem"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "táblázat dokumentum"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "bemutató dokumentum"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "szöveges dokumentum"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "webes dokumentum"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "e-mail dokumentum"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "megjegyzés"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "listadoboz"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "csoportosítás"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "kép"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "értesítés"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "információs sor"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "szintsáv"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "címsor"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "idézetblokk"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "hang"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "videó"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definíció"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "cikk"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "jelölő"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "napló"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "futó szöveg"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematikai kifejezés"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "értékelés"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "időzítő"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "leíráslista"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "leírt kifejezés"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "leíró érték"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Akadálymentes név"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Az objektumpéldány neve az akadálymentesítési technológiás hozzáféréshez "
+"formázva"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Akadálymentes leírás"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Az objektumpéldány leírása, a akadálymentesítési technológiás hozzáféréshez "
+"formázva"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Akadálymentes szülő"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"A pillanatnyi akadálymentes objektumról visszaadott szülőobjektum az "
+"atk_object_get_parent() függvény használatával"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Akadálymentes érték"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Értesítésre szolgál, ha az érték módosult"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Akadálymentes szerep"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Az objektum akadálymentes szerepe"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Akadálymentes réteg"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Az objektum akadálymentes rétege"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Akadálymentes MDI-érték"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Az objektum akadálymentes MDI-értéke"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Akadálymentes táblázatcím"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Értesítésre szolgál, ha a táblázat címe módosult. Ezt a tulajdonságot nem "
+"szabad használni, helyette az accessible-table-caption-object tulajdonság "
+"használandó"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Akadálymentes táblázat-oszlopfejléc"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Értesítésre szolgál, ha a táblázat oszlopfejléc módosult"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Akadálymentes táblázat-oszlopleírás"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Értesítésre szolgál, ha a táblázat oszlopleírás módosult"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Akadálymentes táblázat-sorfejléc"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Értesítésre szolgál, ha a táblázat sorfejléc módosult"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Akadálymentes táblázat-sorleírás"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Értesítésre szolgál, ha a táblázat sorleírás módosult"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Akadálymentes táblázat-összefoglalás"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Értesítésre szolgál, ha a táblázat-összefoglalás módosult"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Akadálymentes táblázatcím objektum"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Értesítésre szolgál, ha a táblázatcím módosult"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Az akadálymentes hiperszöveg-hivatkozások száma"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Az aktuális AtkHypertext hivatkozásainak száma"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "nagyon gyenge"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "gyenge"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "elfogadható"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "erős"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "nagyon erős"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "nagyon alacsony"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "közepes"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "magas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "nagyon magas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "nagyon rossz"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "rossz"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "jó"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "nagyon jó"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "legjobb"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Az alkalmazás már nem létezik"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Szinkronizációs hívást próbáltak, ahol tilos"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Szinkronizációs hívást próbáltak, ahol tilos"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Ismeretlen aláírás (%s) a RemoveAccessible elemhez"
@@ -97,3 +906,6 @@ msgstr "Szinkronizációs hívást próbáltak, ahol tilos"
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr ""
 #~ "Érvénytelen aláírás (%s) érkezett a(z) %s szignálhoz a(z) %s felületről\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Értesítésre szolgál, ha a szülő módosult"
diff --git a/po/hy.po b/po/hy.po
new file mode 100644 (file)
index 0000000..1e4808c
--- /dev/null
+++ b/po/hy.po
@@ -0,0 +1,522 @@
+# Translation of atk to Armenian
+# This file is distributed under the same license as the atk package.
+# Copyright (C) 2010, Arman Vardanyan
+# Arman Vardanyan <armvardany@yandex.ru>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=atk&component=general\n"
+"POT-Creation-Date: 2010-05-03 22:21+0000\n"
+"PO-Revision-Date: 2010-05-27 17:38+0400\n"
+"Last-Translator: Nune <nune@instigatedesign.com>\n"
+"Language-Team:  <norik@freenet.am>\n"
+"Language: hy\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Ընտրված հղում"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Որոշում է արդյոք AtkHyperlink օբյեկտն ընտրված է"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Խարիսխների քանակը"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink օբյեկտի հետ ասոցացված խարիսխների քանակը"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Վերջնական ինդեքս"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink օբյեկտի վերջնական ինդեքս"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Սկիզբնական ինդեքս"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink օբյեկտի սկիզբնական ինդեքս"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "անվավեր"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "արագացուցչի պիտակ"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "տագնապ"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "անիմացիա"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "սլաք"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "օրացույց"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "կտավ"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "նշատուփ"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "նշատուփերի տարր"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "գույնի ընտրություն"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "սյան գլխամաս"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "համակցված տուփ"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "ամսաթվի խմբագրիչ"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "աշխատասեղանի պատկերակ"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "աշխատասեղանի շրջանակ"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "համարի հավաքում"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "երկխոսություն"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "պանակի վահանակ"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "նկարչության տարածք"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ֆայլերի ընտրություն"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "ներկող"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "տառատեսակի ընտրություն"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "շրջանակ"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "թափանցիկ վահանակ"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "պարունակությունը html լեզվով"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "պատկերակ"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "նկար"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ներքին շրջանակ"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "պիտակ"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "շերտավոր վահանակ"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "ցուցակ"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "ցուցակի տարր"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "մենյու"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "մենյուի գոտի"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "մենյուի տարր"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "ընտրանքի վահանակ"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "էջի ներդիր"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "էջի ներդիրների ցանկ"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "վահանակ"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "գաղտնաբառ"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "ելնող մենյու"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ընթացագոտի"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "սեղմվող կոճակ"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "կետակոճակ"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "Կետակոճակների տարր"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "արմատային վահանակ"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "տողի գլխամաս"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "ոլորագոտի"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "ոլորման վահանակ"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "բաժանիչ"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "սահիչ"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "կրկնակի վահանակ"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "պտտման կոճակ"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "վիճակագոտի"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "աղյուսակ"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "աղյուսակի բջիջ"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "աղյուսակի սյան գլխամաս"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "աղյուսակի տողի գլխամաս"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "անբաժան մենյուի տարր"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "տերմինալ"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "տեքստ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "փոխանջատիչ կոճակ"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "գործիքների գոտի"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "հուշում"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ծառ"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ծառի տեսքով աղյուսակ"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "անհայտ"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "դիտման տարածք"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "պատուհան"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "գլխամաս"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "ստորամաս"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "պարբերություն"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "քանոն"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "աշխատածրագիր"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "ինքնալրացում"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "խմբագրման վահանակ"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "ներդրված բաղադրիչ"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "գրառում"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "գծապատկեր"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "վերնագիր"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "փաստաթղթի շրջանակ"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "վերնագիր"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "էջ"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "բաժին"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "ավելցուկային օբյեկտ"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ձեւ"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "հղում"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "մուտքագրման մեթոդի պատուհան"
+
+#: ../atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Մատչելիացված անուն"
+
+#: ../atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Օբյեկտի օրինակի նկարագրություն, որն օգտագործվում է մատչելիացման տեխնոլոգիաների միջոցով հասանելիության համար"
+
+#: ../atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Մատչելիացված նկարագրություն"
+
+#: ../atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Օբյեկտի նկարագրություն, որն օգտագործվում է մատչելիացման տեխնոլոգիաների միջոցով հասանելիության համար"
+
+#: ../atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Մատչելիացված ծնող"
+
+#: ../atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Օգտագործվում է ծնողի փոփոխությունների մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Մատչելիացված արժեք"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Օգտագործվում է արժեքի փոփոխության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Մատչելիացված դեր"
+
+#: ../atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Այս օբյեկտի հասանելի դերը"
+
+#: ../atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Մատչելիացված շերտ"
+
+#: ../atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Այս օբյեկտի հասանելի շերտը"
+
+#: ../atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Մատչելիացված MDI արժեք"
+
+#: ../atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Այս օբյեկտի հասանելի MDI արժեքը"
+
+#: ../atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Մատչելիացված աղյուսակի վերնագիր"
+
+#: ../atk/atkobject.c:546
+msgid "Is used to notify that the table caption has changed; this property should not be used. accessible-table-caption-object should be used instead"
+msgstr "Օգտագործվում է աղյուսակի գլխամասի փոփոխության մասին տեղեկացնելու համար; այս հատկությունը չպետք է օգտագործվի, փոխարենը պետք է օգտագործվի accessible-table-caption-object հատկությունը"
+
+#: ../atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Մաչելիացված աղյուսակի սյան գլխամաս"
+
+#: ../atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Օգտագործվում է աղյուսակի սյան գլխամասի փոփոխության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Աղյուսակի սյան մատչելի նկարագրություն"
+
+#: ../atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Օգտագործվում է աղյուսակի սյան նկարագրության փոփոխության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Մաչելիացված աղյուսակի տողի գլխամաս"
+
+#: ../atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Օգտագործվում է աղյուսակի տողի գլխամասի փոփոխության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Աղյուսակի տողի մատչելի նկարագրություն"
+
+#: ../atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Օգտագործվում է աղյուսակի տողի նկարագրության փոփոության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Մատչելիացված աղյուսակի ամփոփում"
+
+#: ../atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Օգտագործվում է աղյուսակի ամփոփման փոփոխության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Մատչելիացված աղյուսակի վերնագրի օբյեկտ"
+
+#: ../atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Օգտագործվում է աղյուսակի վերնագրի փոփոխության մասին տեղեկացնելու համար"
+
+#: ../atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Հասանելի հիպերտեքստային հղումների քանակը"
+
+#: ../atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "AtkHypertext ընթացիկ օբյեկտի պարունակած հղումների քանակը"
index 1254f7e..8ab76b5 100644 (file)
--- a/po/id.po
+++ b/po/id.po
+# #-#-#-#-#  id.po (at-spi2-core master)  #-#-#-#-#
 # Indonesian translation of at-spi2-core
 # Copyright (C) 2011 THE at-spi2-core'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Andika Triwidada <andika@gmail.com>, 2011.
 # Dirgita <dirgitadevina@yahoo.co.id>, 2011.
+# #-#-#-#-#  id.po (atk master)  #-#-#-#-#
+# Indonesia translation of atk HEAD.
+# Copyright (C) 2005 THE atk's COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+#
+# Mohammad DAMT <mdamt@bisnisweb.com>, 2005.
+# Ahmad Riza H Nst  <rizahnst@gnome.org>, 2006.
+# Andika Triwidada <andika@gmail.com>, 2010, 2011, 2014.
+# Dirgita <dirgitadevina@yahoo.co.id>, 2010.
+# Kukuh Syafaat <kukuhsyafaat@gnome.org>, 2021-2022, 2024.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-08 15:47+0000\n"
-"PO-Revision-Date: 2014-02-09 06:38+0700\n"
-"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
-"Language-Team: Indonesian <gnome@i15n.org>\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2024-01-03 22:53+0000\n"
+"PO-Revision-Date: 2024-01-05 12:39+0700\n"
+"Last-Translator: Kukuh Syafaat <kukuhsyafaat@gnome.org>\n"
+"Language-Team: GNOME Indonesian Translation Team <gnome@i15n.org>\n"
 "Language: id\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 1.6.3\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4\n"
+"X-Generator: Poedit 3.0\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Taut Terpilih"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Menentukan apakah objek AtkHyperlink dipilih atau tidak"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Jumlah Jangkar/Anchor"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Jumlah jangkar/anchor yang dihubungkan dengan objek AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Indeks akhir"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Akhir indeks objek AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Indeks awal"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Indeks awal objek AtkHyperlink"
+
+#: atk/atkobject.c:272
+msgid "Accessible Name"
+msgstr "Nama Akses"
+
+#: atk/atkobject.c:273
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Nama turunan objek yang digunakan untuk teknologi kemudahan akses"
+
+#: atk/atkobject.c:279
+msgid "Accessible Description"
+msgstr "Keterangan Akses"
+
+#: atk/atkobject.c:280
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Keterangan objek yang digunakan dalam teknologi kemudahan akses"
+
+#: atk/atkobject.c:286
+msgid "Accessible Parent"
+msgstr "Induk Akses"
+
+#: atk/atkobject.c:287
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Induk akses saat ini sebagaimana dikembalikan oleh atk_object_get_parent()"
+
+#: atk/atkobject.c:303
+msgid "Accessible Value"
+msgstr "Nilai Akses"
+
+#: atk/atkobject.c:304
+msgid "Is used to notify that the value has changed"
+msgstr "Digunakan untuk memberitahukan bahwa nilai telah berubah"
+
+#: atk/atkobject.c:312
+msgid "Accessible Role"
+msgstr "Peran Akses"
+
+#: atk/atkobject.c:313
+msgid "The accessible role of this object"
+msgstr "Peran akses objek ini"
+
+#: atk/atkobject.c:320
+msgid "Accessible Layer"
+msgstr "Tapis Akses"
+
+#: atk/atkobject.c:321
+msgid "The accessible layer of this object"
+msgstr "Tapis akses objek ini"
+
+#: atk/atkobject.c:329
+msgid "Accessible MDI Value"
+msgstr "Nilai MDI Akses"
+
+#: atk/atkobject.c:330
+msgid "The accessible MDI value of this object"
+msgstr "Nilai MDI akses objek ini"
+
+#: atk/atkobject.c:346
+msgid "Accessible Table Caption"
+msgstr "Judul Tabel Akses"
+
+#: atk/atkobject.c:347
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Digunakan untuk memberi peringatan bahwa judul tabel telah berubah,nilai ini "
+"sebaiknya tidak digunakan, silakan gunakan accessible-table-caption-object "
+"saja"
+
+#: atk/atkobject.c:361
+msgid "Accessible Table Column Header"
+msgstr "Kepala Kolom Tabel Akses"
+
+#: atk/atkobject.c:362
+msgid "Is used to notify that the table column header has changed"
+msgstr "Digunakan untuk memberitahu bahwa kepala kolom telah berubah"
+
+#: atk/atkobject.c:377
+msgid "Accessible Table Column Description"
+msgstr "Keterangan Kolom Tabel Akses"
+
+#: atk/atkobject.c:378
+msgid "Is used to notify that the table column description has changed"
+msgstr "Digunakan untuk memberitahu bahwa keterangan kolom tabel telah berubah"
+
+#: atk/atkobject.c:393
+msgid "Accessible Table Row Header"
+msgstr "Kepala Baris Tabel Akses"
+
+#: atk/atkobject.c:394
+msgid "Is used to notify that the table row header has changed"
+msgstr "Digunakan untuk memberitahu bawha kepala baris tabel telah berubah"
+
+#: atk/atkobject.c:408
+msgid "Accessible Table Row Description"
+msgstr "Keterangan Baris Tabel Akses"
+
+#: atk/atkobject.c:409
+msgid "Is used to notify that the table row description has changed"
+msgstr "Digunakan untuk memberitahu bahwa keterangan baris tabel telah berubah"
+
+#: atk/atkobject.c:415
+msgid "Accessible Table Summary"
+msgstr "Ringkasan Tabel Akses"
+
+#: atk/atkobject.c:416
+msgid "Is used to notify that the table summary has changed"
+msgstr "Digunakan untuk memberitahu bahwa keterangan tabel telah berubah"
+
+#: atk/atkobject.c:422
+msgid "Accessible Table Caption Object"
+msgstr "Objek Judul Tabel Akses"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the table caption has changed"
+msgstr "Digunakan untuk memberitahu bahwa judul tabel telah berubah"
+
+#: atk/atkobject.c:429
+msgid "Number of Accessible Hypertext Links"
+msgstr "Jumlah Akses Taut Hiperteks"
+
+#: atk/atkobject.c:430
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Jumlah taut yang dimiliki AtkHypertext saat ini"
+
+#: atk/atkobject.c:439
+msgid "Accessible ID"
+msgstr "ID Akses"
+
+#: atk/atkobject.c:440
+msgid "ID for the accessible; useful for automated testing"
+msgstr "ID untuk akses; berguna untuk pengujian otomatis"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:446
+msgid "Help text"
+msgstr "Teks bantuan"
+
+#: atk/atkobject.c:447
+msgid "Help text associated with the accessible"
+msgstr "Teks bantuan terkait dengan yang dapat diakses"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "sangat lemah"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "lemah"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "dapat diterima"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "kuat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "sangat kuat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "sangat rendah"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "sedang"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "tinggi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "sangat tinggi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "sangat buruk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "buruk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "baik"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "sangat baik"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "terbaik"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Aplikasi tak ada lagi"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Mencoba pemanggilan sinkron dimana dilarang"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "tidak sah"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "label akselerator"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "waspada"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "animasi"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "panah"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "kalender"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "kanvas"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "kotak cek"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "item menu cek"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "pemilih warna"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "tajuk kolom"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "kotak kombo"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "penyunting tanggal"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "ikon desktop"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "bingkai desktop"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "tombol pemutar"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "dialog"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "panel direktori"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "area gambar"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "pemilih berkas"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "isian"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "pemilih fonta"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "bingkai"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "panel kaca"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "kontainer html"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "ikon"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "gambar"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "bingkai internal"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "label"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "panel  berlapis"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "daftar"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "isi daftar"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "menu"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "baris menu"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "tombol menu"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "objek menu"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "panel opsi"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "halaman tab"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "daftar halaman tab"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "panel"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "teks sandi"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "menu tongol"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "indikator proses"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "tombol tekan"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "tombol radio"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "objek menu radio"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "panel dasar"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "tajuk baris"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "batang penggulung"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "panel penggulung"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "pemisah"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "slider"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "panel pemisah"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "tombol putar"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "baris status"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "tabel"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "sel tabel"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "tajuk kolom pada tabel"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "tajuk baris pada tabel"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "anggota menu yang dapat dilepas"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminal"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "teks"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "tombol togel"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "bilah alat"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "teks bantuan"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "pohon"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "tabel pohon"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "tidak diketahui"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "viewport"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "jendela"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "tajuk"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "kaki"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "penggaris"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "aplikasi"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "lengkap secara otomatis"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "bilah sunting"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "komponen tercangkok"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "entri"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "bagan"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "kapsi"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "bingkai dokumen"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "tajuk"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "halaman"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "bagian"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "objek redundan"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "formulir"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "taut"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "jendela metoda masukan"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "baris tabel"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "butir tabel pohon"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "spreadsheet dokumen"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "presentasi dokumen"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "teks dokumen"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "web dokumen"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "surel dokumen"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "komentar"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "kotak daftar"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "pengelompokan"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "peta gambar"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "pemberitahuan"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "bilah info"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "bilah aras"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "bilah judul"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "kutip blok"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "audio"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "definisi"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "artikel"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "landmark"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "log"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "marquee"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "math"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "rating"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "timer"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "daftar deskripsi"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "istilah deskripsi"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "nilai deskripsi"
+
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Mencoba pemanggilan sinkron dimana dilarang"
index 61246a7..1b5f03f 100644 (file)
--- a/po/is.po
+++ b/po/is.po
@@ -1,9 +1,17 @@
+# #-#-#-#-#  is.po  #-#-#-#-#
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Sveinn í Felli <sv1@fellsnet.is>, 2021.
+# #-#-#-#-#  is.po (atk 2.1.3)  #-#-#-#-#
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Sveinn í Felli <sv1@fellsnet.is>, 2022.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  is.po  #-#-#-#-#\n"
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
 "POT-Creation-Date: 2021-12-08 22:05+0000\n"
@@ -16,6 +24,19 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Lokalize 19.12.3\n"
+"#-#-#-#-#  is.po (atk 2.1.3)  #-#-#-#-#\n"
+"Project-Id-Version: atk 2.1.3\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/atk/issues\n"
+"POT-Creation-Date: 2020-06-06 13:32+0000\n"
+"PO-Revision-Date: 2022-01-29 17:32+0000\n"
+"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
+"Language-Team: Icelandic <translation-team-is@lists.sourceforge.org>\n"
+"Language: is\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 19.12.3\n"
 
 #: atspi/atspi-component.c:332 atspi/atspi-misc.c:1105 atspi/atspi-value.c:111
 msgid "The application no longer exists"
@@ -24,3 +45,781 @@ msgstr "Forritið er ekki lengur til"
 #: atspi/atspi-misc.c:1888
 msgid "Attempted synchronous call where prohibited"
 msgstr "Reyndi samhæft kall þegar slíkt er bannað"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Valinn tengill"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Fjöldi markstikla"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Endaraðnúmer"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Upphafsraðnúmer"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "ógilt"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "flýtilykilsmerki"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "aðvörun"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "hreyfimynd"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "píla"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "dagatal"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "strigi"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "gátreitur"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "gátreitur valmyndaratriðis"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "litaval"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "fyrirsögn dálks"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "fjölvalsreitur"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "dagsetningarritill"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "skjáborðstáknmynd"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "skjáborðsrammi"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "skífa"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "samskiptagluggi"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "möppuspjald"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "teiknisvæði"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "skráaveljari"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "áfyllari"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "leturveljari"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "rammi"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "glerspjald"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html-gámur"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "táknmynd"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "mynd"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "innri rammi"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "merki"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "lagskipt spjald"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "listi"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "listafærsla"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "valmynd"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "valmyndarstika"
+
+#: atk/atkobject.c:133
+msgid "menu item"
+msgstr "valmyndaratriði"
+
+#: atk/atkobject.c:134
+msgid "option pane"
+msgstr "valkostaspjald"
+
+#: atk/atkobject.c:135
+msgid "page tab"
+msgstr "síðuflipi"
+
+#: atk/atkobject.c:136
+msgid "page tab list"
+msgstr "síðuflipalisti"
+
+#: atk/atkobject.c:137
+msgid "panel"
+msgstr "tækjaborð"
+
+#: atk/atkobject.c:138
+msgid "password text"
+msgstr "lykilorðstexti"
+
+#: atk/atkobject.c:139
+msgid "popup menu"
+msgstr "sprettvalmynd"
+
+#: atk/atkobject.c:140
+msgid "progress bar"
+msgstr "framvindustika"
+
+#: atk/atkobject.c:141
+msgid "push button"
+msgstr "ýtihnappur"
+
+#: atk/atkobject.c:142
+msgid "radio button"
+msgstr "einvalsreitur"
+
+#: atk/atkobject.c:143
+msgid "radio menu item"
+msgstr "einvalsreitur valmyndarfærslu"
+
+#: atk/atkobject.c:144
+msgid "root pane"
+msgstr "rótarspjald"
+
+#: atk/atkobject.c:145
+msgid "row header"
+msgstr "fyrirsögn raðar"
+
+#: atk/atkobject.c:146
+msgid "scroll bar"
+msgstr "skrunstika"
+
+#: atk/atkobject.c:147
+msgid "scroll pane"
+msgstr "skrunspjald"
+
+#: atk/atkobject.c:148
+msgid "separator"
+msgstr "aðgreinir"
+
+#: atk/atkobject.c:149
+msgid "slider"
+msgstr "rennanlegur hnappur"
+
+#: atk/atkobject.c:150
+msgid "split pane"
+msgstr "klofið spjald"
+
+#: atk/atkobject.c:151
+msgid "spin button"
+msgstr "snúningshnappur"
+
+#: atk/atkobject.c:152
+msgid "statusbar"
+msgstr "stöðustika"
+
+#: atk/atkobject.c:153
+msgid "table"
+msgstr "tafla"
+
+#: atk/atkobject.c:154
+msgid "table cell"
+msgstr "töflureitur"
+
+#: atk/atkobject.c:155
+msgid "table column header"
+msgstr "fyrirsögn töfludálks"
+
+#: atk/atkobject.c:156
+msgid "table row header"
+msgstr "fyrirsögn töfluraðar"
+
+#: atk/atkobject.c:157
+msgid "tear off menu item"
+msgstr "rífa-af-valmyndaratriði"
+
+#: atk/atkobject.c:158
+msgid "terminal"
+msgstr "skel"
+
+#: atk/atkobject.c:159
+msgid "text"
+msgstr "texti"
+
+#: atk/atkobject.c:160
+msgid "toggle button"
+msgstr "víxlhnappur"
+
+#: atk/atkobject.c:161
+msgid "tool bar"
+msgstr "verkfærastika"
+
+#: atk/atkobject.c:162
+msgid "tool tip"
+msgstr "vísbending verkfæra"
+
+#: atk/atkobject.c:163
+msgid "tree"
+msgstr "tré"
+
+#: atk/atkobject.c:164
+msgid "tree table"
+msgstr "greinatafla"
+
+#: atk/atkobject.c:165
+msgid "unknown"
+msgstr "óþekkt"
+
+#: atk/atkobject.c:166
+msgid "viewport"
+msgstr "sýningarsvæði"
+
+#: atk/atkobject.c:167
+msgid "window"
+msgstr "gluggi"
+
+#: atk/atkobject.c:168
+msgid "header"
+msgstr "haus"
+
+#: atk/atkobject.c:169
+msgid "footer"
+msgstr "fótur"
+
+#: atk/atkobject.c:170
+msgid "paragraph"
+msgstr "málsgrein"
+
+#: atk/atkobject.c:171
+msgid "ruler"
+msgstr "reglustika"
+
+#: atk/atkobject.c:172
+msgid "application"
+msgstr "forrit"
+
+#: atk/atkobject.c:173
+msgid "autocomplete"
+msgstr "sjálfklárun"
+
+#: atk/atkobject.c:174
+msgid "edit bar"
+msgstr "breytingastika"
+
+#: atk/atkobject.c:175
+msgid "embedded component"
+msgstr "ívafin eining"
+
+#: atk/atkobject.c:176
+msgid "entry"
+msgstr "færsla"
+
+#: atk/atkobject.c:177
+msgid "chart"
+msgstr "kort"
+
+#: atk/atkobject.c:178
+msgid "caption"
+msgstr "skýringatexti"
+
+#: atk/atkobject.c:179
+msgid "document frame"
+msgstr "rammi skjals"
+
+#: atk/atkobject.c:180
+msgid "heading"
+msgstr "fyrirsögn"
+
+#: atk/atkobject.c:181
+msgid "page"
+msgstr "síða"
+
+#: atk/atkobject.c:182
+msgid "section"
+msgstr "hluti"
+
+#: atk/atkobject.c:183
+msgid "redundant object"
+msgstr "afgangshlutur"
+
+#: atk/atkobject.c:184
+msgid "form"
+msgstr "innfyllingarform"
+
+#: atk/atkobject.c:185
+msgid "link"
+msgstr "tengill"
+
+#: atk/atkobject.c:186
+msgid "input method window"
+msgstr "inntaksaðferðargluggi"
+
+#: atk/atkobject.c:187
+msgid "table row"
+msgstr "töfluröð"
+
+#: atk/atkobject.c:188
+msgid "tree item"
+msgstr "atriði í grein"
+
+#: atk/atkobject.c:189
+msgid "document spreadsheet"
+msgstr "töflureiknisskjal"
+
+#: atk/atkobject.c:190
+msgid "document presentation"
+msgstr "kynningarskjal"
+
+#: atk/atkobject.c:191
+msgid "document text"
+msgstr "textaskjal"
+
+#: atk/atkobject.c:192
+msgid "document web"
+msgstr "vefskjal"
+
+#: atk/atkobject.c:193
+msgid "document email"
+msgstr "tölvupóstskjal"
+
+#: atk/atkobject.c:194
+msgid "comment"
+msgstr "athugasemd"
+
+#: atk/atkobject.c:195
+#| msgid "list"
+msgid "list box"
+msgstr "listareitur"
+
+#: atk/atkobject.c:196
+msgid "grouping"
+msgstr "hópun"
+
+#: atk/atkobject.c:197
+#| msgid "image"
+msgid "image map"
+msgstr "myndhlutakort"
+
+#: atk/atkobject.c:198
+#| msgid "animation"
+msgid "notification"
+msgstr "tilkynning"
+
+#: atk/atkobject.c:199
+msgid "info bar"
+msgstr "upplýsingastika"
+
+#: atk/atkobject.c:200
+msgid "level bar"
+msgstr "stigastika"
+
+#: atk/atkobject.c:201
+msgid "title bar"
+msgstr "titilstika"
+
+#: atk/atkobject.c:202
+msgid "block quote"
+msgstr ""
+
+#: atk/atkobject.c:203
+msgid "audio"
+msgstr "hljóð"
+
+#: atk/atkobject.c:204
+msgid "video"
+msgstr "myndskeið"
+
+#: atk/atkobject.c:205
+#| msgid "animation"
+msgid "definition"
+msgstr "skilgreining"
+
+#: atk/atkobject.c:206
+msgid "article"
+msgstr "grein"
+
+#: atk/atkobject.c:207
+msgid "landmark"
+msgstr ""
+
+#: atk/atkobject.c:208
+#| msgid "dialog"
+msgid "log"
+msgstr "atvikaskrá"
+
+#: atk/atkobject.c:209
+msgid "marquee"
+msgstr "valstrengur"
+
+#: atk/atkobject.c:210
+msgid "math"
+msgstr "stærðfræði"
+
+#: atk/atkobject.c:211
+msgid "rating"
+msgstr "einkunn"
+
+#: atk/atkobject.c:212
+msgid "timer"
+msgstr "niðurtalning"
+
+#: atk/atkobject.c:213
+msgid "description list"
+msgstr ""
+
+#: atk/atkobject.c:214
+msgid "description term"
+msgstr ""
+
+#: atk/atkobject.c:215
+msgid "description value"
+msgstr ""
+
+#: atk/atkobject.c:391
+msgid "Accessible Name"
+msgstr "Heiti í aðgengi"
+
+#: atk/atkobject.c:392
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:398
+msgid "Accessible Description"
+msgstr "Lýsing í aðgengi"
+
+#: atk/atkobject.c:399
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:405
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:406
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+
+#: atk/atkobject.c:422
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:431
+msgid "Accessible Role"
+msgstr "Hlutverk í aðgengi"
+
+#: atk/atkobject.c:432
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:439
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:440
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:448
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:449
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:465
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:466
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:480
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:481
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:497
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:512
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:513
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:534
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:535
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:541
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:542
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:548
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:549
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "mjög veikt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "veikt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+#| msgid "table"
+msgid "acceptable"
+msgstr "ásættanlegt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "sterkt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "mjög sterkt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "mjög lágt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "miðlungs"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "hátt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "mjög hátt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "mjög slæmt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "slæmt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "gott"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "mjög gott"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "best"
index 0e19749..a22a27f 100644 (file)
--- a/po/it.po
+++ b/po/it.po
+# #-#-#-#-#  it.po (at-spi2-core)  #-#-#-#-#
 # Italian translation for at-spi2-core.
 # Copyright (C) 2011, 2014 Free Software Foundation, Inc.
 # This file is distributed under the same license as the at-spi2-core package.
 # Luca Ferretti <lferrett@gnome.org>, 2011.
-# Milo Casagrande <milo@ubuntu.com>, 2014
+# Milo Casagrande <milo@ubuntu.com>, 2014, 2023.
+#
+# #-#-#-#-#  it.po (atk)  #-#-#-#-#
+# Italian translation of atk.
+# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011i, 2023 Free Software Foundation, Inc.
+# Alessio Frusciante <algol@firenze.linux.it>, 2002, 2003, 2004.
+# Luca Ferretti <lferrett@gnome.org>, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
+# Claudio Arseni <claudio.arseni@ubuntu.com>, 2014.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-03-09 12:33+0100\n"
-"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-08-05 16:00+0000\n"
+"PO-Revision-Date: 2023-09-13 10:15+0200\n"
+"Last-Translator: Milo Casagrande <milo@milo.name>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.6.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Collegamento selezionato"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifica se l'oggetto AtkHyperlink è selezionato"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Numero di anchor"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Il numero di anchor associate all'oggetto AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Indice finale"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "L'indice finale dell'oggetto AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Indice iniziale"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "L'indice iniziale dell'oggetto AtkHyperlink"
+
+#: atk/atkobject.c:268
+msgid "Accessible Name"
+msgstr "Nome accessibile"
+
+#: atk/atkobject.c:269
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Il nome dell'istanza dell'oggetto formattato per l'accesso tramite "
+"tecnologia assistiva"
+
+#: atk/atkobject.c:275
+msgid "Accessible Description"
+msgstr "Descrizione accessibile"
+
+#: atk/atkobject.c:276
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Descrizione di un oggetto, formattata per l'accesso tramite tecnologia "
+"assistiva"
+
+#: atk/atkobject.c:282
+msgid "Accessible Parent"
+msgstr "Genitore accessibile"
+
+#: atk/atkobject.c:283
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Genitore dell'attuale accessibile come restituito da atk_object_get_parent()"
+
+#: atk/atkobject.c:299
+msgid "Accessible Value"
+msgstr "Valore accessibile"
+
+#: atk/atkobject.c:300
+msgid "Is used to notify that the value has changed"
+msgstr "Usato per notificare che il valore è cambiato"
+
+#: atk/atkobject.c:308
+msgid "Accessible Role"
+msgstr "Ruolo accessibile"
+
+#: atk/atkobject.c:309
+msgid "The accessible role of this object"
+msgstr "Il ruolo accessibile di questo oggetto"
+
+#: atk/atkobject.c:316
+msgid "Accessible Layer"
+msgstr "Livello accessibile"
+
+#: atk/atkobject.c:317
+msgid "The accessible layer of this object"
+msgstr "Il livello accessibile di questo oggetto"
+
+#: atk/atkobject.c:325
+msgid "Accessible MDI Value"
+msgstr "Valore MDI accessibile"
+
+#: atk/atkobject.c:326
+msgid "The accessible MDI value of this object"
+msgstr "Il valore MDI accessibile di questo oggetto"
+
+#: atk/atkobject.c:342
+msgid "Accessible Table Caption"
+msgstr "Didascalia accessibile della tabella"
+
+#: atk/atkobject.c:343
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Usato per notificare che la descrizione della tabella è cambiata; questa "
+"proprietà non dovrebbe essere usata. Dovrebbe essere usata accessible-table-"
+"caption-object al suo posto."
+
+#: atk/atkobject.c:357
+msgid "Accessible Table Column Header"
+msgstr "Intestazione accessibile della colonna della tabella"
+
+#: atk/atkobject.c:358
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Usato per notificare che l'intestazione della colonna della tabella è "
+"cambiata"
+
+#: atk/atkobject.c:373
+msgid "Accessible Table Column Description"
+msgstr "Descrizione accessibile della colonna della tabella"
+
+#: atk/atkobject.c:374
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Usata per notificare che la descrizione della colonna della tabella è "
+"cambiata"
+
+#: atk/atkobject.c:389
+msgid "Accessible Table Row Header"
+msgstr "Intestazione accessibile della riga della tabella"
+
+#: atk/atkobject.c:390
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Usato per notificare che l'intestazione della riga della tabella è cambiata"
+
+#: atk/atkobject.c:404
+msgid "Accessible Table Row Description"
+msgstr "Descrizione accessibile della riga della tabella"
+
+#: atk/atkobject.c:405
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Usata per notificare che la descrizione della riga della tabella è cambiata"
+
+#: atk/atkobject.c:411
+msgid "Accessible Table Summary"
+msgstr "Riassunto accessibile della tabella"
+
+#: atk/atkobject.c:412
+msgid "Is used to notify that the table summary has changed"
+msgstr "Usato per notificare che il riassunto della tabella è cambiato"
+
+#: atk/atkobject.c:418
+msgid "Accessible Table Caption Object"
+msgstr "Oggetto didascalia accessibile della tabella"
+
+#: atk/atkobject.c:419
+msgid "Is used to notify that the table caption has changed"
+msgstr "Usato per notificare che la didascalia della tabella e cambiata"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:425
+msgid "Number of Accessible Hypertext Links"
+msgstr "Numero di collegamenti accessibili nell'ipertesto"
+
+#: atk/atkobject.c:426
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Il numero di collegamenti presenti nell'AtkHypertext attuale"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "molto debole"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "debole"
+
+# @ATK_ROLE_TABLE: An object used to represent information in terms of rows and columns
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "accettabile"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "robusta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "molto robusta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "molto fragile"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "media"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "elevata"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "molto elevata"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "molto brutta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "brutta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "buona"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "molto buona"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "migliore"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1229 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "L'applicazione non esiste più"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Proibito tentativo di chiamata sincrona"
+#  * AtkObject represents the minimum information all accessible objects
+#  * return. This information includes accessible name, accessible
+#  * description, role and state of the object, as well information about
+#  * its parent and children. It is also possible to obtain more specific
+#  * accessibility information about a component if it supports one or more
+#  * of the following interfaces:
+#
+# @ATK_ROLE_INVALID: Invalid role
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "non valido"
+
+# @ATK_ROLE_ACCEL_LABEL: A label which represents an accelerator
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "etichetta acceleratore"
+
+# @ATK_ROLE_ALERT: An object which is an alert to the user
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "allerta"
+
+# @ATK_ROLE_ANIMATION: An object which is an animated image
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "animazione"
+
+# @ATK_ROLE_ARROW: An arrow in one of the four cardinal directions
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "freccia"
+
+# @ATK_ROLE_CALENDAR:  An object that displays a calendar and allows the user to select a date
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "calendario"
+
+# @ATK_ROLE_CANVAS: An object that can be drawn into and is used to trap events
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "tela"
+
+# @ATK_ROLE_CHECK_BOX: A choice that can be checked or unchecked and provides a separate indicator for the current state
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "casella di spunta"
+
+# @ATK_ROLE_CHECK_MENU_ITEM: A menu item with a check box
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "voce di menù di spunta"
+
+# @ATK_ROLE_COLOR_CHOOSER: A specialized dialog that lets the user choose a color
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "selettore colore"
+
+# @ATK_ROLE_COLUMN_HEADER: The header for a column of data
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "intestazione di colonna"
+
+# @ATK_ROLE_COMBO_BOX: A list of choices the user can select from
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "casella combinata"
+
+# @ATK_ROLE_DATE_EDITOR: An object whose purpose is to allow a user to edit a date
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "editor di date"
+
+# @ATK_ROLE_DESKTOP_ICON: An inconifed internal frame within a DESKTOP_PANE
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "icona della scrivania"
+
+# @ATK_ROLE_DESKTOP_FRAME: A pane that supports internal frames and iconified versions of those internal frames
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "cornice della scrivania"
+
+# @ATK_ROLE_DIAL: An object whose purpose is to allow a user to set a value
+#
+# rotella, vista la spiegazione è totalmente fuori luogo... -Luca
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "rotella"
+
+# @ATK_ROLE_DIALOG: A top level window with title bar and a border
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "dialogo"
+
+# @ATK_ROLE_DIRECTORY_PANE: A pane that allows the user to navigate through and select the contents of a directory
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "riquadro directory"
+
+# @ATK_ROLE_DRAWING_AREA: An object used for drawing custom user interface elements
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "area di disegno"
+
+# @ATK_ROLE_FILE_CHOOSER: A specialized dialog that lets the user choose a file
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "selettore file"
+
+# @ATK_ROLE_FILLER: A object that fills up space in a user interface
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "riempitore"
+
+# @ATK_ROLE_FONT_CHOOSER: A specialized dialog that lets the user choose a font
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "selettore tipo di carattere"
+
+# @ATK_ROLE_FRAME: A top level window with a title bar, border, menubar, etc.
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "cornice"
+
+# @ATK_ROLE_GLASS_PANE: A pane that is guaranteed to be painted on top of all panes beneath it
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "riquardo trasparente"
+
+# @ATK_ROLE_HTML_CONTAINER: A document container for HTML, whose children represent the document content
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "contenitore html"
+
+# @ATK_ROLE_ICON: A small fixed size picture, typically used to decorate components
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "icona"
+
+# @ATK_ROLE_IMAGE: An object whose primary purpose is to display an image
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "immagine"
+
+# @ATK_ROLE_INTERNAL_FRAME: A frame-like object that is clipped by a desktop pane
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "cornice interna"
+
+# @ATK_ROLE_LABEL: An object used to present an icon or short string in an interface
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "etichetta"
+
+# @ATK_ROLE_LAYERED_PANE: A specialized pane that allows its children to be drawn in layers, providing a form of stacking order
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "riquadro a livelli"
+
+# @ATK_ROLE_LIST: An object that presents a list of objects to the user and allows the user to select one or more of them
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "elenco"
+
+# @ATK_ROLE_LIST_ITEM: An object that represents an element of a list
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "voce di elenco"
+
+# @ATK_ROLE_MENU: An object usually found inside a menu bar that contains a list of actions the user can choose from
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "menù"
+
+# @ATK_ROLE_MENU_BAR: An object usually drawn at the top of the primary dialog box of an application that contains a list of menus the user can choose from
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "barra dei menù"
+
+# @ATK_ROLE_PUSH_BUTTON: An object the user can manipulate to tell the application to do something
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "pulsante menù"
+
+# @ATK_ROLE_MENU_ITEM: An object usually contained in a menu that presents an action the user can choose
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "voce di menù"
+
+# *@ATK_ROLE_OPTION_PANE: A specialized pane whose primary use is inside a DIALOG
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "riquadro opzioni"
+
+# @ATK_ROLE_PAGE_TAB: An object that is a child of a page tab list
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "scheda"
+
+# @ATK_ROLE_PAGE_TAB_LIST: An object that presents a series of panels (or page tabs), one at a time, through some mechanism provided by the object
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "elenco di schede"
+
+# @ATK_ROLE_PANEL: A generic container that is often used to group objects
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "pannello"
+
+# @ATK_ROLE_PASSWORD_TEXT: A text object uses for passwords, or other places where the text content is not shown visibly to the user
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "testo password"
+
+# @ATK_ROLE_POPUP_MENU: A temporary window that is usually used to offer the user a list of choices, and then hides when the user selects one of those choices
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "menù a comparsa"
+
+# @ATK_ROLE_PROGRESS_BAR: An object used to indicate how much of a task has been completed
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "barra di avanzamento"
+
+# @ATK_ROLE_PUSH_BUTTON: An object the user can manipulate to tell the application to do something
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "pulsante"
+
+# @ATK_ROLE_RADIO_BUTTON: A specialized check box that will cause other radio buttons in the same group to become unchecked when this one is checked
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "pulsante radio"
+
+# @ATK_ROLE_RADIO_MENU_ITEM: A check menu item which belongs to a group. At each instant exactly one of the radio menu items from a group is selected
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "voce di menù radio"
+
+# @ATK_ROLE_ROOT_PANE: A specialized pane that has a glass pane and a layered pane as its children
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "riquadro radice"
+
+# @ATK_ROLE_ROW_HEADER: The header for a row of data
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "intestazione di riga"
+
+# @ATK_ROLE_SCROLL_BAR: An object usually used to allow a user to incrementally view a large amount of data.
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "barra di scorrimento"
+
+# @ATK_ROLE_SCROLL_PANE: An object that allows a user to incrementally view a large amount of information
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "riquadro a scorrimento"
+
+# @ATK_ROLE_SEPARATOR: An object usually contained in a menu to provide a visible and logical separation of the contents in a menu
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "separatore"
+
+# @ATK_ROLE_SLIDER: An object that allows the user to select from a bounded range
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "controllo scorrevole"
+
+# @ATK_ROLE_SPLIT_PANE: A specialized panel that presents two other panels at the same time
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "riquadro diviso"
+
+# @ATK_ROLE_SPIN_BUTTON: An object used to get an integer or floating point number from the user
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "controllo di selezione"
+
+# @ATK_ROLE_STATUSBAR: An object which reports messages of minor importance to the user
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "barra di stato"
+
+# @ATK_ROLE_TABLE: An object used to represent information in terms of rows and columns
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "tabella"
+
+# @ATK_ROLE_TABLE_CELL: A cell in a table
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "cella di tabella"
+
+# @ATK_ROLE_TABLE_COLUMN_HEADER: The header for a column of a table
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "intestazione di colonna per tabella"
+
+# @ATK_ROLE_TABLE_ROW_HEADER: The header for a row of a table
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "intestazione di riga per tabella"
+
+# @ATK_ROLE_TEAR_OFF_MENU_ITEM: A menu item used to tear off and reattach its menu
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "voce di menù staccabile"
+
+# @ATK_ROLE_TERMINAL: An object that represents an accessible terminal
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminale"
+
+# @ATK_ROLE_TEXT: An object that presents text to the user
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "testo"
+
+# @ATK_ROLE_TOGGLE_BUTTON: A specialized push button that can be checked or unchecked, but does not provide a separate indicator for the current state
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "pulsante di commutazione"
+
+# @ATK_ROLE_TOOL_BAR: A bar or palette usually composed of push buttons or toggle buttons
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "barra degli strumenti"
+
+# @ATK_ROLE_TOOL_TIP: An object that provides information about another object
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "suggerimento"
+
+# @ATK_ROLE_TREE: An object used to represent hierarchical information to the user
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "albero"
+
+# @ATK_ROLE_TREE_TABLE: An object capable of expanding and collapsing rows as well as showing multiple columns of data
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "tabella ad albero"
+
+# @ATK_ROLE_UNKNOWN: The object contains some Accessible information, but its role is not known
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "sconosciuto"
+
+# *@ATK_ROLE_VIEWPORT: An object usually used in a scroll pane
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "area visibile"
+
+# @ATK_ROLE_WINDOW: A top level window with no title or border.
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "finestra"
+
+# @ATK_ROLE_HEADER: An object that serves as a document header.
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "intestazione"
+
+# @ATK_ROLE_FOOTER: An object that serves as a document footer.
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "piè di pagina"
+
+# @ATK_ROLE_PARAGRAPH: An object which is contains a paragraph of text content
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "paragrafo"
+
+# @ATK_ROLE_RULER: An object which describes margins and tab stops, etc. for text objects which it controls
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "righello"
+
+# @ATK_ROLE_APPLICATION: The object is an application object, which may contain @ATK_ROLE_FRAME objects or other types of accessibles.
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "applicazione"
+
+# @ATK_ROLE_AUTOCOMPLETE: The object is a dialog or list containing items for insertion into an entry widget, for instance a list of words for completion of a text entry.
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "completamento automatico"
+
+# @ATK_ROLE_EDITBAR: The object is an editable text object in a toolbar
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "barra di modifica"
+
+# @ATK_ROLE_EMBEDDED: The object is an embedded container within a document or panel.  This role is a grouping "hint" indicating that the contained objects share a context.
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "componente incorporato"
+
+# @ATK_ROLE_ENTRY: The object is a component whose textual content may be entered or modified by the user, provided @ATK_STATE_EDITABLE is present.
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "campo inserimento"
+
+# @ATK_ROLE_CHART: The object is a graphical depiction of quantitative data. It may contain multiple subelements whose attributes and/or description may be queried to obtain both the quantitative data and information about how the data is being presented. The LABELLED_BY relation is particularly important in interpreting objects of this type, as is the accessible-description property.
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "diagramma"
+
+# @ATK_ROLE_CAPTION: The object contains descriptive information, usually textual, about another user interface element such as a table, chart, or image.
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "didascalia"
+
+# @ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "cornice documento"
+
+# @ATK_ROLE_HEADING: The object serves as a heading for content which follows it in a document. The 'heading level' of the heading, if availabe, may be obtained by querying the object's attributes.
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "intestazione"
+
+# @ATK_ROLE_PAGE: The object is a containing instance which encapsulates a page of information. @ATK_ROLE_PAGE is used in documents and content which support a paginated navigation model.
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "pagina"
+
+# @ATK_ROLE_SECTION: The object is a containing instance of document content which constitutes a particular 'logical' section of the document. The type of content within a section, and the nature of the section division itself, may be obtained by querying the object's attributes. Sections may be nested.
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "sezione"
+
+# @ATK_ROLE_REDUNDANT_OBJECT: The object is redundant with another object in the hierarchy, and is exposed for purely technical reasons.  Objects of this role should normally be ignored by clients.
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "oggetto ridondante"
+
+# @ATK_ROLE_FRAME: A top level window with a title bar, border, menubar, etc.
+#
+#
+# Traduzione non ottimale, ma visto l'originale non penso si potesse
+# fare molto altro -Luca
+#
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "modulo"
+
+# @ATK_ROLE_LINK - The object is a hypertext anchor, i.e. a "link" in a hypertext document. Such objects are distinct from 'inline' content which may also use the Hypertext/Hyperlink interfaces to indicate the range/location within a text object where an inline or embedded object lies
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "collegamento"
+
+# @ATK_ROLE_INPUT_METHOD_WINDOW - The object is a window or similar viewport which is used to allow composition or input of a 'complex character', in other words it is an "input method window.
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "finestra metodo di input"
+
+# @ATK_ROLE_TABLE_ROW_HEADER: The header for a row of a table
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "riga di tabella"
+
+# @ATK_ROLE_TREE_TABLE: An object capable of expanding and collapsing rows as well as showing multiple columns of data
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "elemento albero"
+
+# @ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "documento foglio di calcolo"
+
+# @ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "documento presentazione"
+
+# @ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "documento testo"
+
+# @ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "documento web"
+
+# @ATK_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which contains a view of document content. Document frames may occur within another Document instance, in which case the second document may be said to be embedded in the containing instance. HTML frames are often ROLE_DOCUMENT_FRAME. Either this object, or a singleton descendant, should implement the Document interface.
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "documento email"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "commento"
+
+# @ATK_ROLE_LIST: An object that presents a list of objects to the user and allows the user to select one or more of them
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "casella elenco"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "raggruppamento"
+
+# @ATK_ROLE_IMAGE: An object whose primary purpose is to display an image
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "mappa immagine"
+
+# @ATK_ROLE_ANIMATION: An object which is an animated image
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "notifica"
+
+# @ATK_ROLE_MENU_BAR: An object usually drawn at the top of the primary dialog box of an application that contains a list of menus the user can choose from
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "barra delle informazioni"
+
+# @ATK_ROLE_SCROLL_BAR: An object usually used to allow a user to incrementally view a large amount of data.
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "barra di livello"
+
+# @ATK_ROLE_TOOL_BAR: A bar or palette usually composed of push buttons or toggle buttons
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "barra del titolo"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "block quote"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "audio"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
+
+# @ATK_ROLE_ANIMATION: An object which is an animated image
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "definizione"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "articolo"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "punto di riferimento"
+
+# @ATK_ROLE_DIALOG: A top level window with title bar and a border
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "registro"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "marquee"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "matematica"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "valutazione"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "timer"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "elenco descrizione"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "termine descrizione"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "valore descrizione"
index c444871..c9ba55f 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -1,10 +1,23 @@
+# #-#-#-#-#  ja.po (at-spi2-core master)  #-#-#-#-#
 # Japanese translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Hideki Yamane <henrich@debian.org>, 2011.
 #
+# #-#-#-#-#  ja.po (atk master)  #-#-#-#-#
+# atk ja.po.
+# Copyright (C) 2003-2013, 2019-2020 Free Software Foundation Inc.
+# This file is distributed under the same license as the atk package.
+# Takeshi AIHANA <takeshi.aihana@gmail.com>, 2003, 2004, 2006, 2009.
+# Satoru SATOH <ss@gnome.gr.jp>, 2006.
+# Yoji TOYODA <bsyamato@sea.plala.or.jp>, 2012.
+# Jiro Matsuzawa <jmatsuzawa@gnome.org>, 2013.
+# sicklylife <translation@sicklylife.jp>, 2019-2020.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ja.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,9 +30,798 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"#-#-#-#-#  ja.po (atk master)  #-#-#-#-#\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/atk/issues\n"
+"POT-Creation-Date: 2020-01-15 13:39+0000\n"
+"PO-Revision-Date: 2020-01-23 23:00+0900\n"
+"Last-Translator: sicklylife <translation@sicklylife.jp>\n"
+"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
 
 #: ../atspi/atspi-component.c:313 ../atspi/atspi-misc.c:941
 #: ../atspi/atspi-misc.c:992 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "そのアプリケーションは存在しません"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "選択したリンク"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink オブジェクトが選択されているどうかを指定"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "アンカーの数"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink オブジェクトに対応づけられたアンカーの数"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "終了インデックス"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink オブジェクトの終了インデックス"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "開始インデックス"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink オブジェクトの開始インデックス"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "無効"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "アクセラレータのラベル"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "警告"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "アニメーション"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "矢印"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "カレンダー"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "キャンバス"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "チェックボックス"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "チェックメニュー項目"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "色の選択"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "列ヘッダー"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "コンボボックス"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "日付エディター"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "デスクトップアイコン"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "デスクトップフレーム"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "ダイアル"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "ダイアログ"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "ディレクトリペイン"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "描画領域"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "ファイルの選択"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "フィラー"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "フォントの選択"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "フレーム"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "ガラスペイン"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "HTML コンテナー"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "アイコン"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "画像"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "内部フレーム"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "ラベル"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "階層ペイン"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "リスト"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "リストの項目"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "メニュー"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "メニューバー"
+
+#: atk/atkobject.c:133
+msgid "menu item"
+msgstr "メニューの項目"
+
+#: atk/atkobject.c:134
+msgid "option pane"
+msgstr "オプションペイン"
+
+#: atk/atkobject.c:135
+msgid "page tab"
+msgstr "ページタブ"
+
+#: atk/atkobject.c:136
+msgid "page tab list"
+msgstr "ページタブのリスト"
+
+#: atk/atkobject.c:137
+msgid "panel"
+msgstr "パネル"
+
+#: atk/atkobject.c:138
+msgid "password text"
+msgstr "パスワード"
+
+#: atk/atkobject.c:139
+msgid "popup menu"
+msgstr "ポップアップメニュー"
+
+#: atk/atkobject.c:140
+msgid "progress bar"
+msgstr "進捗バー"
+
+#: atk/atkobject.c:141
+msgid "push button"
+msgstr "プッシュボタン"
+
+#: atk/atkobject.c:142
+msgid "radio button"
+msgstr "ラジオボタン"
+
+#: atk/atkobject.c:143
+msgid "radio menu item"
+msgstr "ラジオボタンの項目"
+
+#: atk/atkobject.c:144
+msgid "root pane"
+msgstr "ルートペイン"
+
+#: atk/atkobject.c:145
+msgid "row header"
+msgstr "行ヘッダー"
+
+#: atk/atkobject.c:146
+msgid "scroll bar"
+msgstr "スクロールバー"
+
+#: atk/atkobject.c:147
+msgid "scroll pane"
+msgstr "スクロールペイン"
+
+#: atk/atkobject.c:148
+msgid "separator"
+msgstr "セパレーター"
+
+#: atk/atkobject.c:149
+msgid "slider"
+msgstr "スライダー"
+
+#: atk/atkobject.c:150
+msgid "split pane"
+msgstr "分割ペイン"
+
+#: atk/atkobject.c:151
+msgid "spin button"
+msgstr "スピンボタン"
+
+#: atk/atkobject.c:152
+msgid "statusbar"
+msgstr "ステータスバー"
+
+#: atk/atkobject.c:153
+msgid "table"
+msgstr "表"
+
+#: atk/atkobject.c:154
+msgid "table cell"
+msgstr "表のセル"
+
+#: atk/atkobject.c:155
+msgid "table column header"
+msgstr "表の列ヘッダー"
+
+#: atk/atkobject.c:156
+msgid "table row header"
+msgstr "表の行ヘッダー"
+
+#: atk/atkobject.c:157
+msgid "tear off menu item"
+msgstr "取り外しメニュー項目"
+
+#: atk/atkobject.c:158
+msgid "terminal"
+msgstr "端末"
+
+#: atk/atkobject.c:159
+msgid "text"
+msgstr "テキスト"
+
+#: atk/atkobject.c:160
+msgid "toggle button"
+msgstr "トグルボタン"
+
+#: atk/atkobject.c:161
+msgid "tool bar"
+msgstr "ツールバー"
+
+#: atk/atkobject.c:162
+msgid "tool tip"
+msgstr "ツールチップ"
+
+#: atk/atkobject.c:163
+msgid "tree"
+msgstr "ツリー"
+
+#: atk/atkobject.c:164
+msgid "tree table"
+msgstr "ツリーの表"
+
+#: atk/atkobject.c:165
+msgid "unknown"
+msgstr "不明"
+
+#: atk/atkobject.c:166
+msgid "viewport"
+msgstr "ビューポート"
+
+#: atk/atkobject.c:167
+msgid "window"
+msgstr "ウィンドウ"
+
+#: atk/atkobject.c:168
+msgid "header"
+msgstr "ヘッダー"
+
+#: atk/atkobject.c:169
+msgid "footer"
+msgstr "フッター"
+
+#: atk/atkobject.c:170
+msgid "paragraph"
+msgstr "段落"
+
+#: atk/atkobject.c:171
+msgid "ruler"
+msgstr "ルーラー"
+
+#: atk/atkobject.c:172
+msgid "application"
+msgstr "アプリケーション"
+
+#: atk/atkobject.c:173
+msgid "autocomplete"
+msgstr "自動補完"
+
+#: atk/atkobject.c:174
+msgid "edit bar"
+msgstr "編集バー"
+
+#: atk/atkobject.c:175
+msgid "embedded component"
+msgstr "組み込みコンポーネント"
+
+#: atk/atkobject.c:176
+msgid "entry"
+msgstr "エントリ"
+
+#: atk/atkobject.c:177
+msgid "chart"
+msgstr "図"
+
+#: atk/atkobject.c:178
+msgid "caption"
+msgstr "タイトル"
+
+#: atk/atkobject.c:179
+msgid "document frame"
+msgstr "ドキュメントのフレーム"
+
+#: atk/atkobject.c:180
+msgid "heading"
+msgstr "見出し"
+
+#: atk/atkobject.c:181
+msgid "page"
+msgstr "ページ"
+
+#: atk/atkobject.c:182
+msgid "section"
+msgstr "セクション"
+
+#: atk/atkobject.c:183
+msgid "redundant object"
+msgstr "冗長オブジェクト"
+
+#: atk/atkobject.c:184
+msgid "form"
+msgstr "フォーム"
+
+#: atk/atkobject.c:185
+msgid "link"
+msgstr "リンク"
+
+#: atk/atkobject.c:186
+msgid "input method window"
+msgstr "入力メソッドのウィンドウ"
+
+#: atk/atkobject.c:187
+msgid "table row"
+msgstr "表の行"
+
+#: atk/atkobject.c:188
+msgid "tree item"
+msgstr "ツリーアイテム"
+
+#: atk/atkobject.c:189
+msgid "document spreadsheet"
+msgstr "ドキュメントのスプレッドシート"
+
+#: atk/atkobject.c:190
+msgid "document presentation"
+msgstr "ドキュメントのプレゼンテーション"
+
+#: atk/atkobject.c:191
+msgid "document text"
+msgstr "ドキュメントのテキスト"
+
+#: atk/atkobject.c:192
+msgid "document web"
+msgstr "ドキュメントのウェブ"
+
+#: atk/atkobject.c:193
+msgid "document email"
+msgstr "ドキュメントの E メール"
+
+#: atk/atkobject.c:194
+msgid "comment"
+msgstr "コメント"
+
+#: atk/atkobject.c:195
+msgid "list box"
+msgstr "リストボックス"
+
+#: atk/atkobject.c:196
+msgid "grouping"
+msgstr "分類"
+
+#: atk/atkobject.c:197
+msgid "image map"
+msgstr "画像マップ"
+
+#: atk/atkobject.c:198
+msgid "notification"
+msgstr "通知"
+
+#: atk/atkobject.c:199
+msgid "info bar"
+msgstr "情報バー"
+
+#: atk/atkobject.c:200
+msgid "level bar"
+msgstr "レベルバー"
+
+#: atk/atkobject.c:201
+msgid "title bar"
+msgstr "タイトルバー"
+
+#: atk/atkobject.c:202
+msgid "block quote"
+msgstr "ブロック引用"
+
+#: atk/atkobject.c:203
+msgid "audio"
+msgstr "オーディオ"
+
+#: atk/atkobject.c:204
+msgid "video"
+msgstr "ビデオ"
+
+#: atk/atkobject.c:205
+msgid "definition"
+msgstr ""
+
+#: atk/atkobject.c:206
+msgid "article"
+msgstr ""
+
+#: atk/atkobject.c:207
+msgid "landmark"
+msgstr ""
+
+#: atk/atkobject.c:208
+msgid "log"
+msgstr "ログ"
+
+#: atk/atkobject.c:209
+msgid "marquee"
+msgstr ""
+
+#: atk/atkobject.c:210
+msgid "math"
+msgstr ""
+
+#: atk/atkobject.c:211
+msgid "rating"
+msgstr ""
+
+#: atk/atkobject.c:212
+msgid "timer"
+msgstr "タイマー"
+
+#: atk/atkobject.c:213
+msgid "description list"
+msgstr ""
+
+#: atk/atkobject.c:214
+msgid "description term"
+msgstr ""
+
+#: atk/atkobject.c:215
+msgid "description value"
+msgstr ""
+
+#: atk/atkobject.c:391
+msgid "Accessible Name"
+msgstr "アクセス可能な名前"
+
+#: atk/atkobject.c:392
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "支援技術アクセス形式のオブジェクト・インスタンス名"
+
+#: atk/atkobject.c:398
+msgid "Accessible Description"
+msgstr "アクセス可能な説明"
+
+#: atk/atkobject.c:399
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "支援技術アクセス形式のオブジェクトの説明"
+
+#: atk/atkobject.c:405
+msgid "Accessible Parent"
+msgstr "アクセス可能な親オブジェクト"
+
+#: atk/atkobject.c:406
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+
+#: atk/atkobject.c:422
+msgid "Accessible Value"
+msgstr "アクセス可能な値"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the value has changed"
+msgstr "値が変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:431
+msgid "Accessible Role"
+msgstr "アクセス可能なロール"
+
+#: atk/atkobject.c:432
+msgid "The accessible role of this object"
+msgstr "このオブジェクトでアクセス可能なロール"
+
+#: atk/atkobject.c:439
+msgid "Accessible Layer"
+msgstr "アクセス可能なレイヤー"
+
+#: atk/atkobject.c:440
+msgid "The accessible layer of this object"
+msgstr "このオブジェクトでアクセス可能なレイヤー"
+
+#: atk/atkobject.c:448
+msgid "Accessible MDI Value"
+msgstr "アクセス可能な MDI 値"
+
+#: atk/atkobject.c:449
+msgid "The accessible MDI value of this object"
+msgstr "このオブジェクトでアクセス可能な MDI 値"
+
+#: atk/atkobject.c:465
+msgid "Accessible Table Caption"
+msgstr "アクセス可能な表のタイトル"
+
+#: atk/atkobject.c:466
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"表のタイトルが変更されたことを通知するのに使用 (このプロパティを使用せずに  "
+"accessible-table-caption-object を使用してください)"
+
+#: atk/atkobject.c:480
+msgid "Accessible Table Column Header"
+msgstr "アクセス可能な表の列ヘッダー"
+
+#: atk/atkobject.c:481
+msgid "Is used to notify that the table column header has changed"
+msgstr "表の列ヘッダーが変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:496
+msgid "Accessible Table Column Description"
+msgstr "アクセス可能な表の列の説明"
+
+#: atk/atkobject.c:497
+msgid "Is used to notify that the table column description has changed"
+msgstr "表の列の説明が変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:512
+msgid "Accessible Table Row Header"
+msgstr "アクセス可能な表の行ヘッダー"
+
+#: atk/atkobject.c:513
+msgid "Is used to notify that the table row header has changed"
+msgstr "表の行ヘッダーが変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:527
+msgid "Accessible Table Row Description"
+msgstr "アクセス可能な表の行の説明"
+
+#: atk/atkobject.c:528
+msgid "Is used to notify that the table row description has changed"
+msgstr "表の行の説明が変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:534
+msgid "Accessible Table Summary"
+msgstr "アクセス可能な表のサマリ"
+
+#: atk/atkobject.c:535
+msgid "Is used to notify that the table summary has changed"
+msgstr "表のサマリが変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:541
+msgid "Accessible Table Caption Object"
+msgstr "アクセス可能な表のタイトルオブジェクト"
+
+#: atk/atkobject.c:542
+msgid "Is used to notify that the table caption has changed"
+msgstr "表のタイトルが変更されたことを通知するのに使用"
+
+#: atk/atkobject.c:548
+msgid "Number of Accessible Hypertext Links"
+msgstr "アクセス可能な HyperText リンクの数"
+
+#: atk/atkobject.c:549
+msgid "The number of links which the current AtkHypertext has"
+msgstr "この AtkHypertext オブジェクトが持つリンクの数"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "非常に弱い"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "弱い"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "普通"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "強い"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "非常に強い"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr ""
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "親が変更されたことを通知するのに使用"
diff --git a/po/ka.po b/po/ka.po
new file mode 100644 (file)
index 0000000..026158d
--- /dev/null
+++ b/po/ka.po
@@ -0,0 +1,818 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Ekaterine Papava <papava.e@gtu.ge>, 2024.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2024-01-03 22:53+0000\n"
+"PO-Revision-Date: 2024-01-05 18:45+0100\n"
+"Last-Translator: Ekaterine Papava <papava.e@gtu.ge>\n"
+"Language-Team: Georgian <(nothing)>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "შერჩეული ბმა"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "მიუთითებს, მონიშნულია თუ არა AtkHyperlink ჰიპერბმა"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "ღუზების რაოდენობა"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "მიმდინარე ჰიპერტექსტთან დაკავშირებული ღუზების რაოდენობა"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "ინდექსის ბოლო"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "ჰიპერბმის ობიექტის ინდექსის ბოლო"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "ინდექსის დასაწყისი"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "ჰიპერბმის ობიექტის ინდექსის დასაწყისი"
+
+#: atk/atkobject.c:272
+msgid "Accessible Name"
+msgstr "დამხმარე სახელი"
+
+#: atk/atkobject.c:273
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "ობიექტის დამხმარე ფსევდონიმი დამხმარე ტექნოლოგიებისთვის"
+
+#: atk/atkobject.c:279
+msgid "Accessible Description"
+msgstr "ძირეული დამხმარე ობიექტი"
+
+#: atk/atkobject.c:280
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "ობიექტის აღწერილობა დამხმარე ტექნოლოგიებისთვის"
+
+#: atk/atkobject.c:286
+msgid "Accessible Parent"
+msgstr "ძირეული დამხმარე ობიექტი"
+
+#: atk/atkobject.c:287
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"მიმდინარე წვდომადის atk_object_get_parent()-ის მიერ დაბრუნებული მშობელი"
+
+#: atk/atkobject.c:303
+msgid "Accessible Value"
+msgstr "დამხმარე ობიექტის მნიშვნელობა"
+
+#: atk/atkobject.c:304
+msgid "Is used to notify that the value has changed"
+msgstr "დამხმარე ობიექტის მნიშვნელობის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:312
+msgid "Accessible Role"
+msgstr "დამხმარე ობიექტის როლი"
+
+#: atk/atkobject.c:313
+msgid "The accessible role of this object"
+msgstr "დამხმარე ობიექტის როლი"
+
+#: atk/atkobject.c:320
+msgid "Accessible Layer"
+msgstr "დამხმარე ობიექტის შრე"
+
+#: atk/atkobject.c:321
+msgid "The accessible layer of this object"
+msgstr "დამხმარე ობიექტის შრე"
+
+#: atk/atkobject.c:329
+msgid "Accessible MDI Value"
+msgstr "დამხმარე ობიექტის MDI მნიშვნელობა"
+
+#: atk/atkobject.c:330
+msgid "The accessible MDI value of this object"
+msgstr "დამხმარე ობიექტის MDI მნიშვნელობა"
+
+#: atk/atkobject.c:346
+msgid "Accessible Table Caption"
+msgstr "დამხმარე ობიექტის ცხრილის სათაური"
+
+#: atk/atkobject.c:347
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"დამხმარე ობიექტის ცხრილის სათაურის ცვლილების შეტყობინება; ამ პარამეტრის "
+"ნაცვლად სასურველია დამხმარე ცხრილის სათაურის ობიექტის გამოყენება"
+
+#: atk/atkobject.c:361
+msgid "Accessible Table Column Header"
+msgstr "დამხმარე ობიექტის სვეტის თავსართი"
+
+#: atk/atkobject.c:362
+msgid "Is used to notify that the table column header has changed"
+msgstr "დამხმარე ობიექტის სვეტის თავსართის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:377
+msgid "Accessible Table Column Description"
+msgstr "დამხმარე ობიექტის სვეტის აღწერილობა"
+
+#: atk/atkobject.c:378
+msgid "Is used to notify that the table column description has changed"
+msgstr "დამხმარე ობიექტის სვეტის თავსართის აღწერილობის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:393
+msgid "Accessible Table Row Header"
+msgstr "დამხმარე ობიექტის მწკრივის თავსართი"
+
+#: atk/atkobject.c:394
+msgid "Is used to notify that the table row header has changed"
+msgstr "დამხმარე ობიექტის მწკრივის თავსართის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:408
+msgid "Accessible Table Row Description"
+msgstr "დამხმარე ობიექტის მწკრივის აღწერილობა"
+
+#: atk/atkobject.c:409
+msgid "Is used to notify that the table row description has changed"
+msgstr "დამხმარე ობიექტის მწკრივის აღწერილობის თავსართის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:415
+msgid "Accessible Table Summary"
+msgstr "დამხმარე ობიექტის ნაერთი ცხრილი"
+
+#: atk/atkobject.c:416
+msgid "Is used to notify that the table summary has changed"
+msgstr "დამხმარე ობიექტის ნაერთი ცხრილის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:422
+msgid "Accessible Table Caption Object"
+msgstr "დამხმარე ცხრილის სათაურის ობიექტი"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the table caption has changed"
+msgstr "დამხმარე ცხრილის სათაურის ობიექტის ცვლილების შეტყობინება"
+
+#: atk/atkobject.c:429
+msgid "Number of Accessible Hypertext Links"
+msgstr "დამხმარე ობიექტის ჰიპერტექსტის ბმების რაოდენობა"
+
+#: atk/atkobject.c:430
+msgid "The number of links which the current AtkHypertext has"
+msgstr "მიმდინარე ჰიპერტექსტის ბმების რაოდენობა"
+
+#: atk/atkobject.c:439
+msgid "Accessible ID"
+msgstr "წვდომადის ID"
+
+#: atk/atkobject.c:440
+msgid "ID for the accessible; useful for automated testing"
+msgstr "ID წვდომადისთვის. სასარგებლოა ავტომატური დატესტვისთვის"
+
+#: atk/atkobject.c:446
+msgid "Help text"
+msgstr "დახმარების ტექსტი"
+
+#: atk/atkobject.c:447
+msgid "Help text associated with the accessible"
+msgstr "წვდომადთან ასოცირებული დახმარების ტექსტი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "ძალიან სუსტი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "სუსტი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "დამაკმაყოფილებელი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "ძლიერი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "ძალიან ძლიერი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "ძალიან დაბალი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "საშუალო"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "მაღალი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "ძალიან მაღალი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "ძალიან ცუდი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "ცუდი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "კარგი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "ძალიან კარგი"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "საუკეთესო"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
+msgid "The application no longer exists"
+msgstr "აპლიკაცია აღარ არსებობს"
+
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "მცდარი"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "მალმხმობის წარწერა"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "განგაში"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "ანიმაცია"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "ისარი"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "კალენდარი"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "ტილო"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "ჩამრთველი"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "ჩამრთველი მენიუს ელემენტი"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "ფერის არჩევა"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "სვეტის თავსართი"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "ჩამოშლადი სია"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "თარიღის რედაქტორი"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "სამუშაო დაფის ხატულა"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "სამუშაო დაფის ჩარჩო"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "დარეკვა"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "დიალოგი"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "დასტების კატალოგი"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "სახატავი არე"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "ფაილების არჩევა"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "შემვსები"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "შრიფტების არჩევა"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "ჩარჩო"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "გამჭვირვალე პანელი"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html ბლოკი"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "ხატულა"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "გამოსახულება"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "შიდა ჩარჩო"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "ჭდე"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "შრეებიანი პანელი"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "სია"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "სიის ელემენტი"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "მენიუ"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "მენიუს პულტი"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "მენიუს ღილაკი"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "მენიუს ელემენტი"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "ოპციების პანელი"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "დაფა"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "დაფების სია"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "პანელი"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "პაროლი"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "მოტივტივე მენიუ"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "მიმდინარეობის მაჩვენებელი"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "ღილაკი"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "ინდიკატორი"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "ინდიკატორის მენიუს ელემენტი"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "ძირეული დასტა"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "მწკრივის თავსართი"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "გადახვევის ზოლი"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "გადახვევის პანელი"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "გამყოფი"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "ჩოჩიალა"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "ორმაგი პანელი"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "მოტრიალების ღილაკი"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "სტატუსი"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "ცხრილი"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "ცხრილის უჯრა"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "ცხრილის სვეტის თავსართი"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "ცხრილის მწკრივის თავსართი"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "მენიუს ქვეელემენტი"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "ტერმინალი"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "ტექსტი"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "გადამრთველი"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "ხელსაწყოთა პანელი"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "კარნახი"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "ხე"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "განტოტვილი ცხრილი"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "უცნობია"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "ჩვენების არე"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "ფანჯარა"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "თავსართი"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "ქვესართი"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "პარაგრაფი"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "სახაზავი"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "პროგრამა"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "თვითშევსება"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "რედაქტირების პანელი"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "ჩაკერებული ობიექტი"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "ელემენტი"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "განგაში"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "პროგრამა"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "სამუშაო დაფის ჩარჩო"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "თავსართი"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "page"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "სექცია"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "ზედმეტი ობიექტი"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "ფორმა"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "ბმული"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "შეყვანის მეთოდის ფანჯარა"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "ცხრილის მწკრივი"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "ხის ელემენტი"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "დოკუმენტის ელცხრილი"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "დოკუმენტის პრეზენტაცია"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "დოკუმენტის ტექსტი"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "ვებ დოკუმენტი"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "ელფოტა"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "კომენტარი"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "სიის ყუთი"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "დაჯგუფება"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "გამოსახულების რუკა"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "გაფრთხილება"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "ინფორმაციის ზოლი"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "დონის ზოლი"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "სათაურის ზოლი"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "ბრჭყალის ბლოკი"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "აუდიო"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "ვიდეო"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "აღწერა"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "სტატია"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "ორიენტირი"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "ჟურნალი"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "სეფა"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "მათემატიკა"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "შეფასება"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "წამმზომი"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "აღწერის სია"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "აღწერის წესი"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "აღწერის მნიშვნელობა"
index eae37e7..9e56960 100644 (file)
--- a/po/kk.po
+++ b/po/kk.po
 # This file is distributed under the same license as the at-spi2-core package.
 # Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2014.
 #
+# Kazakh translation of atk.
+# Copyright (C) 2010 HZ
+# This file is distributed under the same license as the atk package.
+# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2010.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-10-16 16:03+0000\n"
-"PO-Revision-Date: 2014-10-19 15:13+0600\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-09-17 14:43+0000\n"
+"PO-Revision-Date: 2022-09-18 12:17+0600\n"
 "Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
-"Language-Team: Kazakh <kk@li.org>\n"
+"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
 "Language: kk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Poedit 1.7.3\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Таңдалған сілтеме"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Индекс соңы"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink объектінің индекс соңы"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Индекс басы"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink объектінің индекс басы"
+
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "бұрыс"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr ""
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "ескерту"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "анимация"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "сызықша"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "күнтізбе"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr ""
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr ""
+
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr ""
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "түсті таңдаушы"
+
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr ""
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr ""
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr ""
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "жұмыс үстел таңбашасы"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr ""
+
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr ""
+
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "сұхбат терезесі"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr ""
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr ""
+
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr ""
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr ""
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "фрейм"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr ""
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr ""
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "таңбаша"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "сурет"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr ""
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "белгі"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr ""
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "тізім"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr ""
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "мәзір"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr ""
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "мәзір батырмасы"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "мәзір элементі"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr ""
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr ""
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr ""
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "панель"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr ""
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr ""
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr ""
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr ""
+
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr ""
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr ""
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr ""
+
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr ""
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "айналдыру жолағы"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "ажыратқыш"
+
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr ""
+
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr ""
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "қалып-күй жолағы"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "кесте"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "кесте ұяшығы"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr ""
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr ""
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "терминал"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "мәтін"
+
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr ""
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "саймандар панелі"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr ""
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "ағаш"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr ""
+
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "белгісіз"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "терезе"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "тақырыптама"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr ""
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "параграф"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr ""
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "қолданба"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr ""
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "жазба"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr ""
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr ""
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr ""
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "парақ"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "санат"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "форма"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "сілтеме"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "кесте жолы"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "ағаш элементі"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "құжат эл. кестесі"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "құжат презентациясы"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "құжат мәтіні"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr ""
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr ""
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "түсіндірме"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr ""
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr ""
+
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr ""
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr ""
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr ""
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr ""
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr ""
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr ""
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr ""
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr ""
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr ""
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr ""
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr ""
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr ""
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr ""
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr ""
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr ""
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr ""
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr ""
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr ""
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr ""
+
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "өте әлсіз"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "әлсіз"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "жарайтын"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "қатаң"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "өте қатаң"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "өте төмен"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "орташа"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "жоғары"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "өте жоғары"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "өте нашар"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "нашар"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "жақсы"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "өте жақсы"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "ең жақсы"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1037
-#: ../atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Қолданба енді жоқ болып тұр"
 
-#: ../atspi/atspi-misc.c:1795
-msgid "Attempted synchronous call where prohibited"
-msgstr "Рұқсат етілмеген жерде синхронды шақырулар талабы жасалды"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Рұқсат етілмеген жерде синхронды шақырулар талабы жасалды"
index dc0e287..796e7c2 100644 (file)
--- a/po/km.po
+++ b/po/km.po
@@ -1,11 +1,21 @@
+# #-#-#-#-#  km.po (at-spi2-core.master)  #-#-#-#-#
 # translation of at-spi2-core.master.po to Khmer
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # Khoem Sokhem <khoemsokhem@khmeros.info>, 2012.
+# #-#-#-#-#  km.po (atk.master)  #-#-#-#-#
+# translation of atk.master.po to Khmer
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Khoem Sokhem <khoemsokhem@khmeros.info>, 2012.
+# Morn Met <mornmet@khmeros.info>, 2012.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  km.po (at-spi2-core.master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core.master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-spi&keywords=I18N+L10N&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&keywords=I18N+L10N&component=general\n"
 "POT-Creation-Date: 2012-01-05 21:00+0000\n"
 "PO-Revision-Date: 2012-01-13 10:35+0700\n"
 "Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
@@ -16,6 +26,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
 "X-Language: km-KH\n"
+"#-#-#-#-#  km.po (atk.master)  #-#-#-#-#\n"
+"Project-Id-Version: atk.master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-12-22 18:40+0000\n"
+"PO-Revision-Date: 2012-01-17 11:56+0700\n"
+"Last-Translator: Morn Met <mornmet@khmeros.info>\n"
+"Language-Team: Khmer <support@khmeros.info>\n"
+"Language: km\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: WordForge 0.8 RC1\n"
+"X-Language: km-KH\n"
 
 #: ../atspi/atspi-component.c:313 ../atspi/atspi-misc.c:941
 #: ../atspi/atspi-misc.c:992 ../atspi/atspi-misc.c:1034
@@ -23,3 +48,563 @@ msgstr ""
 msgid "The application no longer exists"
 msgstr "The application no longer exists"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "តំណ​ដែល​បាន​ជ្រើស"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "បញ្ជាក់​ថាតើ​វត្ថុ AtkHyperlink នឹង​ត្រូវ​បាន​ជ្រើស​ដែរ​ឬទេ"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "យុថ្កា​មួយចំនួន"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "យុថ្កា​មួយចំនួន​ដែល​ទាក់ទង​នឹង​វត្ថុ AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "លិបិក្រម​បញ្ចប់"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "លិបិក្រម​បញ្ចប់​នៃ​វ​ត្ថុ AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "លិបិក្រម​ចាប់ផ្ដើម"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "លិបិក្រម​ចាប់ផ្ដើម​នៃ​វត្ថុ AtkHyperlink"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "មិន​ត្រឹមត្រូវ"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ស្លាក​បង្កើនល្បឿន"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "ព្រមាន"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "ចលនា"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "ព្រួញ"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "ប្រតិទិន"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "ផ្ទាំងកំណាត់"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "ប្រអប់ធីក"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "ពិនិត្យមើល​ធាតុ​ម៉ឺនុយ"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "កម្មវិធី​ជ្រើស​ពណ៌"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "ក្បាល​ជួរឈរ"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "ប្រអប់​បន្សំ"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "កម្មវិធី​កែសម្រួល​កាលបរិច្ឆេទ"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "រូបតំណាង​ផ្ទៃតុ"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ស៊ុម​ផ្ទៃតុ"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "ហៅ"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "ប្រអប់"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "បន្ទះថត"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "ផ្ទៃ​គូរ"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "កម្មវិធី​ជ្រើស​ឯកសារ"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "តម្រង"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "កម្មវិធី​ជ្រើស​ពុម្ពអក្សរ"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ស៊ុម"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "បន្ទះ​​កញ្ចក់"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "ឧបករណ៍​ផ្ទុក html"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "រូបតំណាង"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "រូបភាព"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ស៊ុម​ខាងក្នុង"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "ស្លាក"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "ស្លាបព្រិល​​ជាស្រទាប់"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "បញ្ជី"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "ធាតុ​បញ្ជី"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "ម៉ឺនុយ"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "របារ​ម៉ឺនុយ"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "ធាតុ​ម៉ឺនុយ"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "បន្ទះ​ជម្រើស"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "ផ្ទាំង​ទំព័រ"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "បញ្ជី​ផ្ទាំង​ទំព័រ"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "បន្ទះ"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "អត្ថបទ​ពាក្យសម្ងាត់"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "ម៉ឺនុយ​លេចឡើង"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "របារ​វឌ្ឍនភាព"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "ប៊ូតុង​រុញ"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "ប៊ូតុង​មូល"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "ធាតុ​ម៉ឺនុយ​ប៊ូតុងមូល"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "បន្ទះ root"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "ក្បាល​ជួរដេក"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "របារ​រមូរ"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "បន្ទះរមូរ"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "សញ្ញា​បំបែក"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "គ្រាប់​រំកិល"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "បន្ទះ​ពុះ"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "ប៊ូតុង​បង្កើនបន្ថយ"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "របារ​ស្ថានភាព"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "តារាង"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "ក្រឡា​តារាង"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "ក្បាល​ជួរឈរ​តារាង"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "ក្បាល​ជួរដេក​តារាង"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "ញែក​ធាតុ​ម៉ឺនុយ"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "ស្ថានីយ"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "អត្ថបទ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ប៊ូតុង​បិទ/បើក"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "របារ​ឧបករណ៍"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "ព័ត៌មាន​ជំនួយ​ឧបករណ៍"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "មែកធាង"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "តារាង​មែកធាង"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "មិន​ស្គាល់"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "ច្រក​ទិដ្ឋភាព"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "បង្អួច"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "បឋមកថា"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "បាតកថា"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "កថាខណ្ឌ"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "បន្ទាត់"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "កម្មវិធី"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "បំពេញ​ស្វ័យប្រវត្តិ"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "របារ​កែសម្រួល"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "សមាសភាគ​ដែល​បង្កប់"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "ធាតុ"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "គំនូសតាង"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "ចំណងជើង"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "ស៊ុម​ឯកសារ"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "ក្បាល"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "ទំព័រ"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "ភាគ"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "វត្ថុ​ដែល​លើស"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "សំណុំ​បែបបទ"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "តំណ"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "បង្អួច​វិធីសាស្ត្រ​បញ្ចូល"
+
+#: ../atk/atkobject.c:163
+msgid "table row"
+msgstr "ជួរដេក​តា​រាង"
+
+#: ../atk/atkobject.c:164
+msgid "tree item"
+msgstr "ធាតុ​មែកធាង"
+
+#: ../atk/atkobject.c:165
+msgid "document spreadsheet"
+msgstr "សៀវភៅ​បញ្ជី​ឯកសារ"
+
+#: ../atk/atkobject.c:166
+msgid "document presentation"
+msgstr "បទ​បង្ហាញ​ឯកសារ"
+
+#: ../atk/atkobject.c:167
+msgid "document text"
+msgstr "អត្ថបទ​ឯកសារ"
+
+#: ../atk/atkobject.c:168
+msgid "document web"
+msgstr "បណ្ដាញ​ឯកសារ"
+
+#: ../atk/atkobject.c:169
+msgid "document email"
+msgstr "អ៊ីមែល​ឯកសារ"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "មតិយោបល់"
+
+#: ../atk/atkobject.c:171
+msgid "list box"
+msgstr "ប្រអប់​បញ្ជី"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "ដាក់ជាក្រុម"
+
+#: ../atk/atkobject.c:173
+msgid "image map"
+msgstr "ផែនទី​រូបភាព"
+
+#: ../atk/atkobject.c:174
+msgid "notification"
+msgstr "ការ​ជូនដំណឹង"
+
+#: ../atk/atkobject.c:175
+msgid "info bar"
+msgstr "របារ​ព័ត៌មាន"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "ឈ្មោះ​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "ឈ្មោះ​របស់​វត្ថុ​ត្រូវ​បាន​ធ្វើ​ទ្រង់ទ្រាយ​សម្រាប់​ការ​ចូលដំណើរការ​បច្ចេកទេស​ជា​ជំនួយ"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "សេចក្ដី​ពិពណ៌នា​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "សេចក្ដី​ពិពណ៌នា​អំពី​វត្ថុ​ដែល​ត្រូវ​បាន​ធ្វើទ្រង់ទ្រាយ​សម្រាប់​ការ​ចូលដំណើរការ​បច្ចេកវិទ្យា​ជា​ជំនួយ"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "មេ​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា មេ​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "តម្លៃ​ដែល​អាច​ចូលដំណើរការបាន"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា តម្លៃ​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "តួនាទី​ដែល​អាច​ចូលដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "តួនាទី​ដែល​អាច​ចូលដំណើរការ​បាន​នៃ​វត្ថុ​នេះ"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "ស្រទាប់​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "ស្រទាប់​ដែល​អាច​ចូល​ដំណើរការ​បាន​នៃ​វត្ថុ​នេះ"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "តម្លៃ MDI ដែល​អាច​ចូល​ដំណើរការបាន"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "តម្លៃ MDI ដែល​អាច​ចូល​ដំណើរការ​បាន​នៃវត្ថុ​នេះ"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "ចំណងជើង​តារាង​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា ចំណងជើង​តារាង​បាន​ផ្លាស់ប្ដូរ លក្ខណសម្បត្តិ​នេះ​មិន​គួរត្រូវ​បាន​ប្រើ​ទេ ។ គូរតែ​"
+"ប្រើ​វត្ថុ​ចំណងជើង​តារាង​ដែល​អាច​ចូលដំណើរការ​បាន​ជំនួសវិញ"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "ក្បាល​ជួរឈរ​តារាង​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា ក្បាល​ជួរឈរ​តារាង​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "សេចក្ដី​ពិពណ៌នាអំពី​ជួរឈរ​តារាង​ដែល​អាច​ចូលដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា សេចក្ដី​ពិពណ៌នា​អំពី​ជួរឈរ​តារាង​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "ក្បាល​ជួរដេក​តារាង​ដែល​អាច​ចូលដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា ក្បាល​ជូរដេក​តារាង​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "សេចក្ដី​ពិពណ៌នា​ជួរដេក​តារាង​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា សេចក្ដី​ពិពណ៌នា​ជួរដេក​តារាង​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "សង្ខេប​តារាង​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា សង្ខេប​តារាង​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "វត្ថុ​ចំណងជើង​តារាង​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "ត្រូវ​បាន​ប្រើ​ដើម្បី​ជូនដំណឹង​ថា ចំណងជើង​តារាង​បាន​ផ្លាស់ប្ដូរ"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "ចំនួន​តំណ​អត្ថបទ​តភ្ជាប់​គ្មាន​លំដាប់​ដែល​អាច​ចូល​ដំណើរការ​បាន"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ចំនួន​តំណ​ដែល​ AtkHypertext បច្ចុប្បន្ន​មាន"
index 27b44c5..ed02445 100644 (file)
--- a/po/kn.po
+++ b/po/kn.po
@@ -1,13 +1,22 @@
+# #-#-#-#-#  kn.po (at-spi2-core master)  #-#-#-#-#
 # Kannada translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Shankar Prasad <svenkate@redhat.com>, 2011.
+# #-#-#-#-#  kn.po (atk.HEAD.kn)  #-#-#-#-#
+# translation of atk.HEAD.kn.po to Kannada
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Shankar Prasad <svenkate@redhat.com>, 2008, 2009, 2011.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  kn.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
-"cgi?product=at-spi&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&component=general\n"
 "POT-Creation-Date: 2011-02-08 06:35+0000\n"
 "PO-Revision-Date: 2011-02-08 16:09+0530\n"
 "Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
@@ -18,6 +27,20 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 1.1\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  kn.po (atk.HEAD.kn)  #-#-#-#-#\n"
+"Project-Id-Version: atk.HEAD.kn\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-08-16 17:08+0000\n"
+"PO-Revision-Date: 2011-08-29 16:32+0530\n"
+"Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
+"Language-Team: Kannada <en@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"Language: kn\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -91,8 +114,7 @@ msgstr ""
 #, c-format
 msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
 msgstr ""
-"atspi_dbus_get_property: ತಪ್ಪಾದ ಬಗೆ: %s ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, %c "
-"ದೊರೆತಿದೆ\n"
+"atspi_dbus_get_property: ತಪ್ಪಾದ ಬಗೆ: %s ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು, %c ದೊರೆತಿದೆ\n"
 
 #: ../atspi/atspi-misc.c:1279
 #, c-format
@@ -102,8 +124,7 @@ msgstr "AT-SPI: ಗೊತ್ತಿರದ ಸಂಪರ್ಕಸಾಧನ %s"
 #: ../atspi/atspi-misc.c:1299
 #, c-format
 msgid "AT-SPI: expected 2 values in states array; got %d\n"
-msgstr ""
-"AT-SPI: ಸ್ಥಿತಿಗಳ ವ್ಯೂಹದಿಂದ 2 ಮೌಲ್ಯಗಳನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು; %d ದೊರೆತಿದೆ\n"
+msgstr "AT-SPI: ಸ್ಥಿತಿಗಳ ವ್ಯೂಹದಿಂದ 2 ಮೌಲ್ಯಗಳನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗಿತ್ತು; %d ದೊರೆತಿದೆ\n"
 
 #: ../atspi/atspi-accessible.c:997
 msgid "Streamable content not implemented"
@@ -121,3 +142,577 @@ msgstr ""
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "ಮಾನ್ಯವಾದ ಸಹಿ %s ದೊರೆತಿದೆ, %s ಎಂಬ ಸಂಜ್ಞೆಗಾಗಿ, %s ಎಂಬ ಸಂಪರ್ಕಸಾಧನದಿಂದ\n"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "ಆರಿಸಲಾದ ಕೊಂಡಿ"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink ಆಬ್ಜೆಕ್ಟ್‍ ಆರಿಸಲ್ಪಟ್ಟಿದೆಯೆ ಎಂದು ಸೂಚಿಸುತ್ತದೆ"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "ಆಂಕರ್‍ಗಳ ಸಂಖ್ಯೆ"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink ಆಬ್ಜೆಕ್ಟ್‍ನೊಂದಿಗೆ ಹೊಂದಿಕೊಂಡಿರುವ ಆಂಕರ್‍ಗಳ ಸಂಖ್ಯೆ"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "ಅಂತ್ಯದ ಇಂಡೆಕ್ಸ್‍"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink ಆಬ್ಜೆಕ್ಟ್‍ನ ಅಂತ್ಯದ ಇಂಡೆಕ್ಸ್‍"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "ಆರಂಭದ ಇಂಡೆಕ್ಸ್‍"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink ಆಬ್ಜೆಕ್ಟ್‍ನ ಆರಂಭದ ಇಂಡೆಕ್ಸ್‍"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "ಅಮಾನ್ಯ"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ವೇಗೋತ್ಕರ್ಷಕ ಲೇಬಲ್"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "ಎಚ್ಚರಿಕೆ"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "ಅನಿಮೇಶನ್"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "ತೀರ"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "ಕ್ಯಾಲೆಂಡರ್"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "ಕ್ಯಾನ್ವಾಸ್"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "ಗುರುತು ಪೆಟ್ಟಿಗೆ"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "ಮೆನು ಅಂಶವನ್ನು ಪರೀಕ್ಷಿಸು"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "ಬಣ್ಣದ ಆಯ್ಕೆಗಾರ"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "ಕಾಲಂ ಹೆಡರ್"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "ಕಾಂಬೋ ಪೆಟ್ಟಿಗೆ"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "ದಿನಾಂಕ-ಸಂಪಾದಕ"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ಗಣಕತೆರೆಯ ಚಿಹ್ನೆ"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ಗಣಕತೆರೆಯ ಚೌಕಟ್ಟು"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "ಕರೆ"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "ಸಂವಾದ"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ಕೋಶ ಫಲಕ"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "ಬರೆಯುವ ಜಾಗ"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ಕಡತ ಆಯ್ಕೆಗಾರ"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "ತುಂಬಿಸುವವ"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ಅಕ್ಷರಶೈಲಿಆಯ್ಕೆಗಾರ"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ಚೌಕಟ್ಟು"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "ಗಾಜಿನ ಫಲಕ"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html ಒಳಗೊಂಡಿರುವ"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ಚಿಹ್ನೆ"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "ಚಿತ್ರ"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ಒಳಗಿನ ಚೌಕಟ್ಟು"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "ಲೇಬಲ್"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "ಪದರು ಪದರಾದ ಫಲಕ"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "ಅಂಶ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "ಪರಿವಿಡಿ"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "ಮೆನು ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "ಮೆನು ಅಂಶ"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "ಆಯ್ಕೆ ಫಲಕ"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "ಪುಟದ ಟ್ಯಾಬ್"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "ಪುಟದ ಟ್ಯಾಬ್ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "ಮುಖ್ಯ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "ಗುಪ್ತಪದ ಪಠ್ಯ"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "ಪುಟಿಕೆ ಮೆನು"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ಪ್ರಗತಿ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "ಒತ್ತು ಗುಂಡಿ"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "ರೇಡಿಯೋ ಗುಂಡಿ"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "ರೇಡಿಯೋ ಮೆನು ಅಂಶ"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "ಮೂಲ ಫಲಕ"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "ಸಾಲು ಹೆಡರ್"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "ಚಲನ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "ಚಲನ ಫಲಕ"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "ವಿಭಜಕ"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "ಸ್ಲೈಡರ್"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "ಸೀಳು ಫಲಕ"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "ತಿರುಗು ಗುಂಡಿ"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "ಸ್ಥಿತಿ ಪಟ್ಟಿಕೆ"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "ಟೇಬಲ್"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "ಟೇಬಲ್ ಸೆಲ್"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "ಟೇಬಲ್ ಕಾಲಂ ಹೆಡರ್"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "ಟೇಬಲ್ ಸಾಲು ಹೆಡರ್"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "ಮೆನು ಅಂಶವನ್ನು ಹರಿದು ಹಾಕು"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "ಟರ್ಮಿನಲ್"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "ಪಠ್ಯ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ಹೊರಳು ಗುಂಡಿ"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "ಉಪಕರಣ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "ಉಪಕರಣ ಸಲಹೆ"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ವೃಕ್ಷ"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ಟ್ರೀ ಟೇಬಲ್"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "ಗೊತ್ತಾಗದ"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "ನೋಟದ ಮಿತಿ"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "ಕಿಟಕಿ"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "ಶಿರೋ ಲೇಖ"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "ಪಾದ ಲೇಖ"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "ಪ್ಯಾರಾಗ್ರಾಫ್"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "ಅಳತೆಗೋಲು"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "ಅನ್ವಯ"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "ಸ್ವಯಂಪೂರ್ಣಗೊಳಿಕೆ"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "ಸಂಪಾದನೆಯ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "ಅಡಕಗೊಳಿಸಲಾದ ಘಟಕ"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "ನಮೂದು"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "ನಕ್ಷೆ"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "ಶಿರೋನಾಮ"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "ದಸ್ತಾವೇಜಿನ ಚೌಕಟ್ಟು"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "ಶೀರ್ಷಿಕೆ"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "ಪುಟ"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "ವಿಭಾಗ"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "ಅನವಶ್ಯಕ ಆಬ್ಜೆಕ್ಟ್‍"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ಫಾರ್ಮ್"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "ಸಂಪರ್ಕಕೊಂಡಿ"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ಇನ್‌ಪುಟ್ ಕ್ರಮದ ವಿಂಡೊ"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "ಟೇಬಲ್ ಅಡ್ಡಸಾಲು"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "ವೃಕ್ಷ ಅಂಶ"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "ದಸ್ತಾವೇಜಿನ ಸ್ಪ್ರೆಡ್‌ಶೀಟ್"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "ದಸ್ತಾವೇಜಿನ ಪ್ರಸೆಂಟೇಶನ್"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "ದಸ್ತಾವೇಜಿನ ಟೆಕ್ಸ್ಟ್‍"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "ದಸ್ತಾವೇಜಿನ ಜಾಲ"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "ದಸ್ತಾವೇಜಿನ ಇಮೈಲ್"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "ಟಿಪ್ಪಣಿ"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "ಪಟ್ಟಿ ಚೌಕ"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "ಗುಂಪುಗೊಳಿಕೆ"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "ಚಿತ್ರ ನಕ್ಷೆ"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "ಸೂಚನೆಗಳು"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "ಮಾಹಿತಿ ಪಟ್ಟಿ"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಹೆಸರು"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"ಸಹಾಯಕ ತಂತ್ರಜ್ಞಾನ ನಿಲುಕಣೆ(ಅಸ್ಸಿಸ್ಟಿವ್ ಟೆಕ್ನೊಲಜಿ ಅಕ್ಸೆಸ್) ಗೆ ಹೊಂದುವಂತೆ ಬದಲಾಯಿಸಲಾದ "
+"ಆಬ್ಜೆಕ್ಟ್ ಸನ್ನಿವೇಶದ(ಇನ್‍ಸ್ಟೆನ್ಸ್‍) ಹೆಸರು"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ವಿವರಣೆ"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"ಸಹಾಯಕ ತಂತ್ರಜ್ಞಾನ ನಿಲುಕಣೆ(ಅಸ್ಸಿಸ್ಟಿವ್ ಟೆಕ್ನೊಲಜಿ ಅಕ್ಸೆಸ್) ಗೆ ಹೊಂದುವಂತಹ ಆಬ್ಜೆಕ್ಟ್ ನ ವಿವರಣೆ"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಮೂಲ"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "ಮೂಲವು ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲ್ಪಡುತ್ತದೆ"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಮೌಲ್ಯ"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "ಮೌಲ್ಯವು ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲ್ಪಡುತ್ತದೆ"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಪಾತ್ರ"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "ಪಾತ್ರವು ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲ್ಪಡುತ್ತದೆ"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಪದರ"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "ಆಬ್ಜೆಕ್ಟ್ ನ ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಪರದೆ "
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ MDI ಮೌಲ್ಯ"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "ಆಬ್ಜೆಕ್ಟ್‍ನ ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ MDI ಮೌಲ್ಯ"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಶೀರ್ಷಿಕೆ"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ಟೇಬಲ್ ನ ಶಿರೊನಾಮ ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲಾಗಿದೆ; ಈ ಗುಣಲಕ್ಷಣವನ್ನು ಬಳಸಬಾರದು. ಇದರ "
+"ಬದಲು ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ-ಟೇಬಲ್-ಶಿರೊನಾಮ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಬಳಸಬೇಕು"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಕಾಲಂ ಹೆಡರ್"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "ಟೇಬಲ್ ನ ಕಾಲಂ ಹೆಡರ್ ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲಾಗಿದೆ"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಕಾಲಂ ವಿವರಣೆ"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "ಟೇಬಲ್ ನ ಕಾಲಂ ವಿವರಣೆ ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲಾಗಿದೆ"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಸಾಲು ಹೆಡರ್"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "ಟೇಬಲ್ ನ ಸಾಲಿನ ಹೆಡರ್ ಬದಲಾಗಿದೆ ಎಂದು ತಿಳಿಸಲು ಬಳಸಲಾಗಿದೆ"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಸಾಲು ವಿವರಣೆ"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "ಟೇಬಲ್ ನ ರೊ ವಿವರಣೆ ಬದಲಾಗಿದೆ ಅಂತ ತಿಳಿಸುವುದಕ್ಕೆ ಬಳಸಲಾಗಿದೆ"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಸಾರಾಂಶ"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "ಟೇಬಲ್ ನ ಸಾರಂಶ ಬದಲಾಗಿದೆ ಅಂತ ತಿಳಿಸುವುದಕ್ಕೆ ಬಳಸಲಾಗಿದೆ"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ ಟೇಬಲ್ ಶೀರ್ಷಿಕೆ ಆಬ್ಜೆಕ್ಟ್‍"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "ಟೇಬಲ್ ನ ಶಿರೊನಾಮ ಬದಲಾಗಿದೆ ಅಂತ ತಿಳಿಸುವುದಕ್ಕೆ ಬಳಸಲಾಗಿದೆ"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "ನಿಲುಕಿಸಿಕೊಳ್ಳಬಹುದಾದ AtkHypertext ಕೊಂಡಿಗಳ ಸಂಖ್ಯೆ"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ಪ್ರಸಕ್ತ AtkHypertext ಹೊಂದಿರುವ ಕೊಂಡಿಗಳ ಸಂಖ್ಯೆ"
index 04a55b7..55844ea 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
 # Korean translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
-# Changwoo Ryu <cwryu@debian.org>, 2011, 2014.
-#
+# (atk) 
+# Nam SungHyun <namsh@kldp.org>, 2002
+# Changwoo Ryu <cwryu@debian.org>, 2004, 2006, 2008, 2009, 2011, 2014
+# (at-spi2-core)
+# Changwoo Ryu <cwryu@debian.org>, 2011, 2014, 2022.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-03-07 01:38+0900\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-09-04 01:02+0900\n"
 "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
-"Language-Team: Korean <gnome-kr@googlegroups.com>\n"
+"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
 "Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "링크 선택"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "해당 AtkHyperlink 오브젝트를 선택했는 지 여부를 지정합니다"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "연결 개수"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink 오브젝트에 연동된 연결의 개수"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "끝 인덱스"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink 오브젝트의 끝 인덱스"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "시작 인덱스"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink 오브젝트의 시작 인덱스"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "잘못됨"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "단축키 레이블"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "경보"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "에니메이션"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "화살표"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "달력"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "캔버스"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "확인란"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "확인 메뉴 항목"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "색 선택창"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "열 헤더"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "콤보 상자"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "날짜 편집기"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "바탕 화면 아이콘"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "바탕 화면 프레임"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "다이얼"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "대화상자"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "디렉터리 창"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "그리기 영역"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "파일 선택창"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "채우기"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "글꼴 선택창"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "프레임"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "투명 창"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "HTML 컨테이너"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "아이콘"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "그림"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "내부 프레임"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "레이블"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "계층 창"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "목록"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "목록 항목"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "메뉴"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "메뉴 모음"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "메뉴 단추"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "메뉴 항목"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "옵션 창"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "페이지 탭"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "페이지 탭 목록"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "패널"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "암호 텍스트"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "팝업 메뉴"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "진행률 표시줄"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "푸쉬 단추"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "라디오 단추"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "라디오 메뉴 항목"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "루트 창"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "열 헤더"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "스크롤 막대"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "스크롤 창"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "구분선"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "슬라이더"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "나눔 창"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "스핀 단추"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "상태 표시줄"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "테이블"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "테이블 셀"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "테이블 열 헤더"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "테이블 행 헤더"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "떼어내기 메뉴 항목"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "터미널"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "텍스트"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "토글 단추"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "도구 모음"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "도구 설명"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "트리"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "트리 테이블"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "알 수 없음"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "뷰포트"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "창"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "머리글"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "바닥글"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "단락"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "눈금자"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "응용프로그램"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "자동 완성"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "편집 막대"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "포함된 컴포넌트"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "입력창"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "표"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "캡션"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "문서 프레임"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "머리글"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "쪽"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "절"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "추가 객체"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "폼"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "링크"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "입력기 창"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "테이블 행"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "트리 항목"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "문서 스프레드시트"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "문서 프리젠테이션"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "문서 텍스트"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "문서 웹"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "문서 전자 메일"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "주석"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "목록 상자"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "모음"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "그림 맵"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "알림"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "정보 모음"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "단계 표시 막대"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "제목 표시줄"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "블럭 인용"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "오디오"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "비디오"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "정의"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "글"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "랜드마크"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "기록"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "그늘"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "수학"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "평가"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "타미어"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "설명 목록"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "설명 용어"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "설명 값"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "접근성 이름"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "접근성 기술로 접근할 때 사용할 오브젝트 인스턴스의 이름"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "접근성 설명"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "접근성 기술로 접근할 때 사용할 오브젝트의 설명"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "접근성 상위"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "atk_object_get_parent()가 리턴한 현재 접근성 값의 상위 위젯"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "접근성 값"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "값이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "접근 역할"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "이 오브젝트의 접근성 역할"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "접근성 레이어"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "이 오브젝트의 접근성 레이어"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "접근성 MDI 값"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "이 오브젝트의 접근성 MDI 값"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "접근성 테이블 캡션"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"테이블 캡션이 바뀐 걸 알릴 때 쓰입니다; 이 속성은 사용하지 않아야 합니다. 대"
+"신에 accessible-table-caption-object를 사용해야 합니다"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "접근성 테이블 열 머리말"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "테이블 열 머리말이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "접근성 테이블 열 설명"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "테이블 열 설명이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "접근성 테이블 행 머리말"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "테이블 행 머리말이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "접근성 테이블 행 설명"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "테이블 행 설명이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "접근성 테이블 요약"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "테이블 요약이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "접근성 테이블 캡션 오브젝트"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "테이블 캡션이 바뀐 걸 알릴 때 쓰입니다"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "접근성 하이퍼텍스트 링크 개수"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "현재 AtkHyperlink에 들어 있는 링크의 개수"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "매우 취약"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "취약"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "가능"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "강력"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "매우 강력"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "매우 낮음"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "중간"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "높음"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "매우 높음"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "매우 나쁨"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "나쁨"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "좋음"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "매우 좋음"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "최고"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "프로그램이 더 이상 없습니다"
-
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "동기식 호출을 시도했으나 금지되어 있습니다"
diff --git a/po/ku.po b/po/ku.po
new file mode 100644 (file)
index 0000000..70fe194
--- /dev/null
+++ b/po/ku.po
@@ -0,0 +1,530 @@
+# translation of ku.po to Kurdish
+# Kurdish translation of atk
+# Copyright (C) 2006 THE atk'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+#
+#
+# Erdal Ronahi <erdal.ronahi@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ku\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2006-12-23 21:49+0100\n"
+"Last-Translator: Erdal Ronahi <erdal.ronahi@gmail.com>\n"
+"Language-Team: Kurdish <ku@li.org>\n"
+"Language: ku\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+"X-Rosetta-Export-Date: 2006-12-23 20:28+0000\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Girêdana Hilbijartî"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Diyar dike bê ka biresera AtkHyperlink hatiye hilbijartin yan na"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Hejmara Çipayan"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Hejmara girêdanên têkildarê AtkHyperlink"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Pêrista dawî"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Pêrista dawî ya objeya AtkHyperlink"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Pêrista destpêkê"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Pêrista destpêkê ya AtkHyperlink"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "nederbasdar"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "etîketa lezkerê"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "hişyarî"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "candarî"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "tîr"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "salname"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "neqiş"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "qutiyê kontrolê"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "hêmana pêşekê kontrol bike"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "bijarkerê reng"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "sernavê stûnê"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "pir-qutî"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "sererastkerê daneyan"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "îkona sermasê"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "çarçoveya sermaseyê"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "bigere"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "diyalog"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "panela pelrêçan"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "qada xêzkirinê"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "bijarkerê pelan"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "tijeker"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "hilbijêrê curetîpan"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "çarçove"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "cama paceyê"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "depoya html"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "îkon"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "wêne"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "çacoveya hundirî"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "etîket"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "panela bi tebeqe"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "lîste"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "Hêmana lîsteyê"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "pêşek"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "darikê pêşekê"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "hêmana pêşekê"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "panela vebijêrkan"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "hilfirîna rûpelê"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "lîsteya hilfirînên rûpelê"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "nivîsa şîfreyê"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "pêşeka vebûnbar"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "darikê pêşveçûnê"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "bişkok"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "bişkoka radyoyê"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "hêmana bişkoka radyoyê"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "panela kok"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "sernavê rêzikê"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "darikê şemitandinê"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "panela şemitandinê"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "kevan"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "şemitandin"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "panela veqetiyayî"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "bişkoka lêgerînê"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "darikê rewşê"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "tablo"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "şaneya tabloyê"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "sernavê stûna tabloyê"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "sernavê rêzika tabloyê"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "hêmana pêşekê ji hev cihê bike"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "termînal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "nivîs"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "bişkoka veke/bigire"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "darikê amûran"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "li ber guh xistin"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "dar"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "tabloya daran"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "nenas"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "pace"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "sernav"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "binnivîs"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "hişyarî"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "sepan"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "bixweber tije bike"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "darikê sererastkirinê"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "hevgirtiyê definkirî"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "ketan"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "xanxank"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "sernav"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "çarçoveya pelgeyê"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "sernivîs"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "rûpel"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "beş"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "biresera ne hewce"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "form"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Navê Gihiştbar"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Navê hêmana bireserê, ji bo gihiştina teknolojiya alîkar hate teşekirin"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Pênasa Gihiştbar"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Danasîna bireserê, ji bo gihiştina teknolojiya alîkar hate teşekirin"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Xwediyê Gihiştbar"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Ji bo hişyariya guherandina xwedî tê bikaranîn"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Nirxa Gihiştbar"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Ji bo hişyariya guherandina nirxê tê bikaranîn"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Rolê Gihiştbar"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Rolê gihiştbar ya vê bireserê"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Tebeqeya Gihiştbar"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Tebeqeya gihiştbar ya vê bireserê"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Nirxa MDI ya Gihiştbar"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Nirxa MDI'ya gihiştbar ya vê bireserê"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Sernavê Tabloya ku Gihiştbar"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Sernavê Stûna Tabloya Gihiştbar"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Ji bo hişyariya guherandina sernavê stûna tabloyê tê bikaranîn"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Danasîna Stûnê Tabloya Gihiştbar"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Ji bo hişyariya guherandina danasîna stûna tabloyê tê bikaranîn"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Sernavê Dorvegeriya Tabloya Gihiştbar"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Ji bo hişyariya guherandina sernavê dorvegeriya tabloyê tê bikaranîn"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Naskirina wêneya rêza gihandinê"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "i bo wêneya rêza naskirinê hatiye gohertin tê bi karkanînin"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Sernivîsa wêneya gihandinê"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Ji bo hişyariya guherîna kurtebiriyê tê bikaranîn"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Biresera Sernavê Tabloya Gihiştbar"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Ji bo hişyariya guherîna sernavê tabloyê tê bikaranîn"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Gihandinda Hejmara Hypertext"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Hejmara Girêdanan yên di AtkHypertext de hene"
diff --git a/po/li.po b/po/li.po
new file mode 100644 (file)
index 0000000..cae1723
--- /dev/null
+++ b/po/li.po
@@ -0,0 +1,572 @@
+# Limburgish translation of ATK.
+# Copyright (C) 2002 COPYRIGHTHOLDER
+# This file is distributed under the same license as the atk package.
+# Mathieu van Woerkom <mathieu@brabants.org>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk cvs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2003-06-04 16:08+0100\n"
+"Last-Translator: Mathieu van Woerkom <mathieu@brabants.org>\n"
+"Language-Team: Limburgish\n"
+"Language: li\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr ""
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr ""
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr ""
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "óngeljig"
+
+#: atk/atkobject.c:75
+#, fuzzy
+msgid "accelerator label"
+msgstr "sjnaktósjlabel"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "alarm"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "animasie"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "piel"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "kelender"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "kanvas"
+
+#: atk/atkobject.c:81
+#, fuzzy
+msgid "check box"
+msgstr "aankruutsfekske"
+
+#: atk/atkobject.c:82
+#, fuzzy
+msgid "check menu item"
+msgstr "aankruuts-menu-item"
+
+#: atk/atkobject.c:83
+#, fuzzy
+msgid "color chooser"
+msgstr "kleurekezer"
+
+#: atk/atkobject.c:84
+#, fuzzy
+msgid "column header"
+msgstr "kelómtittel"
+
+#: atk/atkobject.c:85
+#, fuzzy
+msgid "combo box"
+msgstr "käösfak"
+
+#: atk/atkobject.c:86
+#, fuzzy
+msgid "dateeditor"
+msgstr "datem bewirke"
+
+#: atk/atkobject.c:87
+#, fuzzy
+msgid "desktop icon"
+msgstr "beroblaadpiktogram"
+
+#: atk/atkobject.c:88
+#, fuzzy
+msgid "desktop frame"
+msgstr "beroblaad-frame"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "belle"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "dialoogvinster"
+
+#: atk/atkobject.c:91
+#, fuzzy
+msgid "directory pane"
+msgstr "mappepeniel"
+
+#: atk/atkobject.c:92
+#, fuzzy
+msgid "drawing area"
+msgstr "teikegebeed"
+
+#: atk/atkobject.c:93
+#, fuzzy
+msgid "file chooser"
+msgstr "besjtandjkezer"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "völler"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+#, fuzzy
+msgid "fontchooser"
+msgstr "booksjtaaftype-kezer"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "frame"
+
+#: atk/atkobject.c:98
+#, fuzzy
+msgid "glass pane"
+msgstr "glaaspeniel"
+
+#: atk/atkobject.c:99
+#, fuzzy
+msgid "html container"
+msgstr "html-container"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "piktogram"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "aafbiljing"
+
+#: atk/atkobject.c:102
+#, fuzzy
+msgid "internal frame"
+msgstr "intern frame"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:104
+#, fuzzy
+msgid "layered pane"
+msgstr "gelaog peniel"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "lies"
+
+#: atk/atkobject.c:106
+#, fuzzy
+msgid "list item"
+msgstr "lies-item"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:108
+#, fuzzy
+msgid "menu bar"
+msgstr "menu-balk"
+
+#: atk/atkobject.c:109
+#, fuzzy
+msgid "menu item"
+msgstr "menu-item"
+
+#: atk/atkobject.c:110
+#, fuzzy
+msgid "option pane"
+msgstr "opsies-peniel"
+
+#: atk/atkobject.c:111
+#, fuzzy
+msgid "page tab"
+msgstr "pagina-tabblaad"
+
+#: atk/atkobject.c:112
+#, fuzzy
+msgid "page tab list"
+msgstr "pagina-tabblaadlies"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "peniel"
+
+#: atk/atkobject.c:114
+#, fuzzy
+msgid "password text"
+msgstr "wachwaordteks"
+
+#: atk/atkobject.c:115
+#, fuzzy
+msgid "popup menu"
+msgstr "popup-menu"
+
+#: atk/atkobject.c:116
+#, fuzzy
+msgid "progress bar"
+msgstr "avvansbalk"
+
+#: atk/atkobject.c:117
+#, fuzzy
+msgid "push button"
+msgstr "drökknóp"
+
+#: atk/atkobject.c:118
+#, fuzzy
+msgid "radio button"
+msgstr "radioknóp"
+
+#: atk/atkobject.c:119
+#, fuzzy
+msgid "radio menu item"
+msgstr "radio-menu-item"
+
+#: atk/atkobject.c:120
+#, fuzzy
+msgid "root pane"
+msgstr "huidpeniel"
+
+#: atk/atkobject.c:121
+#, fuzzy
+msgid "row header"
+msgstr "riejtittel"
+
+#: atk/atkobject.c:122
+#, fuzzy
+msgid "scroll bar"
+msgstr "sjuufbalk"
+
+#: atk/atkobject.c:123
+#, fuzzy
+msgid "scroll pane"
+msgstr "sjuufpeniel"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "sjeijing"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "sjuver"
+
+#: atk/atkobject.c:126
+#, fuzzy
+msgid "split pane"
+msgstr "gedeild peniel"
+
+#: atk/atkobject.c:127
+#, fuzzy
+msgid "spin button"
+msgstr "ómhoeg/ómlieg-knóp"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "sjtatusbalk"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "tabel"
+
+#: atk/atkobject.c:130
+#, fuzzy
+msgid "table cell"
+msgstr "tabel-sel"
+
+#: atk/atkobject.c:131
+#, fuzzy
+msgid "table column header"
+msgstr "tabelkelómtittel"
+
+#: atk/atkobject.c:132
+#, fuzzy
+msgid "table row header"
+msgstr "tabelriejtittel"
+
+#: atk/atkobject.c:133
+#, fuzzy
+msgid "tear off menu item"
+msgstr "aafnaembaar menu-item"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "teks"
+
+#: atk/atkobject.c:136
+#, fuzzy
+msgid "toggle button"
+msgstr "sjakelknóp"
+
+#: atk/atkobject.c:137
+#, fuzzy
+msgid "tool bar"
+msgstr "wirkbalk"
+
+#: atk/atkobject.c:138
+#, fuzzy
+msgid "tool tip"
+msgstr "hulpballóng"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "boum"
+
+#: atk/atkobject.c:140
+#, fuzzy
+msgid "tree table"
+msgstr "boumtabel"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "ónbekènd"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "blikveldj"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "vinster"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "kop"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "voot"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "parregraaf"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "linejaal"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "program"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr ""
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "alarm"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "program"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "kop"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "aafbiljing"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "frame"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
index 776ad0c..e9fac6b 100644 (file)
--- a/po/lt.po
+++ b/po/lt.po
+# #-#-#-#-#  lt.po (at-spi2-core master)  #-#-#-#-#
 # Lithuanian translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
-# Aurimas Černius <aurisc4@gmail.com>, 2011, 2014.
+#
+# #-#-#-#-#  lt.po (atk HEAD)  #-#-#-#-#
+# Lithuanian translation of atk.
+# Copyright (C) 2003-2006 Free Software Foundation, Inc.
+# Tomas Kuliavas <tokul@users.sourceforge.net>, 2003-2004.
+# Žygimantas Beručka <zygis@gnome.org>, 2005-2006.
+# Aurimas Černius <aurisc4@gmail.com>, 2014-2022.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-21 15:45+0000\n"
-"PO-Revision-Date: 2014-02-21 22:05+0200\n"
+"Project-Id-Version: atk HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-22 23:15+0300\n"
 "Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
-"Language-Team: Lithuanian <gnome-lt@lists.akl.lt>\n"
+"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
 "Language: lt\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
-"%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Gtranslator 2.91.6\n"
+"#-#-#-#-#  lt.po (at-spi2-core master)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2)\n"
+"X-Generator: Gtranslator 40.0\n"
+"#-#-#-#-#  lt.po (atk HEAD)  #-#-#-#-#\n"
+"X-Generator: Gtranslator 2.91.7\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"(n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Pasirinkta nuoroda"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Nurodo ar AtkHyperlink objektas pasirinktas"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Prieraišų kiekis"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Su AtkHyperlink objektu susietų prieraišų kiekis"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Rodyklės pabaiga"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink objekto rodyklės pabaiga"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Rodyklės pradžia"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink objekto rodyklės pradžia"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "klaidingas"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "greita žymė"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "perspėjimas"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animacija"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "rodyklė"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalendorius"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "lapas"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "žymimasis langelis"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "žymimojo meniu punktas"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "spalvų parinkimas"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "stulpelio antraštė"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "laukas su sąrašu"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "datos redaktorius"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "darbastalio piktograma"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "darbastalio rėmelis"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "rinkiklis"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "dialogas"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "aplanko polangis"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "piešimo laukas"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "failų parinkiklis"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "užpildiklis"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "šriftų parinkimas"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "rėmelis"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "skaidrus polangis"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html konteineris"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "piktograma"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "paveikslėlis"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "vidinis rėmelis"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "žymė"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "sluoksniuotas polangis"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "sąrašas"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "sąrašo punktas"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "meniu"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "meniu juosta"
+
+#: atk/atkobject.c:133
+#| msgid "push button"
+msgid "menu button"
+msgstr "meniu mygtukas"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "meniu punktas"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "parametrų skydelis"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "lango kortelė"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lango kortelių sąrašas"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "skydelis"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "slaptažodžio tekstas"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "išsiskleidžiantis meniu"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "eigos juosta"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "paspaudžiamasis mygtukas"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "žymimoji akutė"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "žymimojo meniu punktas"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "pagrindinis skydelis"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "eilutės antraštė"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "slinkties juosta"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "slinkties polangis"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "skyriklis"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "šliaužiklis"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "perskyrimo skydelis"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "pasukimo mygtukas"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "būsenos juosta"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "lentelė"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "lentelės langelis"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "lentelės stulpelio antraštė"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "lentelės eilutės antraštė"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "atkabinamo meniu punktas"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminalas"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "tekstas"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "perjungimo mygtukas"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "įrankių juosta"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "paaiškinimas"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "medis"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "medžio lentelė"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "nežinomas"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "peržiūros-kampas"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "langas"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "antraštė"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "poraštė"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "pastraipa"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "liniuotė"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "programa"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "automatinis užbaigimas"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "redagavimo juosta"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "įterpiamas komponentas"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "įrašas"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagrama"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "pavadinimas"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "dokumento rėmelis"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "antraštė"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "puslapis"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "skyrius"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "nereikalingas objektas"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "forma"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "nuoroda"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "įvesties metodo langas"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "lentelės eilutė"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "medžio elementas"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "skaičiuoklės dokumentas"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "pateikties dokumentas"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "teksto dokumentas"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "žiniatinklio dokumentas"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "el. pašto dokumentas"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "komentaras"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "sąrašo laukas"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "grūpavimas"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "paveikslėlio pateiktis"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "pranešimas"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "informacinė juosta"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "lygiuotės juosta"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "pavadinimo juosta"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "bloko komentaras"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "gardas"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "vaizdas"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "apibrėžimas"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "straipsnis"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "gairė"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "žurnalas"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "žymėjimas"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematika"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "reitingas"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "laikmatis"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "aprašymų sąrašas"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "aprašymo terminas"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "aprašymo vertė"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Prieinamas vardas"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Objekto kopijos vardas suformatuotas pagalbinių technologijų apdorojimui"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Prieinamas aprašymas"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Objekto aprašymas suformuotas pagalbinių technologijų apdorojimui"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Prieinamas pirminis objektas"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Šiuo metu prieinamo elemento tėvas, kaip jį grąžina atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Prieinama reikšmė"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Naudojamas informuoti apie reikšmės pasikeitimus"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Prieinama paskirtis"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Prieinama šio objekto paskirtis"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Prieinamas sluoksnis"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Prieinamas šio objekto sluoksnis"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Prieinama MDI reikšmė"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Prieinama objekto MDI reikšmė"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Prieinama lentelės antraštė"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Naudojamas informuoti apie lentelės poantraštės pasikeitimus. Ši savybė "
+"neturėtų būti naudojama. Naudokite accessible-table-caption-object"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Prieinama lentelės stulpelio antraštė"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Naudojamas informuoti apie lentelės stulpelio antraštės pasikeitimus"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Prieinamas lentelės intarpo aprašymas"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Naudojamas informuoti apie lentelės stulpelio aprašymo pasikeitimus"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Prieinama lentelės eilutės antraštė"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Naudojamas informuoti apie lentelės eilutės antraštės pasikeitimus"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Prieinamas lentelės eilutės aprašymas"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Naudojamas informuoti apie lentelės eilutės aprašymo pasikeitimus"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Prieinama lentelės santrauka"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Naudojamas informuoti apie lentelės santraukos pasikeitimus"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Prieinamas lentelės antraštės objektas"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Naudojamas informuoti apie lentelės poantraštės pasikeitimus"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Prieinamų hiperteksto nuorodų skaičius"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Nuorodų kiekis esamame AtkHypertext objekte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "labai silpnas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "silpnas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "priimtinas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "stiprus"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "labai stiprus"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "labai žemas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "vidutinis"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "aukštas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "labai aukštas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "labai blogas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "blogas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "geras"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "labai geras"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "geriausias"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Programos nebėra"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "Bandyta atlikti sinchroninį kvietimą, kur tai draudžiama"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Bandyta atlikti sinchroninį kvietimą, kur tai draudžiama"
index 3a14aa4..9599b68 100644 (file)
--- a/po/lv.po
+++ b/po/lv.po
+# #-#-#-#-#  lv.po  #-#-#-#-#
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
+# #-#-#-#-#  lv.po (lv)  #-#-#-#-#
+# translation of lv.po to Latvian
+# atk for Latvian.
+# Copyright (C) 2002 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+#
+#
 # Rudolfs <rudolfs.mazurs@gmail.com>, 2011, 2014.
+# Artis Trops <hornet@navigator.lv>, 2002.
+# Raivis Dejus <orvils@gmail.com>, 2006, 2009.
+# Rūdofls Mazurs <rudolfs.mazurs@gmail.com>, 2011.
+# Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2012, 2014, 2021, 2022.
 msgid ""
 msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-03-07 13:52+0200\n"
+"Project-Id-Version: lv\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-09-03 16:06+0300\n"
 "Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n"
 "Language-Team: Latvian <lata-l10n@googlegroups.com>\n"
 "Language: lv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.5\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
-"2);\n"
+"#-#-#-#-#  lv.po  #-#-#-#-#\n"
+"X-Generator: Lokalize 21.12.3\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :"
+" 2);\n"
+"#-#-#-#-#  lv.po (lv)  #-#-#-#-#\n"
+"X-Generator: Lokalize 21.08.1\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :"
+" 2);\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Izvēlētā saite"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Norāda, vai ir izvēlēts AtkHyperlink objekts"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Enkuru skaits"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Enkuru skaits, kas tiek saistīts ar AtkHyperlink objektu"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Beigu indekss"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink objekta beigu indekss"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Sākuma indekss"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink objekta sākuma indekss"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "nederīgs"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "paātrinātāja etiķete"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "brīdinājums"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animācija"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "bulta"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalendārs"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "audekls"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "izvēles rūtiņa"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "izvēles izvēlnes elements"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "krāsas izvēlētājs"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "kolonnas galvene"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "kombinētais lodziņš"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "datuma redaktors"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "darbvirsmas ikona"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "darbvirsmas rāmis"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "ciparnīca"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "dialoglodziņš"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "direktoriju rūts"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "zīmēšanas laukums"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "datņu izvēlētājs"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "aizpldītājs"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "fontu izvēlētājs"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "rāmis"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "stikla rūts"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html konteiners"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikona"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "attēls"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "iekšējais rāmis"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiķete"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "slāņota rūts"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "saraksts"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "saraksta elements"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "izvēlne"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "izvēlnes josla"
+
+#: atk/atkobject.c:133
+#| msgid "push button"
+msgid "menu button"
+msgstr "izvēlnes poga"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "izvēlnes elements"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "opciju rūts"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "lapas cilne"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lapas ciļņu saraksts"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panelis"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "paroles teksts"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "uznirstošā izvēlne"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "progresa josla"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "spiedpoga"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "radio poga"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "radio izvēlnes priekšmets"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "saknes rūts"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "rindas galvene"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "ritjosla"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "rit rūts"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "atdalītājs"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "slīdnis"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "šķeltņ rūts"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "skaitītāja poga"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "statusjosla"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tabula"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "tabulas šūna"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "tabulas kolonas galvene"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "tabulas rindas galvene"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "pārceļamās izvēlnes elements"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminālis"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "teksts"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "pārslēgšanas poga"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "rīku josla"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "padoms"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "koks"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "koka tabula"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "nezināms"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "skatpunkts"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "logs"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "galvene"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "kājene"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "rindkopa"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "lineāls"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "lietotne"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "automātiskas pabeigšana"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "rediģēšanas josla"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "iegulta komponente"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "ieraksts"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "diagramma"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "virsraksts"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "dokumenta ietvars"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "virsraksts"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "lapa"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "sadaļa"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "rezerves objekts"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "forma"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "saite"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "ievades metodes logs"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "tabulas rinda"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "koka vienums"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "dokumenta izklājlapa"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "dokumenta prezentācija"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "dokumenta teksts"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "dokumenta tīmeklis"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "dokumenta e-pasts"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "komentārs"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "saraksta lauks"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "grupēšana"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "attēla karte"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "paziņojums"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "informācijas josla"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "līmeņa josla"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "virsraksta josla"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "bloka citāts"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definīcija"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "raksts"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "orientieris"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "žurnāls"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "slīdjosla"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matemātika"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "vērtējums"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "taimeris"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "aprakstu saraksts"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "apraksta terms"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "apraksta vērtība"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Pieejamais vārds"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Objekta instances nosaukums noformēts atbalsta tehnoloģiju pieejai"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Pieejamais apraksts"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Objekta apraksts, noformēts atbalsta tehnoloģiju pieejai"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Pieejamais vecāks"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Pašreizējā pieejamā vecāks, ko ir atgriezis atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Pieejamā vērtība"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Tiek izmantots, lai paziņotu, ka vērtība ir mainījusies"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Pieejamā loma"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Šī objekta pieejamā loma"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Pieejamais slānis"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Šī objekta pieejams slānis"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Pieejamā MDI vērtība"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Šī objekta Pieejamā MDI vērtība"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Pieejamais tabulas virsraksts"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Tiek izmantots, lai paziņotu, ka tabulas virsraksts ir mainījies. Šo īpašību "
+"nevajadzētu izmantot. Tā vietā vajadzētu izmantot accessible-table-caption-"
+"object"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Pieejamā tabulas kolonnas galvene "
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Tiek izmantota, lai paziņotu, ka tabulas kolonnas galvene ir mainījusies"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Pieejamais tabulas kolonnas apraksts"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Tiek izmantots, lai paziņotu, ka tabulas kolonnas apraksts ir mainījies"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Pieejamā tabulas rindas galvene"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Tiek izmantota, lai paziņotu, ka tabulas rinda ir mainījusies"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Pieejamais tabulas rindas apraksts"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Tiek izmantota, lai paziņotu, ka tabulas rindas apraksts ir mainījies"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Pieejamais tabulas kopsavilkums"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Tiek izmantots, lai paziņotu, ka tabulas kopsavilkums ir mainījies"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Pieejamais tabulas virsraksta objekts"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Tiek izmantots, lai paziņotu, ka tabulas virsraksts ir mainījies"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Pieejamo hiperteksta saišu skaits"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Saišu skaits, kurās ir AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "ļoti vājš"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "vājš"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "pieņemamas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "stiprs"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "ļoti stiprs"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "ļoti zems"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "vidējs"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "augsts"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "ļoti augsts"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "ļoti slikts"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "slikts"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "labs"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "ļoti labs"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "labākais"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Šī lietotne vairs neeksistē"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Tika aizliegti mēģinātie sinhronie izsaukumi"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Tika aizliegti mēģinātie sinhronie izsaukumi"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Nezināms paraksts %s priekš RemoveAccessible"
@@ -90,3 +886,6 @@ msgstr "Tika aizliegti mēģinātie sinhronie izsaukumi"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Saņēma nederīgu parakstu %s signālam %s no saskarnes %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Tiek izmantots, lai paziņotu, ka vecāks ir mainījies"
diff --git a/po/mai.po b/po/mai.po
new file mode 100644 (file)
index 0000000..5acb3c2
--- /dev/null
+++ b/po/mai.po
@@ -0,0 +1,530 @@
+# translation of atk.HEAD.po to Maithili
+# Copyright (C) 2006 The GNOME Foundation
+# This file is distributed under the same license as the PACKAGE package.
+# BOSS GNU/Linux <bosslinux@cdac.in>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: gedit.HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2008-01-25 13:49+0530\n"
+"Last-Translator: Sangeeta Kumari\n"
+"Language-Team:  <en@li.org>\n"
+"Language: mai\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "चयनित लिंक"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "उल्लेखित करैत अछि जे की एटीके-हायपरलिंक ऑब्जेक्ट चयनित अछि"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "एंकर्स क' संख्या"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "एटीके-हायपरलिंक ऑब्जेक्ट क' सँग सम्बद्ध एंकर्स क' संख्या"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "अंतिम सूची"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "एटीके-हायपरलिंक ऑब्जेक्टक अंतिम सूची"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "प्रारंभ सूची"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "एटीके-हायपरलिंक ऑब्जेक्ट क' प्रारंभ सूची"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "अवैध"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "त्वरक लेबल"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "सावधान"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "एनीमेशन"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "तीर"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "कैलेंडर"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "कैनवास"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "जाँच पेटी"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "चेक मेनू मद"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "रँग चयनक"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "कॉलम हेडर"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "कॉम्बो बक्सा"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "तिथि-सम्पादक"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "डेस्कटॉप चिह्न"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "डेस्कटॉप रूपरेखा"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "डॉयल"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "समाद"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "निर्देशिका फलक"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "आरेखण-क्षेत्र"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "फाइल-चयनक"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "भरैबला"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "फ़ॉन्ट-चयनक"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "रूपरेखा"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "काँच-फलक"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "एचटीएमएल-कन्टेनर"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "चिह्न"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "छवि"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "आन्तरिक रूपरेखा"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "लेबल"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "स्तरित फलक"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "सूची"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "सूची मद"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "मेनू"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "मेनू पट्टी"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "मेनू मद"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "विकल्प फलक"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "पृष्ठ टैब"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "पृष्ठ टैब सूची"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "पटल"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "पासवर्ड पाठ"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "पॉपअप मेनू "
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "प्रगति पट्टी"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "पुश बटन"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "रेडियो बटन"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "रेडियो मेनू मद"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "रूट फलक"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "पंक्ति हेडर"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "स्क्रॉल पट्टी"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "स्क्रॉल फलक"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "विभाजक"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "स्लाइडर"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "कटल फलक"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "स्पिन बटन"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "स्थिति-पट्टी"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "तालिका"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "तालिका सेल"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "तालिका कॉलम हेडर"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "तालिका पंक्ति हेडर"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "टीयर ऑफ मेनू मद"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "टर्मिनल"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "पाठ"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "टॉगल बटन"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "उपकरण पट्टी"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "उपकरण युक्ति"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "ट्री"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "ट्री-तालिका"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "अज्ञात"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "व्यूपोर्ट"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "विंडो"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "हेडर"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "फुटर"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "पैराग्राफ"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "सावधान"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "अनुप्रयोग"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "स्वतः-पूर्ण"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "संपादन पट्टी"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "एंबेडेड घटक"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "प्रविष्टि"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "चार्ट"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "कैप्शन"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "दस्तावेज ढाँचा"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "शीर्षक"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "पृष्ठ"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "खंड"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "वैकल्पिक वस्तु"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "प्रपत्र"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "पँहुचयोग्य नाम"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "असिस्टिव तकनॉलाज़ी पहुँच लेल फॉर्मेटेड ऑब्जेक्ट इंस्टैन्स क' नाम"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "पहुँच योग्य वर्णन"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "असिस्टिव तकनॉलाज़ी पहुँच लेल फॉर्मेटेड ऑब्जेक्ट क' वर्णन"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "पहुँच योग्य पैरेंट"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "पैरेंट बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "पहुँच योग्य मूल्य"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "मूल्य बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "पहुँच योग्य भूमिका"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "एहि वस्तु क' पहुँच योग्य भूमिका"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "पहुँच योग्य परत"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "ई वस्तु क' पहुँच योग्य परत"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "पहुँच योग्य एमडीआइ मूल्य"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "ई ऑब्जेक्ट क' पहुँच योग्य एमडीआई मूल्य"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "पहुँच योग्य तालिका शीर्षक"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"तालिका शीर्षक बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि. ई गुण उपयोग मे नहि "
+"लेनाइचाही. बदलामे पहुँच योग्य-तालिका-शीर्षक-ऑब्जेक्ट उपयोगमे लेनाइ चाही"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "पहुँच योग्य तालिका कॉलम हेडर"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "तालिका कॉलम हेडर बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "पहुँच योग्य तालिका कॉलम वर्णन"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "पहुँच योग्य तालिका कॉलम वर्णन बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "पहुँच योग्य तालिका पंक्ति हेडर"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "तालिका पंक्ति हेडर बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "पहुँच योग्य तालिका पंक्ति वर्णन"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "पहुँच योग्य तालिका पंक्ति वर्णन बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "पहुँच योग्य तालिका सारांश"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "तालिका कॉलम सारांश बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "पहुँच योग्य तालिका शीर्षक ऑब्जेक्ट"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "तालिका शीर्षक बदएल चुकल अछि ई बताबै लेल उपयोगमे आबैत अछि"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "पहुँच योग्य हायपरटेक्स्ट लिंक्स क' संख्या"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "लिंक क' सँख्या जे वर्तमान एटीके-हायपरटेक्स्टमे अछि"
diff --git a/po/mk.po b/po/mk.po
new file mode 100644 (file)
index 0000000..ab4f726
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,537 @@
+# translation of mk.po to Macedonian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Ime, 2002.
+# Maratonec 3 <maraton@unknown3>, 2002.
+# Arangel Angov <ufo@linux.net.mk>, 2004, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: mk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2006-08-02 08:33+0200\n"
+"Last-Translator: Arangel Angov <ufo@linux.net.mk>\n"
+"Language-Team: Macedonian <ossm-members@hedona.on.net.mk>\n"
+"Language: mk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Избрана врска"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Одредува дали е избран објектот AtkHyperlink"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Број на сидра"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Бројот на сидра поврзани со објектот AtkHyperlink"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Завршен индекс"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Завршниот индекс на објектот AtkHyperlink"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Почетен индекс"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Почетниот индекс на објектот AtkHyperlink"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "невалидно"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ознака за забрзувачот"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "известувач"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "анимација"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "стрелка"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "календар"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "платна"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "кутивче за штиклирање"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "штиклирај предмет од менито"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "одбирач на бои"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "заглавје на колона"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "комбо кутивче"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "уредувач на датум"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "икона на работна површина"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "рамка на работна површина"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "бирај"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "дијалог"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "простор за директориум"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "површина за цртање"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "одбирач на датотеки"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "пополнувач"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "одбирач на фонтови"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "рамка"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "простор за стакло"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html содржател"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "икона"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "слика"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "интерна рамка"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "ознака"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "простор со слоеви"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "листа"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "предмет од листата"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "мени"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "лента со мени"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "предмет од мени"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "простор за опција"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "таб на страница"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "листа на табот на страницата"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "панел"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "текст за лозинка"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "скокачко мени"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "лента за прогрес"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "притисни копче"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "копче за радио"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "предмет за радио од менито"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "простор за root"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "заглавје на ред"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "лента за лизгање"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "простор за лизгање"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "одвојувач"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "лизгач"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "поделен простор"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "копче за вртење"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "статусна лента"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "табела"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "ќелија во табела"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "заглавје на колоната во табелата"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "заглавје на редот во табелата"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "предмет за одвојување од менито"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "терминал"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "текст"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "промени копче"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "лента со алатки"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "трикови"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "дрво"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "дрво на табела"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "непознато"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "покажи порта"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "прозорец"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "заглавје"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "подножје"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "параграф"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "известувач"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "апликација"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "автоматско завршување"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "лента за уредување"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "вградена компонента"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "запис"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "мапа"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "воведен дел"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "рамка на документот"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "големини на букви"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "страница"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "оддел"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "дуплиран објект"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "форма"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Пристапно име"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Името на објектот форматирано за да се овозможи пристапот до помошните "
+"технологии"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Пристапен опис"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Опис на објекотот, форматиран за пристап до помошните технологии"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Пристапен процес"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Се користи за известување дека процесот е променет"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Пристапна вредност"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Се користи за известување дека вредноста е променета"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Пристапна улога"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Пристапната улога на овој објект"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Пристапен слој"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Пристапниот слој на овој објект"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Пристапна вредност за MDI"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Пристапната вредност на MDI за овој објект"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Пристапен наслов за табелата"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Се користи за известување кога насловот на табелата е променет; ова својство "
+"не треба да се користи. Наместо него треба да се користи accessible-table-"
+"caption-object"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Пристапно заглавје за колоната во табелата"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Се користи за известување кога заглавјето на колоната во табелата е променето"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Пристапен опис за колоната во табелата"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Се користи за известување кога описот на колоната во табелата е променет"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Пристапно заглавје за редот во табелата"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Се користи за известување кога е променето заглавјето на редот во табелата"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Пристапен опис за редот во табелата"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Се користи за известување кога е променет описот на редот во табелата"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Пристапна кратка содржина за табелата"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+"Се користи за известување кога кратката содржина на табелата е променета"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Пристапен објект за наслов на табелата"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Се користи за известување кога насловот на табелата е променет"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Број на пристапни хајпертекст врски"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Бројот на врски кои што во моментов ги има AtkHypertext"
index e3212d0..4dbf644 100644 (file)
--- a/po/ml.po
+++ b/po/ml.po
@@ -1,10 +1,20 @@
+# #-#-#-#-#  ml.po (at-spi2-core master)  #-#-#-#-#
 # Malayalam translation for at-spi2-core.
 # Copyright (C) 2012 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Anish A <aneesh.nl@gmail.com>, 2012.
 # Anish Sheela <aneesh.nl@gmail.com>, 2017.
+# #-#-#-#-#  ml.po (atk.HEAD.ml)  #-#-#-#-#
+# translation of atk.HEAD.ml.po to
+# This file is distributed under the same license as the atk.HEAD package.
+# Copyright (C) 2003, 2006, 2009, 2012 atk'S COPYRIGHT HOLDER.
+# FSF-India <locale@gnu.org.in>, 2003.
+# Ani Peter <peter.ani@gmail.com>, 2006, 2009.
+# Anish A <aneesh.nl@gmail.com>, 2012.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ml.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=at-spi2-core\n"
@@ -19,6 +29,20 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Virtaal 0.7.1\n"
 "X-Project-Style: gnome\n"
+"#-#-#-#-#  ml.po (atk.HEAD.ml)  #-#-#-#-#\n"
+"Project-Id-Version: atk.HEAD.ml\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-03-13 12:43+0530\n"
+"PO-Revision-Date: 2012-03-12 23:10+0530\n"
+"Last-Translator: Anish A <aneesh.nl@gmail.com>\n"
+"Language-Team: Swatantra Malayalam Computing <discuss@lists.smc.org.in>\n"
+"Language: ml\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.0\n"
+"X-Project-Style: gnome\n"
 
 #: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
 msgid "The application no longer exists"
@@ -27,3 +51,564 @@ msgstr "ഈ പ്രയോഗം ഇപ്പോള്‍ നിലവിലി
 #: atspi/atspi-misc.c:1843
 msgid "Attempted synchronous call where prohibited"
 msgstr "ചെയ്യാന്‍ നോക്കിയ സിങ്ക്റണസ് കോളുകള്‍ തടയപ്പെട്ടു"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "തെരഞ്ഞെടുക്കപ്പെട്ട കണ്ണി"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink ഒബ്ജക്റ്റ് തെരഞ്ഞെടുത്തുവോ എന്നു് നമുക്കു് വ്യക്തമാക്കി തരുന്നു"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "ആങ്കറുകളുടെ എണ്ണം"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink ഒബ്ജക്റ്റുമായി ബന്ധമുളള ആങ്കറുകളുടെ എണ്ണം"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "സൂചികയുടെ അവസാനം"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink ഒബ്ജക്റ്റിനുള്ള സൂചികയുടെ അവസാനം"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "സൂചികയുടെ തുടക്കം"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink ഒബ്ജക്റ്റിനുള്ള സൂചികയുടെ തുടക്കം"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "അസാധു"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "അക്സലറേറ്റര്‍ ലേബല്‍"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "മുന്നറിയിപ്പു്"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "ചലനചിത്രം"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "സൂചകം"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "കലണ്ടര്‍"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "ക്യാന്വാസ്"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "ചെക്ക് ബോക്സ്"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "മെന്യു പരിശോധിക്കുക"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "നിറം തെരഞ്ഞെടുക്കുന്ന സഹായി"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "നിര തലക്കെ‌ട്ട്"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "കോംബോ ബോക്സ്"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "തീയതി തിരുത്തല്‍ സംവിധാനം"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "പണിയിടത്ത് കാണപ്പെടുന്ന ചിഹ്നം"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "പണിയിട ചട്ടക്കൂട് "
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "ഡയല്‍"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "സംവാദം "
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ഡയറക്ടറി പെയിന്‍"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "വരയ്ക്കുവാനുളള സ്ഥലം"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ഫയല്‍ തെരെ‌ഞ്ഞെടുപ്പ്"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "ഫില്ലര്‍"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "fontchooser"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ചട്ടക്കൂട് "
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "ഗ്ലാസ് പാളി"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html കണ്ടയിനര്‍"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ചിഹ്നം"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "ചിത്രം"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ഇന്റേണല്‍ ഫ്രെയിം"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "ലേബല്‍"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "നിരവധി തലങ്ങളുള്ള പാളി "
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "നാമാവലി"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "വസ്തുക്കള്‍ ചിട്ടയില്‍ നിരത്തുക"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "പട്ടിക "
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "മെന്യു ബാര്‍"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "മെന്യു ഐറ്റം"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "ഓപ്ഷന്‍ പെയിന്‍"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "താളിനുള്ള റ്റാബ്"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "അനുബന്ധങ്ങളുടെ പട്ടിക "
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "പാളി "
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "അടയാളവാക്യം "
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "പോപ് അപ്പ് പട്ടിക "
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "പ്രോഗ്രസ്സ് ബാര്‍"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "പുഷ് ബട്ടണ്‍"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "റേ‌ഡിയോ ബട്ടണ്‍"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "റേഡിയോ മെന്യു ഐറ്റം"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "അടിസ്ഥാന പാളി "
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "എല്ലാ തലവാചകങ്ങളും കാണിക്കുക "
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "സ്ക്ക്രോള്‍ ബാര്‍"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "നിരക്കിനീക്കാവുന്ന പാളി"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "സെപ്പറേറ്റര്‍"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "സ്ലൈഡര്‍"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "രണ്ടായി തിരിച്ച പാളി"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "സ്പിന്‍ ബട്ടണ്‍"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "സ്റ്റേറ്റസ് ബാര്‍"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "ടേബിള്‍"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "ടേബിള്‍ സെല്ല്"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "ടേബിള്‍ നിരയ്ക്കുള്ള തലകെട്ട്"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "ടേബിള്‍ വരിയ്ക്കുള്ള തലകെട്ട്"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "മെനു ഇനം മാറ്റുക"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "ടെര്‍മിനല്‍"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "വാക്യം"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ടൊഗ്ഗിള്‍ ബട്ടണ്‍"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "പണി ആയുധപ്പെട്ടി"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "സൂചന"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ട്രീ"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ട്രീ ടേബിള്‍"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "അപരിചിതം"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "ദര്‍ശന മണ്ഡലം"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "ജാലകം"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "ഹെഡ്ഡര്‍"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "അടിക്കുറിപ്പു്"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "ഖണ്ഡിക"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "റൂളര്‍"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "പ്രയോഗം"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "സ്വയമായി പൂര്‍ത്തിയാക്കുക"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "മാറ്റം വരുത്തുന്നതിനുള്ള പട്ടിക"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "എംബഡട് ഘടകം"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "എന്‍ട്രി"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "ചാര്‍ട്ട്"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "തലക്കെട്ട്"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "ഡോക്യുമെന്‍റ് "
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "തലകെട്ട്"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "താള്‍"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "വിഭാഗം"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "redundant object"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ഫോറം"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "കണ്ണി"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ഇന്‍പുട്ട് മെഥേഡിനുള്ള ജാലകം"
+
+#: ../atk/atkobject.c:163
+msgid "table row"
+msgstr "പട്ടിക നിര"
+
+#: ../atk/atkobject.c:164
+msgid "tree item"
+msgstr "ട്രീ ഇനം"
+
+#: ../atk/atkobject.c:165
+msgid "document spreadsheet"
+msgstr "ഡോക്യുമെന്‍റ് സ്പ്രെഡ്ഷീറ്റ്"
+
+#: ../atk/atkobject.c:166
+msgid "document presentation"
+msgstr "ഡോക്യുമെന്‍റ് അവതരണം"
+
+#: ../atk/atkobject.c:167
+msgid "document text"
+msgstr "ഡോക്യുമെന്‍റ് ടെക്സ്റ്റ് "
+
+#: ../atk/atkobject.c:168
+msgid "document web"
+msgstr "ഡോക്യുമെന്‍റ് വെബ്ബ്"
+
+#: ../atk/atkobject.c:169
+msgid "document email"
+msgstr "ഡോക്യുമെന്‍റ് ഇമെയില്‍"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "അഭിപ്രായം"
+
+#: ../atk/atkobject.c:171
+msgid "list box"
+msgstr "നാമാവലി"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "ഒരുമിപ്പിക്കു"
+
+#: ../atk/atkobject.c:173
+msgid "image map"
+msgstr "ചിത്രത്തിന്റെ രൂപരേഖ"
+
+#: ../atk/atkobject.c:174
+msgid "notification"
+msgstr "അറിയിപ്പു്"
+
+#: ../atk/atkobject.c:175
+msgid "info bar"
+msgstr "അറിയിപ്പ് ബാര്‍"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "Accessible Name"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Object instance’s name formatted for assistive technology access"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "Accessible Description"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Description of an object, formatted for assistive technology access"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "Accessible Parent"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "പേരന്റ് മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "Accessible Value"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "മൂല്ല്യം മാറിയിട്ടുണ്ട് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "Accessible Role"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "ഈ ഒബ്ജക്റ്റിന്റെ ആക്സസ്സിബിളായ റോള്‍"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "Accessible Layer"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "ഈ ഒബ്ജക്റ്റിന്‍റെ ആക്സസ്സിബിളായ ലെയര്‍"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "Accessible MDI Value"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "ഈ ഒബ്ജക്റ്റിന്റെ ആക്സസ്സിബിളായ MDI മൂല്ല്യം"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "Accessible Table Caption"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ടേബിളിന്റെ തലക്കെട്ട് മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു; എന്നാല്‍ ഇതിനു്പകരമായി "
+"accessible-table-caption-object ഉപയോഗിക്കേണ്ടതാണു്."
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "Accessible Table Column Header"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "ടേബിളിന്റെ നിരയുടെ തലക്കെട്ട് മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "Accessible Table Column Description"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "ടേബിളിന്റെ വരി വിവരണം മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "Accessible Table Row Header"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "ടേബിളിന്റെ വരി തലക്കെട്ട് മാറിയിട്ടുണ്ടു് എന്ന് അറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "Accessible Table Row Description"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "ടേബിളിന്റെ വരി വിവരണം മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "Accessible Table Summary"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "ടേബിളിന്റെ സമ്മറി മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "Accessible Table Caption Object"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "ടേബിളിന്റെ തലക്കെട്ട് മാറിയിട്ടുണ്ടു് എന്നറിയിക്കുന്നതിനായി ഉപയോഗിക്കുന്നു"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "ആക്സസ്സിബിളായ ഹൈപ്പര്‍ ടെക്സ്റ്റ് കണ്ണികളുടെ എണ്ണം"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ഇപ്പോള്‍ നിലവിലുളള AtkHypertext നുളള കണ്ണികളുടെ എണ്ണം"
diff --git a/po/mn.po b/po/mn.po
new file mode 100644 (file)
index 0000000..ab76e1b
--- /dev/null
+++ b/po/mn.po
@@ -0,0 +1,530 @@
+# translation of mn.po to Mongolian
+# This file is distributed under the same license as the atk.HEAD package.
+# Copyright (C) 2004
+#
+#
+# Sanlig Badral <badral@openmn.org>, 2003, 2004, 2008.
+# Sanlig Badral <badral@users.sourceforge.net>, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: mn\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2010-03-22 16:46+0200\n"
+"Last-Translator: Badral <badral@openmn.org>\n"
+"Language-Team: Mongolian <openmn-translation@lists.sf.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.3\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Сонгогдсон холбоос"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink объект сонгогдох эсэхийг өгнө үү"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Гадасны тоо"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink объекттой холбогдсон гадасны тоо"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Төгсгөл индекс"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink объектын төгсгөл индекс"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Эхлэл индекс"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink объектын эхлэл индекс"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "хүчингүй"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "товч-бичээс"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "Сонордуулга"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "Хөдөлгөөн"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "Сум"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "Цаглабар"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "зураг(canvas)"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "хэрээст талбар"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "хэрээст цэсний элемент"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "Өнгө сонгогч"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "баганын толгой"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "Унадаг талбар"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "Огноо-засварлагч"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "Ажлын тавцангийн эмблем"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "Ажлын тавцангийн хүрээ"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "залгах"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "диалоги"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "Лавлахын самбар"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "Зурах талбар"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "Файл сонгогч"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "Дүүргэгч"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "Бичиг сонгогч"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "хүрээ"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "шилэн самбар"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "HTML-агуулах"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "эмблем"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "Зураг"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "дотоод хүрээ"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "бичээс"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "үечилсэн самбар"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "жагсаалт"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "жагсаалт элемент"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "цэс"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "цэс самбар"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "цэсний элемент"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "сонголт самбар"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "хуудас-гогцоо"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "хуудас-гогцоо-жагсаалт"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "Удирдах самбар"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "нууц үг-текст"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "Тагтан цэс (Popup)"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "прогресс самбар"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "товгор-товч"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "радио товч"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "радио-цэс-элемент"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "үндэс-самбар"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "мөрийн толгой"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "гүйлгэгч"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "гүйлгэгч самбар"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "тусгаарлагч"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "гулсуур"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "хуваагдсан-самбарууд"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "spin-товч"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "Төлөвийн самбар"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "хүснэгт"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "хүснэгт-нүд"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "хүснэгтийн баганын толгой"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "хүснэгтийн мөрийн толгой"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "тасархай-цэс элемент"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "терминал"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "текст"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "эргэх товч"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "багаж самбар"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "зөвлөмж"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "Мод"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "мод-хүснэгт"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "тодорхойгүй"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "харах талбар"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "Цонх"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "толгой"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "хөл"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "Догол мөр"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "шугам"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "х.программ"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "Автомат-хөрвүүлэлт"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "Засвар цэс"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "Холбоотой бүрэлдэхүүн"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "бичлэг"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "диаграмм"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "гарчиг"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "баримтын блок"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "гарчиг"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "хуудас"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "хэсэг"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "илүүдэл объект"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "маягт"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr "Холбоос"
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr "Оруулах боломжтой цонх"
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Чөлөөт нэр"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Туслагч-технологийн хандалтаар хэлбэржсэн объект инстантын нэр"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Чөлөөт тодорхойлолт"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Туслагч-технологиор хэлбэржсэн объектын тодорхойлолт"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Чөлөөт эцэг элемент"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Эцэг элементийн утга өөрчлөлтийн сонордуулга хэрэглэгдэх үү"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Чөлөөт утга"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Утга өөрчлөлтийн сонордуулга хэрэглэгдэх үү"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Чөлөөт дүр"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Энэ объектийн чөлөөт дүр"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Чөлөөт давхарга"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Энэ объектын чөлөөт үе"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Чөлөөт MDI утга"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Энэ объектын чөлөөт MDI утга"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Чөлөөт хүснэгтийн гарчиг"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Хүснэгтийн гарчиг өөрчлөлтийн сонордуулга хэрэглэгдэх үү; энэ шинж чанарын "
+"оронд accessible-table-caption-object хэрэглэгдэх ёстой."
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Чөлөөт хүснэгтийн баганын толгой"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Баганын толгой өөрчлөгдөхөд сонордуулга хэрэглэх үү"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Чөлөөт хүснэгтийн баганын гарчиг"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Хүснэгтийн баганын гарчиг өөрчлөгдөхөд сонордуулга хэрэглэх үү"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Чөлөөт хүснэгтийн мөрийн толгой"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Хүснэгтийн мөрийн толгой өөрчлөгдөхөд сонордуулга хэрэглэх үү"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Чөлөөт хүснэгтийн мөрийн гарчиг"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Хүснэгтийн мөрийн гарчиг өөрчлөгдөхөд сонордуулга хэрэглэх үү"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Чөлөөт хүснэгтийн товчлол"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Хүснэгтийн товчлол өөрчлөгдөхөд сонордуулга хэрэглэх үү"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Чөлөөт хүснэгт тодорхойлох объект"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Хүснэгтийн тодорхойлолт өөрчлөгдөхөд сонордуулга хэрэглэх үү"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Хандах боломжтой гипертекст холбоосын тоо"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Идэвхитэй AtkHypertext·дэх холбоосуудын тоо"
index 3dc7f23..375ee39 100644 (file)
--- a/po/mr.po
+++ b/po/mr.po
@@ -1,13 +1,25 @@
+# #-#-#-#-#  mr.po (mr)  #-#-#-#-#
 # translation of mr.po to Marathi
 # Marathi translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Sandeep Shedmake <sshedmak@redhat.com>, 2011.
+# #-#-#-#-#  mr.po (atk.HEAD.mr)  #-#-#-#-#
+# translation of atk.HEAD.mr.po to marathi
+# Copyright (C) 2004  Jitendra Shah.
+# This file is distributed under the same license as the ATK package.
+#
+# FIRST AUTHOR Pradeep Deshpande.<npdeshpande@vsnl.com>, 2004.
+# sandeep shedmake <sandeep.shedmake@gmail.com>, 2008.
+# Sandeep Shedmake <sandeep.shedmake@gmail.com>, 2008, 2009.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  mr.po (mr)  #-#-#-#-#\n"
 "Project-Id-Version: mr\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-spi&keywords=I18N+L10N&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&keywords=I18N+L10N&component=general\n"
 "POT-Creation-Date: 2011-03-23 10:25+0000\n"
 "PO-Revision-Date: 2011-03-23 16:16+0530\n"
 "Last-Translator: Sandeep Shedmake <sshedmak@redhat.com>\n"
@@ -18,6 +30,19 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"#-#-#-#-#  mr.po (atk.HEAD.mr)  #-#-#-#-#\n"
+"Project-Id-Version: atk.HEAD.mr\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2009-03-09 10:36+0530\n"
+"Last-Translator: Sandeep Shedmake <sandeep.shedmake@gmail.com>\n"
+"Language-Team: marathi\n"
+"Language: mr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -39,14 +64,18 @@ msgstr "AT-SPI: GetItems मध्ये त्रुटी आढळली, sen
 msgid ""
 "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
 "signature %s"
-msgstr "AT-SPI: अपरिचीत स्वाक्षरी %s सह _atspi_dbus_return_accessible_from_message कॉल केले"
+msgstr ""
+"AT-SPI: अपरिचीत स्वाक्षरी %s सह _atspi_dbus_return_accessible_from_message कॉल "
+"केले"
 
 #: ../atspi/atspi-misc.c:616
 #, c-format
 msgid ""
 "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
 "signature %s"
-msgstr "AT-SPI: अपरिचीत स्वाक्षरी %s सह _atspi_dbus_return_hyperlink_from_message कॉल केले"
+msgstr ""
+"AT-SPI: अपरिचीत स्वाक्षरी %s सह _atspi_dbus_return_hyperlink_from_message कॉल "
+"केले"
 
 #: ../atspi/atspi-misc.c:641
 #, c-format
@@ -61,7 +90,8 @@ msgstr "ॲप्लिकेशन यापुढे अस्तित्व
 #: ../atspi/atspi-misc.c:1062
 #, c-format
 msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-msgstr "AT-SPI: संवाद %2$s पासून %1$s प्राप्त करतेवेळी वेरिएंट अपकेक्षीत; %3$s प्राप्त झाले\n"
+msgstr ""
+"AT-SPI: संवाद %2$s पासून %1$s प्राप्त करतेवेळी वेरिएंट अपकेक्षीत; %3$s प्राप्त झाले\n"
 
 #: ../atspi/atspi-misc.c:1068
 #, c-format
@@ -83,7 +113,8 @@ msgid "Streamable content not implemented"
 msgstr "स्ट्रिमजोगी अंतर्भूत माहिती लागू केले नाही"
 
 #: ../atspi/atspi-event-listener.c:510
-msgid "called atspi_event_listener_register_from_callback with a NULL event_type"
+msgid ""
+"called atspi_event_listener_register_from_callback with a NULL event_type"
 msgstr "NULL event_type सह atspi_event_listener_register_from_callback कॉल केले"
 
 #: ../atspi/atspi-event-listener.c:777
@@ -91,3 +122,511 @@ msgstr "NULL event_type सह atspi_event_listener_register_from_callback क
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "संवाद %3$s पासून संकेत %2$s करीता अवैध स्वाक्षरी %1$s प्राप्त झाले\n"
 
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "निवडलेली साखळी"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink घटक निवडला आहे का नाही ते सांगते"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "नांगरांची/आधारस्तंभांची संख्या"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink घटकाशी संबधीत आधारस्तंभ"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "अनुक्रमा समाप्त करा"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink घटक अनुक्रम अनुक्रम शेवट"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "अनुक्रम आरंभ करा"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink घटकचा अनुक्रम आरंभ"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "अमान्य"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "प्रवेगक लेबल"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "सावधान"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "चित्रचेतनीरण"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "बाण"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "दिनदर्शिका"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "पडदा"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "चिन्ह चौकोन"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "चिन्हांकन चौकटीचा मेनू"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "रंग निवडकर्ता"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "स्तंभ शिर्षक"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "कॉम्बो चौकोन"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "दिनांक संपादक"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "डेस्कटॉप वरील चिन्ह"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "डेस्कटॉपची पटल"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "डायल"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "संवाद"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "संचयीका पटल"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "चित्रण क्षेत्र"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "फाइल निवडकर्ता"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "भरणी"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "फॉन्टनिवडकर्ता"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "पटल"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "काचेचे तावदान"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html समाविष्टीका"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "चिन्ह"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "प्रतिमा"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "आंतरीक पटल"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "लेबल"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "बहुपदरी पटल"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "यादी"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "यादीमधील घटक"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "मेन्यु"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "मेन्यु यादी"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "मेन्यु घटक"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "पर्याय पटल"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "पानावरील टॅब"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "पानावरील टॅबची यादी"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "पटल"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "गुप्तशब्द पाठ्य"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "पॉपअप मेन्यु"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "प्रगती निदर्शक पट्टी"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "पुश बटण"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "रेडिओ बटण"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "रेडिओ मेन्यु घटक"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "मूळ पटल"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "ओळ शिर्षक"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "सरकपट्टी"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "सरकपट्टी पटल"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "विभाजनकर्ता"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "सरकपट्टी"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "विभाजित पटल"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "स्पीन बटण"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "स्थितीपट्टी"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "तक्ता"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "तक्त्यामधील भाग"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "तक्त्यामधील स्तंभ शिर्षक"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "तक्त्यामधील ओळीचे शिर्षक"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "अलग करण्याजोगा मेन्यु घटक"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "टर्मिनल"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "पाठ्य"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "टॉगल बटण"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "साधन पट्टी"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "साधन नोक"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "वृक्ष"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "वृक्ष तक्ता"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "अपरिचीत"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "पोर्टदृश्य"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "चौकट"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "शिर्षकलेख"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "तळलेख"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "परिच्छेद"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "पट्टी"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "अनुप्रयोग"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "स्वयंपूर्तता"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "संपादन पट्टी"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "अंतर्भूत घटक"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "नोंद"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "आलेख"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "विधान"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "दस्तऐवज पटल"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "शिर्षक"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "पान"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "विभाग"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "अगाऊ घटक"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "फॉर्म"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr "दुवा"
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr "इन्पुट पद्धतत खिडकी"
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "प्राप्य नाव"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "सहाय्यक तंत्रज्ञानाच्या उपलब्धतेसाठी घटकाचे आरेखित नाव"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "प्राप्य वर्णन"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "सहाय्यक तंत्रज्ञानाच्या प्राप्तीकरीता बनविलेल्या कृतीचे वर्णन"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "प्राप्य मुळ"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "मुळ बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "प्राप्य मूल्य"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "मुल्य बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "प्राप्य भूमिका"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "या घटकाची प्राप्य भूमिका"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "प्राप्य स्थर"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "या घटकाचे प्राप्य स्थर"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "प्राप्य MDI मूल्य"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "या घटक करीता प्राप्य MDI मूल्य"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "प्राप्य तक्ता विधान"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"तक्ता विधान बदलले अशी सूचना देण्याकरीता वापरले जाते; या गुणधर्माचा वापर करू नये. "
+"त्याऐवजी प्राप्य-तक्ता-विधान-घटक चा वापर करावा"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "प्राप्य तक्ता स्तंभ शिर्षिका"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "तक्ता स्तंभ शिर्षक बदलविले गेले अशी सूचना सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "प्राप्य तक्ता स्तंभ वर्णन"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "तक्ता स्तंभ वर्णन बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "प्राप्य तक्ता ओळी शिर्षकाचे वर्णन"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "तक्ता ओळी शीर्षक बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "प्राप्य तक्ता ओळी वर्णन"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "तक्ता ओळी वर्णन बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "प्राप्य तक्ता सारांश"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "तक्ता सारांश बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "प्राप्य तक्ता विधान घटक"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "तक्ता विधान बदलविले गेले अशी सूचना देण्याकरीता वापरले जाते"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "प्राप्य हायपरटेक्स्ट लिंकची एकूण संख्या"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "सद्याच्या AtkHypertext वरील एकूण लिंकची संख्या"
index 2cbc1c6..c0bf129 100644 (file)
--- a/po/ms.po
+++ b/po/ms.po
@@ -1,10 +1,18 @@
+# #-#-#-#-#  ms.po (at-spi2-core master)  #-#-#-#-#
 # Malay translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Ahmed Noor Kader Mustajir Md Eusoff <sir.ade@gmail.com>, 2011.
 #
+# #-#-#-#-#  ms.po (atk HEAD)  #-#-#-#-#
+# ATK
+# Jika takut risiko, Jangan bicara tentang Perjuangan
+# Hasbullah Bin Pit (sebol) <sebol@ikhlas.com>, 2002-2003
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ms.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +25,19 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.5.4\n"
+"#-#-#-#-#  ms.po (atk HEAD)  #-#-#-#-#\n"
+"Project-Id-Version: atk HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/atk/issues\n"
+"POT-Creation-Date: 2020-01-23 15:49+0000\n"
+"PO-Revision-Date: 2020-01-27 03:27+0800\n"
+"Last-Translator: abuyop <abuyop@gmail.com>\n"
+"Language-Team: Pasukan Terjemahan GNOME Malaysia\n"
+"Language: ms\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Poedit 2.0.6\n"
 
 #: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1037
 #: ../atspi/atspi-value.c:111
@@ -26,3 +47,791 @@ msgstr "Aplikasi telah tiada"
 #: ../atspi/atspi-misc.c:1795
 msgid "Attempted synchronous call where prohibited"
 msgstr "Panggilan segerak yang dicuba adalah terlarang"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Pautan Terpilih"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Nyatakan sama ada objek AtkHyperlink terpilih"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Bilangan Penambat"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Bilangan penambat yang dikaitkan dengan objek AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Penghujung indeks"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Penghujung indeks bagi objek AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Permulaan indeks"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Permulaan indeks bagi objek AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "tidak sah"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "label pemecut"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "awas"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animasi"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "anak panah"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalendar"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "kanvas"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "kotak semak"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "item menu semak"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "pemilih warna"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "pengepala lajur"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "kotak kombo"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "penyunting tarikh"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "ikon atas meja"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "bingkai atas meja"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "dail"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "dialog"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "anak tetingkap direktori"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "kawasan lukisan"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "pemilih fail"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "pengisi"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "pemilih fon"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "bingkai"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "anak tetingkap kaca"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "bekas html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikon"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "imej"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "bingkai dalaman"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "anak tetingkap berlapis"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "senarai"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "item senarai"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "palang menu"
+
+#: atk/atkobject.c:133
+msgid "menu item"
+msgstr "item menu"
+
+#: atk/atkobject.c:134
+msgid "option pane"
+msgstr "anak tetingkap pilihan"
+
+#: atk/atkobject.c:135
+msgid "page tab"
+msgstr "tab halaman"
+
+#: atk/atkobject.c:136
+msgid "page tab list"
+msgstr "senarai tab halaman"
+
+#: atk/atkobject.c:137
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:138
+msgid "password text"
+msgstr "teks kata laluan"
+
+#: atk/atkobject.c:139
+msgid "popup menu"
+msgstr "menu timbul"
+
+#: atk/atkobject.c:140
+msgid "progress bar"
+msgstr "palang kemajuan"
+
+#: atk/atkobject.c:141
+msgid "push button"
+msgstr "butang tekan"
+
+#: atk/atkobject.c:142
+msgid "radio button"
+msgstr "butang radio"
+
+#: atk/atkobject.c:143
+msgid "radio menu item"
+msgstr "item menu radio"
+
+#: atk/atkobject.c:144
+msgid "root pane"
+msgstr "anak tetingkap root"
+
+#: atk/atkobject.c:145
+msgid "row header"
+msgstr "pengepala baris"
+
+#: atk/atkobject.c:146
+msgid "scroll bar"
+msgstr "palang tatal"
+
+#: atk/atkobject.c:147
+msgid "scroll pane"
+msgstr "anak tetingkap tatal"
+
+#: atk/atkobject.c:148
+msgid "separator"
+msgstr "pemisah"
+
+#: atk/atkobject.c:149
+msgid "slider"
+msgstr "pelungsur"
+
+#: atk/atkobject.c:150
+msgid "split pane"
+msgstr "anak tetingkap terpisah"
+
+#: atk/atkobject.c:151
+msgid "spin button"
+msgstr "butang angka"
+
+#: atk/atkobject.c:152
+msgid "statusbar"
+msgstr "palang status"
+
+#: atk/atkobject.c:153
+msgid "table"
+msgstr "jadual"
+
+#: atk/atkobject.c:154
+msgid "table cell"
+msgstr "sel jadual"
+
+#: atk/atkobject.c:155
+msgid "table column header"
+msgstr "pengepala lajur jadual"
+
+#: atk/atkobject.c:156
+msgid "table row header"
+msgstr "pengepala baris jadual"
+
+#: atk/atkobject.c:157
+msgid "tear off menu item"
+msgstr "item menu terkoyak"
+
+#: atk/atkobject.c:158
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:159
+msgid "text"
+msgstr "teks"
+
+#: atk/atkobject.c:160
+msgid "toggle button"
+msgstr "butang togol"
+
+#: atk/atkobject.c:161
+msgid "tool bar"
+msgstr "palang alat"
+
+#: atk/atkobject.c:162
+msgid "tool tip"
+msgstr "petua alat"
+
+#: atk/atkobject.c:163
+msgid "tree"
+msgstr "pepohon"
+
+#: atk/atkobject.c:164
+msgid "tree table"
+msgstr "jadual pepohon"
+
+#: atk/atkobject.c:165
+msgid "unknown"
+msgstr "tidak diketahui"
+
+#: atk/atkobject.c:166
+msgid "viewport"
+msgstr "port pandang"
+
+#: atk/atkobject.c:167
+msgid "window"
+msgstr "tetingkap"
+
+#: atk/atkobject.c:168
+msgid "header"
+msgstr "pengepala"
+
+#: atk/atkobject.c:169
+msgid "footer"
+msgstr "pengaki"
+
+#: atk/atkobject.c:170
+msgid "paragraph"
+msgstr "perenggan"
+
+#: atk/atkobject.c:171
+msgid "ruler"
+msgstr "pembaris"
+
+#: atk/atkobject.c:172
+msgid "application"
+msgstr "aplikasi"
+
+#: atk/atkobject.c:173
+msgid "autocomplete"
+msgstr "auto-lengkap"
+
+#: atk/atkobject.c:174
+msgid "edit bar"
+msgstr "palang sunting"
+
+#: atk/atkobject.c:175
+msgid "embedded component"
+msgstr "komponen terbenam"
+
+#: atk/atkobject.c:176
+msgid "entry"
+msgstr "masukan"
+
+#: atk/atkobject.c:177
+msgid "chart"
+msgstr "carta"
+
+#: atk/atkobject.c:178
+msgid "caption"
+msgstr "kapsyen"
+
+#: atk/atkobject.c:179
+msgid "document frame"
+msgstr "bingkai dokumen"
+
+#: atk/atkobject.c:180
+msgid "heading"
+msgstr "tajuk"
+
+#: atk/atkobject.c:181
+msgid "page"
+msgstr "halaman"
+
+#: atk/atkobject.c:182
+msgid "section"
+msgstr "seksyen"
+
+#: atk/atkobject.c:183
+msgid "redundant object"
+msgstr "objek lewah"
+
+#: atk/atkobject.c:184
+msgid "form"
+msgstr "borang"
+
+#: atk/atkobject.c:185
+msgid "link"
+msgstr "pautan"
+
+#: atk/atkobject.c:186
+msgid "input method window"
+msgstr "tetingkap kaedah input"
+
+#: atk/atkobject.c:187
+#| msgid "table row header"
+msgid "table row"
+msgstr "baris jadual"
+
+#: atk/atkobject.c:188
+#| msgid "tree table"
+msgid "tree item"
+msgstr "item pepohon"
+
+#: atk/atkobject.c:189
+msgid "document spreadsheet"
+msgstr "hamparan dokumen"
+
+#: atk/atkobject.c:190
+msgid "document presentation"
+msgstr "persembahan dokumen"
+
+#: atk/atkobject.c:191
+msgid "document text"
+msgstr "teks dokumen"
+
+#: atk/atkobject.c:192
+msgid "document web"
+msgstr "sesawang dokumen"
+
+#: atk/atkobject.c:193
+msgid "document email"
+msgstr "emel dokumen"
+
+#: atk/atkobject.c:194
+msgid "comment"
+msgstr "ulasan"
+
+#: atk/atkobject.c:195
+#| msgid "list"
+msgid "list box"
+msgstr "kotak senarai"
+
+#: atk/atkobject.c:196
+msgid "grouping"
+msgstr "pengelompokan"
+
+#: atk/atkobject.c:197
+#| msgid "image"
+msgid "image map"
+msgstr "peta imej"
+
+#: atk/atkobject.c:198
+#| msgid "animation"
+msgid "notification"
+msgstr "pemberitahuan"
+
+#: atk/atkobject.c:199
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "palang maklumat"
+
+#: atk/atkobject.c:200
+#| msgid "scroll bar"
+msgid "level bar"
+msgstr "palang aras"
+
+#: atk/atkobject.c:201
+#| msgid "tool bar"
+msgid "title bar"
+msgstr "palang tajuk"
+
+#: atk/atkobject.c:202
+msgid "block quote"
+msgstr "petikan blok"
+
+#: atk/atkobject.c:203
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:204
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:205
+#| msgid "animation"
+msgid "definition"
+msgstr "takrifan"
+
+#: atk/atkobject.c:206
+msgid "article"
+msgstr "artikel"
+
+#: atk/atkobject.c:207
+msgid "landmark"
+msgstr "mercu tanda"
+
+#: atk/atkobject.c:208
+#| msgid "dialog"
+msgid "log"
+msgstr "log"
+
+#: atk/atkobject.c:209
+msgid "marquee"
+msgstr "marquee"
+
+#: atk/atkobject.c:210
+msgid "math"
+msgstr "matematik"
+
+#: atk/atkobject.c:211
+msgid "rating"
+msgstr "penarafan"
+
+#: atk/atkobject.c:212
+msgid "timer"
+msgstr "pemasa"
+
+#: atk/atkobject.c:213
+msgid "description list"
+msgstr "senarai keterangan"
+
+#: atk/atkobject.c:214
+msgid "description term"
+msgstr "terma keterangan"
+
+#: atk/atkobject.c:215
+msgid "description value"
+msgstr "nilai keterangan"
+
+#: atk/atkobject.c:391
+msgid "Accessible Name"
+msgstr "Nama Boleh Capai"
+
+#: atk/atkobject.c:392
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Nama tika objek terformat untuk capaian teknologi bantuan"
+
+#: atk/atkobject.c:398
+msgid "Accessible Description"
+msgstr "Keterangan Boleh Capai"
+
+#: atk/atkobject.c:399
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Keterangan bagi satu objek, terformat untuk capaian teknologi bantuan"
+
+#: atk/atkobject.c:405
+msgid "Accessible Parent"
+msgstr "Induk Boleh Capai"
+
+#: atk/atkobject.c:406
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Induk bagi boleh capai semasa sebagai dikembalikan oleh "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:422
+msgid "Accessible Value"
+msgstr "Nilai Boleh Capai"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the value has changed"
+msgstr "Digunakan untuk maklumkan nilai telah berubah"
+
+#: atk/atkobject.c:431
+msgid "Accessible Role"
+msgstr "Peranan Boleh Capai"
+
+#: atk/atkobject.c:432
+msgid "The accessible role of this object"
+msgstr "Peranan boleh capai bagi objek ini"
+
+#: atk/atkobject.c:439
+msgid "Accessible Layer"
+msgstr "Lapisan Boleh Capai"
+
+#: atk/atkobject.c:440
+msgid "The accessible layer of this object"
+msgstr "Lapisan boleh capai bagi objek ini"
+
+#: atk/atkobject.c:448
+msgid "Accessible MDI Value"
+msgstr "Nilai MDI Boleh Capai"
+
+#: atk/atkobject.c:449
+msgid "The accessible MDI value of this object"
+msgstr "Nilai MDI boleh capai bagi objek ini"
+
+#: atk/atkobject.c:465
+msgid "Accessible Table Caption"
+msgstr "Kapsyen Jadual Boleh Capai"
+
+#: atk/atkobject.c:466
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Digunakan untuk maklumkan kapsyen jadual telah berubah; sifat ini sepatutnya "
+"tidak digunakan. accessible-table-caption-object patut digunakan sebagai "
+"ganti"
+
+#: atk/atkobject.c:480
+msgid "Accessible Table Column Header"
+msgstr "Pengepala Lajur Jadual Boleh Capai"
+
+#: atk/atkobject.c:481
+msgid "Is used to notify that the table column header has changed"
+msgstr "Digunakan untuk maklumkan pengepala lajur jadual telah berubah"
+
+#: atk/atkobject.c:496
+msgid "Accessible Table Column Description"
+msgstr "Keterangan Lajur Jadual Boleh Capai"
+
+#: atk/atkobject.c:497
+msgid "Is used to notify that the table column description has changed"
+msgstr "Digunakan untuk maklumkan keterangan lajur jadual telah berubah"
+
+#: atk/atkobject.c:512
+msgid "Accessible Table Row Header"
+msgstr "Pengepala Baris Jadual Boleh Capai"
+
+#: atk/atkobject.c:513
+msgid "Is used to notify that the table row header has changed"
+msgstr "Digunakan untuk maklumkan pengepala baris jadual telah berubah"
+
+#: atk/atkobject.c:527
+msgid "Accessible Table Row Description"
+msgstr "Keterangan Baris Jadual Boleh Capai"
+
+#: atk/atkobject.c:528
+msgid "Is used to notify that the table row description has changed"
+msgstr "Digunakan untuk maklumkan keterangan baris jadual telah berubah"
+
+#: atk/atkobject.c:534
+msgid "Accessible Table Summary"
+msgstr "Ringkasan Jadual Boleh Capai"
+
+#: atk/atkobject.c:535
+msgid "Is used to notify that the table summary has changed"
+msgstr "Digunakan untuk maklumkan ringkasan jadual telah berubah"
+
+#: atk/atkobject.c:541
+msgid "Accessible Table Caption Object"
+msgstr "Objek Kapsyen Jadual Boleh Capai"
+
+#: atk/atkobject.c:542
+msgid "Is used to notify that the table caption has changed"
+msgstr "Digunakan untuk maklumkan kapsyen jadual telah berubah"
+
+#: atk/atkobject.c:548
+msgid "Number of Accessible Hypertext Links"
+msgstr "Bilangan Pautan Hiperteks Boleh Capai"
+
+#: atk/atkobject.c:549
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Bilangan pautan ada pada AtkHypertext semasa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "sangat lemah"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "lemah"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+#| msgid "table"
+msgid "acceptable"
+msgstr "boleh terima"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "kuat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "sangat kuat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "sangat rendah"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "sederhana"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "tinggi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "sangat tinggi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "sangat teruk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "teruk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "baik"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "sangat baik"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "terbaik"
index 860ee1b..d2998e5 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -1,10 +1,18 @@
+# #-#-#-#-#  nb.po (at-spi2-core 2.1.x)  #-#-#-#-#
 # Norwegian bokmål translation of at-spi2-core.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # Kjartan Maraas <kmaraas@gnome.org>, 2011-2014.
 #
+# #-#-#-#-#  nb.po (atk 2.11.90)  #-#-#-#-#
+# Norwegian bokmål translation of atk.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Kjartan Maraas <kmaraas@gnome.org>, 2003-2014.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  nb.po (at-spi2-core 2.1.x)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core 2.1.x\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-02-10 08:06+0100\n"
@@ -15,6 +23,17 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  nb.po (atk 2.11.90)  #-#-#-#-#\n"
+"Project-Id-Version: atk 2.11.90\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-03-23 19:52+0100\n"
+"PO-Revision-Date: 2014-03-23 19:53+0100\n"
+"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
+"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -24,3 +43,779 @@ msgstr "Programmet eksisterer ikke lenger"
 #: ../atspi/atspi-misc.c:1777
 msgid "Attempted synchronous call where prohibited"
 msgstr "Forsøkt synkront kall ble hindret"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Selected Link"
+msgstr "Valgt lenke"
+
+#: ../atk/atkhyperlink.c:129
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Oppgir om et AtkHyperlink-objekt er valgt"
+
+#: ../atk/atkhyperlink.c:135
+msgid "Number of Anchors"
+msgstr "Antall anker"
+
+#: ../atk/atkhyperlink.c:136
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Antall anker assosiert med AtkHyperlink-objektet"
+
+#: ../atk/atkhyperlink.c:144
+msgid "End index"
+msgstr "Sluttindeks"
+
+#: ../atk/atkhyperlink.c:145
+msgid "The end index of the AtkHyperlink object"
+msgstr "Sluttindeks for AtkHyperlink-objektet"
+
+#: ../atk/atkhyperlink.c:153
+msgid "Start index"
+msgstr "Startindeks"
+
+#: ../atk/atkhyperlink.c:154
+msgid "The start index of the AtkHyperlink object"
+msgstr "Startindeks for AtkHyperlink-objektet"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "ugyldig"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "etikett for snarveitast"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "varsel"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "animasjon"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "pil"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "kalender"
+
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "kanvas"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "avkryssingsboks"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "menyoppføring med avkryssingsboks"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "fargevelger"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "kolonnetopptekst"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "komboboks"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "datoredigering"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "skrivebordsikon"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "skrivebordsramme"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "nummeroppføring"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "dialog"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "katalogområde"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "tegneområde"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "filvelger"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "fyll"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "skriftvelger"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "ramme"
+
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "glass-område"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "html-område"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "ikon"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "bilde"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "intern ramme"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "etikett"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "lagdelt område"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "liste"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "listeoppføring"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "meny"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "menylinje"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "menyoppføring"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "alternativ-område"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "sidefane"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "sidefaneliste"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "passordtekst"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "oppsprettmeny"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "fremgangsmåler"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "trykknapp"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "radioknapp"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "radiomenyoppføring"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "rotområde"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "radtoppekst"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "rullefelt"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "rulleområde"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "skillelinje"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "ruller"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "delt område"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "spin button"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "statuslinje"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "tabell"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "tabellcelle"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "topptekst for kolonne i tabell"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "topptekst for rad i tabell"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "avtagbar menyoppføring"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "tekst"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "av/på-knapp"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "verktøylinje"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "verktøytips"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "tre"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "tretabell"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "ukjent"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "visningsport"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "vindu"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "topptekst"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "bunntekst"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "avsnitt"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "linjal"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "applikasjon"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "autofullfør"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "rediger linje"
+
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "innebygget komponent"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "oppføring"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "graf"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "bildetekst"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "dokumentramme"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "topptekst"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "side"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "del"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "redundant objekt"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "skjema"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "lenke"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "vindu for inndatametode"
+
+#: ../atk/atkobject.c:186
+msgid "table row"
+msgstr "rad i tabell"
+
+#: ../atk/atkobject.c:187
+msgid "tree item"
+msgstr "treoppføring"
+
+#: ../atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "regnearkdokument"
+
+#: ../atk/atkobject.c:189
+msgid "document presentation"
+msgstr "presentasjonsdokument"
+
+#: ../atk/atkobject.c:190
+msgid "document text"
+msgstr "tekstdokument"
+
+#: ../atk/atkobject.c:191
+msgid "document web"
+msgstr "nettdokument"
+
+#: ../atk/atkobject.c:192
+msgid "document email"
+msgstr "e-postdokument"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "kommentar"
+
+#: ../atk/atkobject.c:194
+msgid "list box"
+msgstr "listeboks"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "gruppering"
+
+#: ../atk/atkobject.c:196
+msgid "image map"
+msgstr "bildekart"
+
+#: ../atk/atkobject.c:197
+msgid "notification"
+msgstr "varsling"
+
+#: ../atk/atkobject.c:198
+msgid "info bar"
+msgstr "informasjonslinje"
+
+#: ../atk/atkobject.c:199
+msgid "level bar"
+msgstr "nivåfelt"
+
+#: ../atk/atkobject.c:200
+msgid "title bar"
+msgstr "tittellinje"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr "blokksitat"
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "lyd"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "bilde"
+
+#: ../atk/atkobject.c:204
+msgid "definition"
+msgstr "definisjon"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "artikkel"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr "landemerke"
+
+#: ../atk/atkobject.c:207
+msgid "log"
+msgstr "logg"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr "marquee"
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr "matematikk"
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "poeng"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "teller"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "beskrivelsesliste"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "beskrivelsesbegrep"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "verdi for beskrivelse"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Tilgjengelig navn"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Objektinstansens navn formattert for aksess via hjelpefunksjoner"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Tilgjengelig beskrivelse"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Beskrivelse av et objekt formattert for aksess via hjelpefunksjoner"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Tilgjengelig opphav"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Opphav til aktiv tilgjengelighetsobjekt som returnert av "
+"atk_object_get_parent()"
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Tilgjengelig verdi"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Brukes til å varsle at verdien er endret"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Tilgjengelig rolle"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "Tilgjengelig rolle for dette objektet"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Tilgjengelig lag"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "Tilgjengelig lag for dette objektet"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Tilgjengelig MDI-verdi"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "Tilgjengelig MDI-verdi for dette objektet"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Tilgjengelig tabelltekst"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Brukes til å varsle at denne tabellteksten er endret; denne egenskapen bør "
+"ikke brukes. accessible-table-caption-object bør brukes i stedet"
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Topptekst for kolonne i tilgjengelig tabell"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "Brukes til å varsle at kolonnetopptekst for tabellen er endret"
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Tilgjengelig beskrivelse av kolonne i tabell"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "Brukes til å varsle at kolonnebeskrivelse for tabell er endret"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Tilgjengelig topptekst for rad i tabell"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "Brukes til å varsle at radtopptekst for tabellen er endret"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Tilgjengelig beskrivelse av rad i tabell"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Brukes til å varsle at radbeskrivelse i tabell er endret"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Tilgjengelig tabellsammendrag"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Brukes til å varsle at tabellsammendrag er endret"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Tilgjengelig objekt for tabelltekst"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Brukes til å varsle at tabellteksten er endret"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Antall tilgjengelige hypertekstlenker"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Antall lenker i aktiv AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "meget svak"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "svak"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "akseptabel"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "sterk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "meget sterk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "meget lav"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "middels"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "høy"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "meget høy"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "meget dårlig"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "dårlig"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "god"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "meget god"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "best"
index e2673b0..987dcc0 100644 (file)
--- a/po/ne.po
+++ b/po/ne.po
+# #-#-#-#-#  ne.po (Gnome Nepali Translation Project)  #-#-#-#-#
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
+# #-#-#-#-#  ne.po (Gnome Nepali Translation Project)  #-#-#-#-#
+# translation of atk.gnome-2-14.ne.po to Nepali
+# translation of atk.gnome-2-10.ne.po to Nepali
+# translation of atk.gnome-2-10.po to Nepali
+# translation of atk.HEAD.po to Nepali
+# translation of atk.HEAD.po to
+# translation of atk.HEAD.ne.po to
+# This file is distributed under the same license as the atk package.
+# Pawan Chitrakar <pawan@nplinux.org>.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Pawan Chitrakar,,, <pawan@mpp.org.np>, 2005.
+# Ganesh Ghimire <gghimire@gmail.com>, 2005.
+# Jyotshna Shrestha <jyotshna@mpp.org.np>, 2005.
+# Jaydeep Bhusal <zaydeep@hotmail.com>, 2005.
+# Kapil Timilsina <lipak21@gmail.com>, 2005.
+# Shyam Krishna Bal <shyamkrishna_bal@yahoo.com>, 2006.
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: Gnome Nepali Translation Project\n"
-"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=at-spi2-core\n"
-"POT-Creation-Date: 2017-07-03 20:15+0000\n"
-"PO-Revision-Date: 2017-07-25 15:09+0545\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-09-11 05:08+0545\n"
+"Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
 "Language-Team: Nepali Translation Team <chautari@gmail.com>\n"
+"Language: ne\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.3\n"
-"Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"Language: ne_NP\n"
+"Plural-Forms: nplurals=2;plural=(n!=1);\n"
+"X-Generator: Poedit 3.0.1\n"
+"X-Generator: Poedit 2.0.4\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "चयन गरिएको लिङ्क"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink वस्तु चयन गरिएको छ कि छैन निश्चित गर्नुहोस्"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "एङ्करहरूको सङ्ख्या"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink वस्तुसँग सम्बद्ध एङ्करहरूको सङ्ख्या"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "अन्तिम अनुक्रमणिका"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink वस्तुको अन्तिम अनुक्रमणिका"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "सुरु अनुक्रमणिका"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink वस्तुको प्रथम अनुक्रमणिका"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "अवैध"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "गतिवर्धक लेबुल"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "सावधान"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "एनिमेसन"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "बाँण"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "पात्रो"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "क्यानभास"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "जाँच बाकस"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "मेनु वस्तु जाँच्नुहोस्"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "रङ चयनकर्ता"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "स्तम्भ हेडर"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "कम्बो बाकस"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "मिति सम्पादक"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "डेस्कटप प्रतिमा"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "डेस्कटप फ्रेम"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "डायल"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "संवाद"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "डाइरेक्टरी फलक"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "रेखाचित्र क्षेत्र"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "फाइल चयनकर्ता"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "फिलर"
+
+#  I know it looks wrong but that is what Java returns
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "फन्ट चयनकर्ता"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "फ्रेम"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "ग्लास फलक"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "html भाँडो"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "प्रतिमा"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "छवि"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "आन्तरिक फ्रेम"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "लेबुल"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "तहगत फलक"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "सूची"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "सूची वस्तु"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "मेनु"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "मेनु पट्टि"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "मेनु बटन"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "मेनु वस्तु"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "विकल्प फलक"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "पृष्ठ ट्याब"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "पृष्ठ ट्याब सूची"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "प्यानल"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "पासवर्ड पाठ"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "पपअप मेनु"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "प्रगति पट्टि"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "थिच्ने बटन"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "रेडियो बटन"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "रेडियो मेनु वस्तु"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "मूल फलक"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "पङ्क्ति हेडर"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "स्क्रोलपट्टी"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "स्क्रोल फलक"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "विभाजक"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "स्लाइडर"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "छुट्टिएको फलक"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "स्पिन बटन"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "वस्तुस्थितिपट्टी"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "तालिका"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "तालिका कक्ष"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "तालिका स्तम्भ हेडर"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "तालिका पङ्क्ति हेडर"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "मेनु वस्तु छुट्याउनुहोस्"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "टर्मिनल"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "पाठ"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "टगल बटन"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "उपकरणपट्टी"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "टुल टिप"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "ट्रि"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "ट्रि तालिका"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "अज्ञात"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "दृश्य पोर्ट"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "सञ्झ्याल"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "हेडर"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "फुटर"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "अनुच्छेद"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "रुलर"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "अनुप्रयोग"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "स्वत:समाप्ती"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "सम्पादन पट्टी"
 
-#: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "सन्निबेश गरिएको अवयव"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "प्रविष्टि"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "चित्रपट"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "क्याप्सन"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "कागजात फ्रेम"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "हेडिङ"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "पृष्ठ"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "सेक्सन"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "अतिरिक्त वस्तु"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "फारम"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "लिङ्क"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "आयात विधि सञ्झ्याल"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "तालिका पङ्क्ति"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "ट्रि सामाग्री"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "सप्रेडशिट कागजात"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "प्रस्तुतिकरण कागजात"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "पाठ कागजात"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "कागजात वेब"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "इमेल कागजात"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "टिप्पणी"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "सुची बाकस"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "समूहबद्ध"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "छवि मानचित्र"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "सूचना"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "सूचना पट्टी"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "निसानी पट्टी"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "शीर्षक पट्टी"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "बाक्लो उद्धरण"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "ध्वनी"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "भिडियो"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "परिभाषा"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "लेख"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "भूमिनिसान"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "दैनिकि"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "मार्की"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "गणित"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "दर निर्धारण"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "समयक"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "वर्णन सूची"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "वर्णन शब्द"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "वर्णन मान"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "पहुँचयोग्य नाम"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "सहयोगी प्रविधि पहुंचका लागि वस्तु दृष्टान्तको नाम ढाँचा पारियो"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "पहुँचयोग्य वर्णन"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "एउटा वस्तुको वर्णन, सहयोगी प्रविधि पहुँचका लागि ढाँचा पारियो"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "पहुँचयोग्य प्रमूल"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "atk_object_get_parent() द्वारा फर्काइएको वर्तमान पहुँचको अभिभावक"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "पहुँचयोग्य मान"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "मान परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "पहुँचयोग्य भूमिका"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "यस वस्तुको पहुँच योग्य भूमिका"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "पहुँच योग्य तह"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "यस वस्तुको पहुँच योग्य तह"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "पहुँच योग्य MDI मान"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "यस वस्तुको पहुँच योग्य MDI मान"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "पहुँच योग्य तालिका क्याप्सन"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should not be "
+"used. accessible-table-caption-object should be used instead"
+msgstr ""
+"तालिका क्याप्सन परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ; यो गुण प्रयोग गर्न सकिँदैन। यसको "
+"सट्टामा पहुँच योग्य-तालिका-क्याप्सन-वस्तु प्रयोग गर्नुहोस्"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "पहुँच योग्य तालिका स्तम्भ हेडर"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "तालिका स्तम्भ हेडर परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "पहुँच योग्य तालिका स्तम्भ वर्णन"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "तालिका स्तम्भ वर्णन परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "पहुँच योग्य तालिका पङ्क्ति हेडर"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "तालिका पङ्क्ति हेडर परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "पहुँच योग्य तालिका पङ्क्ति वर्णन"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "तालिका पङ्क्ति वर्णन परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "पहुँच योग्य तालिका सारांश"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "तालिका सारांश परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "पहुँच योग्य तालिका क्याप्सन वस्तु"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "तालिका क्याप्सन परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "पहुँच योग्य हाइपरटेक्स्ट लिङ्कहरूको सङ्ख्या"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "हालको AtkHypertext संगरहेको लिङ्कहरूको सङ्ख्या"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "सार्‍है कमजोर"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "कमजोर"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "स्वीकार्य"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "बलियो"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "धेरै बलियो"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "अति न्यून"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "मध्यम"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "उच्च"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "अति उच्च"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "धेरै खराब"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "खराब"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "असल"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "अति असल"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "उत्तम"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "अनुप्रयोग अब उप्रान्त उपलब्ध छैन"
 
-#: atspi/atspi-misc.c:1843
-msgid "Attempted synchronous call where prohibited"
-msgstr "निषेधित भए सिंक्रोनस कल कोशिश गर्नुहोस्"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "निषेधित भए सिंक्रोनस कल कोशिश गर्नुहोस्"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "प्रमूल परिवर्तन भइसक्यो भनेर सूचीत गर्न प्रयोग गरिन्छ"
index 0fe1fa6..8a1987f 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -1,3 +1,4 @@
+# #-#-#-#-#  nl.po (at-spi2-core)  #-#-#-#-#
 # Dutch translation for at-spi2-core
 #
 # This file is distributed under the same license as the at-spi2-core package.
 # Dit is echt een verschrikkelijke module: alleen maar technische termen die
 # totaal onbegrijpelijk zijn. — Wouter
 #
+# #-#-#-#-#  nl.po (atk)  #-#-#-#-#
+# Dutch translation for atk.
+#
+# This file is distributed under the same license as the atk package.
+#
+#
+# Vincent van Adrighem <V.vanAdrighem@dirck.mine.nu>, 2002.
+# Tino Meinen <a.t.meinen@chello.nl>, 2004, 2005, 2006.
+# Wouter Bolsterlee <wbolster@gnome.org>, 2009.
+# Justin van Steijn <jvs@fsfe.org>, 2016.
+# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2017.
+# Nathan Follens <nfollens@gnome.org>, 2022.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=at-spi2-core\n"
-"POT-Creation-Date: 2017-09-04 22:34+0000\n"
-"PO-Revision-Date: 2015-05-26 17:44+0100\n"
-"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
-"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-09-17 14:43+0000\n"
+"PO-Revision-Date: 2022-11-02 00:42+0100\n"
+"Last-Translator: Nathan Follens <nfollens@gnome.org>\n"
+"Language-Team: Dutch <gnome-nl-list@gnome.org>\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Lokalize 2.0\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Geselecteerde koppeling"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Geeft aan of het AtkHyperLink object geselecteerd is"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Aantal ankers"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Het aantal ankers wat met het AtkHyperlink object is geassocieerd"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Einde index"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Einde van de index van het AtkHyperlink object"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Begin index"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Begin van de index van het AtkHyperlink object"
+
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "ongeldig"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr "sneltoetslabel"
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "alarm"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "animatie"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "pijl"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "agenda"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr "canvas"
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr "aankruisvakje"
+
+# Wat is een aankruismenu-item? Bedoelen ze soms Menu-item aankruisen? Hannie
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr "Menu-item aankruisen"
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "kleurenkiezer"
+
+# kolomkop/kolomtitel
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr "kolomtitel"
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr "keuzevak"
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr "datum-editor"
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "bureaubladpictogram"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr "bureaublad-frame"
+
+# opbellen/inbellen/bellen
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr "bellen"
+
+# dialoog/dialoogvenster
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "dialoogvenster"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr "mappenpaneel"
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr "tekengebied"
+
+# bestandsselectie/kiezer
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr "bestandskiezer"
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr "vuller"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr "lettertypeselectie"
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "frame"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr "glaspaneel"
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr "html-container"
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "pictogram"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "afbeelding"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr "intern frame"
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "label"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr "gelaagd paneel"
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "lijst"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr "lijst-item"
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr "menubalk"
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "menuknop"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "menu-item"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr "opties-paneel"
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr "pagina-tabblad"
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr "pagina-tabbladlijst"
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "paneel"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr "wachtwoordtekst"
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr "popup-menu"
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr "voortgangsbalk"
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr "drukknop"
+
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr "radioknop"
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr "radio-menu-item"
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr "hoofdpaneel"
+
+# rijkop/rijtitel
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr "rijtitel"
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "schuifbalk"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr "schuifpaneel"
+
+# scheidingsteken/scheider/scheiding
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "scheiding"
+
+# schuifknop/schuiver
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr "schuiver"
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr "gedeeld paneel"
+
+# draaiknop/tellerknop/teller/spinknop
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr "omhoog/omlaag-knop"
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "statusbalk"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "tabel"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "tabel-cel"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr "kolomtitel"
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr "rijtitel"
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr "losscheurbaar menu-item"
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "tekst"
+
+# schakelaar/schakelknop
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr "schakelknop"
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "werkbalk"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr "hulpballon"
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "boom"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr "boomtabel"
+
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "onbekend"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr "blikveld"
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "venster"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "kop"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr "voet"
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "paragraaf"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr "liniaal"
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "programma"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr "auto-afmaken"
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr "bewerkingsbalk"
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr "ingebedde component"
+
+# Wat is de juiste betekenis?
+# item/invoerveld/onderdeel
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "invoerveld"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr "grafiek"
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr "onderschrift"
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr "document-frame"
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr "kop"
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "pagina"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "sectie"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr "overbodig object"
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "formulier"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "link"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr "invoermethodescherm"
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "tabelrij"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "boomitem"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "document-spreadsheet"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "document-presentatie"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "document-tekst"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr "document-web"
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr "document-e-mail"
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "commentaar"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr "keuzemenu"
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr "groepering"
+
+# https://nl.wikipedia.org/wiki/Image_map
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr "afbeeldingsindeling"
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr "melding"
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr "infobalk"
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr "niveaubalk"
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr "titelbalk"
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr "citaatblok"
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr "definitie"
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr "artikel"
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr "landmark"
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr "log"
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr "marquee"
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr "wiskunde"
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr "beoordeling"
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr "timer"
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr "beschrijving lijst"
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr "beschrijving term"
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr "beschrijving waarde"
+
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr "Toegankelijke naam"
+
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Naam van dit object, speciaal opgemaakt voor toegankelijkstechnologie"
+
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr "Toekankelijke omschrijving"
+
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Omschrijving van dit object, speciaal opgemaakt voor toegang van "
+"ondersteunende technologie"
+
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr "Toegankelijke ouder"
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Ouder van de huidige toegankelijke zoals teruggekoppeld door "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr "Toegankelijke waarde"
+
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr "Wordt gebruikt om aan te geven dat de waarde is gewijzigd"
+
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr "Toegankelijke rol"
+
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr "De toegankelijke rol van dit object"
+
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr "Toegankelijke laag"
+
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr "De toegankelijke laag van dit object"
+
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr "Toegankelijke MDI-waarde"
+
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr "De toegankelijke MDI-waarde van dit object"
+
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr "Toegankelijke tabeltitel"
+
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Wordt gebruikt om aan te geven dat de tabeltitel is gewijzigd (niet "
+"gebruiken). U kunt beter accessible-table-caption-object gebruiken"
+
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr "Toegankelijke tabel kolomtitel"
+
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr "Wordt gebruikt om aan te geven dat de kolomtitel is gewijzigd"
+
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr "Toegankelijke kolomomschrijving"
+
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr "Wordt gebruikt om aan te geven dat de kolomomschrijving is gewijzigd"
+
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr "Toegankelijke rijtitel"
+
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr "Wordt gebruikt om aan te geven dat de rijtitel is gewijzigd"
+
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr "Toegankelijke rijomschrijving"
+
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr "Wordt gebruikt om aan te geven dat de rijomschrijving is gewijzigd"
+
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr "Toegankelijke tabelsamenvatting"
+
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr "Wordt gebruikt om aan te geven dat de tabelsamenvatting is gewijzigd"
+
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr "Toegankelijk tabeltitelobject"
+
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr "Wordt gebruikt om aan te geven dat de tabeltitel is gewijzigd"
+
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr "Aantal toegankelijke hypertext links"
+
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Het huidig aantal links van de huidige AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "zeer zwak"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "zwak"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "acceptabel"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "sterk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "zeer sterk"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "zeer laag"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "midden"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "hoog"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "zeer hoog"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "zeer slecht"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "slecht"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "goed"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "zeer goed"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "beste"
 
-#: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "De toepassing bestaat niet meer"
 
-#: atspi/atspi-misc.c:1850
-msgid "Attempted synchronous call where prohibited"
-msgstr "Synchrone oproep geprobeerd waar verboden"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Synchrone oproep geprobeerd waar verboden"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: onbekende signature ‘%s’ voor RemoveAccessible"
diff --git a/po/nn.po b/po/nn.po
new file mode 100644 (file)
index 0000000..ed8686d
--- /dev/null
+++ b/po/nn.po
@@ -0,0 +1,596 @@
+# translation of nn.po to Norwegian Nynorsk
+# This file is distributed under the same license as the ATK package.
+# Copyright (C) 2003 Åsmund Skjæveland.
+#
+# Åsmund Skjæveland <aasmunds@ulrik.uio.no>, 2003, 2004, 2005, 2006.
+# Åsmund Skjæveland <aasmunds@ulrik.uio.no>, 2009, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: nn\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-09-11 11:03+0000\n"
+"PO-Revision-Date: 2012-05-08 13:13+0200\n"
+"Last-Translator: Åsmund Skjæveland <aasmunds@ulrik.uio.no>\n"
+"Language-Team: Norwegian Nynorsk <i18n-no@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.4\n"
+"Language: nn\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Vald lenkje"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Seier om AtkHyperlink-objektet er vald"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Tal på anker"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Talet på anker kopla til AtkHyperlink-objektet"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Sluttindeks"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Sluttindeksen til AtkHyperlink-objektet"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Startindeks"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Startindeksen til AtkHyperlink-objektet"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "ugyldig"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "merkelapp for aksellerator"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "åtvaring"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "animasjon"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "pil"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "kalender"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "lerret"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "avkryssingsboks"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "element i avkryssingsmeny"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "fargeveljar"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "kolonnetittel"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "kombinasjonsboks"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "datoredigerar"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "skrivebordsikon"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "skrivebordsramme"
+
+# TRN: Eg er ikkje nøgd med denne, for det er i det heile eit dårleg ord på engelsk.
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "hjul"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "dialog"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "katalogpanel"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "teikneområde"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "filveljar"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "fyll"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "skifttypeveljar"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ramme"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "glaspanel"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html-boks"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ikon"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "bilete"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "intern ramme"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "merkelapp"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "lagdelt panel"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "liste"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "element i liste"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "meny"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "menylinje"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "element i meny"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "innstillingspanel"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "arkfane"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "arkfaneliste"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "passordtekst"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "oppsprettmeny"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "framdriftsvisar"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "trykknapp"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "radioknapp"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "radiomeny-element"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "rotpanel"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "radtittel"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "rullefelt"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "rullepanel"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "skiljeteikn"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "glidebrytar"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "delt panel"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "talboks"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "statuslinje"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "tabell"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "tabellcelle"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "tabellkolonnetittel"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "tabellradtittel"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "element i lausriven meny"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "tekst"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "av/på-knapp"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "verktøylinje"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "verktøytips"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "tre"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "tretabell"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "ukjend"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "visingsområde"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "vindauge"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "topptekst"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "botntekst"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "avsnitt"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "linjal"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "program"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "autofullfør"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "redigeringsfelt"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "innbakt komponent"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "oppføring"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "graf"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "figurtekst"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "dokumentramme"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "topptekst"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "side"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "del"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "overflødig objekt"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "skjema"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "lenkje"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "inndatametode-vindauge"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "tabellrad"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "tre-element"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "dokument, rekneark"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "dokument, presentasjon"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "dokument, tekst"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "dokument, vev"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "dokument, e-post"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "kommentar"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "listeboks"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "gruppering"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "biletekart"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "melding"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "infolinje"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "Tilgjengeleg namn"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Objektinstansen sitt namn, formatert for tilgang gjennom hjelpeteknologi"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "Tilgjengeleg skildring"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Skildring av eit objekt, formatert for tilgang gjennom hjelpeteknologi"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "Tilgjengeleg forelder"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "Vert brukt til å varsla om at forelderen har endra"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "Tilgjengeleg verdi"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "Vert brukt til å varsla at verdien er endra"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "Tilgjengeleg rolle"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "Den tilgjengelege rolla til dette objektet"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "Tilgjengeleg lag"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "Det tilgjengelege laget til dette objektet"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "Tilgjengeleg MDI-verdi"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "Den tilgjengelege MDI-verdien til dette objektet"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "Tilgjengeleg tabelltittel"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Vert brukt til å varsla at tabelltittelen er endra. Denne eigenskapen bør "
+"ikkje brukast. «accessible-table-caption-object» bør brukast i staden"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "Tilgjengeleg tabellkolonnetittel"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "Vert brukt til å varsla at tabellkolonnetittelen er endra"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "Tilgjengeleg tabellkolonneskildring"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "Vert brukt til å varsla at tabellkolonneskildringa er endra"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "Tilgjengeleg tabellradtittel"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "Vert brukt til å varsla at tabellradtittelen er endra"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "Tilgjengeleg tabellradskildring"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "Vert brukt til å varsla at tabellradskildringa er endra"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "Tilgjengeleg tabellsamandrag"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "Vert brukt til å varsla at tabellsamandraget er endra"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "Tilgjengeleg tabelltittelobjekt"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "Vert brukt til å varsla at tabelltittelen er endra"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "Talet på hypertekstlenkjer som er gjort tilgjengelege"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Talet på lenkjer som noverande AtkHypertext har"
+
index 7385b86..148d41a 100644 (file)
--- a/po/oc.po
+++ b/po/oc.po
+# #-#-#-#-#  oc.po (at-spi2-core master)  #-#-#-#-#
 # Occitan translation for at-spi2-core.
 # Copyright (C) 2011 Listed translators
 # This file is distributed under the same license as the at-spi2-core package.
 # Claude Paroz <claude@2xlibre.net>, 2011.
 # Cédric Valmary (Tot en òc) <cvalmary@yahoo.fr>, 2015.
 # Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>, 2016.
+# #-#-#-#-#  oc.po (atk HEAD)  #-#-#-#-#
+# Occitan translation of atk.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# This file is distributed under GNU Library General Public License Version 2.
+# Yannig Marchegay (Kokoyaya) <yannig@marchegay.org>, 2006-2008
+# Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>, 2016.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2016-05-23 23:38+0000\n"
-"PO-Revision-Date: 2016-05-29 20:29+0200\n"
-"Last-Translator: Cédric Valmary (totenoc.eu) <cvalmary@yahoo.fr>\n"
+"Project-Id-Version: atk HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-09-16 21:24+0200\n"
+"Last-Translator: Quentin PAGÈS\n"
 "Language-Team: Tot En Òc\n"
 "Language: oc\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Virtaal 0.7.1\n"
+"X-Generator: Poedit 3.1.1\n"
 "X-Project-Style: gnome\n"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1073
-#: ../atspi/atspi-value.c:111
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Ligam seleccionat"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Indica se l'objècte AtkHyperlink es seleccionat"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Nombre d'ancòras"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Lo nombre d'ancòras associadas amb l'objècte AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Fin d'indèx"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "La fin de l'indèx de l'objècte AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Començament d'indèx"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Lo començament de l'indèx de l'objècte AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "invalid"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "etiqueta de l'acorchi"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "alèrta"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animacion"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "puntador"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "calendièr"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "canavàs"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "casa de marcar"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "element de menú amb casa de marcar"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "selector de colors"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "entèsta de colomna"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "bóstia combinada"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "editor de datas"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "icòna del burèu"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "quadre del burèu"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "afichador circular"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "bóstia de dialòg"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "panèl dels repertòris"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "zòna de dessenh"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "selector de fichièrs"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "objècte d'emplenatge"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "selector de poliças"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "quadre"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "panèl de veire"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "contenidor html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "icòna"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "imatge"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "quadre intèrne"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etiqueta"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "panèl superpausat"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "element de lista"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menú"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "barra de menús"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "boton de menú"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "element de menú"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "panèl d'opcions"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "onglet de pagina"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lista d'onglets de pagina"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "tablèu de bòrd"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "camp de senhal"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "menú contextual"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "barra de progression"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "boton"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "boton ràdio"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "element de menú amb boton ràdio"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "panèl raiç"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "entèsta de linha"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "barra de desfilament"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "panèl de desfilament"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "lisièra"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "panèl devesible"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "boton de reglatge"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "barra d'estat"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tablèu"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "cellula de tablèu"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "entèsta de colomna de tablèu"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "entèsta de linha de tablèu"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "element de menú destacable"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "consòla"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "tèxte"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "boton de dos estats"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "barra d'aisinas"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "infobulla"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "arbre"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "tablèu arborescent"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "desconegut"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "fenèstra de trabalh"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "fenèstra"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "entèsta de pagina"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "bas de pagina"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "linha"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplicacion"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "autocompletament"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "barra d'edicion"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "component incorporat"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "zòna de picada"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "grafic"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "legenda"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "quadre del document"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "entèsta"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "pagina"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "seccion"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "objècte redondant"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formulari"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "ligam"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "fenèstra de metòde de picada"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "linha de tablèu"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "element arborescent"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "document tablador"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "document presentacion"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "document tèxte"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "document web"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "document corrièr electronic"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "comentari"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "lista desenrotlanta"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "gropament"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "mapa imatge"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "notificacion"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "barra d'informacions"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "barra de nivèl"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "barra de títol"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "blòt de citacion"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "àudio"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "vidèo"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definicion"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "article"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "punt de referéncia"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "jornal"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "zòna desfilanta"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "math"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "notacion"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "cronomètre"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "lista descriptiva"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "tèrme descrit"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "valor de descripcion"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Nom accessible"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nom d'una instància d'objècte formatat per èsser accessible per las ajudas "
+"tecnicas"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Descripcion accessibla"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Descripcion d'un objècte, formatat per èsser accessible per las ajudas "
+"tecnicas"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Parent accessible"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Parent de l'element accessible actual renviat per atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Valor accessibla"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Es utilizat per notificar que la valor a cambiat"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Ròtle accessible"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Lo ròtle accessible d'aqueste objècte"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Jaç accessible"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Lo jaç accessible d'aqueste objècte"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Valor MDI accessibla"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "La valor MDI accessibla d'aqueste objècte"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Legenda de tablèu accessible"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Es utilizat per notificar que la legenda del tablèu a cambiat ; aquesta "
+"proprietat deuriá pas èsser utilizada. La proprietat accessible-table-"
+"caption-object deuriá èsser utilizada a la plaça"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Entèsta de colomna de tablèu accessibla"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Es utilizat per notificar que l'entèsta de la colomna del tablèu a cambiat"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Descripcion de colomna de tablèu accessibla"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Es utilizat per notificar que la descripcion de la colomna del tablèu a "
+"cambiat"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Entèsta de linha de tablèu accessibla"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Es utilizat per notificar que l'entèsta de la linha del tablèu a cambiat"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Descripcion de linha de tablèu accessibla"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Es utilizat per notificar que la descripcion de la linha del tablèu a cambiat"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Resumit de tablèu accessible"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Es utilizat per notificar que lo resumit del tablèu a cambiat"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Objècte legenda de tablèu accessible"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Es utilizat per notificar que la legenda del tablèu a cambiat"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Nombre de ligams ipertèxtes accessibles"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Lo nombre de ligams contenguts per l'AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "fòrt feble"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "feble"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "acceptable"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "fòrt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "plan fòrt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "fòrt bas"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "mejan"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "elevat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "fòrt elevat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "fòrt marrit"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "marrit"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "fòrt bon"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "optimal"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "L'aplicacion existís pas mai"
 
-#: ../atspi/atspi-misc.c:1832
-msgid "Attempted synchronous call where prohibited"
-msgstr "La temptativa d'apèl sincròn es interdita"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "La temptativa d'apèl sincròn es interdita"
index eaed22d..35051f6 100644 (file)
--- a/po/or.po
+++ b/po/or.po
@@ -1,13 +1,26 @@
+# #-#-#-#-#  or.po (at-spi2-core master)  #-#-#-#-#
 # Oriya translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Manoj Kumar Giri <mgiri@redhat.com>, 2011.
+# #-#-#-#-#  or.po (or)  #-#-#-#-#
+# translation of or.po to Oriya
+# Oriya translation of atk.HEAD.pot.
+# Copyright (C) 2005, 2006, 2009, Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# $Id: or.po,v 1.3 2006/12/15 05:17:55 liyuan Exp $
+#
+# Gora Mohanty <gora_mohanty@yahoo.co.in>, 2005, 2006.
+# Subhransu Behera <arya_subhransu@yahoo.co.in>, 2006.
+# Manoj Kumar Giri <mgiri@redhat.com>, 2009, 2011.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  or.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
-"cgi?product=at-spi&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&component=general\n"
 "POT-Creation-Date: 2011-02-12 19:29+0000\n"
 "PO-Revision-Date: 2011-03-17 15:23+0530\n"
 "Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
@@ -18,6 +31,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 1.1\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  or.po (or)  #-#-#-#-#\n"
+"Project-Id-Version: or\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-09-11 11:03+0000\n"
+"PO-Revision-Date: 2011-09-22 10:21+0530\n"
+"Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
+"Language-Team: Oriya <oriya-it@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms:  nplurals=2; plural=(n!=1);\n"
+"\n"
+"Language: or\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -84,8 +112,7 @@ msgstr "ଏହି ପ୍ରୟୋଗଟି ବର୍ତ୍ତମାନ ନାହ
 #, c-format
 msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
 msgstr ""
-"AT-SPI: %s କୁ ଅନ୍ତରାପୃଷ୍ଠ %s ରୁ କାଢ଼ିବା ସମୟରେ ଗୋଟିଏ ପ୍ରାଚଳକୁ ଆଶାକରାଯିଥିଲା; "
-"%s ମିଳିଲା\n"
+"AT-SPI: %s କୁ ଅନ୍ତରାପୃଷ୍ଠ %s ରୁ କାଢ଼ିବା ସମୟରେ ଗୋଟିଏ ପ୍ରାଚଳକୁ ଆଶାକରାଯିଥିଲା; %s ମିଳିଲା\n"
 
 #: ../atspi/atspi-misc.c:1136
 #, c-format
@@ -110,12 +137,582 @@ msgstr "କଢ଼ାଯୋଗ୍ଯ ବିଷୟବସ୍ତୁକୁ କାର
 msgid ""
 "called atspi_event_listener_register_from_callback with a NULL event_type"
 msgstr ""
-"atspi_event_listener_register_from_callback କୁ ଗୋଟିଏ NULL event_type ସହିତ "
-"ଡà¬\95ା à¬¯à¬¾à¬\87à¬\9bି"
+"atspi_event_listener_register_from_callback କୁ ଗୋଟିଏ NULL event_type ସହିତ ଡକା "
+"ଯାଇଛି"
 
 #: ../atspi/atspi-event-listener.c:777
 #, c-format
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "ସଙ୍କେତ %s ପାଇଁ ଅନ୍ତରାପୃଷ୍ଠ %s ରୁ ଅବୈଧ ହସ୍ତାକ୍ଷର %s ପାଇଛି\n"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "ବଚ୍ଛିତ ସଂଯୋଗ"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "ନିର୍ଦ୍ଦିଷ୍ଟ କରେ ଏ.ଟି.କେ.ହାଇପରସଂଯୋଗ ବସ୍ତୁ ବଛାଯାଇଛି କି ନାହିଁ"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "ସ୍ଥିରକର ସଂଖ୍ଯା"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "ଏ.ଟି.କେ.ହାଇପରସଂଯୋଗ ବସ୍ତୁ ସହିତ ସଂଯୁକ୍ତ ସ୍ଥିରକର ସଂଖ୍ଯା"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "ଶେଷ ଅନୁକ୍ରମଣିକା"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "ଏ.ଟି.କେ.ହାଇପରସଂଯୋଗ ବସ୍ତୁର ଶେଷ ଅନୁକ୍ରମଣିକା"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "ପ୍ରାରମ୍ଭିକ ଅନୁକ୍ରମଣିକା"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "ଏ.ଟି.କେ.ହାଇପରସଂଯୋଗ ବସ୍ତୁର ପ୍ରାରମ୍ଭିକ ଅନୁକ୍ରମଣିକା"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "ଅବୈଧ"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ତ୍ବରକ ଚିହ୍ନକ"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "ଚେତାବନୀ"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "ଜୀବନାୟନ"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "ତୀର"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "କାଲେଣ୍ଡର"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "ଅଙ୍କନ କ୍ଷେତ୍ର"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "ତନଖି ବାକ୍ସ"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "ତନଖି ମେନୁ ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "ରଙ୍ଗ ଚୟକ"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "ସ୍ତମ୍ଭ ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "ସମ୍ମିଳିତ ବାକ୍ସ"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "ତାରୀଖ ସମ୍ପାଦକ"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ଡେସ୍କଟପ ଚିତ୍ରସଙ୍କେତ"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ଡେସ୍କଟପ ବନ୍ଧେଇ"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "ଡାଏଲ"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "ସଂଳାପ"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ଡିରେକ୍ଟୋରି ଝରକା"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "ଅଙ୍କନ କ୍ଷେତ୍ର"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ଫାଇଲ ଚୟକ"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "ଭରଣ ବସ୍ତୁ"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ଅକ୍ଷରରୂପ ଚୟକ"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ବନ୍ଧେଇ"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "କାଚ ବନ୍ଧେଇ"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "ଏଚ.ଟି.ଏମ.ଏଲ. ଧାରକ"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ଚିତ୍ରସଙ୍କେତ"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "ଚିତ୍ର"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ଆଭ୍ଯନ୍ତରୀଣ ବନ୍ଧେଇ"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "ଚିହ୍ନକ"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "ବହୁସ୍ତର ଝରକା"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "ତାଲିକା"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "ତାଲିକା ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "ମେନୁ"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "ମେନୁ ପଟି"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "ମେନୁ ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "ପସନ୍ଦ ଝରକା"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "ପୃଷ୍ଠା ଟାବ"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "ପୃଷ୍ଠା ଟାବର ତାଲିକା"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "ଫଳକ"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "ପ୍ରବେଶ ସଙ୍କେତ ପାଠ୍ଯ"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "ପପ୍ଅପ ମେନୁ"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ପ୍ରଗତି ସୂଚକ"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "ଚିପା ଚାବି"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "ରେଡିଓ ଚାବି"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "ରେଡିଓ ତାଲିକା ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "ମୂଳ ଝରକା"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "ଧାଡ଼ି ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "ଦୃଶ୍ଯବଦଳା ପଟି"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "ଦୃଶ୍ଯବଦଳା ଝରକା"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "ବିଭାଜକ"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "ସର୍ପକ"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "ବିଭକ୍ତ ଝରକା"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "ଘୂର୍ଣନ ଚାବି"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "ଅବସ୍ଥିତି ପଟି"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "ସାରଣୀ"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "ସାରଣୀ କୋଷ"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "ସାରଣୀ ସ୍ତମ୍ଭ ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "ସାରଣୀ ଧାଡ଼ି ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "ବିଚ୍ଛିନ୍ନ ତାଲିକା ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "ଟର୍ମିନାଲ"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "ପାଠ୍ଯ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ଅଦଳବଦଳ ଚାବି"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "ସାଧନ ପଟି"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "ଉପକରଣ ସୂଚନା"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ବୃକ୍ଷ"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ବୃକ୍ଷ ସାରଣୀ"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "ଅଜଣା"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "ଦୃଶ୍ଯ ସଂଯୋଗୀ"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "ୱିଣ୍ଡୋ"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "ପାଦିକା"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "ଅନୁଚ୍ଛେଦ"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "ଶାସକ"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "ପ୍ରୟୋଗ"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "ସ୍ବଂୟ ସମାପ୍ତି"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "ସମ୍ପାଦନ ପଟି"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "ସନ୍ନିବେଶିତ ଯନ୍ତ୍ରାଂଶ"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "ଭରଣ"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "ମାନଚିତ୍ର"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "ଦଲିଲ ବନ୍ଧେଇ"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "ପୃଷ୍ଠା"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "ଅଂଶ"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "ଅନାବଶ୍ଯକ ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ଫର୍ମ"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "ସଂଯୋଗ"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ନିବେଶ ପଦ୍ଧତି ୱିଣ୍ଡୋ"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "ସାରଣୀ ଧାଡ଼ି"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "ବୃକ୍ଷ ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "ଦଲିଲ ସ୍ପ୍ରେଡଶୀଟ"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "ଦଲିଲ ଉପସ୍ଥାପନା"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "ଦଲିଲ ପାଠ୍ୟ"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "ଦଲିଲ ୱେବ"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "ଦଲିଲ ଇମେଲ"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "ଟିପ୍ପଣୀ"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "ତାଲିକା ବାକ୍ସ"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "ସମୂହୀକରଣ"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "ଚିତ୍ର ମ୍ଯାପ"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "ବିଜ୍ଞପ୍ତି"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "ସୂଚନା ପଟି"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "ସୁଗମ ନାମ"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "ସହାୟକ ଟେକନିକି ପ୍ରବେଶାନୁମତି ପାଇଁ ସଜ୍ଜିତ ବସ୍ତୁ ଉଦାହରଣର ନାମ"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "ସୁଗମ ବର୍ଣ୍ଣନା"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "ସହାୟକ ଟେକନିକି ପ୍ରବେଶାନୁମତି ପାଇଁ ସଜ୍ଜିତ ବସ୍ତୁର ବର୍ଣ୍ଣନା"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "ସୁଗମ ପୂର୍ବଜ"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "ପୂର୍ବଜ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "ସୁଗମ ମୂଲ୍ଯ"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "ମୂଲ୍ଯ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "ସୁଗମ ଭୂମିକା"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "ଏହି ବସ୍ତୁର ସୁଗମ ଭୂମିକା"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "ସୁଗମ ସ୍ତର"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "ଏହି ବସ୍ତୁର ସୁଗମ ସ୍ତର"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "ସୁଗମ ଏମ.ଡି.ଆଇ. ମୂଲ୍ଯ"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "ଏହି ବସ୍ତୁର ସୁଗମ ଏମ.ଡି.ଆଇ. ମୂଲ୍ଯ"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "ସୁଗମ ସାରଣୀ ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ସାରଣୀ ଶୀର୍ଷକ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ; ଏହି ଗୁଣଧର୍ମ ବ୍ଯବହାର କରିବା ଉଚିତ ନୁହେଁ. ଏହା "
+"ବଦଳରେ ସୁଗମ ସାରଣୀ-ଶୀର୍ଷକ-ବସ୍ତୁ ବ୍ଯବହାର କରନ୍ତୁ"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "ସୁଗମ ସାରଣୀ ସ୍ତମ୍ଭ ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "ସାରଣୀ ସ୍ତମ୍ଭ ଶୀର୍ଷକ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "ସୁଗମ ସାରଣୀ ସ୍ତମ୍ଭ ବର୍ଣ୍ଣନା"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "ସାରଣୀ ସ୍ତମ୍ଭ ବର୍ଣ୍ଣନା ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "ସୁଗମ ସାରଣୀ ଧାଡ଼ି ଶୀର୍ଷକ"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "ସାରଣୀ ଧାଡ଼ି ଶୀର୍ଷକ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "ସୁଗମ ସାରଣୀ ଧାଡ଼ି ବର୍ଣ୍ଣନା"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "ସାରଣୀ ଧାଡ଼ି ବର୍ଣ୍ଣନା ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "ସୁଗମ ସାରଣୀ ସାରାଂଶ"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "ସାରଣୀ ସାରାଂଶ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "ସୁଗମ ସାରଣୀ ଶୀର୍ଷକ ବସ୍ତୁ"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "ସାରଣୀ ଶୀର୍ଷକ ବସ୍ତୁ ବଦଳିଯାଇଥିବାର ସୂଚନା ପ୍ରଦାନ କରେ"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "ସୁଗମ ହାଇପରପାଠ୍ଯର ସଂଯୋଗର ସଂଖ୍ଯା"
 
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ସାମ୍ପ୍ରତିକ ଏଟିକେହାଇପରପାଠ୍ଯର ସଂଯୋଗର ସଂଖ୍ଯା"
index 5453c10..fdcde1e 100644 (file)
--- a/po/pa.po
+++ b/po/pa.po
+# #-#-#-#-#  pa.po (at-spi2-core master)  #-#-#-#-#
 # Punjabi translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
+# #-#-#-#-#  pa.po (atk.HEAD)  #-#-#-#-#
+# translation of atk.HEAD.po to Punjabi
+# translation of atk.HEAD.pa.po to Punjabi
+# translation of pa.po to Punjabi
+# Copyright (C) 2004 THE atk.HEAD'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk.HEAD package.
+#
 # A S Alam <aalam@users.sf.net>, 2011, 2014.
+# Amanpreet Singh Alam <amanlinux@netscape.net>, 2004.
+# Amanpreet Singh Alam <aalam@redhat.com>, 2004.
+# Amanpreet Singh Alam <aalam@users.sf.net>, 2005,2006.
+# A S Alam <aalam@users.sf.net>, 2009, 2011, 2014, 2023.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-09-21 08:49-0500\n"
-"Last-Translator: A S Alam <aalam@users.sf.net>\n"
-"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
+"Project-Id-Version: atk.HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-08-05 16:00+0000\n"
+"PO-Revision-Date: 2023-09-02 08:41-0700\n"
+"Last-Translator: A S Alam <aalam@satluj.org>\n"
+"Language-Team: Punjabi <kde-i18n-doc@kde.org>\n"
 "Language: pa\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.5\n"
+"#-#-#-#-#  pa.po (at-spi2-core master)  #-#-#-#-#\n"
+"X-Generator: Lokalize 23.04.3\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  pa.po (atk.HEAD)  #-#-#-#-#\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "ਚੁਣਿਆ ਲਿੰਕ"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "ਦੱਸੋ ਕਿ AtkHyperlink ਆਬਜੈਕਟ ਚੁਣਿਆ ਜਾਵੇ"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "ਅੰਕਰ ਦੀ ਗਿਣਤੀ"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink ਇਕਾਈ ਨਾਲ ਸੰਬੰਧਤ ਅੰਕਰਾਂ ਦੀ ਗਿਣਤੀ"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "ਅੰਤ ਇੰਡੈਕਸ"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink ਇਕਾਈ ਦੇ ਇੰਡੈਕਸ ਦਾ ਅੰਤ"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "ਸ਼ੁਰੂ ਇੰਡੈਕਸ"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink ਇਕਾਈ ਦਾ ਇੰਡੈਕਸ ਸ਼ੁਰੂ"
+
+#: atk/atkobject.c:268
+msgid "Accessible Name"
+msgstr "ਪਹੁੰਚ ਨਾਂ"
+
+#: atk/atkobject.c:269
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "ਸਹਾਇਕ ਤਕਨੀਕ ਪਹੁੰਚ ਲਈ ਮੌਜੂਦਾ ਆਬਜੈਕਟ ਦਾ ਫਾਰਮੈਟ ਨਾਂ"
+
+#: atk/atkobject.c:275
+msgid "Accessible Description"
+msgstr "ਪਹੁੰਚਯੋਗ ਵੇਰਵਾ"
+
+#: atk/atkobject.c:276
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "ਸਹਾਇਕ ਤਕਨੀਕ ਲਈ ਆਬਜੈਕਟ ਦਾ ਵੇਰਵਾ ਫਾਰਮੈਟ ਕੀਤਾ"
+
+#: atk/atkobject.c:282
+msgid "Accessible Parent"
+msgstr "ਪਹੁੰਚਯੋਗ ਮੋਢੀ"
+
+#: atk/atkobject.c:283
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "atk_object_get_parent() ਵਲੋਂ ਮੌਜੂਦਾ ਪਹੁੰਚਯੋਗ ਦੇ ਪੇਰੈਂਟ"
+
+#: atk/atkobject.c:299
+msgid "Accessible Value"
+msgstr "ਪਹੁੰਚਯੋਗ ਮੁੱਲ"
+
+#: atk/atkobject.c:300
+msgid "Is used to notify that the value has changed"
+msgstr "ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਮੁੱਲ ਤਬਦੀਲ ਹੋ ਗਿਆ ਹੈ"
+
+#: atk/atkobject.c:308
+msgid "Accessible Role"
+msgstr "ਪਹੁੰਚਯੋਗ ਰੋਲ"
+
+#: atk/atkobject.c:309
+msgid "The accessible role of this object"
+msgstr "ਇਸ ਇਕਾਈ ਦਾ ਪਹੁੰਚਯੋਗ ਰੋਲ"
+
+#: atk/atkobject.c:316
+msgid "Accessible Layer"
+msgstr "ਪਹੁੰਚਯੋਗ ਲੇਅਰ"
+
+#: atk/atkobject.c:317
+msgid "The accessible layer of this object"
+msgstr "ਇਸ ਆਬਜੈਕਟ ਦਾ ਪਹੁੰਚਯੋਗ ਲੇਅਰ"
+
+#: atk/atkobject.c:325
+msgid "Accessible MDI Value"
+msgstr "ਪਹੁੰਚਯੋਗ MDI ਮੁੱਲ"
+
+#: atk/atkobject.c:326
+msgid "The accessible MDI value of this object"
+msgstr "ਇਸ ਆਬਜੈਕਟ ਦਾ ਪਹੁੰਚਯੋਗ MDI"
+
+#: atk/atkobject.c:342
+msgid "Accessible Table Caption"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਸੁਰਖੀ"
+
+#: atk/atkobject.c:343
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤੀ ਜਾਂਦੀ ਹੈ ਕਿ ਟੇਬਲ ਸੁਰਖੀ ਬਦਲ ਗਈ।ਇਹ ਵਿਸ਼ੇਸਤਾ ਵਰਤੀ ਨਹੀ ਜਾਣੀ"
+" ਚਾਹੀਦੀ ਹੈ। "
+"ਇਸ ਦੀ ਬਜਾਏ ਪਹੁੰਚ-ਟੇਬਲ-ਸੁਰਖੀ-ਇਕਾਈ ਇਸਤੇਮਾਲ ਕਰੋ।"
+
+#: atk/atkobject.c:357
+msgid "Accessible Table Column Header"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਕਾਲਮ ਹੈੱਡਰ"
+
+#: atk/atkobject.c:358
+msgid "Is used to notify that the table column header has changed"
+msgstr "ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਣਾ ਹੈ ਕਿ ਟੇਬਲ ਕਾਲਮ ਹੈੱਡਰ ਤਬਦੀਲ ਹੋ ਗਿਆ ਹੈ"
+
+#: atk/atkobject.c:373
+msgid "Accessible Table Column Description"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਕਾਲਮ ਵੇਰਵਾ"
+
+#: atk/atkobject.c:374
+msgid "Is used to notify that the table column description has changed"
+msgstr "ਇਹ ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਟੇਬਲ ਕਾਲਮ ਵੇਰਵਾ ਤਬਦੀਲ ਹੋ ਗਿਆ ਹੈ"
+
+#: atk/atkobject.c:389
+msgid "Accessible Table Row Header"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਕਤਾਰ ਹੈੱਡਰ"
+
+#: atk/atkobject.c:390
+msgid "Is used to notify that the table row header has changed"
+msgstr "ਇਹ ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਟੇਬਲ ਕਤਾਰ ਹੈੱਡਰ ਤਬਦੀਲ ਹੋ ਗਿਆ ਹੈ"
+
+#: atk/atkobject.c:404
+msgid "Accessible Table Row Description"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਕਤਾਰ ਵੇਰਵਾ"
+
+#: atk/atkobject.c:405
+msgid "Is used to notify that the table row description has changed"
+msgstr "ਇਹ ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਟੇਬਲ ਕਤਾਰ ਵੇਰਵਾ ਤਬਦੀਲ ਹੋ ਗਿਆ ਹੈ"
+
+#: atk/atkobject.c:411
+msgid "Accessible Table Summary"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਸੰਖੇਪ"
+
+#: atk/atkobject.c:412
+msgid "Is used to notify that the table summary has changed"
+msgstr "ਇਹ ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਟੇਬਲ ਸੰਖੇਪ ਤਬਦੀਲ ਹੋ ਗਈ ਹੈ"
+
+#: atk/atkobject.c:418
+msgid "Accessible Table Caption Object"
+msgstr "ਪਹੁੰਚਯੋਗ ਟੇਬਲ ਨਾਂ ਇਕਾਈ"
+
+#: atk/atkobject.c:419
+msgid "Is used to notify that the table caption has changed"
+msgstr "ਇਹ ਸੂਚਨਾ ਦੇਣ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਕਿ ਟੇਬਲ ਨਾਂ ਤਬਦੀਲ ਹੋ ਗਿਆ ਹੈ"
+
+#: atk/atkobject.c:425
+msgid "Number of Accessible Hypertext Links"
+msgstr "ਪਹੁੰਚਯੋਗ ਹਾਈਪ੍ਰਟੈਕਸਟ ਲਿੰਕਾਂ ਦੀ ਗਿਣਤੀ"
+
+#: atk/atkobject.c:426
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ਮੌਜੂਦਾ AtkHypertext ਵਿੱਚ ਲਿੰਕਾਂ ਦੀ ਗਿਣਤੀ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "ਬਹੁਤ ਹਲਕਾ"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "ਹਲਕਾ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "ਮਨਜ਼ੂਰਯੋਗ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "ਮਜ਼ਬੂਤ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "ਬਹੁਤ ਮਜ਼ਬੂਤ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "ਬਹੁਤ ਘੱਟ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "ਮੱਧਮ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "ਵੱਧ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "ਬਹੁਤ ਵੱਧ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "ਬਹੁਤ ਖ਼ਰਾਬ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "ਖਰਾਬ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "ਚੰਗਾ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "ਬਹੁਤ ਚੰਗਾ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "ਸਭ ਤੋਂ ਵਧੀਆ"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1229 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "ਐਪਲੀਕੇਸ਼ਨ ਹੁਣ ਮੌਜੂਦ ਨਹੀਂ ਹੈ"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "ਸੈਕਰੋਨਾਈਸ ਕਾਲ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ, ਜਿੱਥੇ ਪਾਬੰਦੀ ਹੈ"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "ਅਢੁੱਕਵਾਂ"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "ਐਕਸਰਲੇਸਟਰ ਲੇਬਲ"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "ਚੇਤਾਵਨੀ"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "ਐਨੀਮੇਸ਼ਨ"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "ਤੀਰ"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "ਕੈਲੰਡਰ"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "ਕੈਨਵਸ"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "ਚੈਕ-ਬਕਸਾ"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "ਚੈਕ ਮੇਨੂ ਆਈਟਮ"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "ਰੰਗ ਚੋਣਕਾਰ"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "ਕਾਲਮ ਹੈੱਡਰ"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "ਕੰਬੋ ਬਾਕਸ"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "ਮਿਤੀ-ਸੰਪਾਦਕ"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "ਡੈਸਕਟਾਪ ਆਈਕਾਨ"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "ਡੈਸਕਟਾਪ ਫਰੇਮ"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "ਡਾਇਲ"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "ਡਾਈਲਾਗ"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "ਡਾਇਰੈਕਟਰੀ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "ਡਰਾਇੰਗ ਖੇਤਰ"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "ਫਾਇਲ ਚੋਣਕਾਰ"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "ਭਰਨ ਵਾਲਾ"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "ਫੋਂਟ ਚੋਣਕਾਰ"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "ਫਰੇਮ"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "ਗਲਾਸ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html ਬਕਸਾ"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "ਆਈਕਾਨ"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "ਚਿੱਤਰ"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "ਅੰਦਰੂਨੀ ਫਰੇਮ"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "ਲੇਬਲ"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "ਪਰਤਦਾਰ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "ਲਿਸਟ"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "ਲਿਸਟ ਆਈਟਮ"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "ਮੇਨੂ"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "ਮੇਨੂ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:84
+#| msgid "push button"
+msgid "menu button"
+msgstr "ਮੇਨੂ ਬਟਨ"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "ਮੇਨੂ ਆਈਟਮ"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "ਚੋਣ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "ਪੇਜ਼ ਟੈਬ"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "ਪੇਜ਼ ਟੈਬ ਲਿਸਟ"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "ਪੈਨਲ"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "ਪਾਸਵਰਡ ਟੈਕਸਟ"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "ਪੋਪਅੱਪ ਮੇਨੂ"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "ਤਰੱਕੀ ਪੱਟੀ"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "ਦਬਾਉ ਬਟਨ"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "ਰੇਡੀਉ ਬਟਨ"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "ਰੇਡੀਉ ਮੇਨੂ ਆਈਟਮ"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "ਰੂਟ (root) ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "ਕਤਾਰ ਹੈੱਡਰ"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "ਸਕ੍ਰੋਲ ਪੱਟੀ"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "ਸਕ੍ਰੋਲ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "ਵੱਖਰੇਵਾਂ"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "ਸਲਾਈਡਰ"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "ਵੱਖ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "ਘੁੰਮਾਉ ਬਟਨ"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "ਹਾਲਤ-ਪੱਟੀ"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "ਟੇਬਲ"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "ਟੇਬਲ ਸੈੱਲ"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "ਟੇਬਲ ਕਾਲਮ ਹੈੱਡਰ"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "ਟੇਬਲ ਕਤਾਰ ਹੈੱਡਰ"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "ਵੱਖ ਹੋਣ ਵਾਲੀ ਮੇਨੂ ਇਕਾਈ"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "ਟਰਮੀਨਲ"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "ਟੈਕਸਟ"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "ਤਬਦੀਲ ਬਟਨ"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "ਟੂਲ ਬਾਰ"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "ਟੂਲ ਟਿੱਪ"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "ਲੜੀ"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "ਲੜੀ ਟੇਬਲ"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "ਅਣਜਾਣ"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "ਵਿਊਪੋਰਟ"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "ਵਿੰਡੋ"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "ਹੈੱਡਰ"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "ਫੁੱਟਰ"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "ਪੈਰ੍ਹਾ"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "ਰੂਲਰ"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "ਐਪਲੀਕੇਸ਼ਨ"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "ਸਵੈ-ਪੂਰਨ"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "ਸੋਧ ਪੱਟੀ"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "ਇੰਬੈੱਡ ਭਾਗ"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "ਐਂਟਰੀ"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "ਚਾਰਟ"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "ਸੁਰਖੀ"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "ਡੌਕੂਮੈਂਟ ਫਰੇਮ"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "ਹੈੱਡਿੰਗ"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "ਪੇਜ਼"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "ਸੈਕਸ਼ਨ"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "ਦੂਹਰਾ ਆਬਜੈਕਟ"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "ਫਾਰਮ"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "ਲਿੰਕ"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "ਇੰਪੁੱਟ ਢੰਗ ਵਿੰਡੋ"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "ਟੇਬਲ ਕਤਾਰ"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "ਲੜੀ ਆਈਟਮ"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "ਡੌਕੂਮੈਂਟ ਸਪਰੈਡਸ਼ੀਟ"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "ਡੌਕੂਮੈਂਟ ਪਰਿਜੈਂਟੇਸ਼ਨ"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "ਡੌਕੂਮੈਂਟ ਟੈਕਸਟ"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "ਡੌਕੂਮੈਂਟ ਵੈੱਬ"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "ਡੌਕੂਮੈਂਟ ਈਮੇਲ"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "ਟਿੱਪਣੀ"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "ਲਿਸਟ ਬਾਕਸ"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "ਗਰੁੱਪਿੰਗ"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "ਚਿੱਤਰ ਮੈਪ"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "ਨੋਟੀਫਿਕੇਸ਼ਨ"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "ਜਾਣਕਾਰੀ ਬਾਹੀ"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "ਲੈਵਲ ਪੱਟੀ"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "ਟਾਈਟਲ ਪੱਟੀ"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "ਬਲਾਕ ਕੋਟ"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "ਆਡੀਓ"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "ਵਿਡੀਓ"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "ਪਰਿਭਾਸ਼ਾ"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "ਲੇਖ"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "ਲੈਂਡਮਾਰਕ"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "ਲਾਗ"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "ਸ਼ਾਮਿਆਨਾ"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "ਗਣਿਤ"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "ਰੇਟਿੰਗ"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "ਟਾਈਮਰ"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "ਵੇਰਵਾ ਸੂਚੀ"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "ਵੇਰਵ ਸ਼ਬਦ"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "ਵੇਰਵਾ ਮੁੱਲ"
+
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "ਸੈਕਰੋਨਾਈਸ ਕਾਲ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ, ਜਿੱਥੇ ਪਾਬੰਦੀ ਹੈ"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: RemoveAccessible ਲਈ ਅਣਜਾਣ %s ਦਸਤਖਤ"
@@ -89,3 +882,6 @@ msgstr "ਸੈਕਰੋਨਾਈਸ ਕਾਲ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤ
 
 #~ msgid "AT-SPI: Couldn't register with bus: %s\n"
 #~ msgstr "AT-SPI: ਬਸ ਨਾਲ ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ: %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "ਜੇ ਮੋਢੀ (parent) ਬਦਲ ਗਿਆ ਹੈ ਤਾਂ ਇਹ ਟਿੱਪਣੀ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ  "
index 0682229..c324bc4 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -1,16 +1,17 @@
 # Polish translation for at-spi2-core.
-# Copyright © 2003-2014 the at-spi2-core authors.
+# Copyright © 2003-2022 the at-spi2-core authors.
 # This file is distributed under the same license as the at-spi2-core package.
-# Artur Flinta <aflinta@at.kernel.pl>, 2003.
-# Piotr Drąg <piotrdrag@gmail.com>, 2011-2014.
-# Aviary.pl <community-poland@mozilla.org>, 2011-2014.
+# Zbigniew Chyla <chyla@alice.ci.pwr.wroc.pl>, 2003.
+# Artur Flinta <aflinta@at.kernel.pl>, 2003-2006.
+# Piotr Drąg <piotrdrag@gmail.com>, 2010-2022.
+# Aviary.pl <community-poland@mozilla.org>, 2009-2022.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-08-22 20:42+0200\n"
-"PO-Revision-Date: 2014-03-02 18:35+0100\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-15 15:18+0200\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <community-poland@mozilla.org>\n"
 "Language: pl\n"
@@ -20,11 +21,789 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2);\n"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1073
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Zaznaczony odnośnik"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Określa, czy obiekt AtkHyperlink jest zaznaczony"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Liczba zakotwiczeń"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Liczba zakotwiczeń powiązanych z obiektem AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Indeks końcowy"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Indeks końcowy obiektu AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Indeks początkowy"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Indeks początkowy obiektu AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "nieprawidłowy"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "etykieta z klawiszem skrótu"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "alarm"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animacja"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "strzałka"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "kalendarz"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "płótno"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "przycisk opcji"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "element menu wyboru"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "okno wyboru kolorów"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "nagłówek kolumny"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "wejście z opcjami"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "edytor dat"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "ikona pulpitu"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "ramka pulpitu"
+
+# chyba o to może chodzić
+# ew. wybieranie numeru.
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "tarcza liczbowa"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "okno dialogowe"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "obszar katalogu"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "obszar rysowania"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "okno wyboru pliku"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "wypełniacz"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "okno wyboru czcionki"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "ramka"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "obszar szklany"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "kontener HTML"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ikona"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "obraz"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "ramka wewnętrzna"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "etykieta"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "obszar warstwowy"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "element listy"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "pasek menu"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "przycisk menu"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "element menu"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "obszar opcji"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "zakładka strony"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lista zakładek stron"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "tekst hasła"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "menu podręczne"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "pasek postępu"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "przycisk"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "przycisk radiowy"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "radiowy element menu"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "obszar główny"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "nagłówek wiersza"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "pasek przewijania"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "obszar przewijania"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "separator"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "suwak"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "obszar podziału"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "wejście liczbowe"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "pasek stanu"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tabela"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "komórka tabeli"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "nagłówek kolumny tabeli"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "nagłówek wiersza tabeli"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "odrywający element menu"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "napis"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "przycisk przełączania"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "pasek narzędziowy"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "podpowiedź"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "drzewo"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "tabela drzewiasta"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "nieznany"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "obszar wyświetlania"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "okno"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "nagłówek"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "stopka"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "akapit"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "linia"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "program"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "automatyczne uzupełnianie"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "pasek edycji"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "element osadzony"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "wejście"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "wykres"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "podpis"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "ramka dokumentu"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "nagłówek"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "strona"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "sekcja"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "obiekt nadmiarowy"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formularz"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "odnośnik"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "okno metody wprowadzania"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "wiersz tabeli"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "element drzewa"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "arkusz kalkulacyjny dokumentu"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "prezentacja dokumentu"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "tekst dokumentu"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "witryna dokumentu"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "adres e-mail dokumentu"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "komentarz"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "przycisk listy"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "grupowanie"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "mapa obrazu"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "powiadomienie"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "pasek informacji"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "pasek poziomu"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "pasek tytułowy"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "cytat blokowy"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "dźwięk"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "nagranie wideo"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definicja"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "artykuł"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "punkt orientacyjny"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "dziennik"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "pływający tekst"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matematyka"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "ocena"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "stoper"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "lista opisu"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "termin opisu"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "wartość opisu"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Nazwa obiektu dostępności"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nazwa instancji obiektu, sformatowana dla dostępu technologii wspierających"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Opis obiektu dostępności"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Opis obiektu, sformatowany dla dostępu technologii wspierających"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Nadrzędny obiekt dostępności"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Obiekt nadrzędny obecnego obiektu dostępności, zwrócony przez "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Wartość obiektu dostępności"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Jest używany do powiadamiania o zmianie wartości obiektu"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Rola dostępności"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Rola dostępności tego obiektu"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Warstwa dostępności"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Warstwa dostępności tego obiektu"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Wartość dostępności MDI"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Wartość dostępności MDI tego obiektu"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Nagłówek tabeli dostępności"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Jest używane do powiadamiania o zmianie nagłówka tabeli. Zamiast tej "
+"właściwości należy używać obiektu nagłówka tabeli dostępności"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Nagłówek kolumny tabeli dostępności"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Jest używane do powiadamiania o zmianie nagłówka kolumny tabeli"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Opis kolumny tabeli dostępności"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Jest używane do powiadamiania o zmianie opisu kolumny tabeli"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Nagłówek wiersza tabeli dostępności"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Jest używane do powiadamiania o zmianie nagłówka wiersza tabeli"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Opis wiersza tabeli dostępności"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Jest używane do powiadamiania o zmianie opisu wiersza tabeli"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Zestawienie tabeli dostępności"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Jest używane do powiadamiania o zmianie zestawienia tabeli"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Obiekt nagłówka tabeli dostępności"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Jest używane do powiadamiania o zmianie nagłówka tabeli"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Liczba hipertekstowych odnośników dostępności"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Liczba odnośników posiadanych przez bieżący obiekt AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "bardzo słabe"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "słabe"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "akceptowalne"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "silne"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "bardzo silne"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "bardzo niskie"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "średnie"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "wysokie"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "bardzo wysokie"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "bardzo złe"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "złe"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "dobre"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "bardzo dobre"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "najlepsze"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Program już nie istnieje"
-
-#: ../atspi/atspi-misc.c:1832
-msgid "Attempted synchronous call where prohibited"
-msgstr "Próbowano synchronicznego wywołania tam, gdzie jest to zabronione"
diff --git a/po/ps.po b/po/ps.po
new file mode 100644 (file)
index 0000000..03b3fbb
--- /dev/null
+++ b/po/ps.po
@@ -0,0 +1,529 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk.head\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2008-07-11 08:31-0800\n"
+"Last-Translator: Zabeeh Khan <zabeehkhan@gmail.com>\n"
+"Language-Team: Pashto <pathanisation@googlegroups.com>\n"
+"Language: ps\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Pashto, Pushto\n"
+"X-Poedit-Country: AFGHANISTAN\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "ټاکل شوې تړنه"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "څيز ټاکل شوی وي Atk-ځانګړې کوي چې که چېرې لوپېوند"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "د استلو شمېر"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "څيز پورې نښتي وي Atk-د هغو استلو شمېر چې د لوپېوند"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "پای لړيال"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "څيز پای لړيال Atk-د لوپېوند"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "پېل لړيال"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "څيز پېل لړيال Atk-د لوپېوند"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "ناسم"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ګړندۍ کوونکې نښکه"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "خبرول"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "سېلن"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "غشی"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "کليز"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "ټوکر"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "خوښ بکس"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "خوښ غورنۍ توکی"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "رنګ ټاکونکی"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "د ستن سرۍ"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "تړنګ بکس"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "نېټه سمونګر"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "د سرپاڼې انځورن"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "د سرپاڼې چوکاټ"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "وهل"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "کړکۍ"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "د درکموند چوکاټ"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "د انځورونې سېمه"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "دوتنه ټاکونکی"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "ډکونی"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ليکبڼه ټاکونکی"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "چوکاټ"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "ښيښه چوکاټ"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "لرونکی html"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "انځورن"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "انځور"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "دننی چوکاټ"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "نښکه"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "لهر شوی چوکاټ"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "لړ"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "لړ توکی"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "غورنۍ"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "غورنۍ پټه"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "غورنۍ توکی"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "غوراوی چوکاټ"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "مخ ټوپ"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "د مخ ټوپ لړ"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "چوکاټ"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "تېرنويې ليکنه"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "بړبوکیزه غورنۍ"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "پرمختګ پټه"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "تمب تڼۍ"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "رېډيو تڼۍ"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "رېډيو غورنۍ توکی"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "وليز چوکاټ"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "کيل سرۍ"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "رغښت پټه"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "رغښت چوکاټ"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "بېلوونکی"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "ښويونى"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "چاودون چوکاټ"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "چورلښت تڼۍ"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "انکړ پټه"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "لښتيال"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "لښتيال خونه"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "د لښتيال ستن سرۍ"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "د لښتيال کيل سرۍ"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "چاودېدونکی غورنۍ توکی"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "پايالی"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "ليکنه"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "څرنګتیاونج تڼۍ"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "توکپټه"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "توک نکته"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "ونه"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "ونه لښتيال"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "ناڅرګند"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "درشل ليد"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "کړکۍ"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "سرۍ"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "پښۍ"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "پېرېګراف"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "خبرول"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "کاريال"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "خپلبشپړېدل"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "سمون پټه"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "راتاو رغتوک"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "ننوت"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "څرګندمن"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "نیونګه"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr "لاسوند چوکاټ"
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "سريز"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "مخ"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "برخه"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr "زياتي څيز"
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "ډکنۍ"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "لاسرسی نوم"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "د څيز د بېلګې نوم چې د مرستندويه ټېکنالوجۍ لاسرس لپاره بڼول شوې وي"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "لاسرسی سپړاوی"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "د کوم څيز سپړاوی، چې د مرستندويه ټېکنالوجۍ لاسرس لپاره بڼول شوې وي"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "لاسرسی پلرين"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې پلرين بدل شوی دی"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "لاسرسی ارزښت"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "د دې لپاره کارول کيږي چې وښيي چې ارزښت بدل شوی"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "لاسرسې دنده"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "د دې څيز لاسرسې دنده"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "لاسرسی لهر"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "د دې څيز لاسرسی لهر"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "ارزښت MDI لاسرسی"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "لاسرسی ارزښت MDI د دې څيز د"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "لاسرسې لښتيال نيونګه"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال نيونګه بدله شوې ده؛ د دې "
+"ځانتيا کارول پکار نه دي. د دې پر ځای لاسرسی-لښتيال-نيونګه-څيز کارول پکار دي"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "لاسرسې لښتيال ستن سرۍ"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال ستن سرۍ بدل شوی دی"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "لاسرسی لښتيال ستن سپړاوی"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال ستن سپړاوی بدل شوی دی"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "لاسرسې لښتيال کيل سرۍ"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال کيل سرۍ بدل شوی دی"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "لاسرسی لښتيال کيل سپړاوی"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال کيل سپړاوی بدل شوی دی"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "لاسرسی لښتيال لنډيز"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال لنډيز بدل شوی دی"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "لاسرسی لښتيال نيونګه څيز"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "د دې لپاره کارول کيږي چې خبر ورکړي چې د لښتيال نيونګه بدله شوې ده"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "د لاسرسو لومتن تړنو شمېر"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "لري Atk-هغه تړنو شمېر چې اوس يې لومتن"
index 9953a00..c233f8c 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
 # Portuguese translation for at-spi2-core.
-# Copyright © 2011, 2014 at-spi2-core
+# Copyright © 2011-2022 at-spi2-core.
 # This file is distributed under the same license as the at-spi2-core package.
-# Duarte Loreto <happyguy_pt@hotmail.com>, 2011, 2014.
+# Duarte Loreto <happyguy_pt@hotmail.com>, 2003, 2004, 2006, 2007, 2009, 2011, 2013, 2014.
+# Rui Batista <ruiandrebatista@gmail.com>, 2009.
 # Pedro Albuquerque <palbuquerque73@openmailbox.com>, 2015.
+# Hugo Carvalho <hugokarvalho@hotmail.com>, 2020, 2021, 2022.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: 3.12\n"
 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
-"POT-Creation-Date: 2020-05-27 15:50+0000\n"
-"PO-Revision-Date: 2020-06-24 11:33+0100\n"
-"Last-Translator: Manuela Silva <mmsrs@sky.com>\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-07-26 14:57+0100\n"
+"Last-Translator: Hugo Carvalho <hugokarvalho@hotmail.com>\n"
 "Language-Team: Português <palbuquerque73@openmailbox.com>\n"
 "Language: pt\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1.1\n"
+"X-Generator: Gtranslator 2.91.6\n"
+
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Ligação selecionada"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica se o objeto AtkHyperlink está selecionado"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Número de âncoras"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "O número de âncoras associadas com o objeto AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Índice final"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "O índice final do objeto AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Índice inicial"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "O Índice inicial do objeto AtkHyperlink"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "inválido"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "rótulo de atalho"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "alerta"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "animação"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "seta"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "calendário"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "tela"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "caixa de verificação"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "item de menu de verificação"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "seletor de cores"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "cabeçalho de coluna"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "caixa de combinação"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "editor de datas"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "ícone de área de trabalho"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "moldura da área de trabalho"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "botão giratório"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "diálogo"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "painel de pasta"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "área de desenho"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "seletor de ficheiro"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "ferramenta de preencher"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "seletor de letra"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "moldura"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "painel transparente"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "contentor de html"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "ícone"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "imagem"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "moldura interna"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "rótulo"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "painel em camadas"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "item de lista"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "barra de menu"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "botão do menu"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "item de menu"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "painel de opções"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "separador de página"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "lista de separadores de página"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "painel"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "texto da senha"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "menu contextual"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "barra de progresso"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "botão de pressão"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "botão rádio"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "item de menu rádio"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "painel de raiz"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "cabeçalho de linha"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "barra de rolamento"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "painel de rolamento"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "deslizador"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "painel dividido"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "botão rotativo"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "barra de estado"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "tabela"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "célula de tabela"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "cabeçalho de coluna de tabela"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "cabeçalho de linha de tabela"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "item de menu destacável"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "texto"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "botão de alternar"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "barra de ferramentas"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "dica"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "árvore"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "tabela de árvore"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "desconhecido"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "zona de vista"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "janela"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "cabeçalho"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "rodapé"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "parágrafo"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "régua"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "aplicação"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "autocompletar"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "barra de edição"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "componente embutido"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "entrada"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "gráfico"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "legenda"
 
-#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1075 atspi/atspi-value.c:111
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "moldura de documento"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "título"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "página"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "secção"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "objeto redundante"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "formulário"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "ligação"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "janela de método de introdução"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "linha de tabela"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "item de árvore"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "documento de folha de cálculo"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "documento de apresentação"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "documento de texto"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "documento web"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "documento de email"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "comentário"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "caixa de lista"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "agrupar"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "mapa de imagem"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "notificação"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "barra de informação"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "barra de nível"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "barra de título"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "citação"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "áudio"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "vídeo"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "definição"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "artigo"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "marco"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "registo"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "destaque"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "matemática"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "classificação"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "temporizador"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "lista de descrição"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "termo de descrição"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "valor de descrição"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Nome acessível"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nome de instância de objeto formatado para acesso por tecnologia de "
+"assistência"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Descrição acessível"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Descrição de um objeto, formatada para acesso por tecnologia de assistência"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Pai acessível"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Pai do acessível atual tal como devolvido por atk_object_get_parent()"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Valor acessível"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Utilizado para notificar que o valor foi alterado"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Papel acessível"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "O papel acessível deste objeto"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Camada acessível"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "A camada acessível deste objeto"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Valor MDI acessível"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "O valor MDI de acessibilidade deste objeto"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Legenda de tabela acessível"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Utilizada para notificar que a legenda da tabela foi alterada; esta "
+"propriedade não deverá ser utilizada. Deverá antes ser utilizado accessible-"
+"table-caption-object"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Cabeçalho de coluna de tabela acessível"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Utilizado para notificar que o cabeçalho da coluna da tabela foi alterado"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Descrição de coluna de tabela acessível"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Utilizado para notificar que a descrição da coluna da tabela foi alterada"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Cabeçalho de linha de tabela acessível"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Utilizado para notificar que o cabeçalho da linha da tabela foi alterado"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Descrição de linha de tabela acessível"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Utilizado para notificar que a descrição da linha da tabela foi alterada"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Resumo de tabela acessível"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Utilizado para notificar que o resumo da tabela foi alterado"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Objeto de legenda de tabela acessível"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Utilizado para notificar que a legenda da tabela foi alterada"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Número de ligações de hipertexto acessíveis"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "O número de atalhos que o AtkHypertext atual possui"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "muito fraca"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "fraca"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "aceitável"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "muito forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "muito baixa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "baixa"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "muito alta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "muito mau"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "mau"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bom"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "muito bom"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "ideal"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "A aplicação já não existe"
 
-#: atspi/atspi-misc.c:1853
-msgid "Attempted synchronous call where prohibited"
-msgstr "Tentativa de chamada síncrona onde proibida"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Tentativa de chamada síncrona onde proibida"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Assinatura %s desconhecida para RemoveAccessible"
@@ -36,11 +825,19 @@ msgstr "Tentativa de chamada síncrona onde proibida"
 #~ msgid "AT-SPI: Error in GetItems, sender=%s, error=%s"
 #~ msgstr "AT-SPI: Erro em GetItems, invocador=%s, erro=%s"
 
-#~ msgid "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange signature %s"
-#~ msgstr "AT-SPI: Chamada de _atspi_dbus_return_accessible_from_message com assinatura incomun %s"
+#~ msgid ""
+#~ "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
+#~ "signature %s"
+#~ msgstr ""
+#~ "AT-SPI: Chamada de _atspi_dbus_return_accessible_from_message com "
+#~ "assinatura incomun %s"
 
-#~ msgid "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange signature %s"
-#~ msgstr "AT-SPI: Chamada de _atspi_dbus_return_hyperlink_from_message com assinatura incomun %s"
+#~ msgid ""
+#~ "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
+#~ "signature %s"
+#~ msgstr ""
+#~ "AT-SPI: Chamada de _atspi_dbus_return_hyperlink_from_message com "
+#~ "assinatura incomun %s"
 
 #~ msgid "AT-SPI: AddAccessible with unknown signature %s\n"
 #~ msgstr "AT-SPI: AddAccessible com assinatura %s desconhecida\n"
@@ -49,7 +846,9 @@ msgstr "Tentativa de chamada síncrona onde proibida"
 #~ msgstr "AT-SPI: Incapaz de obter o ecrã\n"
 
 #~ msgid "AT-SPI: Accessibility bus not found - Using session bus.\n"
-#~ msgstr "AT-SPI: Incapaz de encontrar o canal de acessibilidade - A utilizar o canal de sessão.\n"
+#~ msgstr ""
+#~ "AT-SPI: Incapaz de encontrar o canal de acessibilidade - A utilizar o "
+#~ "canal de sessão.\n"
 
 #~ msgid "AT-SPI: Couldn't connect to bus: %s\n"
 #~ msgstr "AT-SPI: Incapaz de se ligar ao canal: %s\n"
@@ -57,8 +856,10 @@ msgstr "Tentativa de chamada síncrona onde proibida"
 #~ msgid "AT-SPI: Couldn't register with bus: %s\n"
 #~ msgstr "AT-SPI: Incapaz de se registar no canal: %s\n"
 
-#~ msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-#~ msgstr "AT-SPI: esperada uma variante ao obter %s do interface %s; obtida %s\n"
+#~ msgid ""
+#~ "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
+#~ msgstr ""
+#~ "AT-SPI: esperada uma variante ao obter %s do interface %s; obtida %s\n"
 
 #~ msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
 #~ msgstr "atspi_dbus_get_property: Tipo incorrecto: esperado %s, obtido %c\n"
@@ -72,8 +873,14 @@ msgstr "Tentativa de chamada síncrona onde proibida"
 #~ msgid "Streamable content not implemented"
 #~ msgstr "Conteúdo em fluxo (stream) não está implementado"
 
-#~ msgid "called atspi_event_listener_register_from_callback with a NULL event_type"
-#~ msgstr "invocação de atspi_event_listener_register_from_callback com event_type NULL"
+#~ msgid ""
+#~ "called atspi_event_listener_register_from_callback with a NULL event_type"
+#~ msgstr ""
+#~ "invocação de atspi_event_listener_register_from_callback com event_type "
+#~ "NULL"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Obtida assinatura %s inválida para o sinal %s do interface %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Utilizado para notificar que o pai foi alterado"
index 0cdbeed..5ad7f5b 100644 (file)
 # Brazilian Portuguese translation for at-spi2-core.
-# Copyright (C) 2014 at-spi2-core's COPYRIGHT HOLDER
+# Copyright (C) 2022 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
+# Alexandre Folle de Menezes <afmenez@terra.com.br>, 2003.
+# Claudio André <claudio.andre@correios.net.br>, 2006.
+# Leonardo Ferreira Fontenelle <leonardof@gnome.org>, 2006-2009.
+# Flamarion Jorge <jorge.flamarion@gmail.com>, 2011.
+# Fábio Nogueira <deb-user-ba@ubuntu.com>, 2013.
 # Enrico nicoletto <liverig@gmail.com>, 2011, 2014.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2014.
+# Tiago Melo Casal <tcasal@intervox.nce.ufrj.br>, 2018.
+# Leônidas Araújo <leorusvellt@hotmail.com>, 2022.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-02-04 13:14-0300\n"
-"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-08-22 19:55+0000\n"
+"PO-Revision-Date: 2022-08-05 11:36-0300\n"
+"Last-Translator: Leônidas Araújo <leorusvellt@hotmail.com>\n"
 "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.6.3\n"
+"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"X-Generator: Gtranslator 40.0\n"
+"X-DL-Team: pt_BR\n"
+"X-DL-Module: at-spi2-core\n"
+"X-DL-Branch: main\n"
+"X-DL-Domain: po\n"
+"X-DL-State: Translating\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Link selecionado"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Especifica se o objeto AtkHyperlink deve ser selecionado"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Número de âncoras"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "O número de âncoras associadas com o objeto AtkHyperlink"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Índice final"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "O índice final do objeto AtkHyperlink"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Índice inicial"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "O índice inicial do objeto AtkHyperlink"
+
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "inválido"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr "etiqueta aceleradora"
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "alerta"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "animação"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "seta"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "calendário"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr "área de gráficos"
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr "caixa de seleção"
+
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr "item de menu de seleção"
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "seletor de cores"
+
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr "cabeçalho de coluna"
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr "caixa de combinação"
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr "editor de datas"
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "ícone da área de trabalho"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr "quadro da área de trabalho"
+
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr "seletor"
+
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "diálogo"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr "painel de diretório"
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr "área de desenho"
+
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr "seletor de arquivos"
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr "preenchedor"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr "seletor de fontes"
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "quadro"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr "painel transparente"
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr "recipiente de html"
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "ícone"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "imagem"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr "quadro interno"
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "rótulo"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr "painel sobreposto"
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "lista"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr "item de lista"
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr "barra de menu"
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "botão de menu"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "item de menu"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr "painel de opções"
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr "aba de página"
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr "lista de abas de página"
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "painel"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr "texto de senha"
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr "menu de contexto"
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr "barra de progresso"
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr "botão de apertar"
+
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr "botão de opção"
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr "item de menu de opções"
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr "painel raiz"
+
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr "cabeçalho de linha"
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "barra de rolagem"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr "painel de rolagem"
+
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "separador"
+
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr "controle deslizante"
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr "painel ajustável"
+
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr "botão do seletor numérico"
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "barra de status"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "tabela"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "célula de tabela"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr "cabeçalho de coluna de tabela"
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr "cabeçalho de linha de tabela"
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr "item de menu destacável"
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "texto"
+
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr "botão de alternância"
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "barra de ferramentas"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr "dica"
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "árvore"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr "tabela de árvore"
+
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "desconhecido"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr "porta de visualização"
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "janela"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "cabeçalho"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr "rodapé"
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "parágrafo"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr "régua"
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "aplicativo"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr "completar automaticamente"
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr "barra de edição"
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr "componente embutido"
+
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "entrada"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr "diagrama"
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr "legenda"
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr "quadro de documento"
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr "título"
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "página"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "seção"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr "objeto redundante"
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "formulário"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "link"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr "janela de método de entrada"
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "linha da tabela"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "item da árvore"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "planilha de documento"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "documento de apresentação"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "documento de texto"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr "documento da web"
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr "documento de e-mail"
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "comentário"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr "caixa de lista"
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr "agrupamento"
+
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr "mapa de imagens"
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr "notificação"
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr "barra de informações"
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr "barra de nível"
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr "barra de título"
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr "citação"
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr "áudio"
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr "vídeo"
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr "definição"
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr "artigo"
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr "marco"
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr "log"
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr "demarcação"
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr "matemática"
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr "avaliação"
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr "temporizador"
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr "lista de descrição"
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr "termo de descrição"
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr "valor da descrição"
+
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr "Nome acessível"
+
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Nome da instância do objeto formatado para acesso da tecnologia assistiva"
+
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr "Descrição acessível"
+
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Descrição de um objeto, formatada para acesso da tecnologia assistiva"
+
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr "Pai acessível"
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Pai do acesso atual como é devolvido pelo atk_object_get_parent()"
+
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr "Valor acessível"
+
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr "É usado para notificar que um valor mudou"
+
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr "Regra acessível"
+
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr "A regra acessível desse objeto"
+
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr "Camada acessível"
+
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr "A camada acessível desse objeto"
+
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr "Valor MDI acessível"
+
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr "O valor MDI acessível desse objeto"
+
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr "Legenda acessível da tabela"
+
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"É usada para notificar que a legenda da tabela mudou; essa propriedade não "
+"deve ser usada. Em vez disso, accessible-table-caption-object deve ser usado"
+
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr "Cabeçalho acessível de coluna da tabela"
+
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr "É usado para notificar que o cabeçalho de coluna da tabela mudou"
+
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr "Descrição acessível de coluna da tabela"
+
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr "É usado para notificar que uma descrição de coluna da tabela mudou"
+
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr "Cabeçalho acessível de linha da tabela"
+
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr "É usado para notificar que o cabeçalho de linha da tabela mudou"
+
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr "Descrição acessível de linha da tabela"
+
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr "É usado para notificar que a descrição de linha da tabela mudou"
+
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr "Sumário acessível da tabela"
+
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr "É usado para notificar que o sumário da tabela mudou"
+
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr "Objeto acessível de legenda da tabela"
+
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr "É usado para notificar que a legenda da tabela mudou"
+
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr "Número de links de hipertexto acessíveis"
+
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr "O número de links com o AtkHypertext atual"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "muito fraco"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "fraco"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "aceitável"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "muito forte"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "muito baixo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "médio"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "alto"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "muito alto"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "muito ruim"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "ruim"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "bom"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "muito bom"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "melhor"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Este aplicativo não existe mais"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "A tentativa de chamadas síncronas foram proibidas"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "A tentativa de chamadas síncronas foram proibidas"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Assinatura %s desconhecida para RemoveAccessible"
@@ -82,3 +871,6 @@ msgstr "A tentativa de chamadas síncronas foram proibidas"
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr ""
 #~ "Foi obtido a assinatura %s inválida para o sinal %s da interface %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "É usada para notificar que o pai mudou"
index 8f504fe..83c17b0 100644 (file)
--- a/po/ro.po
+++ b/po/ro.po
+# #-#-#-#-#  ro.po (at-spi2-core master)  #-#-#-#-#
 # Romanian translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2011.
 # Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>, 2015.
+# #-#-#-#-#  ro.po (atk)  #-#-#-#-#
+# Romanian translation for atk
+# Copyright (C) 2003 - 2009 Free Software Foundation, Inc.
+# Mișu Moldovan <dumol@gnome.ro>, 2003 - 2009.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2015-06-22 20:11+0200\n"
-"Last-Translator: Daniel Șerbănescu <daniel [at] serbanescu [dot] dk>\n"
-"Language-Team: Gnome Romanian Translation Team\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-01-25 15:54+0000\n"
+"PO-Revision-Date: 2023-07-29 13:51+0300\n"
+"Last-Translator: Florentina Mușat <florentina [dot] musat [dot] 28 [at] "
+"gmail [dot] com>\n"
+"Language-Team: Romanian <gnomero-list@lists.sourceforge.net>\n"
 "Language: ro\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
-"20)) ? 1 : 2);;\n"
-"X-Generator: Virtaal 0.7.1\n"
+"20)) ? 1 : 2);\n"
+"X-Generator: Poedit 3.3.2\n"
 "X-Project-Style: gnome\n"
+"X-Generator: Poedit 2.0.6\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Link selectat"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifică dacă obiectul AtkHyperlink este selectat"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Număr de ancore"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Numărul ancorelor asociat cu obiectul AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Index final"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Indexul final al obiectului AtkHypelink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Index inițial"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Indexul inițial al obiectului AtkHyperlink"
+
+#: atk/atkobject.c:100
+msgid "invalid"
+msgstr "invalid"
+
+#: atk/atkobject.c:101
+msgid "accelerator label"
+msgstr "etichetă accelerator"
+
+#: atk/atkobject.c:102
+msgid "alert"
+msgstr "alertă"
+
+#: atk/atkobject.c:103
+msgid "animation"
+msgstr "animație"
+
+#: atk/atkobject.c:104
+msgid "arrow"
+msgstr "săgeată"
+
+#: atk/atkobject.c:105
+msgid "calendar"
+msgstr "calendar"
+
+#: atk/atkobject.c:106
+msgid "canvas"
+msgstr "canava"
+
+#: atk/atkobject.c:107
+msgid "check box"
+msgstr "căsuță de bifare"
+
+#: atk/atkobject.c:108
+msgid "check menu item"
+msgstr "element meniu de bifare"
+
+#: atk/atkobject.c:109
+msgid "color chooser"
+msgstr "selector de culoare"
+
+#: atk/atkobject.c:110
+msgid "column header"
+msgstr "antet coloană"
+
+#: atk/atkobject.c:111
+msgid "combo box"
+msgstr "căsuță combo"
+
+#: atk/atkobject.c:112
+msgid "dateeditor"
+msgstr "editor al datei"
+
+#: atk/atkobject.c:113
+msgid "desktop icon"
+msgstr "iconiță pe desktop"
+
+#: atk/atkobject.c:114
+msgid "desktop frame"
+msgstr "cadru desktop"
+
+#: atk/atkobject.c:115
+msgid "dial"
+msgstr "cadran"
+
+#: atk/atkobject.c:116
+msgid "dialog"
+msgstr "dialog"
+
+#: atk/atkobject.c:117
+msgid "directory pane"
+msgstr "vedere directoare"
+
+#: atk/atkobject.c:118
+msgid "drawing area"
+msgstr "arie de desenare"
+
+#: atk/atkobject.c:119
+msgid "file chooser"
+msgstr "selector de fișiere"
+
+#: atk/atkobject.c:120
+msgid "filler"
+msgstr "umplere"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:122
+msgid "fontchooser"
+msgstr "selector de fonturi"
+
+#: atk/atkobject.c:123
+msgid "frame"
+msgstr "cadru"
+
+#: atk/atkobject.c:124
+msgid "glass pane"
+msgstr "vedere parțială"
+
+#: atk/atkobject.c:125
+msgid "html container"
+msgstr "recipient html"
+
+#: atk/atkobject.c:126
+msgid "icon"
+msgstr "iconiță"
+
+#: atk/atkobject.c:127
+msgid "image"
+msgstr "imagine"
+
+#: atk/atkobject.c:128
+msgid "internal frame"
+msgstr "cadru intern"
+
+#: atk/atkobject.c:129
+msgid "label"
+msgstr "etichetă"
+
+#: atk/atkobject.c:130
+msgid "layered pane"
+msgstr "vedere suprapusă"
+
+#: atk/atkobject.c:131
+msgid "list"
+msgstr "listă"
+
+#: atk/atkobject.c:132
+msgid "list item"
+msgstr "element listă"
+
+#: atk/atkobject.c:133
+msgid "menu"
+msgstr "meniu"
+
+#: atk/atkobject.c:134
+msgid "menu bar"
+msgstr "bară de meniu"
+
+#: atk/atkobject.c:135
+msgid "menu button"
+msgstr "buton de meniu"
+
+#: atk/atkobject.c:136
+msgid "menu item"
+msgstr "element meniu"
+
+#: atk/atkobject.c:137
+msgid "option pane"
+msgstr "vedere opțiuni"
+
+#: atk/atkobject.c:138
+msgid "page tab"
+msgstr "tab pagină"
+
+#: atk/atkobject.c:139
+msgid "page tab list"
+msgstr "listă taburi pagină"
+
+#: atk/atkobject.c:140
+msgid "panel"
+msgstr "panou"
+
+#: atk/atkobject.c:141
+msgid "password text"
+msgstr "text parolă"
+
+#: atk/atkobject.c:142
+msgid "popup menu"
+msgstr "meniu popup"
+
+#: atk/atkobject.c:143
+msgid "progress bar"
+msgstr "bară de progres"
+
+#: atk/atkobject.c:144
+msgid "push button"
+msgstr "buton normal"
+
+#: atk/atkobject.c:145
+msgid "radio button"
+msgstr "buton radio"
+
+#: atk/atkobject.c:146
+msgid "radio menu item"
+msgstr "element radio meniu"
+
+#: atk/atkobject.c:147
+msgid "root pane"
+msgstr "vedere rădăcină"
+
+#: atk/atkobject.c:148
+msgid "row header"
+msgstr "antet rând"
+
+#: atk/atkobject.c:149
+msgid "scroll bar"
+msgstr "bară de derulare"
+
+#: atk/atkobject.c:150
+msgid "scroll pane"
+msgstr "vedere derulare"
+
+#: atk/atkobject.c:151
+msgid "separator"
+msgstr "separator"
+
+#: atk/atkobject.c:152
+msgid "slider"
+msgstr "derulator"
+
+#: atk/atkobject.c:153
+msgid "split pane"
+msgstr "vedere împărțită"
+
+#: atk/atkobject.c:154
+msgid "spin button"
+msgstr "iconiță animată"
+
+#: atk/atkobject.c:155
+msgid "statusbar"
+msgstr "bară de stare"
+
+#: atk/atkobject.c:156
+msgid "table"
+msgstr "tabel"
+
+#: atk/atkobject.c:157
+msgid "table cell"
+msgstr "celulă tabel"
+
+#: atk/atkobject.c:158
+msgid "table column header"
+msgstr "antet coloană tabel"
+
+#: atk/atkobject.c:159
+msgid "table row header"
+msgstr "antet rând tabel"
+
+#: atk/atkobject.c:160
+msgid "tear off menu item"
+msgstr "element meniu desprins"
+
+#: atk/atkobject.c:161
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:162
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:163
+msgid "toggle button"
+msgstr "buton comutator"
+
+#: atk/atkobject.c:164
+msgid "tool bar"
+msgstr "bară cu unelte"
+
+#: atk/atkobject.c:165
+msgid "tool tip"
+msgstr "indiciu"
+
+#: atk/atkobject.c:166
+msgid "tree"
+msgstr "arbore"
+
+#: atk/atkobject.c:167
+msgid "tree table"
+msgstr "tabel arbore"
+
+#: atk/atkobject.c:168
+msgid "unknown"
+msgstr "necunoscut"
+
+#: atk/atkobject.c:169
+msgid "viewport"
+msgstr "arie vizibilă"
+
+#: atk/atkobject.c:170
+msgid "window"
+msgstr "fereastră"
+
+#: atk/atkobject.c:171
+msgid "header"
+msgstr "antet"
+
+#: atk/atkobject.c:172
+msgid "footer"
+msgstr "notă de subsol"
+
+#: atk/atkobject.c:173
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:174
+msgid "ruler"
+msgstr "riglă"
+
+#: atk/atkobject.c:175
+msgid "application"
+msgstr "aplicație"
+
+#: atk/atkobject.c:176
+msgid "autocomplete"
+msgstr "auto-completare"
+
+#: atk/atkobject.c:177
+msgid "edit bar"
+msgstr "bară de editare"
+
+#: atk/atkobject.c:178
+msgid "embedded component"
+msgstr "componentă încapsulată"
+
+#: atk/atkobject.c:179
+msgid "entry"
+msgstr "intrare"
+
+#: atk/atkobject.c:180
+msgid "chart"
+msgstr "diagramă"
+
+#: atk/atkobject.c:181
+msgid "caption"
+msgstr "titlu"
+
+#: atk/atkobject.c:182
+msgid "document frame"
+msgstr "cadru document"
+
+#: atk/atkobject.c:183
+msgid "heading"
+msgstr "titlu"
+
+#: atk/atkobject.c:184
+msgid "page"
+msgstr "pagină"
+
+#: atk/atkobject.c:185
+msgid "section"
+msgstr "secțiune"
+
+#: atk/atkobject.c:186
+msgid "redundant object"
+msgstr "obiect redundant"
+
+#: atk/atkobject.c:187
+msgid "form"
+msgstr "formular"
+
+#: atk/atkobject.c:188
+msgid "link"
+msgstr "link"
+
+#: atk/atkobject.c:189
+msgid "input method window"
+msgstr "fereastra metodei de input"
+
+#: atk/atkobject.c:190
+msgid "table row"
+msgstr "rând de tabel"
+
+#: atk/atkobject.c:191
+msgid "tree item"
+msgstr "element arbore"
+
+#: atk/atkobject.c:192
+msgid "document spreadsheet"
+msgstr "foaie de calcul document"
+
+#: atk/atkobject.c:193
+msgid "document presentation"
+msgstr "prezentare document"
+
+#: atk/atkobject.c:194
+msgid "document text"
+msgstr "document text"
+
+#: atk/atkobject.c:195
+msgid "document web"
+msgstr "web document"
+
+#: atk/atkobject.c:196
+msgid "document email"
+msgstr "email document"
+
+#: atk/atkobject.c:197
+msgid "comment"
+msgstr "comentariu"
+
+#: atk/atkobject.c:198
+msgid "list box"
+msgstr "căsuță de tip listă"
+
+#: atk/atkobject.c:199
+msgid "grouping"
+msgstr "grupare"
+
+#: atk/atkobject.c:200
+msgid "image map"
+msgstr "hartă de imagini"
+
+#: atk/atkobject.c:201
+msgid "notification"
+msgstr "notificare"
+
+#: atk/atkobject.c:202
+msgid "info bar"
+msgstr "bară de informații"
+
+#: atk/atkobject.c:203
+msgid "level bar"
+msgstr "bară de nivel"
+
+#: atk/atkobject.c:204
+msgid "title bar"
+msgstr "bară de titlu"
+
+#: atk/atkobject.c:205
+msgid "block quote"
+msgstr "bloc de citat"
+
+#: atk/atkobject.c:206
+msgid "audio"
+msgstr "audio"
+
+#: atk/atkobject.c:207
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:208
+msgid "definition"
+msgstr "definiție"
+
+#: atk/atkobject.c:209
+msgid "article"
+msgstr "articol"
+
+#: atk/atkobject.c:210
+msgid "landmark"
+msgstr "reper"
+
+#: atk/atkobject.c:211
+msgid "log"
+msgstr "istoric"
+
+#: atk/atkobject.c:212
+msgid "marquee"
+msgstr "marquee"
+
+#: atk/atkobject.c:213
+msgid "math"
+msgstr "matematică"
+
+#: atk/atkobject.c:214
+msgid "rating"
+msgstr "evaluare"
+
+#: atk/atkobject.c:215
+msgid "timer"
+msgstr "cronometru"
+
+#: atk/atkobject.c:216
+msgid "description list"
+msgstr "listă de descriere"
+
+#: atk/atkobject.c:217
+msgid "description term"
+msgstr "termen de descriere"
+
+#: atk/atkobject.c:218
+msgid "description value"
+msgstr "valoare de descriere"
+
+#: atk/atkobject.c:390
+msgid "Accessible Name"
+msgstr "Nume accesibil"
+
+#: atk/atkobject.c:391
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Numele instanței obiectului formatat pentru accesul asistat"
+
+#: atk/atkobject.c:397
+msgid "Accessible Description"
+msgstr "Descriere accesibilă"
+
+#: atk/atkobject.c:398
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Descrierea unui obiect, formatată pentru accesul asistat"
+
+#: atk/atkobject.c:404
+msgid "Accessible Parent"
+msgstr "Părinte accesibil"
+
+#: atk/atkobject.c:405
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Superiorul de accesibil curent așa cum a fost întors de "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:421
+msgid "Accessible Value"
+msgstr "Valoare accesibilă"
+
+#: atk/atkobject.c:422
+msgid "Is used to notify that the value has changed"
+msgstr "Utilizată pentru a notifica schimbarea valorii"
+
+#: atk/atkobject.c:430
+msgid "Accessible Role"
+msgstr "Rol accesibil"
+
+#: atk/atkobject.c:431
+msgid "The accessible role of this object"
+msgstr "Rolul accesibil al acestui obiect"
+
+#: atk/atkobject.c:438
+msgid "Accessible Layer"
+msgstr "Nivel accesibil"
+
+#: atk/atkobject.c:439
+msgid "The accessible layer of this object"
+msgstr "Nivelul accesibil al acestui obiect"
+
+#: atk/atkobject.c:447
+msgid "Accessible MDI Value"
+msgstr "Valoare MDI accesibilă"
+
+#: atk/atkobject.c:448
+msgid "The accessible MDI value of this object"
+msgstr "Valoarea accesibilă MDI a acestui obiect"
+
+#: atk/atkobject.c:464
+msgid "Accessible Table Caption"
+msgstr "Etichetă accesibilă tabel"
+
+#: atk/atkobject.c:465
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Utilizată pentru a notifica schimbarea etichetei tabelului. Această "
+"proprietate nu ar trebui folosită. A se utiliza accessible-table-caption-"
+"object"
+
+#: atk/atkobject.c:479
+msgid "Accessible Table Column Header"
+msgstr "Antet accesibil coloană tabel"
+
+#: atk/atkobject.c:480
+msgid "Is used to notify that the table column header has changed"
+msgstr "Utilizat pentru a notifica schimbarea antetului coloanei în tabel"
+
+#: atk/atkobject.c:495
+msgid "Accessible Table Column Description"
+msgstr "Descriere accesibilă coloană tabel"
+
+#: atk/atkobject.c:496
+msgid "Is used to notify that the table column description has changed"
+msgstr "Utilizată pentru a notifica schimbarea descrierii coloanei în tabel"
+
+#: atk/atkobject.c:511
+msgid "Accessible Table Row Header"
+msgstr "Antet accesibil rând tabel"
+
+#: atk/atkobject.c:512
+msgid "Is used to notify that the table row header has changed"
+msgstr "Utilizat pentru a notifica schimbarea antetului rândului în tabel"
+
+#: atk/atkobject.c:526
+msgid "Accessible Table Row Description"
+msgstr "Descriere accesibilă rând tabel"
+
+#: atk/atkobject.c:527
+msgid "Is used to notify that the table row description has changed"
+msgstr "Utilizată pentru a notifica schimbarea descrierii rândului în tabel"
+
+#: atk/atkobject.c:533
+msgid "Accessible Table Summary"
+msgstr "Sumar tabel accesibil"
+
+#: atk/atkobject.c:534
+msgid "Is used to notify that the table summary has changed"
+msgstr "Utilizat pentru a notifica schimbarea sumarului tabelului"
+
+#: atk/atkobject.c:540
+msgid "Accessible Table Caption Object"
+msgstr "Obiect etichetă tabel accesibil"
+
+#: atk/atkobject.c:541
+msgid "Is used to notify that the table caption has changed"
+msgstr "Utilizat pentru a notifica schimbarea etichetei tabelului"
+
+#: atk/atkobject.c:547
+msgid "Number of Accessible Hypertext Links"
+msgstr "Număr de linkuri hipertext accesibile"
+
+#: atk/atkobject.c:548
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Numărul de linkuri din instanța curentă AtkHypertext"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "foarte slab"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "slab"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "acceptabil"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "puternic"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "foarte puternic"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "foarte scăzut"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "mediu"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "ridicat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "foarte ridicat"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "foarte rău"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "rău"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "bun"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "foarte bun"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "cel mai bun"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1077 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Aplicația nu mai există"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "S-a încercat un apel sincron unde a fost interzis"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "S-a încercat un apel sincron unde a fost interzis"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Semnătura %s este necunoscută pentru RemoveAccessible"
@@ -96,3 +882,6 @@ msgstr "S-a încercat un apel sincron unde a fost interzis"
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr ""
 #~ "S-a primit semnătura validă %s pentru semnalul %s de la interfața %s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Utilizat pentru a notifica schimbarea părintelui"
index 3d5c167..3f2a27b 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Yuri Myasoedov <omerta13@yandex.ru>, 2011.
-#
+# Copyright (C) 2002-2009 Free Software Foundation Inc.
+# This file is distributed under the same license as the atk package.
+# Dmitry G. Mastrukov <dmitry@taurussoft.org>, 2002-2003.
+# Leonid Kanter <leon@asplinux.ru>, 2006.
+# Yuri Kozlov <yuray@komyakino.ru>, 2010, 2011.
+# Yuri Myasoedov <ymyasoedov@yandex.ru>, 2014.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-03-11 15:59+0300\n"
-"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2024-01-06 16:43+0000\n"
+"PO-Revision-Date: 2024-01-08 15:35+0300\n"
+"Last-Translator: Artur So <arturios2005@mail.ru>\n"
 "Language-Team: Russian <gnome-cyr@gnome.org>\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Poedit 1.5.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 3.4.2\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Выбранная ссылка"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Определяет, выделен ли объект AtkHyperlink"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Число якорей"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Число якорей, связанных с текущим объектом AtkHypertext"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Конец индекса"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Конец индекса объекта AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Начало индекса"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Начало индекса объекта AtkHyperlink"
+
+#: atk/atkobject.c:272
+msgid "Accessible Name"
+msgstr "Облегчённое имя"
+
+#: atk/atkobject.c:273
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Имя экземпляра объекта для доступа с использованием облегчающих технологий"
+
+#: atk/atkobject.c:279
+msgid "Accessible Description"
+msgstr "Облегчённое описание"
+
+#: atk/atkobject.c:280
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Описание объекта для доступа с использованием облегчающих технологий"
+
+#: atk/atkobject.c:286
+msgid "Accessible Parent"
+msgstr "Облегчённый предок"
+
+#: atk/atkobject.c:287
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Родитель текущего облегчённого объекта, возвращаемый atk_object_get_parent()"
+
+#: atk/atkobject.c:303
+msgid "Accessible Value"
+msgstr "Облегчённое значение"
+
+#: atk/atkobject.c:304
+msgid "Is used to notify that the value has changed"
+msgstr "Используется для уведомления, что значение изменилось"
+
+#: atk/atkobject.c:312
+msgid "Accessible Role"
+msgstr "Облегчённая роль"
+
+#: atk/atkobject.c:313
+msgid "The accessible role of this object"
+msgstr "Роль этого объекта в облегчающих технологиях"
+
+#: atk/atkobject.c:320
+msgid "Accessible Layer"
+msgstr "Облегчённый уровень"
+
+#: atk/atkobject.c:321
+msgid "The accessible layer of this object"
+msgstr "Уровень этого объекта в облегчающих технологиях"
+
+#: atk/atkobject.c:329
+msgid "Accessible MDI Value"
+msgstr "Облегчённое значение MDI"
+
+#: atk/atkobject.c:330
+msgid "The accessible MDI value of this object"
+msgstr "Значение MDI этого объекта в облегчающих технологиях"
+
+#: atk/atkobject.c:346
+msgid "Accessible Table Caption"
+msgstr "Облегчённый заголовок таблицы"
+
+#: atk/atkobject.c:347
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Используется для уведомления о том, что заголовок таблицы изменился; это "
+"свойство не должно использоваться. Вместо него должно использоваться "
+"свойство accessible-table-caption-object"
+
+#: atk/atkobject.c:361
+msgid "Accessible Table Column Header"
+msgstr "Облегчённый заголовок столбца таблицы"
+
+#: atk/atkobject.c:362
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Используется для уведомления о том, что заголовок столбца таблицы изменился"
+
+#: atk/atkobject.c:377
+msgid "Accessible Table Column Description"
+msgstr "Облегчённое описание столбца таблицы"
+
+#: atk/atkobject.c:378
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Используется для уведомления о том, что описание столбца таблицы изменилось"
+
+#: atk/atkobject.c:393
+msgid "Accessible Table Row Header"
+msgstr "Облегчённый заголовок строки таблицы"
+
+#: atk/atkobject.c:394
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Используется для уведомления о том, что заголовок строки таблицы изменился"
+
+#: atk/atkobject.c:408
+msgid "Accessible Table Row Description"
+msgstr "Облегчённое описание строки таблицы"
+
+#: atk/atkobject.c:409
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Используется для уведомления о том, что описание строки таблицы изменилось"
+
+#: atk/atkobject.c:415
+msgid "Accessible Table Summary"
+msgstr "Облегчённая сводка таблицы"
+
+#: atk/atkobject.c:416
+msgid "Is used to notify that the table summary has changed"
+msgstr "Используется для уведомления о том, что сводка таблицы изменилась"
+
+#: atk/atkobject.c:422
+msgid "Accessible Table Caption Object"
+msgstr "Облегчённый объект заголовка таблицы"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the table caption has changed"
+msgstr "Используется для уведомления о том, что заголовок таблицы изменился"
+
+#: atk/atkobject.c:429
+msgid "Number of Accessible Hypertext Links"
+msgstr "Число облегчённых гипертекстовых ссылок"
+
+#: atk/atkobject.c:430
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Число ссылок, которые имеет текущий объект AtkHypertext"
+
+#: atk/atkobject.c:439
+msgid "Accessible ID"
+msgstr "Идентификатор доступности"
+
+#: atk/atkobject.c:440
+msgid "ID for the accessible; useful for automated testing"
+msgstr ""
+"Идентификатор доступности; полезно для автоматизированного тестирования"
+
+#: atk/atkobject.c:446
+msgid "Help text"
+msgstr "Текст справки"
+
+#: atk/atkobject.c:447
+msgid "Help text associated with the accessible"
+msgstr "Текст справки, связанный с доступностью"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "очень слабо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "слабо"
+
+# средне
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "приемлемо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "надёжно"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "очень надёжно"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "очень низко"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "средне"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "высоко"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "очень высоко"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "очень плохо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "плохо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "хорошо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "очень хорошо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "наилучшее"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Приложение больше не существует"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Попытка сделать синхронный вызов там, где это запрещено"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "недопустима"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "метка ускорителя"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "тревога"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "анимация"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "стрелка"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "календарь"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "канва"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "кнопка-флажок"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "элемент-флажок меню"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "выбор цвета"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "заголовок столбца"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "выпадающий список с возможностью ввода"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "редактор даты"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "значок рабочего стола"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "рамка рабочего стола"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "набор номера"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "диалог"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "панель каталога"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "область рисования"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "выбор файлов"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "заполнитель"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "выбор шрифта"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "рамка"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "прозрачная панель"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "содержимое с языком html"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "значок"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "изображение"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "внутренняя рамка"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "метка"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "панель с уровнями"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "список"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "элемент списка"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "меню"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "строка меню"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "кнопка меню"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "элемент меню"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "панель опций"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "вкладка страницы"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "список вкладок страницы"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "панель"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "пароль"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "всплывающее меню"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "индикатор выполнения"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "нажимаемая кнопка"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "радио-кнопка"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "радио-элемент меню"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "корневая панель"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "заголовок строки"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "полоса прокрутки"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "панель прокрутки"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "разделитель"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "бегунок"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "двойная панель"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "кнопка вращения"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "строка состояния"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "таблица"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "ячейка таблицы"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "заголовок столбца таблицы"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "заголовок строки таблицы"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "неразрывный элемент меню"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "терминал"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "текст"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "кнопка-переключатель"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "панель инструментов"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "подсказка"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "дерево"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "таблица в виде дерева"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "неизвестна"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "область просмотра"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "окно"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "заголовок"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "подвал"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "абзац"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "линейка"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "приложение"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "автодополнение"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "строка редактирования"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "внедрённый компонент"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "запись"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "диаграмма"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "заголовок"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "рамка документа"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "заголовок"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "страница"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "раздел"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "избыточный объект"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "форма"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "ссылка"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "окно метода ввода"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "строка таблицы"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "элемент дерева"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "документ электронной таблицы"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "документ презентации"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "текстовый документ"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "веб-документ"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "документ электронного сообщения"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "комментарий"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "списочный блок"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "группировка"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "карта изображения"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "уведомление"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "информационная полоса"
+
+# см. например GtkLevelBar
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "индикатор выполнения"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "панель заголовка"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "блок цитирования"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "звук"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "видео"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "определение"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "статья"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "ориентир"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "журнал"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "бегущая строка"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "математическое выражение"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "оценка"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "таймер"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "список описаний"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "терм описания"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "значение описания"
+
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Попытка сделать синхронный вызов там, где это запрещено"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: неизвестная подпись %s для RemoveAccessible"
diff --git a/po/rw.po b/po/rw.po
new file mode 100644 (file)
index 0000000..50c6174
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,729 @@
+# translation of atk to Kinyarwanda.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# Steve Murphy <murf@e-tools.com>, 2005
+# Steve performed initial rough translation from compendium built from translations provided by the following translators:
+# Philibert Ndandali  <ndandali@yahoo.fr>, 2005.
+# Viateur MUGENZI <muvia1@yahoo.fr>, 2005.
+# Noëlla Mupole <s24211045@tuks.co.za>, 2005.
+# Carole Karema <karemacarole@hotmail.com>, 2005.
+# JEAN BAPTISTE NGENDAHAYO <ngenda_denis@yahoo.co.uk>, 2005.
+# Augustin KIBERWA  <akiberwa@yahoo.co.uk>, 2005.
+# Donatien NSENGIYUMVA <ndonatienuk@yahoo.co.uk>, 2005..
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk 2.12\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2005-03-28 19:34-0700\n"
+"Last-Translator: Steve Murphy <murf@e-tools.com>\n"
+"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
+"Language: rw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr ""
+
+#: atk/atkhyperlink.c:104
+#, fuzzy
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Igikoresho ni Byahiswemo"
+
+#: atk/atkhyperlink.c:110
+#, fuzzy
+msgid "Number of Anchors"
+msgstr "Bya"
+
+#: atk/atkhyperlink.c:111
+#, fuzzy
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Umubare Bya Na: Igikoresho"
+
+#: atk/atkhyperlink.c:119
+#, fuzzy
+msgid "End index"
+msgstr "Impera Umubarendanga"
+
+#: atk/atkhyperlink.c:120
+#, fuzzy
+msgid "The end index of the AtkHyperlink object"
+msgstr "Impera Umubarendanga Bya Igikoresho"
+
+#: atk/atkhyperlink.c:128
+#, fuzzy
+msgid "Start index"
+msgstr "Gutangira Umubarendanga"
+
+#: atk/atkhyperlink.c:129
+#, fuzzy
+msgid "The start index of the AtkHyperlink object"
+msgstr "Gutangira Umubarendanga Bya Igikoresho"
+
+# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_INVALID.text
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "Sibyo"
+
+#: atk/atkobject.c:75
+#, fuzzy
+msgid "accelerator label"
+msgstr "Akarango"
+
+#: atk/atkobject.c:76
+#, fuzzy
+msgid "alert"
+msgstr "Ikimenyetso"
+
+#: atk/atkobject.c:77
+#, fuzzy
+msgid "animation"
+msgstr "Iyega"
+
+#: atk/atkobject.c:78
+#, fuzzy
+msgid "arrow"
+msgstr "Akambi"
+
+# svtools/source\dialogs\addresstemplate.src:STR_FIELD_CALENDAR.text
+#: atk/atkobject.c:79
+#, fuzzy
+msgid "calendar"
+msgstr "Kalindari"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr ""
+
+# basctl/source\basicide\tbxctl.src:RID_TOOLBOX.SID_INSERT_CHECKBOX.text
+#: atk/atkobject.c:81
+#, fuzzy
+msgid "check box"
+msgstr "Akazu k'ihitamo"
+
+#: atk/atkobject.c:82
+#, fuzzy
+msgid "check menu item"
+msgstr "Kugenzura... Ibikubiyemo Ikintu"
+
+#: atk/atkobject.c:83
+#, fuzzy
+msgid "color chooser"
+msgstr "Ibara"
+
+#: atk/atkobject.c:84
+#, fuzzy
+msgid "column header"
+msgstr "Inkingi Umutwempangano"
+
+# basctl/source\basicide\tbxctl.src:RID_TOOLBOX.SID_INSERT_COMBOBOX.text
+#: atk/atkobject.c:85
+#, fuzzy
+msgid "combo box"
+msgstr "Akazu k'ilisiti irambuka"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr ""
+
+#: atk/atkobject.c:87
+#, fuzzy
+msgid "desktop icon"
+msgstr "Ibiro Agashushondanga"
+
+#: atk/atkobject.c:88
+#, fuzzy
+msgid "desktop frame"
+msgstr "Ibiro Ikadiri"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr ""
+
+# basctl/source\basicide\basidesh.src:RID_STR_STDDIALOGNAME.text
+#: atk/atkobject.c:90
+#, fuzzy
+msgid "dialog"
+msgstr "Ikiganiro"
+
+#: atk/atkobject.c:91
+#, fuzzy
+msgid "directory pane"
+msgstr "bushyinguro"
+
+#: atk/atkobject.c:92
+#, fuzzy
+msgid "drawing area"
+msgstr "Igishushanyo Ubuso"
+
+#: atk/atkobject.c:93
+#, fuzzy
+msgid "file chooser"
+msgstr "IDOSIYE"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr ""
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "ikadiri"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr ""
+
+#: atk/atkobject.c:99
+#, fuzzy
+msgid "html container"
+msgstr "HTML"
+
+# sfx2/source\toolbox\tbxopdlg.src:TP_CONFIG_OBJECTBAR.STR_SYMBOL.text
+#: atk/atkobject.c:100
+#, fuzzy
+msgid "icon"
+msgstr "Agashushondanga"
+
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Common.xcs:....Image.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Image.Enable.text
+#: atk/atkobject.c:101
+#, fuzzy
+msgid "image"
+msgstr "Ishusho"
+
+#: atk/atkobject.c:102
+#, fuzzy
+msgid "internal frame"
+msgstr "By'imbere Ikadiri"
+
+#: atk/atkobject.c:103
+#, fuzzy
+msgid "label"
+msgstr "Akarango"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr ""
+
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....DefaultFont.List.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....DefaultFontCJK.List.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....DefaultFontCTL.List.text
+#: atk/atkobject.c:105
+#, fuzzy
+msgid "list"
+msgstr "Urutonde"
+
+#: atk/atkobject.c:106
+#, fuzzy
+msgid "list item"
+msgstr "Ibigize by'ilisiti"
+
+# #-#-#-#-#  sfx2.pot (Gnome 2.12)  #-#-#-#-#
+# sfx2/source\dialog\cfg.src:DLG_CONFIG.1.TP_CONFIG_MENU.text
+# #-#-#-#-#  sfx2.pot (Gnome 2.12)  #-#-#-#-#
+# sfx2/source\dialog\cfg.src:STR_MENU.text
+#: atk/atkobject.c:107
+#, fuzzy
+msgid "menu"
+msgstr "Ibikubiyemo"
+
+# LOCALIZATION NOTE END   : DO not localize the entities above; test case
+#: atk/atkobject.c:108
+#, fuzzy
+msgid "menu bar"
+msgstr "Umurongo w'ibikubiyemo"
+
+#: atk/atkobject.c:109
+#, fuzzy
+msgid "menu item"
+msgstr "Ibikubiyemo Ikintu"
+
+#: atk/atkobject.c:110
+#, fuzzy
+msgid "option pane"
+msgstr "Ihitamo"
+
+#: atk/atkobject.c:111
+#, fuzzy
+msgid "page tab"
+msgstr "Ipaji Isunika"
+
+#: atk/atkobject.c:112
+#, fuzzy
+msgid "page tab list"
+msgstr "Ipaji Isunika Urutonde"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr ""
+
+#: atk/atkobject.c:114
+#, fuzzy
+msgid "password text"
+msgstr "Ijambobanga... Umwandiko"
+
+#: atk/atkobject.c:115
+#, fuzzy
+msgid "popup menu"
+msgstr "Ibikubiyemo"
+
+# basctl/source\basicide\tbxctl.src:RID_TOOLBOX.SID_INSERT_PROGRESSBAR.text
+#: atk/atkobject.c:116
+#, fuzzy
+msgid "progress bar"
+msgstr "Umurongo w'aho bigeze"
+
+# svx/sdi\svxslots.src:SID_FM_PUSHBUTTON.text
+#: atk/atkobject.c:117
+#, fuzzy
+msgid "push button"
+msgstr "Kanda Buto"
+
+# svx/source\form\fmexpl.src:RID_FMSHELL_CONVERSIONMENU.SID_FM_CONVERTTO_RADIOBUTTON.text
+#: atk/atkobject.c:118
+#, fuzzy
+msgid "radio button"
+msgstr "Buto Radiyo"
+
+#: atk/atkobject.c:119
+#, fuzzy
+msgid "radio menu item"
+msgstr "Ibikubiyemo Ikintu"
+
+#: atk/atkobject.c:120
+#, fuzzy
+msgid "root pane"
+msgstr "Imizi"
+
+#: atk/atkobject.c:121
+#, fuzzy
+msgid "row header"
+msgstr "Urubariro Umutwempangano"
+
+# sfx2/source\view\framedlg.src:TP_FRAMEPROPERTIES.GB_SCROLLING.text
+#: atk/atkobject.c:122
+#, fuzzy
+msgid "scroll bar"
+msgstr "Agafashagenda"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr ""
+
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.WriterObject.Table.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.WriterObject.Frame.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.WriterObject.Graphic.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Calc.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Draw.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Chart.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Image.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Formula.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Impress.Settings.Delimiter.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.OLEMisc.Settings.Delimiter.text
+#: atk/atkobject.c:124
+#, fuzzy
+msgid "separator"
+msgstr "Mutandukanya"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr ""
+
+#: atk/atkobject.c:126
+#, fuzzy
+msgid "split pane"
+msgstr "Gutandukanya"
+
+#: atk/atkobject.c:127
+#, fuzzy
+msgid "spin button"
+msgstr "Buto Nkaragwa"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr ""
+
+#: atk/atkobject.c:129
+#, fuzzy
+msgid "table"
+msgstr "Imbonerahamwe"
+
+# sw/source\ui\shells\shells.src:STR_SWBG_TABLE_CELL.text
+#: atk/atkobject.c:130
+#, fuzzy
+msgid "table cell"
+msgstr "Akazu k'imbonerahamwe"
+
+#: atk/atkobject.c:131
+#, fuzzy
+msgid "table column header"
+msgstr "imbonerahamwe# Inkingi Umutwempangano"
+
+#: atk/atkobject.c:132
+#, fuzzy
+msgid "table row header"
+msgstr "imbonerahamwe# Urubariro Umutwempangano"
+
+#: atk/atkobject.c:133
+#, fuzzy
+msgid "tear off menu item"
+msgstr "Bidakora Ibikubiyemo Ikintu"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr ""
+
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS1.SC_OPCODE_GET_DATE_VALUE.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS1.SC_OPCODE_GET_TIME_VALUE.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_CODE.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_CLEAN.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_FIND.4.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_SEARCH.4.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_TRIM.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_PROPPER.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_UPPER.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_LOWER.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_VALUE.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_LEN.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_LEFT.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_RIGHT.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_MID.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_REPT.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_SUBSTITUTE.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_DECIMAL.2.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_CONVERT.4.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\scfuncs.src:RID_SC_FUNCTION_DESCRIPTIONS2.SC_OPCODE_CONVERT.6.text
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "umwandiko"
+
+#: atk/atkobject.c:136
+#, fuzzy
+msgid "toggle button"
+msgstr "Mukomatanya Akabuto"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr ""
+
+#: atk/atkobject.c:138
+#, fuzzy
+msgid "tool tip"
+msgstr "Inyobora:"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr ""
+
+#: atk/atkobject.c:140
+#, fuzzy
+msgid "tree table"
+msgstr "imbonerahamwe#"
+
+# sfx2/source\dialog\dinfdlg.src:TP_DOCINFODOC.STR_UNKNOWNSIZE.text
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "ntibizwi"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+# sc/source\ui\src\optdlg.src:RID_SCPAGE_CONTENT.GB_WINDOW.text
+#: atk/atkobject.c:143
+#, fuzzy
+msgid "window"
+msgstr "Idirishya"
+
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\WriterWeb.xcs:....Insert.Table.Header.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Table.Header.text
+#: atk/atkobject.c:144
+#, fuzzy
+msgid "header"
+msgstr "Umutwempangano"
+
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\pagedlg\hfedtdlg.src:FOOTER.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_FOOTER.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\src\globstr.src:RID_GLOBSTR.STR_PAGEFOOTER.text
+# #-#-#-#-#  sc.pot (Gnome 2.12)  #-#-#-#-#
+# sc/source\ui\styleui\styledlg.src:RID_SCDLG_STYLES_PAGE.1.TP_PAGE_FOOTER.text
+#: atk/atkobject.c:145
+#, fuzzy
+msgid "footer"
+msgstr "Imperampangano"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "igika"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "Ikimenyetso"
+
+# filter/source\xsltdialog\xmlfiltertabpagebasic.src:RID_XML_FILTER_TABPAGE_BASIC.FT_XML_APPLICATION.text
+#: atk/atkobject.c:148
+#, fuzzy
+msgid "application"
+msgstr "Porogaramu"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+#, fuzzy
+msgid "edit bar"
+msgstr "Guhindura"
+
+#: atk/atkobject.c:151
+#, fuzzy
+msgid "embedded component"
+msgstr "Gitsindiye"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "Ikimenyetso"
+
+# filter/source\xsltdialog\xmlfiltertabpagebasic.src:RID_XML_FILTER_TABPAGE_BASIC.FT_XML_APPLICATION.text
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "Porogaramu"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "Ibiro Ikadiri"
+
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\WriterWeb.xcs:....Insert.Table.Header.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Table.Header.text
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "Umutwempangano"
+
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Common.xcs:....Image.text
+# #-#-#-#-#  officecfg.pot (Gnome 2.12)  #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Image.Enable.text
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "Ishusho"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "ikadiri"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+#, fuzzy
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Izina: Byahanaguwe kugirango"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+#, fuzzy
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Bya Igikoresho Byahanaguwe kugirango"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+#, fuzzy
+msgid "Is used to notify that the parent has changed"
+msgstr "Kuri Byahinduwe"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+#, fuzzy
+msgid "Is used to notify that the value has changed"
+msgstr "Kuri Agaciro Byahinduwe"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+#, fuzzy
+msgid "The accessible role of this object"
+msgstr "Bya iyi Igikoresho"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+#, fuzzy
+msgid "The accessible layer of this object"
+msgstr "Akugara Bya iyi Igikoresho"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+#, fuzzy
+msgid "The accessible MDI value of this object"
+msgstr "Agaciro Bya iyi Igikoresho"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+#, fuzzy
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Kuri imbonerahamwe# Akarango Byahinduwe iyi indangakintu OYA imbonerahamwe# "
+"Akarango Igikoresho"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+#, fuzzy
+msgid "Is used to notify that the table column header has changed"
+msgstr "Kuri imbonerahamwe# Inkingi Umutwempangano Byahinduwe"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+#, fuzzy
+msgid "Is used to notify that the table column description has changed"
+msgstr "Kuri imbonerahamwe# Inkingi Isobanuramiterere Byahinduwe"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+#, fuzzy
+msgid "Is used to notify that the table row header has changed"
+msgstr "Kuri imbonerahamwe# Urubariro Umutwempangano Byahinduwe"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+#, fuzzy
+msgid "Is used to notify that the table row description has changed"
+msgstr "Kuri imbonerahamwe# Urubariro Isobanuramiterere Byahinduwe"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+#, fuzzy
+msgid "Is used to notify that the table summary has changed"
+msgstr "Kuri imbonerahamwe# Inshamake Byahinduwe"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+#, fuzzy
+msgid "Is used to notify that the table caption has changed"
+msgstr "Kuri imbonerahamwe# Akarango Byahinduwe"
+
+#: atk/atkobject.c:594
+#, fuzzy
+msgid "Number of Accessible Hypertext Links"
+msgstr "Bya"
+
+#: atk/atkobject.c:595
+#, fuzzy
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Umubare Bya amahuza KIGEZWEHO"
diff --git a/po/si.po b/po/si.po
new file mode 100644 (file)
index 0000000..5732030
--- /dev/null
+++ b/po/si.po
@@ -0,0 +1,526 @@
+# translation of si.po to Sinhala
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Danishka Navin <snavin@redhat.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: si\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2007-08-03 15:54+0530\n"
+"Last-Translator: Danishka Navin <snavin@redhat.com>\n"
+"Language-Team: Sinhala <en@li.org>\n"
+"Language: si\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr ""
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr ""
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr ""
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "අවලංගු"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr ""
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr ""
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "සජීවනය"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr ""
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "දිනදසුන"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr ""
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "සලකුණු කොටුව"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr ""
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr ""
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr ""
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "සංයුක්ත කොටුව"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr ""
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr ""
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr ""
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "ඩයල් කරනු"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr ""
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr ""
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr ""
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr ""
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr ""
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "රාමුව"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr ""
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr ""
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "නිරූපකය"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "අනුරුව"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr ""
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "ලෙබලය"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr ""
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "ලැයිස්තුව"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr ""
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "මෙනුව"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "මෙනු තීරුව"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr ""
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr ""
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr ""
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr ""
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr ""
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr ""
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr ""
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr ""
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "එබුම් බොත්තම"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "විකල්ප බොත්තම"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr ""
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr ""
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr ""
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "රෝල් තීරුව"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr ""
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr ""
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "ස්ලයිඩරය"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr ""
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr ""
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr ""
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "වගුව"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr ""
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr ""
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr ""
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr ""
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr ""
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr ""
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ටොගල බොත්තම"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr ""
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr ""
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "රුක"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr ""
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "නොදන්නා"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "කවුළුව"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "ශීර්ෂකය"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "පාදකය"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr ""
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr ""
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "යෙදුම"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr ""
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr "පිවිසුම"
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr "ප්‍රස්තාරය"
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr "යටි ලියමන"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr ""
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "පිටුව"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr "අංශය"
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+msgid "form"
+msgstr "පෝරමය"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
index dea424f..9bd02e9 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -1,15 +1,24 @@
+# #-#-#-#-#  sk.po (at-spi2-core)  #-#-#-#-#
 # Slovak translation for at-spi2-core.
 # Copyright (C) 2012 Free Software Foundation, Inc
 # This file is distributed under the same license as the at-spi2-core package.
 # Peter Mráz <etkinator@gmail.com>, 2012.
 #
+# #-#-#-#-#  sk.po (atk)  #-#-#-#-#
+# Slovak translation of atk.
+# Copyright (C) 2003-2006, 2009, 2013 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# Stanislav Visnovsky <visnovsky@kde.org>, 2003, 2004.
+# Marcel Telka <marcel@telka.sk>, 2005, 2006, 2009.
+# Ján Kyselica <kyselica.jan@gmail.com>, 2013.
+# Pavol Klačanský <pavol@klacansky.com>, 2013.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2015-02-28 03:49+0000\n"
-"PO-Revision-Date: 2015-02-28 13:16+0100\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-09-17 14:43+0000\n"
+"PO-Revision-Date: 2022-11-05 11:57+0100\n"
 "Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
 "Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
 "Language: sk\n"
@@ -17,13 +26,846 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
+"X-Generator: Poedit 3.1.1\n"
 "X-Generator: Poedit 1.7.4\n"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1037
-#: ../atspi/atspi-value.c:111
+# property nick
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Vybraný odkaz"
+
+# property blurb
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Určuje, či je vybraný objekt AtkHyperlink"
+
+# PM: nie som si istý či to nemajú byť kotvy - videl som to vo viacerých moduloch tak preložené
+# PK: podla mna to je proste ciel odkazu, jak na webe
+# property nick
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Počet kotiev"
+
+# property blurb
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Počet kotiev spojených s objektom AtkHyperlink"
+
+# property nick
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Index konca"
+
+# property blurb
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Index konca objektu AtkHyperlink"
+
+# property nick
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Index začiatku"
+
+# property blurb
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Index začiatku objektu AtkHyperlink"
+
+# JK: Invalid role of an object
+#: atk/atkobject.c:99
+msgid "invalid"
+msgstr "neplatná"
+
+#: atk/atkobject.c:100
+msgid "accelerator label"
+msgstr "označenie akcelerátora"
+
+#: atk/atkobject.c:101
+msgid "alert"
+msgstr "varovanie"
+
+#: atk/atkobject.c:102
+msgid "animation"
+msgstr "animácia"
+
+#: atk/atkobject.c:103
+msgid "arrow"
+msgstr "šipka"
+
+#: atk/atkobject.c:104
+msgid "calendar"
+msgstr "kalendár"
+
+#: atk/atkobject.c:105
+msgid "canvas"
+msgstr "plátno"
+
+#: atk/atkobject.c:106
+msgid "check box"
+msgstr "zaškrtávacie pole"
+
+#: atk/atkobject.c:107
+msgid "check menu item"
+msgstr "zaškrtávacia položka ponuky"
+
+#: atk/atkobject.c:108
+msgid "color chooser"
+msgstr "výber farby"
+
+#: atk/atkobject.c:109
+msgid "column header"
+msgstr "hlavička stĺpca"
+
+#: atk/atkobject.c:110
+msgid "combo box"
+msgstr "kombinované pole"
+
+#: atk/atkobject.c:111
+msgid "dateeditor"
+msgstr "editor dátumov"
+
+#: atk/atkobject.c:112
+msgid "desktop icon"
+msgstr "ikona plochy"
+
+#: atk/atkobject.c:113
+msgid "desktop frame"
+msgstr "rámec plochy"
+
+# JK: je to pôvodný preklad (vytáčanie), nič rozumné ma nenapadá. Popis v dokumentácií: An object whose purpose is to allow a user to set a value
+# MČ: vyťukanie?
+# PM: určite nie je to myslené ako podstatné  meno
+#: atk/atkobject.c:114
+msgid "dial"
+msgstr "číselník"
+
+#: atk/atkobject.c:115
+msgid "dialog"
+msgstr "dialógové okno"
+
+#: atk/atkobject.c:116
+msgid "directory pane"
+msgstr "plocha priečinka"
+
+#: atk/atkobject.c:117
+msgid "drawing area"
+msgstr "oblasť kreslenia"
+
+#: atk/atkobject.c:118
+msgid "file chooser"
+msgstr "výber súboru"
+
+#: atk/atkobject.c:119
+msgid "filler"
+msgstr "výplň"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:121
+msgid "fontchooser"
+msgstr "výber písma"
+
+#: atk/atkobject.c:122
+msgid "frame"
+msgstr "rámec"
+
+#: atk/atkobject.c:123
+msgid "glass pane"
+msgstr "priehľadná plocha"
+
+#: atk/atkobject.c:124
+msgid "html container"
+msgstr "kontajner html"
+
+#: atk/atkobject.c:125
+msgid "icon"
+msgstr "ikona"
+
+#: atk/atkobject.c:126
+msgid "image"
+msgstr "obrázok"
+
+#: atk/atkobject.c:127
+msgid "internal frame"
+msgstr "vnútorný rámec"
+
+#: atk/atkobject.c:128
+msgid "label"
+msgstr "označenie"
+
+#: atk/atkobject.c:129
+msgid "layered pane"
+msgstr "plocha s vrstvami"
+
+#: atk/atkobject.c:130
+msgid "list"
+msgstr "zoznam"
+
+#: atk/atkobject.c:131
+msgid "list item"
+msgstr "položka zoznamu"
+
+#: atk/atkobject.c:132
+msgid "menu"
+msgstr "ponuka"
+
+#: atk/atkobject.c:133
+msgid "menu bar"
+msgstr "panel ponuky"
+
+#: atk/atkobject.c:134
+msgid "menu button"
+msgstr "tlačidlo ponuky"
+
+#: atk/atkobject.c:135
+msgid "menu item"
+msgstr "položka ponuky"
+
+#: atk/atkobject.c:136
+msgid "option pane"
+msgstr "plocha volieb"
+
+#: atk/atkobject.c:137
+msgid "page tab"
+msgstr "karta"
+
+#: atk/atkobject.c:138
+msgid "page tab list"
+msgstr "zoznam kariet"
+
+#: atk/atkobject.c:139
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:140
+msgid "password text"
+msgstr "text hesla"
+
+#: atk/atkobject.c:141
+msgid "popup menu"
+msgstr "rozbaľovacia ponuka"
+
+#: atk/atkobject.c:142
+msgid "progress bar"
+msgstr "ukazovateľ priebehu"
+
+#: atk/atkobject.c:143
+msgid "push button"
+msgstr "tlačidlo"
+
+# PM: matne si spomínam, že takto je to tuším aj glade ale podľa mňa by to malo byť tlačidlo
+# PK: technicky je to pole z tlacidlami
+#: atk/atkobject.c:144
+msgid "radio button"
+msgstr "rádiové tlačidlo"
+
+#: atk/atkobject.c:145
+msgid "radio menu item"
+msgstr "rádiová položka ponuky"
+
+#: atk/atkobject.c:146
+msgid "root pane"
+msgstr "koreňová plocha"
+
+#: atk/atkobject.c:147
+msgid "row header"
+msgstr "hlavička riadku"
+
+#: atk/atkobject.c:148
+msgid "scroll bar"
+msgstr "posuvník"
+
+#: atk/atkobject.c:149
+msgid "scroll pane"
+msgstr "plocha s posuvníkmi"
+
+#: atk/atkobject.c:150
+msgid "separator"
+msgstr "oddeľovač"
+
+#: atk/atkobject.c:151
+msgid "slider"
+msgstr "posuvník"
+
+#: atk/atkobject.c:152
+msgid "split pane"
+msgstr "rozdelenie plochy"
+
+#: atk/atkobject.c:153
+msgid "spin button"
+msgstr "rolovacie tlačidlo"
+
+#: atk/atkobject.c:154
+msgid "statusbar"
+msgstr "stavová lišta"
+
+#: atk/atkobject.c:155
+msgid "table"
+msgstr "tabuľka"
+
+#: atk/atkobject.c:156
+msgid "table cell"
+msgstr "bunka tabuľky"
+
+#: atk/atkobject.c:157
+msgid "table column header"
+msgstr "hlavička stĺpca tabuľky"
+
+#: atk/atkobject.c:158
+msgid "table row header"
+msgstr "hlavička riadku tabuľky"
+
+#: atk/atkobject.c:159
+msgid "tear off menu item"
+msgstr "položka ponuky pre odtrhnutie"
+
+#: atk/atkobject.c:160
+msgid "terminal"
+msgstr "terminál"
+
+#: atk/atkobject.c:161
+msgid "text"
+msgstr "text"
+
+#: atk/atkobject.c:162
+msgid "toggle button"
+msgstr "prepínacie tlačidlo"
+
+#: atk/atkobject.c:163
+msgid "tool bar"
+msgstr "lišta nástrojov"
+
+#: atk/atkobject.c:164
+msgid "tool tip"
+msgstr "bublinový popis"
+
+#: atk/atkobject.c:165
+msgid "tree"
+msgstr "strom"
+
+#: atk/atkobject.c:166
+msgid "tree table"
+msgstr "stromová tabuľka"
+
+# JK: neznámy objekt
+#: atk/atkobject.c:167
+msgid "unknown"
+msgstr "neznámy"
+
+#: atk/atkobject.c:168
+msgid "viewport"
+msgstr "prehliadacie miesto"
+
+#: atk/atkobject.c:169
+msgid "window"
+msgstr "okno"
+
+#: atk/atkobject.c:170
+msgid "header"
+msgstr "hlavička"
+
+#: atk/atkobject.c:171
+msgid "footer"
+msgstr "pätička"
+
+#: atk/atkobject.c:172
+msgid "paragraph"
+msgstr "odsek"
+
+#: atk/atkobject.c:173
+msgid "ruler"
+msgstr "pravítko"
+
+#: atk/atkobject.c:174
+msgid "application"
+msgstr "aplikácia"
+
+#: atk/atkobject.c:175
+msgid "autocomplete"
+msgstr "automatické dopĺňanie"
+
+#: atk/atkobject.c:176
+msgid "edit bar"
+msgstr "editovacie pole"
+
+#: atk/atkobject.c:177
+msgid "embedded component"
+msgstr "vložený komponent"
+
+#: atk/atkobject.c:178
+msgid "entry"
+msgstr "vstup"
+
+#: atk/atkobject.c:179
+msgid "chart"
+msgstr "diagram"
+
+#: atk/atkobject.c:180
+msgid "caption"
+msgstr "titulok"
+
+#: atk/atkobject.c:181
+msgid "document frame"
+msgstr "rámec dokumentu"
+
+#: atk/atkobject.c:182
+msgid "heading"
+msgstr "nadpis"
+
+#: atk/atkobject.c:183
+msgid "page"
+msgstr "stránka"
+
+#: atk/atkobject.c:184
+msgid "section"
+msgstr "oddiel"
+
+#: atk/atkobject.c:185
+msgid "redundant object"
+msgstr "prebytočný objekt"
+
+#: atk/atkobject.c:186
+msgid "form"
+msgstr "formulár"
+
+#: atk/atkobject.c:187
+msgid "link"
+msgstr "odkaz"
+
+#: atk/atkobject.c:188
+msgid "input method window"
+msgstr "okno metódy vstupu"
+
+#: atk/atkobject.c:189
+msgid "table row"
+msgstr "riadok tabuľky"
+
+#: atk/atkobject.c:190
+msgid "tree item"
+msgstr "položka stromu"
+
+#: atk/atkobject.c:191
+msgid "document spreadsheet"
+msgstr "tabuľkový dokument"
+
+#: atk/atkobject.c:192
+msgid "document presentation"
+msgstr "prezentácia"
+
+#: atk/atkobject.c:193
+msgid "document text"
+msgstr "textový dokument"
+
+#: atk/atkobject.c:194
+msgid "document web"
+msgstr "webový dokument"
+
+#: atk/atkobject.c:195
+msgid "document email"
+msgstr "dokument typu email"
+
+#: atk/atkobject.c:196
+msgid "comment"
+msgstr "komentár"
+
+#: atk/atkobject.c:197
+msgid "list box"
+msgstr "pole zoznamu"
+
+#: atk/atkobject.c:198
+msgid "grouping"
+msgstr "zoskupenie"
+
+#: atk/atkobject.c:199
+msgid "image map"
+msgstr "mapa obrázkov"
+
+#: atk/atkobject.c:200
+msgid "notification"
+msgstr "oznámenie"
+
+#: atk/atkobject.c:201
+msgid "info bar"
+msgstr "infopanel"
+
+#: atk/atkobject.c:202
+msgid "level bar"
+msgstr "indikátor úrovne"
+
+#: atk/atkobject.c:203
+msgid "title bar"
+msgstr "lišta názvu okna"
+
+#: atk/atkobject.c:204
+msgid "block quote"
+msgstr "citácia"
+
+#: atk/atkobject.c:205
+msgid "audio"
+msgstr "zvuk"
+
+#: atk/atkobject.c:206
+msgid "video"
+msgstr "video"
+
+#: atk/atkobject.c:207
+msgid "definition"
+msgstr "definícia"
+
+#: atk/atkobject.c:208
+msgid "article"
+msgstr "článok"
+
+#: atk/atkobject.c:209
+msgid "landmark"
+msgstr "oblasť stránky"
+
+#: atk/atkobject.c:210
+msgid "log"
+msgstr "záznam"
+
+#: atk/atkobject.c:211
+msgid "marquee"
+msgstr "bežiaci text"
+
+#: atk/atkobject.c:212
+msgid "math"
+msgstr "matematika"
+
+#: atk/atkobject.c:213
+msgid "rating"
+msgstr "hodnotenie"
+
+#: atk/atkobject.c:214
+msgid "timer"
+msgstr "časovač"
+
+#: atk/atkobject.c:215
+msgid "description list"
+msgstr "zoznam popisov"
+
+#: atk/atkobject.c:216
+msgid "description term"
+msgstr "výraz definície"
+
+#: atk/atkobject.c:217
+msgid "description value"
+msgstr "hodnota popisu"
+
+# PM: názov; chápem to ako názov objektu, ktorý umožňuje zjednodušené ovládanie - ako to preložiť aby to bolo stručné netuším
+# PK: myslim ze to pochopia z kontextu
+# pv: podľa mňa nie je zobrazené v UI, len pri návrhu UI. Možno zvážiť názov pre prístupnosť. Predstavujem si to ako label pre poli v aplikácii typu designer
+# property name
+#: atk/atkobject.c:393
+msgid "Accessible Name"
+msgstr "Prístupný názov"
+
+# property blurb
+#: atk/atkobject.c:394
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Názov inštancie objektu naformátovaný pre prístupnosť cez zjednodušenie "
+"ovládania"
+
+# property name
+#: atk/atkobject.c:400
+msgid "Accessible Description"
+msgstr "Prístupný popis"
+
+# property blurb
+#: atk/atkobject.c:401
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Popis objektu, formátovaný pre prístupnosť cez zjednodušenie ovládania"
+
+# property name
+#: atk/atkobject.c:407
+msgid "Accessible Parent"
+msgstr "Prístupný rodič"
+
+#: atk/atkobject.c:408
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Rodič aktuálneho sprístupnenia, ako ho vracia funkcia atk_object_get_parent()"
+
+# property name
+#: atk/atkobject.c:424
+msgid "Accessible Value"
+msgstr "Prístupná hodnota"
+
+# property blurb
+#: atk/atkobject.c:425
+msgid "Is used to notify that the value has changed"
+msgstr "Používa sa na oznámenie, že sa hodnota zmenila"
+
+# property name
+#: atk/atkobject.c:433
+msgid "Accessible Role"
+msgstr "Úloha v prístupnosti"
+
+# property blurb
+#: atk/atkobject.c:434
+msgid "The accessible role of this object"
+msgstr "Úloha tohto objektu v prístupnosti"
+
+# property name
+#: atk/atkobject.c:441
+msgid "Accessible Layer"
+msgstr "Vrstva prístupnosti"
+
+# property blurb
+#: atk/atkobject.c:442
+msgid "The accessible layer of this object"
+msgstr "Vrstva prístupnosti tohto objektu"
+
+# property name
+#: atk/atkobject.c:450
+msgid "Accessible MDI Value"
+msgstr "Prístupná hodnota MDI"
+
+# property blurb
+#: atk/atkobject.c:451
+msgid "The accessible MDI value of this object"
+msgstr "Prístupná hodnota MDI pre tento objekt"
+
+# property name
+#: atk/atkobject.c:467
+msgid "Accessible Table Caption"
+msgstr "Prístupný titulok tabuľky"
+
+# property blurb
+#: atk/atkobject.c:468
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Používa sa na oznámenie, že sa nadpis tabuľky zmenil. Táto vlastnosť by sa "
+"nemala používať. Namiesto nej použite accessible-table-caption-object"
+
+# property name
+#: atk/atkobject.c:482
+msgid "Accessible Table Column Header"
+msgstr "Prístupná hlavička stĺpca tabuľky"
+
+# property blurb
+#: atk/atkobject.c:483
+msgid "Is used to notify that the table column header has changed"
+msgstr "Používa sa na oznámenie, že sa hlavička stĺpca tabuľky zmenila"
+
+# property name
+#: atk/atkobject.c:498
+msgid "Accessible Table Column Description"
+msgstr "Prístupný popis stĺpca tabuľky"
+
+# property blurb
+#: atk/atkobject.c:499
+msgid "Is used to notify that the table column description has changed"
+msgstr "Používa sa na oznámenie, že sa popis stĺpca tabuľky zmenil"
+
+# property name
+#: atk/atkobject.c:514
+msgid "Accessible Table Row Header"
+msgstr "Prístupná hlavička riadku tabuľky"
+
+# property blurb
+#: atk/atkobject.c:515
+msgid "Is used to notify that the table row header has changed"
+msgstr "Používa sa na oznámenie, že sa hlavička riadku tabuľky zmenila"
+
+# property name
+#: atk/atkobject.c:529
+msgid "Accessible Table Row Description"
+msgstr "Prístupný popis riadku tabuľky"
+
+# property blurb
+#: atk/atkobject.c:530
+msgid "Is used to notify that the table row description has changed"
+msgstr "Používa sa na oznámenie, že sa popis riadku tabuľky zmenil"
+
+# property name
+#: atk/atkobject.c:536
+msgid "Accessible Table Summary"
+msgstr "Prístupný súhrn tabuľky"
+
+# property blurb
+#: atk/atkobject.c:537
+msgid "Is used to notify that the table summary has changed"
+msgstr "Používa sa na oznámenie, že sa súhrn tabuľky zmenil"
+
+# property name
+#: atk/atkobject.c:543
+msgid "Accessible Table Caption Object"
+msgstr "Prístupný objekt hlavičky tabuľky"
+
+# property blurb
+#: atk/atkobject.c:544
+msgid "Is used to notify that the table caption has changed"
+msgstr "Používa sa na oznámenie, že sa hlavička tabuľky zmenila"
+
+# property name
+#: atk/atkobject.c:550
+msgid "Number of Accessible Hypertext Links"
+msgstr "Počet prístupných odkazov"
+
+# property blurb
+#: atk/atkobject.c:551
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Počet odkazov, ktoré AtkHypertext obsahuje"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "veľmi slabé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "slabé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "akceptovateľné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "silné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "veľmi silné"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "veľmi nízka"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "stredná"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "vysoká"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "veľmi vysoká"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "veľmi zlé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "zlé"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "dobré"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "veľmi dobré"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "najlepšie"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1068 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Aplikácia už neexistuje"
 
-#: ../atspi/atspi-misc.c:1795
-msgid "Attempted synchronous call where prohibited"
-msgstr "Pokus o synchrónne volanie tam, kde je zakázané"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Pokus o synchrónne volanie tam, kde je zakázané"
+
+# property blurb
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Používa sa na oznámenie, že sa rodič zmenil"
index 38365f4..68aaf2c 100644 (file)
--- a/po/sl.po
+++ b/po/sl.po
+# #-#-#-#-#  sl.po (at-spi2-core master)  #-#-#-#-#
 # Slovenian translations for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Ime priimek <email>, 2011-2014.
 #
+# #-#-#-#-#  sl.po (atk master)  #-#-#-#-#
+# Slovenian translations for atk.
+# Copyright (C) 2005-2007 Free Software Foundation, Inc.
+# This file is distributed under the same license as the program package.
+#
+# Andraž Tori <andraz.tori1@guest.arnes.si> 2002
+# Matej Urbančič <mateju@svn.gnome.org> 2007-2014.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-28 15:45+0000\n"
-"PO-Revision-Date: 2014-02-28 23:11+0100\n"
-"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2024-01-03 22:53+0000\n"
+"PO-Revision-Date: 2024-01-05 08:44+0100\n"
+"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
 "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
-"Language: sl\n"
+"Language: sl_SI\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);\n"
 "X-Poedit-SourceCharset: utf-8\n"
-"X-Generator: Poedit 1.5.4\n"
+"X-Generator: Poedit 2.2.1\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Izbrana povezava"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Določa, ali je predmet AtkHyperlink izbran"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Število sider"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Število sider, povezanih s predmetom AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Končno kazalo"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Končno kazalo predmeta AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Začetno kazalo"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Začetno kazalo predmeta AtkHyperlink"
+
+#: atk/atkobject.c:272
+msgid "Accessible Name"
+msgstr "Dostopno ime"
+
+#: atk/atkobject.c:273
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Ime primerka predmeta v obliki pomožnih tehnologij"
+
+#: atk/atkobject.c:279
+msgid "Accessible Description"
+msgstr "Dostopni opis"
+
+#: atk/atkobject.c:280
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Opis predmeta v obliki pomožnih tehnologij"
+
+#: atk/atkobject.c:286
+msgid "Accessible Parent"
+msgstr "Dostopen nadrejeni"
+
+#: atk/atkobject.c:287
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Nadrejeni predmet trenutno dostopnega predmeta, kot ga obravnava "
+"modulatk_object_get_parent()"
+
+#: atk/atkobject.c:303
+msgid "Accessible Value"
+msgstr "Dostopna vrednost"
+
+#: atk/atkobject.c:304
+msgid "Is used to notify that the value has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah vrednosti"
+
+#: atk/atkobject.c:312
+msgid "Accessible Role"
+msgstr "Dostopna vloga"
+
+#: atk/atkobject.c:313
+msgid "The accessible role of this object"
+msgstr "Dostopna vloga tega predmeta"
+
+#: atk/atkobject.c:320
+msgid "Accessible Layer"
+msgstr "Dostopna raven"
+
+#: atk/atkobject.c:321
+msgid "The accessible layer of this object"
+msgstr "Dostopna raven tega predmeta"
+
+#: atk/atkobject.c:329
+msgid "Accessible MDI Value"
+msgstr "Dostopna vrednost MDI"
+
+#: atk/atkobject.c:330
+msgid "The accessible MDI value of this object"
+msgstr "Dostopna vrednost MDI tega predmeta"
+
+#: atk/atkobject.c:346
+msgid "Accessible Table Caption"
+msgstr "Dostopen naziv razpredelnice"
+
+#: atk/atkobject.c:347
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Uporabljen pri opozarjanju o spremembah naziva razpredelnice. Namesto te "
+"lastnosti raje uporabite accessible-table-caption-object"
+
+#: atk/atkobject.c:361
+msgid "Accessible Table Column Header"
+msgstr "Dostopna glava stolpca razpredelnice"
+
+#: atk/atkobject.c:362
+msgid "Is used to notify that the table column header has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah glave stolpca razpredelnice"
+
+#: atk/atkobject.c:377
+msgid "Accessible Table Column Description"
+msgstr "Dostopen opis stolpca razpredelnice"
+
+#: atk/atkobject.c:378
+msgid "Is used to notify that the table column description has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah opisa stolpca razpredelnice"
+
+#: atk/atkobject.c:393
+msgid "Accessible Table Row Header"
+msgstr "Dostopna glava vrstice razpredelnice"
+
+#: atk/atkobject.c:394
+msgid "Is used to notify that the table row header has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah glave vrstice razpredelnice"
+
+#: atk/atkobject.c:408
+msgid "Accessible Table Row Description"
+msgstr "Dostopen opis vrstice razpredelnice"
+
+#: atk/atkobject.c:409
+msgid "Is used to notify that the table row description has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah opisa vrstice razpredelnice"
+
+#: atk/atkobject.c:415
+msgid "Accessible Table Summary"
+msgstr "Dostopen povzetek razpredelnice"
+
+#: atk/atkobject.c:416
+msgid "Is used to notify that the table summary has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah povzetka razpredelnice"
+
+#: atk/atkobject.c:422
+msgid "Accessible Table Caption Object"
+msgstr "Dostopen predmet naziva razpredelnice"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atk/atkobject.c:423
+msgid "Is used to notify that the table caption has changed"
+msgstr "Uporabljen pri opozarjanju o spremembah naziva razpredelnice"
+
+#: atk/atkobject.c:429
+msgid "Number of Accessible Hypertext Links"
+msgstr "Število dostopnih hiperpovezav"
+
+#: atk/atkobject.c:430
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Število povezav, ki jih ima trenutni AtkHypertext"
+
+#: atk/atkobject.c:439
+#, fuzzy
+msgid "Accessible ID"
+msgstr "Dostopni ID"
+
+#: atk/atkobject.c:440
+#, fuzzy
+msgid "ID for the accessible; useful for automated testing"
+msgstr "ID za dostopno; uporabno za samodejno preizkušanje"
+
+# G:0 K:1 O:0
+#: atk/atkobject.c:446
+msgid "Help text"
+msgstr "Besedilo pomoči"
+
+#: atk/atkobject.c:447
+#, fuzzy
+msgid "Help text associated with the accessible"
+msgstr "Besedilo pomoči, povezano z dostopnim"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "zelo šibko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "šibko"
+
+# G:4 K:0 O:0
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "sprejemljivo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "močno"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "zelo močno"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "zelo nizko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "srednje"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "visoko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "zelo visoko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "zelo slabo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "slabo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "dobro"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "zelo dobro"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "najboljše"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Program ne obstaja več"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "Poskus usklajevanja klicev je prepovedan"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "neveljavno"
+
+# G:3 K:0 O:0
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "oznaka pospeševalnika"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "opozorilo"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "animacija"
+
+# G:4 K:2 O:0
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "puščica"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "koledar"
+
+# G:6 K:2 O:0
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "platno"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "potrditveno polje"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "potrditveno polje menija"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "izbirnik barv"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "glava stolpca"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "spustno polje"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "datumski urejevalnik"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "ikona namizja"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "okvir namizja"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "kliči"
+
+# G:0 K:3 O:0
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "pogovorno okno"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "pladenj z mapami"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "risalna površina"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "izbirnik datotek"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "polnilnik"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "izbirnik pisav"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "okvir"
+
+# G:2 K:1 O:0
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "steklen pladenj"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "vsebovalnik html"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "ikona"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "slika"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "notranji okvir"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "oznaka"
+
+# G:3 K:4 O:0
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "ravninski pladenj"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "seznam"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "predmet seznama"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "meni"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "menijska vrstica"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "gumb menija"
+
+# G:2 K:0 O:0
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "predmet menija"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "pladenj možnosti"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "zavihek strani"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "seznam zavihkov strani"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "pult"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "besedilo gesla"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "pojavni meni"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "kazalnik napredka"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "gumb"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "radijski gumb"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "radijski predmet menija"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "korenski pladenj"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "glava vrstice"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "drsnik"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "drsni pladenj"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "ločilnik"
+
+# G:3 K:1 O:0
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "drsnik"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "delilni pladenj"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "vrtljivi gumb"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "vrstica stanja"
+
+# G:4 K:0 O:0
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "razpredelnica"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "celica razpredelnice"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "glava stolpca razpredelnice"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "glava vrstice razpredelnice"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "predmet odtrgljivega menija"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminal"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "besedilo"
+
+# G:1 K:1 O:0
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "preklopni gumb"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "orodna vrstica"
+
+# G:1 K:1 O:0
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "orodni namig"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "drevo"
+
+# G:7 K:1 O:0
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "drevo razpredelnice"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "neznano"
+
+# G:4 K:2 O:0
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "vidno polje"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "okno"
+
+# G:7 K:6 O:0
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "glava"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "noga"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "odstavek"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "merilnik"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "program"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "samodejno dopolnjevanje"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "vrstica za urejanje"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "vgrajene enote"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "vnos"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "graf"
+
+# G:1 K:0 O:0
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "naslov"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "okvir dokumenta"
+
+# G:7 K:6 O:0
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "glava"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "stran"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "odsek"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "odvečni predmet"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "obrazec"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "povezava"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "okno načina vnosa"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "vrstica preglednice"
+
+# G:7 K:1 O:0
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "predmet drevesa"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "preglednica dokumenta"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "predstavitev  dokumenta"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "besedilo dokumenta"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "spletni naslov dokumenta"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "elektronski naslov dokumenta"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "opomba"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "seznam"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "skupinjenje"
+
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "zemljevid slike"
 
-#~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
-#~ msgstr "AT-SPI: neznan podpis %s za predmet RemoveAccessible"
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "obvestilo"
 
-#~ msgid "AT-SPI: Error calling getRoot for %s: %s"
-#~ msgstr "AT-SPI: napaka klicanja predmeta getRoot za %s: %s"
+# G:0 K:1 O:0
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "vrstica podrobnosti"
 
-#~ msgid "AT-SPI: Error in GetItems, sender=%s, error=%s"
-#~ msgstr "AT-SPI: napaka v predmetu GetItems, pošiljatelj=%s, napaka=%s"
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "vrstica ravni"
 
-#~ msgid ""
-#~ "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
-#~ "signature %s"
-#~ msgstr ""
-#~ "AT-SPI: predmet called_atatspi_dbus_return_accessible_from_message je "
-#~ "izveden z nenavadnim podpisom %s"
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "naslovna vrstica"
 
-#~ msgid ""
-#~ "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
-#~ "signature %s"
-#~ msgstr ""
-#~ "AT-SPI: predmet called _atspi_dbus_return_hyperlink_from_message je "
-#~ "izveden z nenavadnim podpisom %s"
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "blokovni navedek"
 
-#~ msgid "AT-SPI: AddAccessible with unknown signature %s\n"
-#~ msgstr "AT-SPI: predmet AddAccessible je izveden z neznanim podpisom %s\n"
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "zvok"
 
-#~ msgid "AT-SPI: Could not get the display\n"
-#~ msgstr "AT-SPI: ni mogoče pridobiti zaslona\n"
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
 
-#~ msgid "AT-SPI: Accessibility bus not found - Using session bus.\n"
-#~ msgstr ""
-#~ "AT-SPI: vodila dostopnosti ni mogoče najti; uporabljeno bo vodilo seje.\n"
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "določilo"
 
-#~ msgid "AT-SPI: Couldn't connect to bus: %s\n"
-#~ msgstr "AT-SPI: ni se mogoče povezati z vodilom: %s\n"
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "prispevek"
 
-#~ msgid "AT-SPI: Couldn't register with bus: %s\n"
-#~ msgstr "AT-SPI: ni se mogoče vpisati na vodilu: %s\n"
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "mestna oznaka"
 
-#~ msgid ""
-#~ "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-#~ msgstr ""
-#~ "AT-SPI: pričakovana vrednost med pridobivanjem %s z vmesnika %s; "
-#~ "pridobljeno %s\n"
+# G:0 K:3 O:0
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "dnevnik"
 
-#~ msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
-#~ msgstr ""
-#~ "atspi_dbus_get_property: neveljavna vrsta: pričakovana je vrednost %s, "
-#~ "pridobljena pa %c\n"
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "markiza"
 
-#~ msgid "AT-SPI: Unknown interface %s"
-#~ msgstr "AT-SPI: neznan vmesnik %s"
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "matematika"
 
-#~ msgid "AT-SPI: expected 2 values in states array; got %d\n"
-#~ msgstr "AT-SPI: pričakovani sta 2 vrednosti v polju stanj; pridobljeno %d\n"
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "ocena"
 
-#~ msgid "Streamable content not implemented"
-#~ msgstr "Ni podpore za pretočno vsebino"
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "časomer"
 
-#~ msgid ""
-#~ "called atspi_event_listener_register_from_callback with a NULL event_type"
-#~ msgstr ""
-#~ "predmet atspi_event_listener_register_from_callback je klican s prazno "
-#~ "vrednostjo možnosti event_type"
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "seznam opisa"
 
-#~ msgid "Got invalid signature %s for signal %s from interface %s\n"
-#~ msgstr "Pridobljen neveljaven podpis %s za signal %s z vmesnika %s\n"
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "pojem opisa"
 
-#~ msgid "AT-SPI: Got error: %s\n"
-#~ msgstr "AT-SPI: pridobljena napaka: %s\n"
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "vrednost opisa"
index e54a5d0..7f2558f 100644 (file)
--- a/po/sq.po
+++ b/po/sq.po
@@ -1,9 +1,19 @@
+# #-#-#-#-#  sq.po (at-spi2-core)  #-#-#-#-#
 # Albanian translation for at-spi2-core.
 # Copyright (C) 2011 Free Software Foundation, Inc.
 # This file is distributed under the same license as the at-spi2-core package.
 # Laurent Dhima <laurenti@alblinux.net>, 2011.
+# #-#-#-#-#  sq.po (atk master)  #-#-#-#-#
+# Përkthimi i mesazheve të atk në shqip
+# Copyright (C) 2002, 2004, 2005, 2006, 2008, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+#
+# Deep_Dark    <epidamus@netscape.net>,        2003.
+# Laurent Dhima        <laurenti@alblinux.net>,        2004, 2005, 2006, 2008, 2010.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  sq.po (at-spi2-core)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2011-02-08 19:14+0100\n"
@@ -15,6 +25,18 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"#-#-#-#-#  sq.po (atk master)  #-#-#-#-#\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2010-05-11 19:32+0200\n"
+"PO-Revision-Date: 2010-05-11 19:35+0200\n"
+"Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
+"Language-Team: albanian <gnome-albanian-perkthyesit@lists.sourceforge.net>\n"
+"Language: sq\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -80,7 +102,8 @@ msgstr "Aplikativi nuk ekziston më"
 #: ../atspi/atspi-misc.c:1130
 #, c-format
 msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-msgstr "AT-SPI: pritej një variant gjatë marrjes së %s nga interfaqja %s; u mor %s\n"
+msgstr ""
+"AT-SPI: pritej një variant gjatë marrjes së %s nga interfaqja %s; u mor %s\n"
 
 #: ../atspi/atspi-misc.c:1136
 #, c-format
@@ -112,3 +135,527 @@ msgstr ""
 #, c-format
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "U mor firma e pavlefshme %s për sinjalin %s nga interfaqja %s\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Lidhja e zgjedhur"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Specifikon nëse është zgjedhur objekti AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Numri i lidhjeve"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Numri i spirancave shoqëruar me objektin AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Fundi i treguesit"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Fundi i treguesit të objektit AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Fillimi i treguesit"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Fillimi i treguesit të objektit AtkHyperlink"
+
+# (pofilter) startcaps: checks that the message starts with the correct capitalisation
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "i pavlefshëm"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "etiketa e përshpejtuesit"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "paralajmërim"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "animacioni"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "shigjetë"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "kalendar"
+
+# (pofilter) brackets: translation has extra '(', ')'
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "telë"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "kuti zgjedhjeje"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "element menu zgjedhur"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "zgjedhësi i ngjyrave"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "kreu i kollonës"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "kuti e kombinuar"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "ndryshues date"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ikonë për desktop"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "kornizë desktop-i"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "telefonatë"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "dritare dialogu"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "paneli i directory"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "sipërfaqja e vizatimit"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "zgjedhësi i file"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "mbushës"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "zgjedhës gërmash"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "kornizë"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "panel i tejdukshëm"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "përmbajtës html"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ikonë"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "figurë"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "kornizë e brendshme"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "etiketë"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "panel me nivele"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "listë"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "element liste"
+
+# (pofilter) unchanged: please translate
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "menu"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "shtyllë menuje"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "element menuje"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "panel opsionesh"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "skedë"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "listë skedash"
+
+# (pofilter) unchanged: please translate
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "tekst fjalëkalimi"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "menu e shpalosëshme"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "shtyllë ecurie"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "pulsant"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "pulsant zgjedhje"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "element menu zgjedhje"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "panel bazë"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "kreu i rreshtit"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "shtyllë rrëshkitje"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "panel me rrëshkitje"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "ndarës"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "kontrollues me rrëshkitje"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "panel i ndarë"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "pulsant numerik"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "shtyllë gjëndjeje"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "tabelë"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "qeli tabele"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "kreu kollone tabele"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "kreu rresht tabele"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "element i shkëputshëm menuje"
+
+# (pofilter) unchanged: please translate
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "tekst"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "pulsant me dy gjëndje"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "panel instrumentësh"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "propozim"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "degëzim"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "tabelë e degëzuar"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "nuk njihet"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "viewport"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "dritare"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "kreu"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "fundi"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraf"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "vizore"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "aplikativ"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "plotësim automatik"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "shtyllë ndryshimi"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "komponent i trupëzuar"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "fushë shtimi"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "diagramë"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "titull"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "kornizë dokumenti"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "titull"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "faqe"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "seksion"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "objekt i përsëritur"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "formular"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "lidhje"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "dritare metode të input"
+
+#: ../atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Emri açesibël"
+
+#: ../atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Emri i instancës së objektit i formatuar për të qenë i shfrytëzueshëm nga "
+"teknollogjitë asistuese"
+
+#: ../atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Përshkrimi açesibël"
+
+#: ../atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+"Përshkrimi i një objekti, formatuar për hyrje nga teknollogjia asistuese"
+
+#: ../atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Prind i përshtatshëm"
+
+#: ../atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Përdoret për të njoftuar që prindi është ndryshuar"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Vlerë e përshtatshme"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Përdoret për të njoftuar që vlera është ndryshuar"
+
+#: ../atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Rol i përshtatshëm"
+
+#: ../atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Roli i përshtatshëm i këtij objekti"
+
+#: ../atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Nivel i përshtatshëm"
+
+#: ../atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Niveli i përshtatshëm i këtij objekti"
+
+#: ../atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Vlerë MDI e përshtatshme"
+
+#: ../atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Vlera e përshtatshme MDI e këtij objekti"
+
+#: ../atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Titull i përshtatshëm tabele"
+
+# (pofilter) sentencecount: The number of sentences differ: 1 versus 2
+# (pofilter) simplecaps: checks the capitalisation of two strings isn't wildly different
+#: ../atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Përdoret për të njoftuar që përshkrimi i tabelës është ndryshuar; kjo "
+"pronësi nuk duhet përdorur. Në vend të saj duhet përdorur accessible-table-"
+"caption-object"
+
+#: ../atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Titulli i përshtatshëm i kollonës së tabelës"
+
+#: ../atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Përdoret për të njoftuar që titulli i kollonës së tabelës është ndryshuar"
+
+#: ../atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Përshkrim i përshtatshëm i kollonës së tabelës"
+
+#: ../atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Përdoret për të njoftuar që përshkrimi i kollonës së tabelës është ndryshuar"
+
+#: ../atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Titulli i përshtatshëm i rreshtit të tabelës"
+
+#: ../atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Përdoret për të njoftuar që titulli i rreshtit të tabelës është ndryshuar"
+
+#: ../atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Përshkrim i përshtatshëm i rreshtit të tabelës"
+
+#: ../atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Përdoret për të njoftuar që përshkrimi i rreshtit të tabelës është ndryshuar"
+
+#: ../atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Përmbledhje e përshtatshme e tabelës"
+
+#: ../atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Përdoret për të njoftuar që përmbledhja e tabelës është ndryshuar"
+
+#: ../atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Objekt titulli i përshtatshëm tabele"
+
+#: ../atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Përdoret për të njoftuar që titulli i tabelës është ndryshuar"
+
+#: ../atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Numër lidhjesh të përshtatshme në hypertext"
+
+#: ../atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Numri i lidhjeve që ka AtkHypertext-i aktual"
index 58a4d7d..4970cc7 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
+# Serbian translation of atk (at-spi2-core)
+# Courtesy of Prevod.org team (http://www.prevod.org/) -- 2003, 2004, 2009.
+# This file is distributed under the same license as the atk package.
+# Maintainer: Данило Шеган <dsegan@gmx.net>
+# Reviewed on 2004-03-05 by Александар Урошевић <urke@users.sourceforge.net>
+# Reviewed on 2004-08-06 by: Данило Шеган <danilo@prevod.org>
 # Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011, 2014.
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-03-15 11:09+0200\n"
-"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-08-06 16:28+0200\n"
+"Last-Translator: Марко М. Костић <marko.m.kostic@gmail.com>\n"
 "Language-Team: Serbian <gnom@prevod.org>\n"
 "Language: sr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
-"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Project-Style: gnome\n"
+"X-Generator: Poedit 3.1.1\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Изабрана веза"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Одређује да ли је изабран објекат Атк Хипервезе"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Број смерница"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Број смерница објекта Атк Хипервезе"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Завршни индекс"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Завршни индекс објекта Атк Хипервезе"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Почетни индекс"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Почетни индекс објекта Атк Хипервезе"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "неисправно"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "ознака пречице"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "упозорење"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "анимација"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "стрелица"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "календар"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "слика"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "кућица за означавање"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "ставка менија за означавање"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "избор боје"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "заглавље колоне"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "комбинована кућица"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "уређивач датума"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "иконица радне површи"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "оквир радне површи"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "позови"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "прозорче"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "листа директоријума"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "површина за цртање"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "избор датотеке"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "пуњач"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "избор словног лика"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "оквир"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "стаклена зона"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "хтмл садржалац"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "иконица"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "слика"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "унутрашњи оквир"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "ознака"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "послагане плоче"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "списак"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "ставка списка"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "мени"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "главни мени"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "дугме менија"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "ставка менија"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "плоча опција"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "лист"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "списак листова"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "панел"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "текст лозинке"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "искачући мени"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "линија напредовања"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "дугме"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "искључиво дугме"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "искључива ставка менија"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "корена плоча"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "заглавље реда"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "линија за померање"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "плоча за померање"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "раздвајач"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "клизач"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "плоча за раздвајање"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "вртеће дугме"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "линија стања"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "табела"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "поље табеле"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "заглавље колоне табеле"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "заглавље реда табеле"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "одвојива ставка менија"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "терминал"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "текст"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "прекидач дугме"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "линија алатки"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "облачић обавештења"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "стабло"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "табела стабла"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "непознато"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "поглед"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "прозор"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "заглавље"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "подножје"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "пасус"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "лењир"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "програм"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "самодопуњавање"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "поље за унос"
+
+# састојак уместо „део“ (part)
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "угњеждени састојак"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "ставка"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "табела"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "натпис"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "оквир документа"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "курс"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "страна"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "одељак"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "поновљени објекат"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "формулар"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "веза"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "прозор начина уноса"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "ред табеле"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "ставка стабла"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "таблица документа"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "презентација документа"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "текст документа"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "веб документа"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "е-пошта документа"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "примедба"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "листа"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "груписање"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "мапа слике"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "обавештење"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "линија обавештења"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "трака нивоа"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "трака наслова"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "блок цитата"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "звук"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "снимак"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "одредница"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "чланак"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "орјентир"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "дневник"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "реклама"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "матиш"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "пласман"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "одбројавач"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "списак описа"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "термин описа"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "вредност описа"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "Приступачно име"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Име инстанце објекта прилагођено приступу помоћу технологија за испомоћ"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "Приступачан опис"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Опис објекта прилагођен приступу помоћу технологија за испомоћ"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "Приступачан садржалац"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Садржалац тренутног приступачног како га даје „atk_object_get_parent()“"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "Приступачна вредност"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "Користи се за обавештавање да је вредност измењена"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "Приступачна улога"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "Приступачна улога овог објекта"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "Слој приступачности"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "Слој приступачности овог објекта"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "Приступачна МДИ вредност"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "Приступачна МДИ вредност овог објекта"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "Приступачан наслов табеле"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Користи се за обавештавање да је измењен наслов табеле; не треба користити "
+"ову особину, већ „accessible-table-caption-object“"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "Приступачно заглавље колоне табеле"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "Користи се за обавештавање да је измењено заглавље колоне у табели"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "Приступачан опис колоне табеле"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "Користи се за обавештавање да је измењен опис колоне у табели"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "Приступачно заглавље реда табеле"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "Користи се за обавештавање да је измењено заглавље реда у табели"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "Приступачан опис реда табеле"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "Користи се за обавештавање да је измењен опис реда у табели"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "Приступачан сажетак табеле"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "Користи се за обавештавање да је измењен сажетак табеле"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "Приступачан објекат наслова табеле"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "Користи се за обавештавање да је измењен наслов табеле"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "Број приступачних веза у надтексту"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Колико веза садржи текући Атк Хипертекст"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "врло слабо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "слабо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "прихватљиво"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "јако"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "врло јако"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "врло ниско"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "средње"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "високо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "врло високо"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "врло лоше"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "лоше"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "добро"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "врло добро"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "најбоље"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Програм не постоји више"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Покушан је усаглашени позив где је забрањен"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Покушан је усаглашени позив где је забрањен"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "АТ-СПИ: Непознат потпис „%s“ за „Уклони доступног“"
@@ -91,3 +877,6 @@ msgstr "Покушан је усаглашени позив где је забр
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Добих неисправан потпис „%s“ за сигнал „%s“ са сучеља „%s“\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Користи се за обавештавање да је садржалац измењен"
diff --git a/po/sr@ije.po b/po/sr@ije.po
new file mode 100644 (file)
index 0000000..e1eb9f2
--- /dev/null
@@ -0,0 +1,536 @@
+# Serbian translation of atk
+# Courtesy of Prevod.org team (http://www.prevod.org/) -- 2003, 2004.
+#
+# This file is distributed under the same license as the atk package.
+#
+# Maintainer: Данило Шеган <dsegan@gmx.net>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2004-08-06 19:34+0200\n"
+"Last-Translator: Bojan Suzic <bojans@teol.net>\n"
+"Language-Team: Serbian (sr) <gnom@prevod.org>\n"
+"Language: sr@ije\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Изабрана веза"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Одређује да ли је изабран AtkHyperlink објекат"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Број смјерница"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Број смјерница AtkHyperlink објекта"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Завршни индекс"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Завршни индекс AtkHyperlink објекта"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Почетни индекс"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Почетни индекс AtkHyperlink објекта"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "неисправно"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ознака пречице"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "упозорење"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "анимација"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "стријела"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "календар"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "слика"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "кућица за означавање"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "ставка менија за означавање"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "избор боје"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "заглавље колоне"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "комбинована кућица"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "уређивач датума"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "иконица радне површи"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "оквир радне површи"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "позови"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "прозорче"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "листа директоријума"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "површина за цртање"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "избор датотеке"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "пуњач"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "избор писма"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "оквир"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "стаклена зона"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "садржалац html-а"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "иконица"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "слика"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "унутрашњи оквир"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "ознака"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "послагане плоче"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "списак"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "ставка списка"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "мени"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "главни мени"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "ставка менија"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "плоча опција"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "лист"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "списак листова"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "панел"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "текст лозинке"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "искачући мени"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "линија тока"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "дугме"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "искључиво дугме"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "искључива ставка менија"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "корена плоча"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "заглавље реда"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "линија за помјерање"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "плоча за помјерање"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "раздвајач"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "клизач"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "плоча за раздвајање"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "вртеће дугме"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "линија са стањем"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "табела"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "поље табеле"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "заглавље колоне табеле"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "заглавље реда табеле"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "одвојива мени ставка"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "терминал"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "текст"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "прекидач дугме"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "линија алатки"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "облачић"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "дрво"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "дрво табела"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "непознато"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "поглед"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "прозор"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "заглавље"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "подножје"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "пасус"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "упозорење"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "програм"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "самодопуњавање"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "поље за унос"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "угњеждени састојак"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "упозорење"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "програм"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "оквир радне површи"
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "заглавље"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "слика"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "оквир"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Приступачно име"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Име инстанце објекта прилагођено приступу помоћу технологија за испомоћ"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Приступачан опис"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Опис објекта прилагођен приступу помоћу технологија за испомоћ"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Приступачан садржалац"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Користи се за обавјештавање да је садржалац измјењен"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Приступачна вредност"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Користи се за обавјештавање да је вриједност измјењена"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Приступачна улога"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Приступачна улога овог објекта"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Слој приступачности"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Слој приступачности овог објекта"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Приступачна MDI вриједност"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Приступачна MDI вриједност овог објекта"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Приступачан наслов табеле"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Користи се за обавјештавање да је измјењен наслов табеле; не треба користити "
+"ову особину, већ accessible-table-caption-object."
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Приступачно заглавље колоне табеле"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Користи се за обавјештавање да је измјењено заглавље колоне у табели"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Приступачан опис колоне табеле"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "Користи се за обавјештавање да је измјењен опис колоне у табели"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Приступачно заглавље реда табеле"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Користи се за обавјештавање да је измјењено заглавље реда у табели"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Приступачан опис реда табеле"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "Користи се за обавјештавање да је измјењен опис реда у табели"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Приступачан сажетак табеле"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Користи се за обавјештавање да је измјењен сажетак табеле"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Приступачан објекат наслова табеле"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Користи се за обавјештавање да је измјењен наслов табеле"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Број приступачних веза у надтексту"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Колико веза садржи текући AtkHypertext"
index 3f03367..c981720 100644 (file)
@@ -1,6 +1,17 @@
+# #-#-#-#-#  sr@latin.po (at-spi2-core)  #-#-#-#-#
 # Miroslav Nikolić <miroslavnikolic@rocketmail.com>, 2011, 2014.
+# #-#-#-#-#  sr@latin.po (atk)  #-#-#-#-#
+# Serbian translation of atk
+# Courtesy of Prevod.org team (http://www.prevod.org/) -- 2003, 2004, 2009.
+# This file is distributed under the same license as the atk package.
+# Maintainer: Danilo Šegan <dsegan@gmx.net>
+# Reviewed on 2004-03-05 by Aleksandar Urošević <urke@users.sourceforge.net>
+# Reviewed on 2004-08-06 by: Danilo Šegan <danilo@prevod.org>
+# Miroslav Nikolić <miroslavnikolic@rocketmail.com>, 2011, 2014.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  sr@latin.po (at-spi2-core)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -12,8 +23,23 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : "
-"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"#-#-#-#-#  sr@latin.po (atk)  #-#-#-#-#\n"
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-03-15 03:47+0000\n"
+"PO-Revision-Date: 2014-03-15 11:24+0200\n"
+"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
+"Language-Team: Serbian <gnom@prevod.org>\n"
+"Language: sr@latin\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Project-Style: gnome\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -24,6 +50,788 @@ msgstr "Program ne postoji više"
 msgid "Attempted synchronous call where prohibited"
 msgstr "Pokušan je usaglašeni poziv gde je zabranjen"
 
+#: ../atk/atkhyperlink.c:128
+msgid "Selected Link"
+msgstr "Izabrana veza"
+
+#: ../atk/atkhyperlink.c:129
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Određuje da li je izabran objekat Atk Hiperveze"
+
+#: ../atk/atkhyperlink.c:135
+msgid "Number of Anchors"
+msgstr "Broj smernica"
+
+#: ../atk/atkhyperlink.c:136
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Broj smernica objekta Atk Hiperveze"
+
+#: ../atk/atkhyperlink.c:144
+msgid "End index"
+msgstr "Završni indeks"
+
+#: ../atk/atkhyperlink.c:145
+msgid "The end index of the AtkHyperlink object"
+msgstr "Završni indeks objekta Atk Hiperveze"
+
+#: ../atk/atkhyperlink.c:153
+msgid "Start index"
+msgstr "Početni indeks"
+
+#: ../atk/atkhyperlink.c:154
+msgid "The start index of the AtkHyperlink object"
+msgstr "Početni indeks objekta Atk Hiperveze"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "neispravno"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "oznaka prečice"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "upozorenje"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "animacija"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "strelica"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "kalendar"
+
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "slika"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "kućica za označavanje"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "stavka menija za označavanje"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "izbor boje"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "zaglavlje kolone"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "kombinovana kućica"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "uređivač datuma"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "ikonica radne površi"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "okvir radne površi"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "pozovi"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "prozorče"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "lista direktorijuma"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "površina za crtanje"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "izbor datoteke"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "punjač"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "izbor slovnog lika"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "okvir"
+
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "staklena zona"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "html sadržalac"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "ikonica"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "slika"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "unutrašnji okvir"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "oznaka"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "poslagane ploče"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "spisak"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "stavka spiska"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "meni"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "glavni meni"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "stavka menija"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "ploča opcija"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "list"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "spisak listova"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "panel"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "tekst lozinke"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "iskačući meni"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "linija napredovanja"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "dugme"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "isključivo dugme"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "isključiva stavka menija"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "korena ploča"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "zaglavlje reda"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "linija za pomeranje"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "ploča za pomeranje"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "razdvajač"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "klizač"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "ploča za razdvajanje"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "vrteće dugme"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "linija stanja"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "tabela"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "polje tabele"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "zaglavlje kolone tabele"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "zaglavlje reda tabele"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "odvojiva stavka menija"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "terminal"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "tekst"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "prekidač dugme"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "linija alatki"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "oblačić obaveštenja"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "stablo"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "tabela stabla"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "nepoznato"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "pogled"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "prozor"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "zaglavlje"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "podnožje"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "pasus"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "lenjir"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "program"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "samodopunjavanje"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "polje za unos"
+
+# sastojak umesto „deo“ (part)
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "ugnježdeni sastojak"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "stavka"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "tabela"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "natpis"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "okvir dokumenta"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "kurs"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "strana"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "odeljak"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "ponovljeni objekat"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "formular"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "veza"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "prozor načina unosa"
+
+#: ../atk/atkobject.c:186
+msgid "table row"
+msgstr "red tabele"
+
+#: ../atk/atkobject.c:187
+msgid "tree item"
+msgstr "stavka stabla"
+
+#: ../atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "tablica dokumenta"
+
+#: ../atk/atkobject.c:189
+msgid "document presentation"
+msgstr "prezentacija dokumenta"
+
+#: ../atk/atkobject.c:190
+msgid "document text"
+msgstr "tekst dokumenta"
+
+#: ../atk/atkobject.c:191
+msgid "document web"
+msgstr "veb dokumenta"
+
+#: ../atk/atkobject.c:192
+msgid "document email"
+msgstr "e-pošta dokumenta"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "primedba"
+
+#: ../atk/atkobject.c:194
+msgid "list box"
+msgstr "lista"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "grupisanje"
+
+#: ../atk/atkobject.c:196
+msgid "image map"
+msgstr "mapa slike"
+
+#: ../atk/atkobject.c:197
+msgid "notification"
+msgstr "obaveštenje"
+
+#: ../atk/atkobject.c:198
+msgid "info bar"
+msgstr "linija obaveštenja"
+
+#: ../atk/atkobject.c:199
+#| msgid "scroll bar"
+msgid "level bar"
+msgstr "traka nivoa"
+
+#: ../atk/atkobject.c:200
+#| msgid "tool bar"
+msgid "title bar"
+msgstr "traka naslova"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr "blok citata"
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "zvuk"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "snimak"
+
+#: ../atk/atkobject.c:204
+#| msgid "animation"
+msgid "definition"
+msgstr "odrednica"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "članak"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr "orjentir"
+
+#: ../atk/atkobject.c:207
+#| msgid "dialog"
+msgid "log"
+msgstr "dnevnik"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr "reklama"
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr "matiš"
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "plasman"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "odbrojavač"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "spisak opisa"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "termin opisa"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "vrednost opisa"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Pristupačno ime"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Ime instance objekta prilagođeno pristupu pomoću tehnologija za ispomoć"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Pristupačan opis"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Opis objekta prilagođen pristupu pomoću tehnologija za ispomoć"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Pristupačan sadržalac"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Sadržalac trenutnog pristupačnog kako ga daje „atk_object_get_parent()“"
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Pristupačna vrednost"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Koristi se za obaveštavanje da je vrednost izmenjena"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Pristupačna uloga"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "Pristupačna uloga ovog objekta"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Sloj pristupačnosti"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "Sloj pristupačnosti ovog objekta"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Pristupačna MDI vrednost"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "Pristupačna MDI vrednost ovog objekta"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Pristupačan naslov tabele"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Koristi se za obaveštavanje da je izmenjen naslov tabele; ne treba koristiti "
+"ovu osobinu, već „accessible-table-caption-object“."
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Pristupačno zaglavlje kolone tabele"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "Koristi se za obaveštavanje da je izmenjeno zaglavlje kolone u tabeli"
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Pristupačan opis kolone tabele"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "Koristi se za obaveštavanje da je izmenjen opis kolone u tabeli"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Pristupačno zaglavlje reda tabele"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "Koristi se za obaveštavanje da je izmenjeno zaglavlje reda u tabeli"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Pristupačan opis reda tabele"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Koristi se za obaveštavanje da je izmenjen opis reda u tabeli"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Pristupačan sažetak tabele"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Koristi se za obaveštavanje da je izmenjen sažetak tabele"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Pristupačan objekat naslova tabele"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Koristi se za obaveštavanje da je izmenjen naslov tabele"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Broj pristupačnih veza u nadtekstu"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Koliko veza sadrži tekući Atk Hipertekst"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "vrlo slabo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "slabo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+#| msgid "table"
+msgid "acceptable"
+msgstr "prihvatljivo"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "jako"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "vrlo jako"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "vrlo nisko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "srednje"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "visoko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "vrlo visoko"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "vrlo loše"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "loše"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "dobro"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "vrlo dobro"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "najbolje"
+
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: Nepoznat potpis „%s“ za „Ukloni dostupnog“"
 
@@ -67,8 +875,8 @@ msgstr "Pokušan je usaglašeni poziv gde je zabranjen"
 #~ msgid ""
 #~ "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
 #~ msgstr ""
-#~ "AT-SPI: očekivana varijanta prilikom dobavljanja „%s“ sa sučelja „%s“; dobih "
-#~ "„%s“\n"
+#~ "AT-SPI: očekivana varijanta prilikom dobavljanja „%s“ sa sučelja „%s“; "
+#~ "dobih „%s“\n"
 
 #~ msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
 #~ msgstr ""
@@ -91,3 +899,6 @@ msgstr "Pokušan je usaglašeni poziv gde je zabranjen"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "Dobih neispravan potpis „%s“ za signal „%s“ sa sučelja „%s“\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Koristi se za obaveštavanje da je sadržalac izmenjen"
index 0ba22db..908203e 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
+# #-#-#-#-#  sv.po (at-spi2-core)  #-#-#-#-#
 # Swedish translation for at-spi2-core.
 # Copyright © 2011-2014 Free Software Foundation, Inc.
 # This file is distributed under the same license as the at-spi2-core package.
 # Daniel Nylander <po@danielnylaner.se>, 2011.
 # Sebastian Rasmussen <sebras@gmail.com>, 2014.
 #
+# #-#-#-#-#  sv.po (atk)  #-#-#-#-#
+# Swedish messages for atk.
+# Copyright © 2002-2021 Free Software Foundation, Inc.
+# This file is distributed under the same license as the atk package.
+# Christian Rose <menthos@menthos.com>, 2002, 2003, 2004, 2005, 2006.
+# Daniel Nylander <po@danielnylander.se>, 2006, 2008, 2011.
+# Josef Andersson <l10nl18nsweja@gmail.com>, 2015.
+# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2014, 2016, 2021, 2023.
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-09-13 02:46+0000\n"
-"PO-Revision-Date: 2014-09-13 11:33+0100\n"
-"Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-09-13 08:16+0000\n"
+"PO-Revision-Date: 2023-10-19 16:00+0200\n"
+"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.5.4\n"
+"X-Generator: Poedit 3.4\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Markerad länk"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Anger huruvida AtkHyperlink-objektet är markerat"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Antal ankare"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Antalet ankare som är associerat med AtkHyperlink-objektet"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Slutindex"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Slutindexet för AtkHyperlink-objektet"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Startindex"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Startindexet för AtkHyperlink-objektet"
+
+#: atk/atkobject.c:268
+msgid "Accessible Name"
+msgstr "Tillgängligt namn"
+
+#: atk/atkobject.c:269
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Objektinstansens namn formaterat för åtkomst av hjälpmedelsteknik"
+
+#: atk/atkobject.c:275
+msgid "Accessible Description"
+msgstr "Tillgänglig beskrivning"
+
+#: atk/atkobject.c:276
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Beskrivning av ett objekt, formaterat för åtkomst av hjälpmedelsteknik"
+
+#: atk/atkobject.c:282
+msgid "Accessible Parent"
+msgstr "Tillgänglig förälder"
+
+#: atk/atkobject.c:283
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Förälder för den aktuella tillgängliga som returnerades av "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:299
+msgid "Accessible Value"
+msgstr "Tillgängligt värde"
+
+#: atk/atkobject.c:300
+msgid "Is used to notify that the value has changed"
+msgstr "Används för att meddela att värdet har ändrats"
+
+#: atk/atkobject.c:308
+msgid "Accessible Role"
+msgstr "Tillgänglig roll"
+
+#: atk/atkobject.c:309
+msgid "The accessible role of this object"
+msgstr "Den tillgängliga rollen för detta objekt"
+
+#: atk/atkobject.c:316
+msgid "Accessible Layer"
+msgstr "Tillgängligt lager"
+
+#: atk/atkobject.c:317
+msgid "The accessible layer of this object"
+msgstr "Det tillgängliga lagret för detta objekt"
+
+#: atk/atkobject.c:325
+msgid "Accessible MDI Value"
+msgstr "Tillgängligt MDI-värde"
+
+#: atk/atkobject.c:326
+msgid "The accessible MDI value of this object"
+msgstr "Det tillgängliga MDI-värdet för detta objekt"
+
+#: atk/atkobject.c:342
+msgid "Accessible Table Caption"
+msgstr "Tillgänglig tabellrubrik"
+
+#: atk/atkobject.c:343
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Används för att meddela att tabellrubriken har ändrats; denna egenskap ska "
+"inte användas. accessible-table-caption-object ska användas i stället"
+
+#: atk/atkobject.c:357
+msgid "Accessible Table Column Header"
+msgstr "Tillgängligt tabellkolumnhuvud"
+
+#: atk/atkobject.c:358
+msgid "Is used to notify that the table column header has changed"
+msgstr "Används för att meddela att tabellkolumnrubriken har ändrats"
+
+#: atk/atkobject.c:373
+msgid "Accessible Table Column Description"
+msgstr "Tillgänglig tabellkolumnbeskrivning"
+
+#: atk/atkobject.c:374
+msgid "Is used to notify that the table column description has changed"
+msgstr "Används för att meddela att tabellkolumnbeskrivningen har ändrats"
+
+#: atk/atkobject.c:389
+msgid "Accessible Table Row Header"
+msgstr "Tillgängligt tabellradshuvud"
+
+#: atk/atkobject.c:390
+msgid "Is used to notify that the table row header has changed"
+msgstr "Används för att meddela att tabellradshuvudet har ändrats"
+
+#: atk/atkobject.c:404
+msgid "Accessible Table Row Description"
+msgstr "Tillgänglig tabellradsbeskrivning"
+
+#: atk/atkobject.c:405
+msgid "Is used to notify that the table row description has changed"
+msgstr "Används för att meddela att tabellradsbeskrivningen har ändrats"
+
+#: atk/atkobject.c:411
+msgid "Accessible Table Summary"
+msgstr "Tillgänglig tabellsammanfattning"
+
+#: atk/atkobject.c:412
+msgid "Is used to notify that the table summary has changed"
+msgstr "Används för att meddela att tabellsammanfattningen har ändrats"
+
+#: atk/atkobject.c:418
+msgid "Accessible Table Caption Object"
+msgstr "Tillgängligt tabellrubriksobjekt"
+
+#: atk/atkobject.c:419
+msgid "Is used to notify that the table caption has changed"
+msgstr "Används för att meddela att tabellrubriken har ändrats"
+
+#: atk/atkobject.c:425
+msgid "Number of Accessible Hypertext Links"
+msgstr "Antal tillgängliga hypertextlänkar"
+
+#: atk/atkobject.c:426
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Antalet länkar som den aktuella AtkHypertext har"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "mycket svagt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "svagt"
 
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1037
-#: ../atspi/atspi-value.c:111
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "acceptabelt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "starkt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "mycket starkt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "mycket lågt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "medel"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "högt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "mycket högt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "mycket dåligt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "dåligt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "bra"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "mycket bra"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "bäst"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Programmet finns inte längre"
 
-#: ../atspi/atspi-misc.c:1795
-msgid "Attempted synchronous call where prohibited"
-msgstr "Försökte göra synkront anrop där det inte är tillåtet"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "ogiltig"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "genvägsetikett"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "varning"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "animering"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "pil"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "kalender"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "rityta"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "kryssruta"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "kryssmenypost"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "färgväljare"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "kolumnrubrik"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "komboruta"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "datumredigerare"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "skrivbordsikon"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "skrivbordsram"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "mätare"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "dialog"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "katalogpanel"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "rityta"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "filväljare"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "ifyllare"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "typsnittsväljare"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "ram"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "glaspanel"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html-behållare"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "ikon"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "bild"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "intern ram"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "etikett"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "lagerpanel"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "lista"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "listpost"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "meny"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "menyrad"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "menyknapp"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "menypost"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "alternativpanel"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "sidflik"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "sidflikslist"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "panel"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "lösenordstext"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "poppuppmeny"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "förloppsindikator"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "tryckknapp"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "radioknapp"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "radiomenypost"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "rotpanel"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "radhuvud"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "rullningslist"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "rullningspanel"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "avskiljare"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "skjutreglage"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "delad panel"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "stegningsruta"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "statusrad"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "tabell"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "tabellcell"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "tabellkolumnhuvud"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "tabellradshuvud"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "avtagbar menypost"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminal"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "text"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "växlingsknapp"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "verktygsfält"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "inforuta"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "träd"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "trädtabell"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "okänd"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "skrivbordsvy"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "fönster"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "huvud"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "fot"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "stycke"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "linjal"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "program"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "komplettera automatiskt"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "redigeringsrad"
+
+# Se http://www.nada.kth.se/dataterm/rek.html#a129
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "inbyggd komponent"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "post"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "lista"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "rubrik"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "dokumentram"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "huvud"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "sida"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "sektion"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "överflödigt objekt"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "formulär"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "länk"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "inmatningsmetodfönster"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "tabellrad"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "trädobjekt"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "dokument kalkylark"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "dokument presentation"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "dokument text"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "dokument webb"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "dokument e-post"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "kommentar"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "listruta"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "gruppering"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "bildkarta"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "avisering"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "informationsrad"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "nivårad"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "namnlist"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "blockcitat"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "ljud"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "definition"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "artikel"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "landmärke"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "logg"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "banderoll"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "matematik"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "gradering"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "timer"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "beskrivningslista"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "beskrivningsterm"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "beskrivningsvärde"
index 9bde515..355e24e 100644 (file)
--- a/po/ta.po
+++ b/po/ta.po
@@ -1,10 +1,24 @@
+# #-#-#-#-#  ta.po (at-spi2-core master)  #-#-#-#-#
 # Tamil translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # I Felix <ifelix@redhat.com>, 2011.
+# #-#-#-#-#  ta.po (atk.HEAD.ta)  #-#-#-#-#
+# translation of atk.HEAD.ta.po to Tamil
+# Tamil translation of ATK.
+# Copyright (C) 2003 ATK'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the ATK package.
+#
+# Dinesh Nadarajah <n_dinesh@yahoo.com>, 2003.
+# Jayaradha N <jaya@pune.redhat.com>, 2004.
+# Felix <ifelix@redhat.com>, 2006, 2007.
+# I. Felix <ifelix@redhat.com>, 2009.
+# I Felix <ifelix@redhat.com>, 2011.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  ta.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -18,9 +32,599 @@ msgstr ""
 "Language: ta\n"
 "X-Generator: Lokalize 1.2\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  ta.po (atk.HEAD.ta)  #-#-#-#-#\n"
+"Project-Id-Version: atk.HEAD.ta\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-08-16 17:08+0000\n"
+"PO-Revision-Date: 2011-09-08 18:17+0530\n"
+"Last-Translator: I Felix <ifelix@redhat.com>\n"
+"Language-Team: Tamil <fedora-trans-ta@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\\n\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"\n"
+"Language: ta\n"
 
 #: ../atspi/atspi-misc.c:941 ../atspi/atspi-misc.c:992
 #: ../atspi/atspi-misc.c:1034
 msgid "The application no longer exists"
 msgstr "பயன்பாடு இனியும் உள்ள"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "தேர்ந்தெடுக்கப்பட்ட இணைப்பு"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink பொருள் தேர்வு செய்யப்பட்டதா என குறிப்பிடவும்"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "இணைப்புகளின் எண்ணிக்கை"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink பொருளோடு தொடர்புடைய இணைப்புகளின் எண்ணிக்கை"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "முடிவு அகரவரிசை"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink பொருளின் முடிவு அகரவரிசை"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "துவக்க அகரவரிசை"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink பொருளின் துவக்க அகரவரிசை"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "தவறானது"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "முடக்கி பெயர்"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "எச்சரிக்கை"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "உயிராக்கம்"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "அம்புக்குறி"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "நாள்காட்டி"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "கேன்வாஸ்"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "சோதனைப்பெட்டி"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "பட்டி உறுப்புகளை சோதித்தல்"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "நிறத் தேர்வி"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "நிரல் தலைப்பு"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "தேர்வுப்பெட்டி"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "தேதி தொகுப்பி"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "பணிமேடை சின்னம்"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "பணிமேடை சட்டம்"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "டயல்"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "உரையாடல்"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "அடைவுப் பகுதி"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "வரையும் பகுதி"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "கோப்பு தேர்வி"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "நிரப்பி"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "எழுத்துரு தேர்வி"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "சட்டம்"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "கண்ணாடி பகுதி"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html பெட்டகம்"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "சின்னம்"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "உருவம்"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "உள்ளமை சட்டம்"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "பெயர்"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "அடுக்கிடப்பட்ட பகுதி"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "பட்டியல்"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "பட்டியல் உறுப்பு"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "பட்டி"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "பட்டி பட்டை"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "பட்டி உறுப்பு"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "விருப்பப் பகுதி"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "பக்கத் தத்தல்"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "பக்கத் தத்தல் பட்டியல்"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "பலகம்"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "கடவுச்சொல் உரை"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "கீழ்விரிப் பட்டி"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "முன்னேற்ற பட்டி"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "அழுத்தும் பொத்தான்"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "தேர்வு பொத்தான்"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "தேர்வு பட்டி உறுப்பு"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "மூலப் பகுதி"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "நிரை தலைப்பு"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "உருள் பட்டை"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "உருள் பகுதி"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "பிரிப்பி"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "ஸ்லைடர்"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "பிரிப்புப் பகுதி"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "சுழல் பொத்தான்"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "நிலைப்பட்டை"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "அட்டவணை"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "அட்டவணை அறை"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "அட்டவணை நிரல் தலைப்பு"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "அட்டவணை நிரை தலைப்பு"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "tear off பட்டி உறுப்பு"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "முனையம்"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "உரை"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "மாற்றி பொத்தான்"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "கருவிப்பட்டை"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "கருவிக் குறிப்பு"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "கிளை"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "கிளை அட்டவணை"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "தெரியாதது"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "viewport"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "சாளரம்"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "தலைப்பு"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "அடிக்குறிப்பு"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "பத்தி"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "அளவீடு"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "பயன்பாடு"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "தானாக முடித்தல்"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "திருத்தும் பட்டி"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "உட்பொதிந்த பொருள்"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "உள்ளீடு"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "வரைபடம்"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "தலைப்பு"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "ஆவண சட்டம்"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "தலைப்பு"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "பக்கம்"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "பிரிவு"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "மிகை பொருள்"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "படிவம்"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "இணைப்பு"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "உள்ளீடு முறை சாளரம்"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "அட்டவணை நிரை"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "கிளை உருப்படி"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "ஆவண விரிதாள்"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "ஆவண வழங்கல்"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "ஆவண உரை"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "ஆவண வலை"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "ஆவண மின்னஞ்சல்"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "கருத்து"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "பட்டியல் பெட்டி"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "தொகுத்தல்"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "பட மேப்"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "அறிவிப்பு"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "தகவல் பட்டை"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "அணுகக்கூடிய பெயர்"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "தொழில்நுட்ப அணுகலுக்காக நிகழ்வின் பெயர் வடிவமைக்கப்பட்டது"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "அணுகக்கூடிய விளக்கம்"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "தொழில் நுட்ப அணுகலுக்காக வடிவமைக்கப்பட்ட பொருளின் விளக்கம்"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "அணுகக்கூடிய முதன்மை"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "முதன்மை அடைவு மாற்றப்பட்டதா என்பதை குறிப்பிட பயன்படும்"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "அணுகக்கூடிய மதிப்பு"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "மதிப்பு மாற்றப்பட்டதா என்பதை தெரிந்து கொள்ள பயன்படும்"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "அணுகக்கூடிய பங்களிப்பு"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "பொருளின் அணுகக்கூடிய பங்களிப்பு"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "அணுகக்கூடிய அடுக்கு"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "இந்தப் பொருளின் அணுகக்கூடிய அடுக்கு"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "அணுகக்கூடிய MDI மதிப்பு"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "இந்தப் பொருளின் அணுகக்கூடிய MDI மதிப்பு"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "அணுகக்கூடிய அட்டவணை தலைப்பு"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"இது பட்டியலின் தலைப்பு மாற்றப்பட்டதை அறிவிக்க பயன்படும்; அதற்குப் பதிலாக அணுகக்கூடிய-"
+"அட்டவணை-தலைப்பு-பொருள் என பயன்படுத்த வேண்டும்"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "அணுகக்கூடிய அட்டவணை நிரல் தலைப்பு"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "இது அட்டவணை நிரல் தலைப்பு மாற்றப்பட்டதைக் குறிக்க பயன்படும்"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "அணுகக்கூடிய அட்டவணை நிரல் விளக்கம்"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "இது அட்டவணை தலைப்பு விளக்கம் மாற்றப்பட்டதை அறிவிக்க பயன்படும்"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "அணுகக்கூடிய நிரல் அட்டவணை தலைப்பு"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "அட்டவணை நிரை தலைப்பு மாற்றப்பட்டதை அறிவிக்க பயன்படும்"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "அணுகக்கூடிய அட்டவணை நிரை விளக்கம்"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "அணுகக்கூடிய அட்டவணை நிரை விளக்கம் மாற்றப்பட்டதைக் குறிக்க பயன்படும்"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "அணுகக்கூடிய அட்டவணை சுருக்கம்"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "அட்டவணை சுருக்கம் மாற்றப்பட்டதைக் குறிப்பிட பயன்படும்"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "அணுகக்கூடிய அட்டவணை தலைப்பு பொருள்"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "அட்டவணை தலைப்பு மாற்றப்பட்டதைக் குறிப்பிட பயன்படும்"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "அணுகக்கூடிய மீஉரை இணைப்புகளின் எண்ணிக்கை"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "தற்போதைய AtkHypertஇல் உள்ள இணைப்புகளின் எண்ணிக்கை"
index 4461167..97aa275 100644 (file)
--- a/po/te.po
+++ b/po/te.po
@@ -1,13 +1,24 @@
+# #-#-#-#-#  te.po (at-spi2-core master)  #-#-#-#-#
 # Telugu translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 #
 # Krishnababu Krothapalli <kkrothap@redhat.com>, 2011.
+# #-#-#-#-#  te.po (te)  #-#-#-#-#
+# translation of te.po to Telugu
+# Telugu translation of atk
+# This file is distributed under the same license as the atk package.
+# Copyright (C) Sree Ganesh <sthottem@redhat.com>, 2006.
+#
+# Krishna Babu K <kkrothap@redhat.com>, 2009.
+# Krishnababu Krothapalli <kkrothap@redhat.com>, 2011.
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  te.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
-"cgi?product=at-spi&component=general\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
+"spi&component=general\n"
 "POT-Creation-Date: 2011-02-08 18:33+0000\n"
 "PO-Revision-Date: 2011-02-09 16:16+0530\n"
 "Last-Translator: Krishnababu Krothapalli <kkrothap@redhat.com>\n"
@@ -18,6 +29,21 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 1.1\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
+"#-#-#-#-#  te.po (te)  #-#-#-#-#\n"
+"Project-Id-Version: te\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-08-16 17:08+0000\n"
+"PO-Revision-Date: 2011-08-29 17:28+0530\n"
+"Last-Translator: Krishnababu Krothapalli <kkrothap@redhat.com>\n"
+"Language-Team: Telugu <en@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
+"Language: te\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -40,8 +66,7 @@ msgid ""
 "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
 "signature %s"
 msgstr ""
-"AT-SPI: కొత్త సంతకం %sతో _atspi_dbus_return_accessible_from_message "
-"పిలువబడింది"
+"AT-SPI: కొత్త సంతకం %sతో _atspi_dbus_return_accessible_from_message పిలువబడింది"
 
 #: ../atspi/atspi-misc.c:616
 #, c-format
@@ -49,8 +74,7 @@ msgid ""
 "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
 "signature %s"
 msgstr ""
-"AT-SPI: కొత్త సంతకం %s తో _atspi_dbus_return_hyperlink_from_message "
-"పిలువబడింది"
+"AT-SPI: కొత్త సంతకం %s తో _atspi_dbus_return_hyperlink_from_message పిలువబడింది"
 
 #: ../atspi/atspi-misc.c:641
 #, c-format
@@ -83,9 +107,7 @@ msgstr "అనువర్తనము యింక లేదు"
 #: ../atspi/atspi-misc.c:1130
 #, c-format
 msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-msgstr ""
-"AT-SPI: %sను ఇంటర్ఫేస్ %s నుండి తెస్తున్నప్పుడు వేరియంట్‌ను వూహించడమైంది; "
-"పొందినది %s\n"
+msgstr "AT-SPI: %sను ఇంటర్ఫేస్ %s నుండి తెస్తున్నప్పుడు వేరియంట్‌ను వూహించడమైంది; పొందినది %s\n"
 
 #: ../atspi/atspi-misc.c:1136
 #, c-format
@@ -117,3 +139,574 @@ msgstr ""
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "చెల్లని సంతకం %s ను సంకేతం %s కొరకు యింటర్ఫేస్ %s నుంది పొందింది\n"
 
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "ఎన్నుకోబడిన లంకె"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "ఎటికె అధిబంధ విషయం ఎన్నికచేయబడిందా  తెల్పండి"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "ఏంకర్ల సంఖ్య"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "ఏంకర్ల సంఖ్య ఎటికె అధిబంధ విషయంతో కూడిఉంది"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "విషయ సూచిక సమాప్తి"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "ఎటికె అధిబంధ విషయ సూచిక చివర"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "విషయసూచికను ప్రారంభించు"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "ఏటికె అధిబంధ విషయ సూచిక ప్రారంభం"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "విలువలేనిది"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "వేగకారి లేబుల్"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "జాగరూకత"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "యానిమేషన్"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "బాణం"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "కాలెండరు"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "కాన్వాసు"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "చెక్‌ బాక్స్"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "మెనూ అంశమును చెక్‌చేయి"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "రంగు యెంచుకొనునది"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "నిలువు వరుస యెగువసూచి"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "కాంబో బాక్స్"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "తేదీ కూర్పరి"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "రంగస్థలం ప్రతిమ"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "రంగస్థలం చట్రం"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "ముఖసూచిక"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "సంభాషణ"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "డైరెక్టరీ  పేన్"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "చిత్రలేఖన ప్రాంతం"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "ఫైలు యెంపికచేయునది"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "పూరకం"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "ఫాంటు యెంపికచేయునది"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "చట్రం"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "గ్లాసు పేన్"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "html వాహిక"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ప్రతిమ"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "ప్రతిరూపం"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "అంతర్గత చట్రం"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "లేబులు"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "స్తరిత పేన్"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "జాబితా"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "జాబితా అంశం"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "జాబితా"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "జాబితా పట్టీ"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "జాబితా అంశం"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "ఐచ్ఛిక పేన్"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "పేజీ టాబ్"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "పేజీ టాబ్ జాబితా"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "పేనల్"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "సంకేతపదం పాఠం"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "పాపప్ మెనూ"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "అబివృద్ధి సూచిక"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "మీటను నొక్కండి"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "రేడియో మీట"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "రేడియో జాబితా అంశం"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "రూట్ పేన్"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "అడ్డువరుస యెగువసూచి"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "స్కోల్ బార్"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "స్క్రోల్ పేన్"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "వేర్పరి"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "స్లైడరు"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "చీల్చు పేన్"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "స్పిన్ మీట"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "స్థితిపట్టీ"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "పట్టిక"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "పట్టిక అర"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "పట్టిక నిలువువరుస యెగువసూచి"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "పట్టిక అడ్డువరుస యెగువసూచి"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "మెనూ అంశం చించివేయి"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "టెర్మినలు"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "పాఠం"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "టోగుల్ మీట"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "సాధన పట్టీ"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "సాధన చిట్కా"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ట్రీ"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ట్రీ పట్టిక"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "తెలియని"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "దృశ్యపోర్టు"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "విండో"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "ఎగువ సూచి"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "దిగువ సూచి"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "పేరా"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "కొలమానం"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "అనువర్తనం"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "స్వయంసమాప్తి"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "కూర్చు పట్టి"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "ఎంబెడెడ్ మూలకం"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "ప్రవేశం"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "చార్టు"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "శీర్షిక"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "పత్ర చట్రం"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "ఎగువ సూచి"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "పేజీ"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "విభాగం"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "రిడండెంట్ ఆబ్జక్ట్"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "రూపం"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "లంకె"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "ఇన్పుట్ పద్దతి విండో"
+
+#: ../atk/atkobject.c:163
+#| msgid "table row header"
+msgid "table row"
+msgstr "పట్టిక అడ్డువరుస"
+
+#: ../atk/atkobject.c:164
+#| msgid "tree table"
+msgid "tree item"
+msgstr "ట్రీ అంశం"
+
+#: ../atk/atkobject.c:165
+#| msgid "document frame"
+msgid "document spreadsheet"
+msgstr "పత్ర స్ప్రెడ్‌షీట్"
+
+#: ../atk/atkobject.c:166
+#| msgid "document frame"
+msgid "document presentation"
+msgstr "పత్ర సమర్పణ"
+
+#: ../atk/atkobject.c:167
+#| msgid "document frame"
+msgid "document text"
+msgstr "పత్ర పాఠం"
+
+#: ../atk/atkobject.c:168
+#| msgid "document frame"
+msgid "document web"
+msgstr "పత్ర వెబ్"
+
+#: ../atk/atkobject.c:169
+#| msgid "document frame"
+msgid "document email"
+msgstr "పత్ర ఈమెయిల్"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "వ్యాఖ్యానము"
+
+#: ../atk/atkobject.c:171
+#| msgid "list"
+msgid "list box"
+msgstr "జాబితా పెట్టె"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "సమూహీకరణ"
+
+#: ../atk/atkobject.c:173
+#| msgid "image"
+msgid "image map"
+msgstr "ప్రతిరూప పటం"
+
+#: ../atk/atkobject.c:174
+#| msgid "animation"
+msgid "notification"
+msgstr "ప్రకటన"
+
+#: ../atk/atkobject.c:175
+#| msgid "menu bar"
+msgid "info bar"
+msgstr "సమాచార పట్టీ"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "అందుబాటులోని పేరు"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "సహాయక సాంకేతికత అందుబాటుకు ఆకృతీకరించబడిన వస్తువు యొక్క సంకేత పేరు"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "అందుబాటగు వర్ణన"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "విషయం యొక్క వివరణ, సాంకేతిక సహాయతకోసం రూపుదిద్దబడింది"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "అందుబాటులోని మాతృక"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "మాతృక మారిందని చెప్పటానికి ఉపయోగపడుతుంది"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "సరైన విలువ"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "విలువ మారిందని చెప్పటానికి ఉపయోగపడుతుంది"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "గుర్తించదగ్గ పాత్ర"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "ఈ వస్తువుయొక్క గుర్తించదగ్గ పాత్ర"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "అందుబాటులో ఉన్న స్థరం"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "ఈ వస్తువు యొక్క అందుబాటులోని స్థరం"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "సరైన ఎండిఐ విలువ"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "ఈ వస్తువు యొక్క సరైన ఎండిఐ విలువ"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "సరైన పట్టిక శీర్షిక"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"మీరు పట్టిక శీర్షిక మారిందని గమనిస్తే; ఈ లక్షణాన్ని ఉపయోగించకండి.  దానికి బదులు accessible-table-"
+"caption-object ఉపయోగించాలి"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "సరైన పట్టిక నిలువ వరుస యెగువ సూచి"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "పట్టిక నిలువవరుస యెగువసూచి మార్చబడిందని సూచించబడింది"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "సరైన పట్టిక నిలువవరుస వర్ణన"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "పట్టిక కాలమ్ వర్ణన మార్చబడిందని సూచించబడింది"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "సరైన పట్టిక రో శీర్షిక"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "పట్టిక కాలమ్ రో శీర్షిక మార్చబడిందని సూచించబడింది"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "సరైన పట్టిక అడ్డువరుస వర్ణన"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "పట్టిక అడ్డువరుస వర్ణన మార్చబడిందని సూచించబడింది"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "అందుబాటులోఉన్న పట్టిక సంక్షిప్తత"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "పట్టిక సంక్షిప్తత మార్చబడిందని సూచించబడింది"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "అందుబాటులోఉన్న పట్టిక శీర్షికా వస్తువు"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "పట్టిక శీర్షిక మార్చబడిందని సూచించబడింది"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "అందుబాటులోఉన్న అధిపాఠ లంకెల సంఖ్య"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ప్రస్తుత ఎటికె అధిపాఠం కలిగిఉన్న లంకెల సంఖ్య"
index d70be16..0420132 100644 (file)
--- a/po/tg.po
+++ b/po/tg.po
@@ -3,8 +3,10 @@
 # This file is distributed under the same license as the PACKAGE package.
 # Victor Ibragimov <victor.ibragimov@gmail.com>, 2013.
 #
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  tg.po (Tajik Gnome)  #-#-#-#-#\n"
 "Project-Id-Version: Tajik Gnome\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,8 +19,580 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.5.4\n"
+"#-#-#-#-#  tg.po (Tajik Gnome)  #-#-#-#-#\n"
+"Project-Id-Version: Tajik Gnome\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2013-02-19 11:07+0000\n"
+"PO-Revision-Date: 2013-01-19 17:25+0500\n"
+"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
+"Language-Team: \n"
+"Language: tg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
 
 #: ../atspi/atspi-component.c:313 ../atspi/atspi-misc.c:1062
 #: ../atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "Ин барнома дигар вуҷуд надорад"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Selected Link"
+msgstr "Пайванди интихобшуда"
+
+#: ../atk/atkhyperlink.c:105
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: ../atk/atkhyperlink.c:111
+msgid "Number of Anchors"
+msgstr ""
+
+#: ../atk/atkhyperlink.c:112
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: ../atk/atkhyperlink.c:120
+msgid "End index"
+msgstr ""
+
+#: ../atk/atkhyperlink.c:121
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: ../atk/atkhyperlink.c:129
+msgid "Start index"
+msgstr ""
+
+#: ../atk/atkhyperlink.c:130
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: ../atk/atkobject.c:75
+msgid "invalid"
+msgstr "беэътимод"
+
+#: ../atk/atkobject.c:76
+msgid "accelerator label"
+msgstr ""
+
+#: ../atk/atkobject.c:77
+msgid "alert"
+msgstr "ҳушдор"
+
+#: ../atk/atkobject.c:78
+msgid "animation"
+msgstr "аниматсия"
+
+#: ../atk/atkobject.c:79
+msgid "arrow"
+msgstr "тир"
+
+#: ../atk/atkobject.c:80
+msgid "calendar"
+msgstr "тақвим"
+
+#: ../atk/atkobject.c:81
+msgid "canvas"
+msgstr ""
+
+#: ../atk/atkobject.c:82
+msgid "check box"
+msgstr ""
+
+#: ../atk/atkobject.c:83
+msgid "check menu item"
+msgstr ""
+
+#: ../atk/atkobject.c:84
+msgid "color chooser"
+msgstr ""
+
+#: ../atk/atkobject.c:85
+msgid "column header"
+msgstr ""
+
+#: ../atk/atkobject.c:86
+msgid "combo box"
+msgstr ""
+
+#: ../atk/atkobject.c:87
+msgid "dateeditor"
+msgstr ""
+
+#: ../atk/atkobject.c:88
+msgid "desktop icon"
+msgstr ""
+
+#: ../atk/atkobject.c:89
+msgid "desktop frame"
+msgstr ""
+
+#: ../atk/atkobject.c:90
+msgid "dial"
+msgstr ""
+
+#: ../atk/atkobject.c:91
+msgid "dialog"
+msgstr "равзанаи гуфтугӯ"
+
+#: ../atk/atkobject.c:92
+msgid "directory pane"
+msgstr ""
+
+#: ../atk/atkobject.c:93
+msgid "drawing area"
+msgstr ""
+
+#: ../atk/atkobject.c:94
+msgid "file chooser"
+msgstr ""
+
+#: ../atk/atkobject.c:95
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:97
+msgid "fontchooser"
+msgstr ""
+
+#: ../atk/atkobject.c:98
+msgid "frame"
+msgstr "чорчӯба"
+
+#: ../atk/atkobject.c:99
+msgid "glass pane"
+msgstr ""
+
+#: ../atk/atkobject.c:100
+msgid "html container"
+msgstr ""
+
+#: ../atk/atkobject.c:101
+msgid "icon"
+msgstr "нишона"
+
+#: ../atk/atkobject.c:102
+msgid "image"
+msgstr "тасвир"
+
+#: ../atk/atkobject.c:103
+msgid "internal frame"
+msgstr ""
+
+#: ../atk/atkobject.c:104
+msgid "label"
+msgstr "барчасп"
+
+#: ../atk/atkobject.c:105
+msgid "layered pane"
+msgstr ""
+
+#: ../atk/atkobject.c:106
+msgid "list"
+msgstr "рӯйхат"
+
+#: ../atk/atkobject.c:107
+msgid "list item"
+msgstr ""
+
+#: ../atk/atkobject.c:108
+msgid "menu"
+msgstr "меню"
+
+#: ../atk/atkobject.c:109
+msgid "menu bar"
+msgstr "навори меню"
+
+#: ../atk/atkobject.c:110
+msgid "menu item"
+msgstr ""
+
+#: ../atk/atkobject.c:111
+msgid "option pane"
+msgstr ""
+
+#: ../atk/atkobject.c:112
+msgid "page tab"
+msgstr ""
+
+#: ../atk/atkobject.c:113
+msgid "page tab list"
+msgstr ""
+
+#: ../atk/atkobject.c:114
+msgid "panel"
+msgstr "лавҳа"
+
+#: ../atk/atkobject.c:115
+msgid "password text"
+msgstr ""
+
+#: ../atk/atkobject.c:116
+msgid "popup menu"
+msgstr ""
+
+#: ../atk/atkobject.c:117
+msgid "progress bar"
+msgstr "навори вазъият"
+
+#: ../atk/atkobject.c:118
+msgid "push button"
+msgstr ""
+
+#: ../atk/atkobject.c:119
+msgid "radio button"
+msgstr "тугмачаи фаъолкунӣ"
+
+#: ../atk/atkobject.c:120
+msgid "radio menu item"
+msgstr ""
+
+#: ../atk/atkobject.c:121
+msgid "root pane"
+msgstr ""
+
+#: ../atk/atkobject.c:122
+msgid "row header"
+msgstr ""
+
+#: ../atk/atkobject.c:123
+msgid "scroll bar"
+msgstr ""
+
+#: ../atk/atkobject.c:124
+msgid "scroll pane"
+msgstr ""
+
+#: ../atk/atkobject.c:125
+msgid "separator"
+msgstr "ҷудокунанда"
+
+#: ../atk/atkobject.c:126
+msgid "slider"
+msgstr ""
+
+#: ../atk/atkobject.c:127
+msgid "split pane"
+msgstr ""
+
+#: ../atk/atkobject.c:128
+msgid "spin button"
+msgstr ""
+
+#: ../atk/atkobject.c:129
+msgid "statusbar"
+msgstr ""
+
+#: ../atk/atkobject.c:130
+msgid "table"
+msgstr "ҷадвал"
+
+#: ../atk/atkobject.c:131
+msgid "table cell"
+msgstr "катаки ҷадвал"
+
+#: ../atk/atkobject.c:132
+msgid "table column header"
+msgstr ""
+
+#: ../atk/atkobject.c:133
+msgid "table row header"
+msgstr ""
+
+#: ../atk/atkobject.c:134
+msgid "tear off menu item"
+msgstr ""
+
+#: ../atk/atkobject.c:135
+msgid "terminal"
+msgstr ""
+
+#: ../atk/atkobject.c:136
+msgid "text"
+msgstr "матн"
+
+#: ../atk/atkobject.c:137
+msgid "toggle button"
+msgstr ""
+
+#: ../atk/atkobject.c:138
+msgid "tool bar"
+msgstr ""
+
+#: ../atk/atkobject.c:139
+msgid "tool tip"
+msgstr ""
+
+#: ../atk/atkobject.c:140
+msgid "tree"
+msgstr "дарахт"
+
+#: ../atk/atkobject.c:141
+msgid "tree table"
+msgstr ""
+
+#: ../atk/atkobject.c:142
+msgid "unknown"
+msgstr "номаълум"
+
+#: ../atk/atkobject.c:143
+msgid "viewport"
+msgstr ""
+
+#: ../atk/atkobject.c:144
+msgid "window"
+msgstr "равзана"
+
+#: ../atk/atkobject.c:145
+msgid "header"
+msgstr "сарварақ"
+
+#: ../atk/atkobject.c:146
+msgid "footer"
+msgstr "поварақ"
+
+#: ../atk/atkobject.c:147
+msgid "paragraph"
+msgstr "банд"
+
+#: ../atk/atkobject.c:148
+msgid "ruler"
+msgstr ""
+
+#: ../atk/atkobject.c:149
+msgid "application"
+msgstr "барнома"
+
+#: ../atk/atkobject.c:150
+msgid "autocomplete"
+msgstr "пуркунии худкор"
+
+#: ../atk/atkobject.c:151
+msgid "edit bar"
+msgstr ""
+
+#: ../atk/atkobject.c:152
+msgid "embedded component"
+msgstr ""
+
+#: ../atk/atkobject.c:153
+msgid "entry"
+msgstr "ворида"
+
+#: ../atk/atkobject.c:154
+msgid "chart"
+msgstr "диаграмма"
+
+#: ../atk/atkobject.c:155
+msgid "caption"
+msgstr "зернавис"
+
+#: ../atk/atkobject.c:156
+msgid "document frame"
+msgstr ""
+
+#: ../atk/atkobject.c:157
+msgid "heading"
+msgstr "сарлавҳа"
+
+#: ../atk/atkobject.c:158
+msgid "page"
+msgstr "саҳифа"
+
+#: ../atk/atkobject.c:159
+msgid "section"
+msgstr "қисмат"
+
+#: ../atk/atkobject.c:160
+msgid "redundant object"
+msgstr ""
+
+#: ../atk/atkobject.c:161
+msgid "form"
+msgstr "шакл"
+
+#: ../atk/atkobject.c:162
+msgid "link"
+msgstr "пайванд"
+
+#: ../atk/atkobject.c:163
+msgid "input method window"
+msgstr ""
+
+#: ../atk/atkobject.c:164
+msgid "table row"
+msgstr ""
+
+#: ../atk/atkobject.c:165
+msgid "tree item"
+msgstr ""
+
+#: ../atk/atkobject.c:166
+msgid "document spreadsheet"
+msgstr ""
+
+#: ../atk/atkobject.c:167
+msgid "document presentation"
+msgstr ""
+
+#: ../atk/atkobject.c:168
+msgid "document text"
+msgstr ""
+
+#: ../atk/atkobject.c:169
+msgid "document web"
+msgstr ""
+
+#: ../atk/atkobject.c:170
+msgid "document email"
+msgstr ""
+
+#: ../atk/atkobject.c:171
+msgid "comment"
+msgstr "шарҳ"
+
+#: ../atk/atkobject.c:172
+msgid "list box"
+msgstr ""
+
+#: ../atk/atkobject.c:173
+msgid "grouping"
+msgstr ""
+
+#: ../atk/atkobject.c:174
+msgid "image map"
+msgstr ""
+
+#: ../atk/atkobject.c:175
+msgid "notification"
+msgstr "огоҳӣ"
+
+#: ../atk/atkobject.c:176
+msgid "info bar"
+msgstr "навори маълумот"
+
+#: ../atk/atkobject.c:518
+msgid "Accessible Name"
+msgstr ""
+
+#: ../atk/atkobject.c:519
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: ../atk/atkobject.c:525
+msgid "Accessible Description"
+msgstr ""
+
+#: ../atk/atkobject.c:526
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: ../atk/atkobject.c:532
+msgid "Accessible Parent"
+msgstr ""
+
+#: ../atk/atkobject.c:533
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:539
+msgid "Accessible Value"
+msgstr ""
+
+#: ../atk/atkobject.c:540
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:548
+msgid "Accessible Role"
+msgstr ""
+
+#: ../atk/atkobject.c:549
+msgid "The accessible role of this object"
+msgstr ""
+
+#: ../atk/atkobject.c:557
+msgid "Accessible Layer"
+msgstr ""
+
+#: ../atk/atkobject.c:558
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: ../atk/atkobject.c:566
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: ../atk/atkobject.c:567
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: ../atk/atkobject.c:575
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: ../atk/atkobject.c:576
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: ../atk/atkobject.c:582
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: ../atk/atkobject.c:583
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:589
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: ../atk/atkobject.c:590
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:596
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: ../atk/atkobject.c:597
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:603
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: ../atk/atkobject.c:604
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:610
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: ../atk/atkobject.c:611
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:617
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: ../atk/atkobject.c:618
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:624
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: ../atk/atkobject.c:625
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
diff --git a/po/th.po b/po/th.po
new file mode 100644 (file)
index 0000000..e551196
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,580 @@
+# Thai translation of atk
+# This file is distributed under the same license as the atk package.
+# Copyright (C) 2004-2012 Free Software Foundation, Inc.
+# Supranee Thirawatthanasuk <supranee@opentle.org>, 2004.
+# Theppitak Karoonboonyanan <thep@linux.thai.net>, 2005-2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2012-09-24 18:19+0000\n"
+"PO-Revision-Date: 2012-10-09 20:07+0700\n"
+"Last-Translator: Theppitak Karoonboonyanan <thep@linux.thai.net>\n"
+"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
+"Language: th\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "ลิงก์ถูกเลือก"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "ระบุว่าออบเจกต์ AtkHyperlink ถูกเลือกอยู่หรือไม่"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "จำนวนของสมอยึด"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "จำนวนของสมอยึดที่สัมพันธ์กับออบเจกต์ AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "ดัชนีสิ้นสุด"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "ดัชนีสิ้นสุดของออบเจกต์ AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "ดัชนีเริ่มต้น"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "ดัชนีเริ่มต้นของออบเจกต์ AtkHyperlink"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "ไม่ถูกต้อง"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ฉลากคีย์ด่วน"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "แจ้งเหตุ"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "ภาพเคลื่อนไหว"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "ลูกศร"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "ปฏิทิน"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "ผ้าใบวาดรูป"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "กล่องกาเครื่องหมาย"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "รายการเมนูกาเครื่องหมาย"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "กล่องเลือกสี"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "หัวข้อคอลัมน์"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "กล่องคอมโบ"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "กล่องแก้ไขวันที่"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "ไอคอนเดสก์ท็อป"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "กรอบเดสก์ท็อป"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "หมุนโทรศัพท์"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "กล่องโต้ตอบ"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "ช่องไดเรกทอรี"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "พื้นที่วาดรูป"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "กล่องเลือกแฟ้ม"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "ช่องเติม"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "กล่องเลือกแบบอักษร"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "กรอบ"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr ""
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "เครื่องบรรจุ html"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "ไอคอน"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "รูปภาพ"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "กรอบภายใน"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "ป้ายชื่อ"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr ""
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "รายชื่อ"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "รายการรายชื่อ"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "เมนู"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "แถบเมนู"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "รายการเมนู"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr ""
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "แท็บของหน้า"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "รายการแท็บของหน้า"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "พาเนล"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "ข้อความรหัสผ่าน"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "เมนูผุดขึ้น"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "แถบบอกความคืบหน้า"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "ปุ่มกด"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "ปุ่มวิทยุ"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "รายการเมนูแบบปุ่มวิทยุ"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "ช่องหลัก"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "หัวแถว"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "แถบเลื่อน"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "ช่องแถบเลื่อน"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "เส้นแบ่ง"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "ปุ่มรางเลื่อน"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr "กล่องแบ่งช่อง"
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr "ปุ่มปรับเลข"
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "แถบสถานะ"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "ตาราง"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr "เซลล์ตาราง"
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "หัวคอลัมน์ของตาราง"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "หัวแถวของตาราง"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "รายการเมนูฉีกออก"
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr "เทอร์มินัล"
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "ข้อความ"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr "ปุ่มสลับค่า"
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "แถบเครื่องมือ"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "คำแนะนำเครื่องมือ"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "ต้นไม้"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ตารางแบบต้นไม้"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "ไม่ทราบ"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr "ช่องมอง"
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "หน้าต่าง"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "หัวกระดาษ"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "ท้ายกระดาษ"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "ย่อหน้า"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr "ไม้บรรทัด"
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "โปรแกรม"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "เติมเต็มคำอัตโนมัติ"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "แถบแก้ไข"
+
+#: ../atk/atkobject.c:151
+msgid "embedded component"
+msgstr "องค์ประกอบฝังตัว"
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "ช่องป้อนข้อความ"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr "แผนภูมิ"
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "ป้ายบรรยาย"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr "กรอบเอกสาร"
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "หัวข้อเรื่อง"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "หน้า"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "หัวข้อ"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr "ออบเจกต์ส่วนเกิน"
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "แบบฟอร์ม"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "ลิงก์"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "หน้าต่างวิธีป้อนข้อความ"
+
+#: ../atk/atkobject.c:163
+msgid "table row"
+msgstr "แถวของตาราง"
+
+#: ../atk/atkobject.c:164
+msgid "tree item"
+msgstr "รายการในต้นไม้"
+
+#: ../atk/atkobject.c:165
+msgid "document spreadsheet"
+msgstr "เอกสารตารางคำนวณ"
+
+#: ../atk/atkobject.c:166
+msgid "document presentation"
+msgstr "เอกสารงานนำเสนอ"
+
+#: ../atk/atkobject.c:167
+msgid "document text"
+msgstr "เอกสารข้อความ"
+
+#: ../atk/atkobject.c:168
+msgid "document web"
+msgstr "เอกสารเว็บ"
+
+#: ../atk/atkobject.c:169
+msgid "document email"
+msgstr "เอกสารอีเมล"
+
+#: ../atk/atkobject.c:170
+msgid "comment"
+msgstr "หมายเหตุ"
+
+#: ../atk/atkobject.c:171
+msgid "list box"
+msgstr "กล่องรายการ"
+
+#: ../atk/atkobject.c:172
+msgid "grouping"
+msgstr "การจัดกลุ่ม"
+
+#: ../atk/atkobject.c:173
+msgid "image map"
+msgstr "แผนที่ในรูปภาพ"
+
+#: ../atk/atkobject.c:174
+msgid "notification"
+msgstr "การแจ้งเหตุ"
+
+#: ../atk/atkobject.c:175
+msgid "info bar"
+msgstr "แถบข้อมูล"
+
+#: ../atk/atkobject.c:514
+msgid "Accessible Name"
+msgstr "ชื่อสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:515
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "ชื่ออินสแตนซ์ของออบเจกต์ ซึ่งจัดรูปแบบไว้สำหรับใช้กับเทคโนโลยีสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:521
+msgid "Accessible Description"
+msgstr "คำบรรยายสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:522
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "คำบรรยายของออบเจกต์ ซึ่งจัดรูปแบบไว้สำหรับใช้กับเทคโนโลยีสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:528
+msgid "Accessible Parent"
+msgstr "ออบเจกต์แม่ของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:529
+msgid "Is used to notify that the parent has changed"
+msgstr "ใช้แจ้งเหตุเมื่อออบเจกต์แม่มีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:535
+msgid "Accessible Value"
+msgstr "ค่าของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:536
+msgid "Is used to notify that the value has changed"
+msgstr "ใช้แจ้งเหตุมื่อค่ามีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:544
+msgid "Accessible Role"
+msgstr "บทบาทของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:545
+msgid "The accessible role of this object"
+msgstr "บทบาทของสิ่งอำนวยความสะดวกของออบเจกต์นี้"
+
+#: ../atk/atkobject.c:553
+msgid "Accessible Layer"
+msgstr "ชั้นของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:554
+msgid "The accessible layer of this object"
+msgstr "ชั้นของสิ่งอำนวยความสะดวกของออบเจกต์นี้"
+
+#: ../atk/atkobject.c:562
+msgid "Accessible MDI Value"
+msgstr "ค่า MDI ของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:563
+msgid "The accessible MDI value of this object"
+msgstr "ค่า MDI ของสิ่งอำนวยความสะดวกของออบเจกต์นี้"
+
+#: ../atk/atkobject.c:571
+msgid "Accessible Table Caption"
+msgstr "ป้ายบรรยายตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:572
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"ใช้แจ้งเหตุเมื่อป้ายบรรยายตารางมีการเปลี่ยนแปลง ไม่ควรใช้ช่องข้อมูลนี้ แต่ควรใช้ accessible-"
+"table-caption-object แทน"
+
+#: ../atk/atkobject.c:578
+msgid "Accessible Table Column Header"
+msgstr "หัวคอลัมน์ตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:579
+msgid "Is used to notify that the table column header has changed"
+msgstr "ใช้แจ้งเหตุเมื่อหัวคอลัมน์ของตารางมีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:585
+msgid "Accessible Table Column Description"
+msgstr "คำบรรยายคอลัมน์ตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:586
+msgid "Is used to notify that the table column description has changed"
+msgstr "ใช้แจ้งเหตุเมื่อคำบรรยายคอลัมน์ของตารางมีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:592
+msgid "Accessible Table Row Header"
+msgstr "หัวแถวตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:593
+msgid "Is used to notify that the table row header has changed"
+msgstr "ใช้แจ้งเหตุเมื่อหัวแถวของตารางมีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:599
+msgid "Accessible Table Row Description"
+msgstr "คำบรรยายแถวตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:600
+msgid "Is used to notify that the table row description has changed"
+msgstr "ใช้แจ้งเหตุเมื่อคำบรรยายแถวของตารางมีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:606
+msgid "Accessible Table Summary"
+msgstr "คำสรุปตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:607
+msgid "Is used to notify that the table summary has changed"
+msgstr "ใช้แจ้งเหตุเมื่อคำสรุปตารางมีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:613
+msgid "Accessible Table Caption Object"
+msgstr "ออบเจกต์ป้ายบรรยายตารางของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:614
+msgid "Is used to notify that the table caption has changed"
+msgstr "ใช้แจ้งเหตุเมื่อป้ายบรรยายตารางมีการเปลี่ยนแปลง"
+
+#: ../atk/atkobject.c:620
+msgid "Number of Accessible Hypertext Links"
+msgstr "จำนวนของ Hypertext Links ของสิ่งอำนวยความสะดวก"
+
+#: ../atk/atkobject.c:621
+msgid "The number of links which the current AtkHypertext has"
+msgstr "จำนวนของลิงก์ที่ AtkHypertext ปัจจุบันมี"
diff --git a/po/tk.po b/po/tk.po
new file mode 100644 (file)
index 0000000..e9ebb98
--- /dev/null
+++ b/po/tk.po
@@ -0,0 +1,538 @@
+# Turkmen translation of epiphany
+# Copyright (C) 2004 Free Software Foundation
+# Copyright (C) 2004 Mühemmet Amut
+#                                Kakilik - Turkmen free software developers community
+# This file is distributed under the terms of GNU General Public License (GPL)
+# Mühemmet Amut <m_amout@yahoo.com>, 2004\r
+# \r
+# \r
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2004-05-25 17:47+0330\n"
+"Last-Translator: Mühemmet Amut <m_amout@yahoo.com>\n"
+"Language-Team: Turkmen <kakilikgroup@yahoo.com>\n"
+"Language: tk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Saýlanan baglaýyş"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Takyklaýa AtkHyperlinkeň zady saýlanybdyrmy"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Labyrlaň Sany"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "labyrlaň AtkHyperlinkeň zady bylen bileleşeleň sany"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Ahyrky görkeziji"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlinkyň zadynyň ahyrky görkezijisi "
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Geçmek görkeziji"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlinkyň zadynyň geçmek görkezijisi "
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "maýyp"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "tizleşdirçi libeli"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "synçy"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "janlaşdyrma"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "ok"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "kalendar"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "kanwas"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "barlamak gapy"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "barlamak menüň aýtemy"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "reňk saýlaçy"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "sütüni heder"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "cümbö gapy"
+
+#: atk/atkobject.c:86
+#, fuzzy
+msgid "dateeditor"
+msgstr "sene editçi"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "desktap aýkon"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "desktap fraým"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "pyntyklamak"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "dýalog"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "halta jam "
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "çyzgy meýdança"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "faýl saýlaçy"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "doldurýançy"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "kalamsaýlaçy"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "fraým"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "aýna jam"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html ekleçi"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "aýkon"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "surat"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "dahili fraým"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "libel"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "gatlakly jam"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "täblisa"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "täblisa aýtemy"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "menü"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "menü zolaky"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "menü aýtemy"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "seçgi jam"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "sahypa täb"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "sahypa täbeň täblisasi"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "panel"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "geçmegsözeň metini"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "pöpüp menü"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ýetişik zolaky"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "iteklemek batüni"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "raýdyo batüni"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "raýdyo menünň aýtemy"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "kök jam"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "setir heder"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "eskrül zolaky"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "eskrül jam"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "izolirleçi"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "taýdyrýan"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "çat jam"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "saramak batüni"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "durum zolaky"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "täblisa"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "täblisaň öýjegi"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "täblisaň sütün hederi"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "täblisaň setir hederi"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "goparmak menü aýtemy"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "termýnal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "metin"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "tagel batüni"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "esbap zolaky"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "esbap nasýhaty"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "bag"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "bag täblisasi"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "nätanyş"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "nazardeşigi"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "äpişge"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "heder"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "füter"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragyraf"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "synçy"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "iş"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "üzisoňlöia"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "edit zolaky"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "synçy"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "iş"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "desktap fraým"
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "heder"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "surat"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "fraým"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Alýeterli Ady"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Alýeterli Waspy"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "byr zadyň waspy, şekilberlebder arkalayan teknölöjig elýetirmeg üçin"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Elýeterli Atasy"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "peýdalanýami ki habar berelýa atasy çalşyrlybdyr"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Elýeterli Gymmat"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "peýdalanýami ki habar berelýa gadyry çalşyrlybdyr"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Elýeterli Nägyş"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "şu zadyň elýeterli nägyşi"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Elýeterli Gatlaky"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "şu zadyň elýeterli gatlaky"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Elýeterli MDI Gymmaty"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "şu zadyň Elýeterli MDI Gymmaty"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Elýeterli Täblisaň Käpşeni"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"peýdalanýami ki habar berelýa täblisaň käpşeni çalşyrlybdyr; şu "
+"häsiýetpeýdalanmalla. elýeterli-täblisa-käpşen-zad bayad peýdalanmali şuň "
+"ýerne"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Elýeterli Tälisaň Sütün hederi"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "peýdalanýami ki habar berelýa täblisaň sütün hederi çalşyrlybdyr"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Elýeterli Tälisaň Sütün Waspy"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr "peýdalanýami ki habar berelýa täblisaň sütün waspy çalşyrlybdyr"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Elýeterli Tälisaň Setir Hederi"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "peýdalanýami ki habar berelýa täblisaň setir hederi çalşyrlybdyr"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Elýeterli Tälisaň Setir Waspy"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr "peýdalanýami ki habar berelýa täblisaň setir waspy çalşyrlybdyr"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Elýeterli Tälisaň holasasy"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "peýdalanýami ki habar berelýa täblisaň holasasy çalşyrlybdyr"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Elýeterli Tälisaň Käpşeniň Zady"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "peýdalanýami ki habar berelýa täblisaň käpşeni çalşyrlybdyr"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Elýeterli Haýpertekst Baglaýyşyň Sany"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "AtkHypertekstyň şymatky baglaýyşlaryň sany"
index 95d04f8..f0f82d0 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
 # Turkish translation for at-spi2-core.
 # Copyright (C) 2011 the Free Software Foundation, Inc.
+# Copyright (C) 2008-2023 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
+#
 # Muhammed EKEN <gnome@m-eken.com>, 2011.
 # Muhammet Kara <muhammetk@gmail.com>, 2011, 2014.
+# Emin Tufan Çetin <etcetin@gmail.com>, 2022.
+#
+# -------------------------------------------------
+# Turkish translation of atk.
+# Copyright (C) 2003 atk's COPYRIGHT HOLDER
+# This file is distributed under the same license as the atk package.
+#
+# Gorkem Cetin <gorkem@kde.org>, 2003.
+# Baris Cicek <baris@teamforce.name.tr>, 2006, 2008, 2009.
+# Necdet Yücel <necdetyucel@gmail.com>, 2014.
+# Muhammet Kara <muhammetk@gmail.com>, 2012, 2014, 2015.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-03 23:50+0000\n"
-"PO-Revision-Date: 2014-12-08 23:31+0200\n"
-"Last-Translator: Muhammet Kara <muhammetk@gmail.com>\n"
-"Language-Team: Türkçe <gnome-turk@gnome.org>\n"
+"Project-Id-Version: at-spi2-core\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-09-02 15:42+0000\n"
+"PO-Revision-Date: 2023-10-14 10:24+0300\n"
+"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
+"Language-Team: Turkish <takim@gnome.org.tr>\n"
 "Language: tr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 3.4\n"
 "X-Generator: Gtranslator 2.91.6\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Seçili Bağ"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink nesnesinin seçili olup olmadığını belirtir"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Çıpa Sayısı"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Çıpaların sayısı AtkHyperlınk nesnesi ile ilişkilidir"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Son dizin"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink nesnesinin son dizini"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Başlama dizini"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink nesnesinin başlama dizini"
+
+#: atk/atkobject.c:268
+msgid "Accessible Name"
+msgstr "Ulaşılabilir Ad"
+
+#: atk/atkobject.c:269
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Nesne ögesinin adı, yardımcı teknoloji ulaşımı için biçimlendi"
+
+#: atk/atkobject.c:275
+msgid "Accessible Description"
+msgstr "Ulaşılabilir Tanım"
+
+#: atk/atkobject.c:276
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Nesnenin tanımı, yardımcı teknoloji ulaşımı için biçimlendi"
+
+#: atk/atkobject.c:282
+msgid "Accessible Parent"
+msgstr "Ulaşılabilir Ebeveyn"
+
+#: atk/atkobject.c:283
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"atk_object_get_parent() tarafından döndürülen şu anki ulaşılabilir ebeveyni"
+
+#: atk/atkobject.c:299
+msgid "Accessible Value"
+msgstr "Ulaşılabilir Değer"
+
+#: atk/atkobject.c:300
+msgid "Is used to notify that the value has changed"
+msgstr "Değerin değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:308
+msgid "Accessible Role"
+msgstr "Ulaşılabilir Rol"
+
+#: atk/atkobject.c:309
+msgid "The accessible role of this object"
+msgstr "Bu nesnenin uyaşılabilir rolü"
+
+#: atk/atkobject.c:316
+msgid "Accessible Layer"
+msgstr "Ulaşılabilir Katman"
+
+#: atk/atkobject.c:317
+msgid "The accessible layer of this object"
+msgstr "Bu nesnenin ulaşılabilir katmanı"
+
+#: atk/atkobject.c:325
+msgid "Accessible MDI Value"
+msgstr "Ulaşılabilir MDI Değeri"
+
+#: atk/atkobject.c:326
+msgid "The accessible MDI value of this object"
+msgstr "Bu nesnenin ulaşılabilir MDI değeri"
+
+#: atk/atkobject.c:342
+msgid "Accessible Table Caption"
+msgstr "Ulaşılabilir Tablo Başlığı"
+
+#: atk/atkobject.c:343
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Tablo başlığının değiştiğini uyarmak için kullanılır; bu özellik "
+"kullanılmamalıdır. Bunun yerine accessible-table-caption-object "
+"kullanılmalıdır"
+
+#: atk/atkobject.c:357
+msgid "Accessible Table Column Header"
+msgstr "Ulaşılabilir Tablo Sütun Başlığı"
+
+#: atk/atkobject.c:358
+msgid "Is used to notify that the table column header has changed"
+msgstr "Tablo sütun başlığının değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:373
+msgid "Accessible Table Column Description"
+msgstr "Ulaşılabilir Tablo Sütun Tanımı"
+
+#: atk/atkobject.c:374
+msgid "Is used to notify that the table column description has changed"
+msgstr "Tablo sütun tanımının değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:389
+msgid "Accessible Table Row Header"
+msgstr "Ulaşılabilir Tablo Sıra Başlığı"
+
+#: atk/atkobject.c:390
+msgid "Is used to notify that the table row header has changed"
+msgstr "Tablo sıra başlığının değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:404
+msgid "Accessible Table Row Description"
+msgstr "Ulaşılabilir Tablo Sıra Tanımı"
+
+#: atk/atkobject.c:405
+msgid "Is used to notify that the table row description has changed"
+msgstr "Tablo sıra tanımının değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:411
+msgid "Accessible Table Summary"
+msgstr "Ulaşılabilir Tablo Özeti"
+
+#: atk/atkobject.c:412
+msgid "Is used to notify that the table summary has changed"
+msgstr "Tablo özetinin değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:418
+msgid "Accessible Table Caption Object"
+msgstr "Ulaşılabilir Tablo Başlık Nesnesi"
+
+#: atk/atkobject.c:419
+msgid "Is used to notify that the table caption has changed"
+msgstr "Tablo başlığının değiştiğini uyarmak için kullanılır"
+
+#: atk/atkobject.c:425
+msgid "Number of Accessible Hypertext Links"
+msgstr "Ulaşılabilir Hiper Metin Bağ Sayısı"
+
+#: atk/atkobject.c:426
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Şu anki AtkHypertext’in sahip olduğu bağ sayısı"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "çok zayıf"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "zayıf"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "kabul edilebilir"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "güçlü"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "çok güçlü"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "çok düşük"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "orta"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "yüksek"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "çok yüksek"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "çok kötü"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "kötü"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "iyi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "çok iyi"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "en iyi"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Artık böyle bir uygulama bulunmuyor"
 
-#: ../atspi/atspi-misc.c:1777
-msgid "Attempted synchronous call where prohibited"
-msgstr "Yasak olduğu halde eşzamanlı çağrı yapmaya çalışıldı"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "geçersiz"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "hızlandırıcı etiketi"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "uyarı"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "canlandırma"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "ok"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "takvim"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "tuval"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "denetim kutusu"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "denetim menü ögesi"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "renk seçici"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "sütun başlığı"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "çoklu kutu"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "veri düzenleyicisi"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "masaüstü simgesi"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "masaüstü çerçevesi"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "çevir"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "iletişim kutusu"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "dizin bölmesi"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "çizim bölgesi"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "dosya seçici"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "doldurucu"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "yazı tipi seçici"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "çerçeve"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "cam panel"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html kabı"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "simge"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "resim"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "iç çerçeve"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "etiket"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "katmanlı bölme"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "liste"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "liste öğesi"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "menü"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "menü çubuğu"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "menü düğmesi"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "menu öğesi"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "seçenek bölmesi"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "sayfa sekmesi"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "sayfa sekme listesi"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "panel"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "parola metni"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "açılır menü"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "ilerleme çubuğu"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "düğme"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "radyo düğmesi"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "radyo düğmesi öğesi"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "kök bölmesi"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "satır başlığı"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "kaydırma çubuğu"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "kaydırma bölmesi"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "ayraç"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "kaydırıcı"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "ayrık panel"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "çevirme düğmesi"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "durum çubuğu"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "tablo"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "tablo hücresi"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "tablo sütun başlığı"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "tablo satır başlığı"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "menü öğesini ayır"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "terminal"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "metin"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "aç/kapat düğmesi"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "araç çubuğu"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "ipucu"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "ağaç"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "ağaç tablosu"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "bilinmeyen"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "görüş alanı"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "pencere"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "başlık"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "dipnot"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "cetvel"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "uygulama"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "kendiliğinden doldur"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "düzenleme çubuğu"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "gömülü bileşen"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "girdi"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "grafik"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "başlık"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "belge çerçevesi"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "başlık"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "sayfa"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "bölüm"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "gereksiz nesne"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "biçim"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "bağ"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "giriş yöntemi penceresi"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "tablo satırı"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "ağaç ögesi"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "belge hesap tablosu"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "belge sunum"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "belge metin"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "belge web"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "belge e-posta"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "yorum"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "liste kutusu"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "kümeleme"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "görüntü eşlem"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "bildirim"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "bilgi çubuğu"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "düzey çubuğu"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "başlık çubuğu"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "öbek alıntı"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "ses"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "video"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "tanımlama"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "makale"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "işaret"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "günlük"
 
-#~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
-#~ msgstr "AT-SPI: Bilinmeyen RemoveAccesible imzası %s"
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "kayan yazı"
 
-#~ msgid "AT-SPI: Error calling getRoot for %s: %s"
-#~ msgstr "AT-SPI: %s için getRoot çağırma hatası: %s"
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "matematik"
 
-#~ msgid "AT-SPI: Error in GetItems, sender=%s, error=%s"
-#~ msgstr "AT-SPI: GetItems'te hata, gönderen=%s, hata=%s"
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "derecelendirme"
 
-#~ msgid "AT-SPI: Unknown interface %s"
-#~ msgstr "AT-SPI: Bilinmeyen arayüz %s"
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "zamanlayıcı"
 
-#~ msgid "AT-SPI: expected 2 values in states array; got %d\n"
-#~ msgstr "AT-SPI: durumlar dizisinde 2 değer beklenirken %d değer alındı\n"
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "açıklama listesi"
 
-#~ msgid "Streamable content not implemented"
-#~ msgstr "Akıcı içerik uygulanmamış"
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "açıklama terimi"
 
-#~ msgid "Got invalid signature %s for signal %s from interface %s\n"
-#~ msgstr "%3$s arayüzünden %2$s sinyali için geçersiz imza %1$s alındı\n"
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "açıklama değeri"
diff --git a/po/tt.po b/po/tt.po
new file mode 100644 (file)
index 0000000..7088a8a
--- /dev/null
+++ b/po/tt.po
@@ -0,0 +1,533 @@
+# Tatarish translation of atk.
+# Albert Fazlí <tatarish.l10n@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk 1.3.10\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2005-11-01 12:39+0300\n"
+"Last-Translator: Albert Fazlí <tatarish.l10n@gmail.com>\n"
+"Language-Team: Tatarish <tatarish.l10n@gmail.com>\n"
+"Language: tt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Saylanğan Bäy"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Saylanğan AtkHyperlink cisem bilgeli"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Irğaq Sanı"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink cisem belän kileşterelgän ırğaq sanı"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Töptezmä azağı"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink cisemeneñ töptezmä azağı"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Töptezmä başı"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink cisemeneñ töptezmä başı"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "yaraqsız"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "tizlätkeç yazması"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "beldergeç"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "canlandıru"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "uq"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "täqwim"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "öslek"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "tamğalı qır"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "tamğalı saylaq-kerem"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "tös saylağıç"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "buy başlığı"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "atılma tezmä"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "çor-tözätkeç"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "östäl tamğası"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "östäl qısası"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "şaltırat"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "dialog"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "törgäk tiräse"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "sızu alanı"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "birem saylağıç"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "tutırğıç"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "yazu-saylağıç"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "qısa"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "pıyalalı tirä"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "html sídırması"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "tamğa"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "sürät"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "eçke qısa"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "yazma"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "qatlanğan tirä"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "tezmä"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "tezmä kereme"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "saylaq"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "saylaq tiräse"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "saylaq kereme"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "köylämä tiräse"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "bit tabı"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "bit tabı tezmäse"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "tirä"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "sersüz-yazma"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "atılma-saylaq"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "alğabarış tiräse"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "basu-töymä"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "saylaw-töymä"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "saylawlı saylaq-kerem"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "asıl-tirä"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "yul başlığı"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "çornaw tiräse"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "çornaw tiräse"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "ayırğıç"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "şudırma"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "bülgeç=tirä"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "çornaw töymäse"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "torıştirä"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "cäymä"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "tüşämä küzänäge"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "tüşämä buy başlığı"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "tüşämä yul başlığı"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "özmäle saylaq-kerem"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "yazma"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "tätek-töymä"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "qoral-tirä"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "qoral-kiñäş"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "ağaç"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "ağaçlı tüşämä"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "bilgesez"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "kürsäsü tiräse"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "täräzä"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "başlıq"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "astlıq"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "paragraf"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "beldergeç"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "yazılım"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "üzennän tutıru"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "üzgärtü tiräse"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "símalı komponent"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "beldergeç"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "yazılım"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "östäl qısası"
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "başlıq"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "sürät"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "qısa"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "İreşmäle Atama"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Cisem aşırmasınıñ adı"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "İreşmäle Açıqlama"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Cisem açıqlaması"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "İreşmäle Ana"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Ana-cisem üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "İreşmäle Bäyä"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Bäyä üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "İreşmäle Çağılış"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Bu cisemneñ ireşmäle çağılışı bu"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "İreşmäle Qat"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Bu cisemneñ ireşmäle qatı bu"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "İreşmäle MDI-Bäyä"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Bu cisemneñ ireşmäle MDI-bäyäse bu"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "İreşmäle Tüşämä Başlığı"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Tüşämä başlığı üzgärelgän buluı turında belderü öçen qullanıla; bu üzençälek "
+"urınına accessible-table-caption-object qullanılğan bulırğa tieş."
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "İreşmäle Tüşämä Buy Başlığı"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr "Tüşämä bayınıñ başlığı üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "İreşmäle Tüşämä Buy Açıqlaması"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Tüşämä buyınıñ açıqlaması üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "İreşmäle Tüşämä Yul Başlığı"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr "Tüşämä yulınıñ başlığı üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "İreşmäle Tüşämä Yul Açıqlaması"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Tüşämä yulınıñ açıqlaması üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "İreşmäle Tüşämä Yomğağı"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Tüşämä yomğağı üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "İreşmäle Tüşämä Başlıq Ciseme"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Tüşämä başlığı üzgärelgän buluı turında belderü öçen qullanıla"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Tereyazmağa İreşmäle Bäy Sanı"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Ağımdağı AtkHypertext taba bäylär sanı bu"
index d696568..666169f 100644 (file)
--- a/po/ug.po
+++ b/po/ug.po
+# #-#-#-#-#  ug.po (at-spi2-core)  #-#-#-#-#
 # Uyghur translation for at-spi2-core.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 # Gheyret Kenji <gheyret@yahoo.com>, 2010.
-# 
+#
+# #-#-#-#-#  ug.po (atk 2.12 )  #-#-#-#-#
+# translation of atk to Uighur
+# This file is distributed under the same license as the PACKAGE package.
+# Gheyret T.Kenji <gheyret@yahoo.com>, 2005.
+# Sahran <sahran.ug@gmail.com>, 2010
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2011-03-18 16:31+0000\n"
-"PO-Revision-Date: 2011-01-31 15:04+0000\n"
-"Last-Translator: Gheyret Kenji <gheyret@yahoo.com>\n"
-"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
+"Project-Id-Version: atk 2.12\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2023-08-05 16:00+0000\n"
+"PO-Revision-Date: 2024-01-06 18:50-0500\n"
+"Last-Translator: Abduqadir Abliz <sahran@live.com>\n"
+"Language-Team: Gnome Uighur Translation Project <gnome-uighur@yahoogroups.com>\n"
 "Language: ug\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
 
-#: ../atspi/atspi-misc.c:291
-#, c-format
-msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
-msgstr "AT-SPI: RemoveAccessible نىڭ ئىمزاسى %s نامەلۇم"
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "تاللانغان ئۇلانما"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "AtkHyperlink نەڭىنىڭ تاللانغان تاللانمىغانلىقىنى كۆرسىتىدۇ"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "لەڭگەر سانى"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "AtkHyperlink بىلەن باغلىنىشلىق بولغان لەڭگەرلەرنىڭ سانى"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "ئاخىرلىشىش ئىندېكسى"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink نەڭىنىڭ ئاخىرلىشىش ئىندېكسى"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "باشلىنىش ئىندېكسى"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink نەڭىنىڭ باشلىنىش ئىندېكسى"
+
+#: atk/atkobject.c:268
+msgid "Accessible Name"
+msgstr "زىيارەتچان ئاتى"
+
+#: atk/atkobject.c:269
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "نەڭ ئۈلگىسىنىڭ ئاتى ياردەمچى تېخنىكا زىيارىتى ئۈچۈن پىچىلغان"
+
+#: atk/atkobject.c:275
+msgid "Accessible Description"
+msgstr "زىيارەتچان چۈشەندۈرۈلۈش"
+
+#: atk/atkobject.c:276
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "نەڭنىڭ چۈشەندۈرۈشى، ياردەمچى تېخنىكا زىيارىتى ئۈچۈن پىچىلغان"
+
+#: atk/atkobject.c:282
+msgid "Accessible Parent"
+msgstr "زىيارەتچان ئاتا تىزگىن"
+
+#: atk/atkobject.c:283
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "بۇ atk_object_get_parent() نۆۋەتتىكى زىيارەتچاننىڭ ئانا قىممىتىنىڭ قايتۇردى"
+
+#: atk/atkobject.c:299
+msgid "Accessible Value"
+msgstr "زىيارەتچان قىممەت"
+
+#: atk/atkobject.c:300
+msgid "Is used to notify that the value has changed"
+msgstr "مەزكۇر قىممەتنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:308
+msgid "Accessible Role"
+msgstr "زىيارەتچان رول"
+
+#: atk/atkobject.c:309
+msgid "The accessible role of this object"
+msgstr "مەزكۇر نەڭنىڭ زىيارەتچان رولى"
+
+#: atk/atkobject.c:316
+msgid "Accessible Layer"
+msgstr "زىيارەتچان قەۋەت"
+
+#: atk/atkobject.c:317
+msgid "The accessible layer of this object"
+msgstr "مەزكۇر نەڭنىڭ زىيارەتچان قەۋىتى"
+
+#: atk/atkobject.c:325
+msgid "Accessible MDI Value"
+msgstr "زىيارەتچان MDI قىممىتى"
+
+#: atk/atkobject.c:326
+msgid "The accessible MDI value of this object"
+msgstr "مەزكۇر نەڭنىڭ زىيارەتچان MDI قىممىتى"
+
+#: atk/atkobject.c:342
+msgid "Accessible Table Caption"
+msgstr "زىيارەتچان جەدۋەل ماۋزۇسى"
+
+#: atk/atkobject.c:343
+msgid ""
+"Is used to notify that the table caption has changed; this property should not be used. accessible-table-caption-object "
+"should be used instead"
+msgstr "جەدۋەل قېشى ئۆزگەرگەندە خەۋەر بېرىش ئۈچۈن ئىشلىتىلىدۇ. بۇنى ئىشلەتمەي accessible-table-caption-object ئىشلەتكەن ياخشى"
+
+#: atk/atkobject.c:357
+msgid "Accessible Table Column Header"
+msgstr "زىيارەتچان جەدۋەل ئىستون قېشى"
+
+#: atk/atkobject.c:358
+msgid "Is used to notify that the table column header has changed"
+msgstr "جەدۋەل ئىستون قېشىنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:373
+msgid "Accessible Table Column Description"
+msgstr "زىيارەتچان جەدۋەل ئىستونىنىڭ چۈشەندۈرۈلۈشى"
+
+#: atk/atkobject.c:374
+msgid "Is used to notify that the table column description has changed"
+msgstr "جەدۋەل ئىستونىنىڭ چۈشەندۈرۈشىنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:389
+msgid "Accessible Table Row Header"
+msgstr "زىيارەتچان جەدۋەل قۇر قېشى"
+
+#: atk/atkobject.c:390
+msgid "Is used to notify that the table row header has changed"
+msgstr "جەدۋەل قۇر قېشىنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:404
+msgid "Accessible Table Row Description"
+msgstr "زىيارەتچان جەدۋەل قۇرىنىڭ چۈشەندۈرۈلۈشى"
+
+#: atk/atkobject.c:405
+msgid "Is used to notify that the table row description has changed"
+msgstr "جەدۋەل قۇرىنىڭ چۈشەندۈرۈشىنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:411
+msgid "Accessible Table Summary"
+msgstr "زىيارەتچان جەدۋەل ئۈزۈندىسى"
+
+#: atk/atkobject.c:412
+msgid "Is used to notify that the table summary has changed"
+msgstr "جەدۋەل ئۈزۈندىسىنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:418
+msgid "Accessible Table Caption Object"
+msgstr "زىيارەتچان جەدۋەل ماۋزۇ نەڭى"
+
+#: atk/atkobject.c:419
+msgid "Is used to notify that the table caption has changed"
+msgstr "جەدۋەل ماۋزۇسىنىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
+
+#: atk/atkobject.c:425
+msgid "Number of Accessible Hypertext Links"
+msgstr "زىيارەتچان مول تېكىست ئۇلانمىلىرىنىڭ سانى"
+
+#: atk/atkobject.c:426
+msgid "The number of links which the current AtkHypertext has"
+msgstr "ھازىرقى AtkHypertext  ئۇلانمىلىرىنىڭ سانى"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "ناھايىتى ئاجىز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "ئاجىز"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "قوشۇلۇشچان"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "كۈچلۈك"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "ناھايىتى كۈچلۈك"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "ناھايىتى تۆۋەن"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "ئوتتۇراھال"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "يۇقىرى"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "ناھايىتى يۇقىرى"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "ناھايىتى ناچار"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "ناچار"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "ياخشى"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "بەك ياخشى"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "ئەڭ ياخشى"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1229 atspi/atspi-value.c:123
+msgid "The application no longer exists"
+msgstr "بۇ پىروگرامما مەۋجۇت ئەمەس"
+
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "ئىناۋەتسىز"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "تېزلەتكۈچنىڭ ئەنى"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "ئاگاھلاندۇرۇش"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "جانلاندۇرۇم"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "يا ئوق"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "يىلنامە"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "رەسىم رەختى"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "تاللاش كۆزنەكچىسى"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "تاللىغىلى بولىدىغان تىزىملىك تۇرى"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "رەڭ تاللىغۇچ"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "رەت قېشى"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "بىرىكمە كۆزنەكچىسى"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "چېسلا تەھرىرلىگۈچ"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "ئۈستەلئۈستى سىنبەلگىسى"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "ئۈستەلئۈستى كۆزنىكى"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "نومۇر بۇراش"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "سۆزلەشكۈ"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "مۇندەرىجە پەنجىرىسى"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "سىزىش دائىرىسى"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "ھۆججەت تاللىغۇچ"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "تولدۇرغۇچ"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "خەت نۇسخا تاللىغۇچ"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "كۆزنەك"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "ئەينەك پەنجىرە"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "html قاچىسى"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "سىنبەلگە"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "سۈرەت"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "ئىچكى كۆزنەك"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "ئەن"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "قەۋەتلىك پەنجىرە"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "تىزىم"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "تىزىم تۈرى"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "تىزىملىك"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "تىزىملىك بالدىقى"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "تىزىملىك توپچە"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "تىزىملىك تۈرى"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "تاللانما پەنجىرىسى"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "بەتكۈچ"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "بەتكۈچ تىزىمى"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "پەنجىرە"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "ئىم تېكىستى"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "سەكرىمە تىزىملىك"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "ئىلگىرىلەش بالدىقى"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "بېسىلما توپچا"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "تاق تاللاش توپچىسى"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "تاق تاللاش تىزىملىك تۈرى"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "يىلتىز پەنجىرە"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "قۇر قېشى"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "سىيرىغۇچ بالداق"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "سىيرىغۇچ پەنجىرە"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "ئايرىغۇچ"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "سۈرگۈچ"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "ئايرىغۇچ پەنجىرىسى"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "چىغ توپچا"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "ھالەت بالداق"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "جەدۋەل"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "جەدۋەل كاتەكچە"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "جەدۋەل ئىستونىنىڭ قېشى"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "جەدۋەل قۇرىنىڭ قېشى"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "تىزىملىك تۈرىنى يىرتماق"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "تېرمىنال"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "تېكىست"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "ئالماشتۇرغۇچ توپچا"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "قورال بالداق"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "كۆرسەتمە"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "شاخسىمان"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "شاخسىمان جەدۋەل"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "نامەلۇم"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "كۆرۈنۈش ئېغىزى"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "كۆزنەك"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "قاش"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "بەت ئاستى"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "ئابزاس"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "سىزغۇچ"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "پروگرامما"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "ئۆزلۈكىدىن تاماملاش"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "تەھرىرلەش بالدىقى"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "سىڭدۈرمە بۆلەك"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "كىرگۈ"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "دىئاگرامما"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "ماۋزۇ"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "پۈتۈك كاندۇكى"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "ماۋزۇ"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "بەت"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "دائىرە"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "ئارتۇقچە نەڭ"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "كۆزنەك"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "ئۇلانما"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "كىرگۈزگۈچ كۆزنىكى"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "جەدۋەل قۇرى"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "شاخسىمان تۇر"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "پۈتۈك جەدۋىلى"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "پۈتۈك سۇنۇلمىسى"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "پۈتۈك تېكىستى"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "پۈتۈك تورتۇراسى"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "پۈتۈك ئېلخېتى"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "ئىزاھات"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "تىزىم كۆزنەكچىسى"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "گۇرۇپپىلاش"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "سۈرەت خەرىتىسى"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "ئۇقتۇرۇش"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "ئۇچۇر بالدىقى"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "دەرىجە بالدىقى"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "ماۋزۇ بالداق"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "بۆلەك نەقىل"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "ئۈن"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "سىن"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "ئېنىقلىما"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "ماقالە"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "مۇساپە بەلگىسى"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "خاتىرە"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "لەيلىمە تېكىست"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "ماتېماتىكا"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "باھا"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "ۋاقىت خاتىرىلىگۈچ"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "چۈشەندۈرۈش تىزىمى"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "چۈشەندۈرۈش  شەرتى"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "چۈشەندۈرۈش قىممىتى"
 
-#: ../atspi/atspi-misc.c:328
 #, c-format
-msgid "AT-SPI: Error calling getRoot for %s: %s"
-msgstr "AT-SPI: %s ئۈچۈن getRoot نى چاقىرغاندا خاتالىق كۆرۈلدى: %s"
+#~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
+#~ msgstr "AT-SPI: RemoveAccessible نىڭ ئىمزاسى %s نامەلۇم"
 
-#: ../atspi/atspi-misc.c:486
 #, c-format
-msgid "AT-SPI: Error in GetItems, sender=%s, error=%s"
-msgstr "AT-SPI: GetItems دا خاتالىق بار. ئەۋەتكۈچى=%s، خاتالىق=%s"
+#~ msgid "AT-SPI: Error calling getRoot for %s: %s"
+#~ msgstr "AT-SPI: %s ئۈچۈن getRoot نى چاقىرغاندا خاتالىق كۆرۈلدى: %s"
 
-#: ../atspi/atspi-misc.c:588
 #, c-format
-msgid ""
-"AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
-"signature %s"
-msgstr "AT-SPI: _atspi_dbus_return_accessible_from_message نى غەلىتە ئىمزا %s بىلەن چاقىردى"
+#~ msgid "AT-SPI: Error in GetItems, sender=%s, error=%s"
+#~ msgstr "AT-SPI: GetItems دا خاتالىق بار. ئەۋەتكۈچى=%s، خاتالىق=%s"
 
-#: ../atspi/atspi-misc.c:617
 #, c-format
-msgid ""
-"AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
-"signature %s"
-msgstr "AT-SPI: _atspi_dbus_return_hyperlink_from_message نى غەلىتە ئىمزا %s بىلەن چاقىردى"
+#~ msgid "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange signature %s"
+#~ msgstr "AT-SPI: _atspi_dbus_return_accessible_from_message نى غەلىتە ئىمزا %s بىلەن چاقىردى"
 
-#: ../atspi/atspi-misc.c:642
 #, c-format
-msgid "AT-SPI: AddAccessible with unknown signature %s\n"
-msgstr "AT-SPI: AddAccessible غەلىتە ئىمزا %s بىلەن بىرگە\n"
+#~ msgid "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange signature %s"
+#~ msgstr "AT-SPI: _atspi_dbus_return_hyperlink_from_message نى غەلىتە ئىمزا %s بىلەن چاقىردى"
 
-#: ../atspi/atspi-misc.c:935 ../atspi/atspi-misc.c:986
-#: ../atspi/atspi-misc.c:1027
-msgid "The application no longer exists"
-msgstr "بۇ پروگرامما مەۋجۇت ئەمەس"
+#, c-format
+#~ msgid "AT-SPI: AddAccessible with unknown signature %s\n"
+#~ msgstr "AT-SPI: AddAccessible غەلىتە ئىمزا %s بىلەن بىرگە\n"
 
-#: ../atspi/atspi-misc.c:1063
 #, c-format
-msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
-msgstr "AT-SPI: %s نى ئارايۈز %s دىن ئالغاندا بىر variant كېلىشى كېرەك ئىدى؛ %s غا ئېرىشتى\n"
+#~ msgid "AT-SPI: expected a variant when fetching %s from interface %s; got %s\n"
+#~ msgstr "AT-SPI: %s نى ئارايۈز %s دىن ئالغاندا بىر variant كېلىشى كېرەك ئىدى؛ %s غا ئېرىشتى\n"
 
-#: ../atspi/atspi-misc.c:1069
 #, c-format
-msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
-msgstr "atspi_dbus_get_property: تىپى خاتا: %s بولۇشى كېرەك ئىدى، %c غا ئېرىشتى\n"
+#~ msgid "atspi_dbus_get_property: Wrong type: expected %s, got %c\n"
+#~ msgstr "atspi_dbus_get_property: تىپى خاتا: %s بولۇشى كېرەك ئىدى، %c غا ئېرىشتى\n"
 
-#: ../atspi/atspi-misc.c:1212
 #, c-format
-msgid "AT-SPI: Unknown interface %s"
-msgstr "AT-SPI:ئارايۈز %s نامەلۇم"
+#~ msgid "AT-SPI: Unknown interface %s"
+#~ msgstr "AT-SPI:ئارايۈز %s نامەلۇم"
 
-#: ../atspi/atspi-misc.c:1232
 #, c-format
-msgid "AT-SPI: expected 2 values in states array; got %d\n"
-msgstr "AT-SPI: ھالەت تىزىقىدا ئىككى قىممەت بولۇشى كېرەك ئىدى؛ %d غا ئېرىشتى\n"
+#~ msgid "AT-SPI: expected 2 values in states array; got %d\n"
+#~ msgstr "AT-SPI: ھالەت تىزىقىدا ئىككى قىممەت بولۇشى كېرەك ئىدى؛ %d غا ئېرىشتى\n"
 
-#: ../atspi/atspi-accessible.c:997
-msgid "Streamable content not implemented"
-msgstr "ئېقىنلاشتۇرغىلى بولىدىغان مەزمۇننى تېخى ئىشلەتكىلى بولمايدۇ"
+#~ msgid "Streamable content not implemented"
+#~ msgstr "ئېقىنلاشتۇرغىلى بولىدىغان مەزمۇننى تېخى ئىشلەتكىلى بولمايدۇ"
 
-#: ../atspi/atspi-event-listener.c:510
-msgid ""
-"called atspi_event_listener_register_from_callback with a NULL event_type"
-msgstr "atspi_event_listener_register_from_callback نى  نۆل(NULL event_type) بىلەن چاقىردى"
+#~ msgid "called atspi_event_listener_register_from_callback with a NULL event_type"
+#~ msgstr "atspi_event_listener_register_from_callback نى  نۆل(NULL event_type) بىلەن چاقىردى"
 
-#: ../atspi/atspi-event-listener.c:777
 #, c-format
-msgid "Got invalid signature %s for signal %s from interface %s\n"
-msgstr "خاتا ئىمزا %s ئېرىشتى. بۇ سىگنال %s ئۈچۈن كېرەك ئىدى. بۇ سىگنال %s ئارايۈزدىن كەلگەن\n"
+#~ msgid "Got invalid signature %s for signal %s from interface %s\n"
+#~ msgstr "خاتا ئىمزا %s ئېرىشتى. بۇ سىگنال %s ئۈچۈن كېرەك ئىدى. بۇ سىگنال %s ئارايۈزدىن كەلگەن\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "ئاتا تىزگىننىڭ ئۆزگەرگەنلىكىنى خەۋەر قىلىشقا ئىشلىتىلىدۇ"
 
 #~ msgid "AT-SPI: Could not get the display\n"
 #~ msgstr "AT-SPI: ئېكرانغا ئېرىشەلمىدى\n"
 
 #~ msgid "AT-SPI: Accessibility bus not found - Using session bus.\n"
-#~ msgstr ""
-#~ "AT-SPI: Accessibility باش لىنىيىسى تېپىلمىدى، شۇڭا ئەڭگىمە باش لىنىيىسى "
-#~ "ئىشلىتىلىدۇ.\n"
+#~ msgstr "AT-SPI: Accessibility باش لىنىيىسى تېپىلمىدى، شۇڭا ئەڭگىمە باش لىنىيىسى ئىشلىتىلىدۇ.\n"
 
 #~ msgid "AT-SPI: Couldn't connect to bus: %s\n"
 #~ msgstr "AT-SPI:باش لىنىيىسىگە باغلىنالمىدى: %s\n"
index be0a057..676072c 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
-# SOME DESCRIPTIVE TITLE.
+# #-#-#-#-#  uk.po (1.1)  #-#-#-#-#
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
+# #-#-#-#-#  uk.po (atk)  #-#-#-#-#
+# ATK Ukrainian translation.
+# Copyright (C) 2002 The ATK Team
+# This file is distributed under the same license as the ATK package.
+# Yuriy Syrota <yuri@renome.rovno.ua>
+# Maxim Dziumanenko <dziumanenko@gmail.com>
 # Korostil Daniel <ted.korostiled@gmail.com>, 2011.
+# wanderlust <wanderlust@ukr.net>, 2009.
+# Korostil Daniel <ted.korostiled@gmail.com>, 2012.
+# Yuri Chornoivan <yurchor@ukr.net>, 2020, 2022, 2024.
 msgid ""
 msgstr ""
-"Project-Id-Version: 1.1\n"
+"Project-Id-Version: atk\n"
 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
-"POT-Creation-Date: 2018-06-10 15:50+0000\n"
-"PO-Revision-Date: 2019-10-18 18:08+0300\n"
-"Last-Translator: vikaig <vikaig99@gmail.com>\n"
-"Language-Team: translation@linux.org.ua\n"
+"POT-Creation-Date: 2024-01-03 22:53+0000\n"
+"PO-Revision-Date: 2024-01-04 09:53+0200\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  uk.po (1.1)  #-#-#-#-#\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Poedit 2.2.1\n"
+"X-Generator: Lokalize 23.04.1\n"
+"#-#-#-#-#  uk.po (atk)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 20.03.70\n"
+
+#: atk/atkhyperlink.c:127
+msgid "Selected Link"
+msgstr "Посилання вибрано"
+
+#: atk/atkhyperlink.c:128
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Вказує, чи виділений об'єкт AtkHyperlink"
+
+#: atk/atkhyperlink.c:134
+msgid "Number of Anchors"
+msgstr "Кількість якорів"
+
+#: atk/atkhyperlink.c:135
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Кількість якорів, пов'язаних з об'єктом AtkHyperlink"
+
+#: atk/atkhyperlink.c:143
+msgid "End index"
+msgstr "Кінцевий індекс"
+
+#: atk/atkhyperlink.c:144
+msgid "The end index of the AtkHyperlink object"
+msgstr "Кінцевий індекс об'єкта AtkHyperlink"
+
+#: atk/atkhyperlink.c:152
+msgid "Start index"
+msgstr "Початковий індекс"
+
+#: atk/atkhyperlink.c:153
+msgid "The start index of the AtkHyperlink object"
+msgstr "Початковий індекс об'єкта AtkHyperlink"
+
+#: atk/atkobject.c:272
+msgid "Accessible Name"
+msgstr "Назва об'єкта"
+
+#: atk/atkobject.c:273
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Назва екземпляру об'єкта для доступу з використанням допоміжних технологій"
+
+#: atk/atkobject.c:279
+msgid "Accessible Description"
+msgstr "Опис об'єкта"
+
+#: atk/atkobject.c:280
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Опис об'єкта для доступу з використанням допоміжних технологій"
+
+#: atk/atkobject.c:286
+msgid "Accessible Parent"
+msgstr "Батьківський об'єкт"
+
+#: atk/atkobject.c:287
+msgid ""
+"Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr ""
+"Батьківський елемент поточного доступного елемента, який повертатиме "
+"atk_object_get_parent()"
+
+#: atk/atkobject.c:303
+msgid "Accessible Value"
+msgstr "Значення об'єкта"
+
+#: atk/atkobject.c:304
+msgid "Is used to notify that the value has changed"
+msgstr "Використовується для сповіщення, що значення змінились"
+
+#: atk/atkobject.c:312
+msgid "Accessible Role"
+msgstr "Роль об'єкта"
+
+#: atk/atkobject.c:313
+msgid "The accessible role of this object"
+msgstr "Роль цього об'єкта у допоміжних технологіях"
+
+#: atk/atkobject.c:320
+msgid "Accessible Layer"
+msgstr "Рівень об'єкта"
+
+#: atk/atkobject.c:321
+msgid "The accessible layer of this object"
+msgstr "Рівень цього об'єкта в допоміжних технологіях"
+
+#: atk/atkobject.c:329
+msgid "Accessible MDI Value"
+msgstr "Допоміжне значення MDI"
+
+#: atk/atkobject.c:330
+msgid "The accessible MDI value of this object"
+msgstr "Значення MDI цього об'єкта у допоміжних технологіях"
+
+#: atk/atkobject.c:346
+msgid "Accessible Table Caption"
+msgstr "Допоміжний заголовок таблиці"
+
+#: atk/atkobject.c:347
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Використовується для сповіщення про зміну заголовку таблиці. Ця властивість "
+"не повинна використовуватись. Натомість повинна використовуватись "
+"властивість accessible-table-caption-object."
+
+#: atk/atkobject.c:361
+msgid "Accessible Table Column Header"
+msgstr "Допоміжний заголовок стовпчика таблиці"
+
+#: atk/atkobject.c:362
+msgid "Is used to notify that the table column header has changed"
+msgstr "Використовується для сповіщення про зміну заголовку стовпця"
+
+#: atk/atkobject.c:377
+msgid "Accessible Table Column Description"
+msgstr "Допоміжний опис стовпця таблиці"
+
+#: atk/atkobject.c:378
+msgid "Is used to notify that the table column description has changed"
+msgstr "Використовується для сповіщення про зміну опису стовпця"
+
+#: atk/atkobject.c:393
+msgid "Accessible Table Row Header"
+msgstr "Допоміжний заголовок рядка таблиці"
+
+#: atk/atkobject.c:394
+msgid "Is used to notify that the table row header has changed"
+msgstr "Використовується для сповіщення про зміну заголовку рядка таблиці"
+
+#: atk/atkobject.c:408
+msgid "Accessible Table Row Description"
+msgstr "Допоміжний опис рядка таблиці"
+
+#: atk/atkobject.c:409
+msgid "Is used to notify that the table row description has changed"
+msgstr "Використовується для сповіщення про зміну опису рядка таблиці"
+
+#: atk/atkobject.c:415
+msgid "Accessible Table Summary"
+msgstr "Допоміжний підсумок таблиці "
+
+#: atk/atkobject.c:416
+msgid "Is used to notify that the table summary has changed"
+msgstr "Використовується для сповіщення про зміну підсумку таблиці"
+
+#: atk/atkobject.c:422
+msgid "Accessible Table Caption Object"
+msgstr "Допоміжний об'єкт заголовку таблиці"
+
+#: atk/atkobject.c:423
+msgid "Is used to notify that the table caption has changed"
+msgstr "Використовується для сповіщення про зміну заголовку таблиці"
+
+#: atk/atkobject.c:429
+msgid "Number of Accessible Hypertext Links"
+msgstr "Кількість допоміжних гіпертекстових посилань"
+
+#: atk/atkobject.c:430
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Кількість посилань, які має поточний об'єкт AtkHypertext"
+
+#: atk/atkobject.c:439
+#| msgid "Accessible Name"
+msgid "Accessible ID"
+msgstr "Ідентифікатор доступності"
 
-#: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
+#: atk/atkobject.c:440
+msgid "ID for the accessible; useful for automated testing"
+msgstr ""
+"Ідентифікатор для елемента доступності: корисно для автоматизованого"
+" тестування"
+
+#: atk/atkobject.c:446
+#| msgid "text"
+msgid "Help text"
+msgstr "Текст довідки"
+
+#: atk/atkobject.c:447
+msgid "Help text associated with the accessible"
+msgstr "Текст довідки, який пов'язано із елементом доступності"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:193
+msgid "very weak"
+msgstr "дуже простий"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:200
+msgid "weak"
+msgstr "простий"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:207
+msgid "acceptable"
+msgstr "прийнятний"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:214
+msgid "strong"
+msgstr "складний"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:221
+msgid "very strong"
+msgstr "дуже складний"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:229
+msgid "very low"
+msgstr "дуже низька"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:237
+msgid "medium"
+msgstr "середня"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:245
+msgid "high"
+msgstr "висока"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:253
+msgid "very high"
+msgstr "дуже висока"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:261
+msgid "very bad"
+msgstr "дуже погано"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:269
+msgid "bad"
+msgstr "погано"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:277
+msgid "good"
+msgstr "добре"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:285
+msgid "very good"
+msgstr "дуже добре"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:293
+msgid "best"
+msgstr "якнайкраще"
+
+#: atspi/atspi-component.c:352 atspi/atspi-misc.c:1230 atspi/atspi-value.c:123
 msgid "The application no longer exists"
 msgstr "Програми більше не існує"
 
-#: atspi/atspi-misc.c:1850
-msgid "Attempted synchronous call where prohibited"
-msgstr "Спроба синхронного виклику там, де це заборонено"
+#: atspi/atspi-misc.c:49
+msgid "invalid"
+msgstr "неприпустимий"
+
+#: atspi/atspi-misc.c:50
+msgid "accelerator label"
+msgstr "позначка комбінації клавіш"
+
+#: atspi/atspi-misc.c:51
+msgid "alert"
+msgstr "тривога"
+
+#: atspi/atspi-misc.c:52
+msgid "animation"
+msgstr "анімація"
+
+#: atspi/atspi-misc.c:53
+msgid "arrow"
+msgstr "стрілка"
+
+#: atspi/atspi-misc.c:54
+msgid "calendar"
+msgstr "календар"
+
+#: atspi/atspi-misc.c:55
+msgid "canvas"
+msgstr "полотно"
+
+#: atspi/atspi-misc.c:56
+msgid "check box"
+msgstr "кнопка-прапорець"
+
+#: atspi/atspi-misc.c:57
+msgid "check menu item"
+msgstr "елемент-прапорець меню"
+
+#: atspi/atspi-misc.c:58
+msgid "color chooser"
+msgstr "вибір кольору"
+
+#: atspi/atspi-misc.c:59
+msgid "column header"
+msgstr "заголовок стовпчика"
+
+#: atspi/atspi-misc.c:60
+msgid "combo box"
+msgstr "поле зі списком"
+
+#: atspi/atspi-misc.c:61
+msgid "dateeditor"
+msgstr "редактор дати"
+
+#: atspi/atspi-misc.c:62
+msgid "desktop icon"
+msgstr "значок робочого столу"
+
+#: atspi/atspi-misc.c:63
+msgid "desktop frame"
+msgstr "рамка робочого столу"
+
+#: atspi/atspi-misc.c:64
+msgid "dial"
+msgstr "набір номера"
+
+#: atspi/atspi-misc.c:65
+msgid "dialog"
+msgstr "діалогове вікно"
+
+#: atspi/atspi-misc.c:66
+msgid "directory pane"
+msgstr "панель каталогу"
+
+#: atspi/atspi-misc.c:67
+msgid "drawing area"
+msgstr "область малювання"
+
+#: atspi/atspi-misc.c:68
+msgid "file chooser"
+msgstr "вибір файлів"
+
+#: atspi/atspi-misc.c:69
+msgid "filler"
+msgstr "заповнювач"
+
+#. I know it looks wrong but that is what Java returns
+#: atspi/atspi-misc.c:71
+msgid "fontchooser"
+msgstr "вибір шрифту"
+
+#: atspi/atspi-misc.c:72
+msgid "frame"
+msgstr "рамка"
+
+#: atspi/atspi-misc.c:73
+msgid "glass pane"
+msgstr "прозора панель"
+
+#: atspi/atspi-misc.c:74
+msgid "html container"
+msgstr "контейнер з html вмістом"
+
+#: atspi/atspi-misc.c:75
+msgid "icon"
+msgstr "значок"
+
+#: atspi/atspi-misc.c:76
+msgid "image"
+msgstr "зображення"
+
+#: atspi/atspi-misc.c:77
+msgid "internal frame"
+msgstr "внутрішня рамка"
+
+#: atspi/atspi-misc.c:78
+msgid "label"
+msgstr "позначка"
+
+#: atspi/atspi-misc.c:79
+msgid "layered pane"
+msgstr "панель з рівнями"
+
+#: atspi/atspi-misc.c:80
+msgid "list"
+msgstr "список"
+
+#: atspi/atspi-misc.c:81
+msgid "list item"
+msgstr "елемент списку"
+
+#: atspi/atspi-misc.c:82
+msgid "menu"
+msgstr "меню"
+
+#: atspi/atspi-misc.c:83
+msgid "menu bar"
+msgstr "рядок меню"
+
+#: atspi/atspi-misc.c:84
+msgid "menu button"
+msgstr "кнопка меню"
+
+#: atspi/atspi-misc.c:85
+msgid "menu item"
+msgstr "елемент меню"
+
+#: atspi/atspi-misc.c:86
+msgid "option pane"
+msgstr "панель параметрів"
+
+#: atspi/atspi-misc.c:87
+msgid "page tab"
+msgstr "вкладка сторінки"
+
+#: atspi/atspi-misc.c:88
+msgid "page tab list"
+msgstr "список вкладок сторінки"
+
+#: atspi/atspi-misc.c:89
+msgid "panel"
+msgstr "панель"
+
+#: atspi/atspi-misc.c:90
+msgid "password text"
+msgstr "пароль"
+
+#: atspi/atspi-misc.c:91
+msgid "popup menu"
+msgstr "контекстне меню"
+
+#: atspi/atspi-misc.c:92
+msgid "progress bar"
+msgstr "індикатор поступу"
+
+#: atspi/atspi-misc.c:93
+msgid "push button"
+msgstr "звичайна кнопка"
+
+#: atspi/atspi-misc.c:94
+msgid "radio button"
+msgstr "кнопка-перемикач"
+
+#: atspi/atspi-misc.c:95
+msgid "radio menu item"
+msgstr "елемент-перемикач меню"
+
+#: atspi/atspi-misc.c:96
+msgid "root pane"
+msgstr "коренева панель"
+
+#: atspi/atspi-misc.c:97
+msgid "row header"
+msgstr "заголовок рядка"
+
+#: atspi/atspi-misc.c:98
+msgid "scroll bar"
+msgstr "смуга прокрутки"
+
+#: atspi/atspi-misc.c:99
+msgid "scroll pane"
+msgstr "панель прокрутки"
+
+#: atspi/atspi-misc.c:100
+msgid "separator"
+msgstr "розділювач"
+
+#: atspi/atspi-misc.c:101
+msgid "slider"
+msgstr "повзунок"
+
+#: atspi/atspi-misc.c:102
+msgid "split pane"
+msgstr "розділена панель"
+
+#: atspi/atspi-misc.c:103
+msgid "spin button"
+msgstr "кнопка обертання"
+
+#: atspi/atspi-misc.c:104
+msgid "statusbar"
+msgstr "рядок стану"
+
+#: atspi/atspi-misc.c:105
+msgid "table"
+msgstr "таблиця"
+
+#: atspi/atspi-misc.c:106
+msgid "table cell"
+msgstr "клітинка таблиці"
+
+#: atspi/atspi-misc.c:107
+msgid "table column header"
+msgstr "заголовок стовпчика таблиці"
+
+#: atspi/atspi-misc.c:108
+msgid "table row header"
+msgstr "заголовок рядка таблиці"
+
+#: atspi/atspi-misc.c:109
+msgid "tear off menu item"
+msgstr "рухомий елемент меню"
+
+#: atspi/atspi-misc.c:110
+msgid "terminal"
+msgstr "термінал"
+
+#: atspi/atspi-misc.c:111
+msgid "text"
+msgstr "текст"
+
+#: atspi/atspi-misc.c:112
+msgid "toggle button"
+msgstr "кнопка-перемикач"
+
+#: atspi/atspi-misc.c:113
+msgid "tool bar"
+msgstr "панель інструментів"
+
+#: atspi/atspi-misc.c:114
+msgid "tool tip"
+msgstr "підказка"
+
+#: atspi/atspi-misc.c:115
+msgid "tree"
+msgstr "дерево"
+
+#: atspi/atspi-misc.c:116
+msgid "tree table"
+msgstr "таблиця у вигляді дерева"
+
+#: atspi/atspi-misc.c:117
+msgid "unknown"
+msgstr "невідомий"
+
+#: atspi/atspi-misc.c:118
+msgid "viewport"
+msgstr "область перегляду"
+
+#: atspi/atspi-misc.c:119
+msgid "window"
+msgstr "вікно"
+
+#: atspi/atspi-misc.c:120
+msgid "header"
+msgstr "заголовок"
+
+#: atspi/atspi-misc.c:121
+msgid "footer"
+msgstr "нижній колонтитул"
+
+#: atspi/atspi-misc.c:122
+msgid "paragraph"
+msgstr "абзац"
+
+#: atspi/atspi-misc.c:123
+msgid "ruler"
+msgstr "лінійка"
+
+#: atspi/atspi-misc.c:124
+msgid "application"
+msgstr "програма"
+
+#: atspi/atspi-misc.c:125
+msgid "autocomplete"
+msgstr "автодоповнення"
+
+#: atspi/atspi-misc.c:126
+msgid "edit bar"
+msgstr "рядок редагування"
+
+#: atspi/atspi-misc.c:127
+msgid "embedded component"
+msgstr "вбудований компонент"
+
+#: atspi/atspi-misc.c:128
+msgid "entry"
+msgstr "запис"
+
+#: atspi/atspi-misc.c:129
+msgid "chart"
+msgstr "діаграма"
+
+#: atspi/atspi-misc.c:130
+msgid "caption"
+msgstr "заголовок"
+
+#: atspi/atspi-misc.c:131
+msgid "document frame"
+msgstr "рамка документа"
+
+#: atspi/atspi-misc.c:132
+msgid "heading"
+msgstr "заголовок"
+
+#: atspi/atspi-misc.c:133
+msgid "page"
+msgstr "сторінка"
+
+#: atspi/atspi-misc.c:134
+msgid "section"
+msgstr "розділ"
+
+#: atspi/atspi-misc.c:135
+msgid "redundant object"
+msgstr "зайвий аргумент"
+
+#: atspi/atspi-misc.c:136
+msgid "form"
+msgstr "форма"
+
+#: atspi/atspi-misc.c:137
+msgid "link"
+msgstr "посилання"
+
+#: atspi/atspi-misc.c:138
+msgid "input method window"
+msgstr "вікно методу вводу"
+
+#: atspi/atspi-misc.c:139
+msgid "table row"
+msgstr "рядок таблиці"
+
+#: atspi/atspi-misc.c:140
+msgid "tree item"
+msgstr "об'єкт дерева"
+
+#: atspi/atspi-misc.c:141
+msgid "document spreadsheet"
+msgstr "документ електронної таблиці"
+
+#: atspi/atspi-misc.c:142
+msgid "document presentation"
+msgstr "документ презентації"
+
+#: atspi/atspi-misc.c:143
+msgid "document text"
+msgstr "документ тексту"
+
+#: atspi/atspi-misc.c:144
+msgid "document web"
+msgstr "документ інтернету"
+
+#: atspi/atspi-misc.c:145
+msgid "document email"
+msgstr "документ пошти"
+
+#: atspi/atspi-misc.c:146
+msgid "comment"
+msgstr "коментар"
+
+#: atspi/atspi-misc.c:147
+msgid "list box"
+msgstr "список"
+
+#: atspi/atspi-misc.c:148
+msgid "grouping"
+msgstr "групування"
+
+#: atspi/atspi-misc.c:149
+msgid "image map"
+msgstr "зображування"
+
+#: atspi/atspi-misc.c:150
+msgid "notification"
+msgstr "сповіщення"
+
+#: atspi/atspi-misc.c:151
+msgid "info bar"
+msgstr "інформаційна панель"
+
+#: atspi/atspi-misc.c:152
+msgid "level bar"
+msgstr "смужка рівня"
+
+#: atspi/atspi-misc.c:153
+msgid "title bar"
+msgstr "смужка заголовка"
+
+#: atspi/atspi-misc.c:154
+msgid "block quote"
+msgstr "цитата"
+
+#: atspi/atspi-misc.c:155
+msgid "audio"
+msgstr "звук"
+
+#: atspi/atspi-misc.c:156
+msgid "video"
+msgstr "відео"
+
+#: atspi/atspi-misc.c:157
+msgid "definition"
+msgstr "визначення"
+
+#: atspi/atspi-misc.c:158
+msgid "article"
+msgstr "стаття"
+
+#: atspi/atspi-misc.c:159
+msgid "landmark"
+msgstr "орієнтир"
+
+#: atspi/atspi-misc.c:160
+msgid "log"
+msgstr "журнал"
+
+#: atspi/atspi-misc.c:161
+msgid "marquee"
+msgstr "область"
+
+#: atspi/atspi-misc.c:162
+msgid "math"
+msgstr "математичний вираз"
+
+#: atspi/atspi-misc.c:163
+msgid "rating"
+msgstr "оцінка"
+
+#: atspi/atspi-misc.c:164
+msgid "timer"
+msgstr "таймер"
+
+#: atspi/atspi-misc.c:165
+msgid "description list"
+msgstr "список опису"
+
+#: atspi/atspi-misc.c:166
+msgid "description term"
+msgstr "термін опису"
+
+#: atspi/atspi-misc.c:167
+msgid "description value"
+msgstr "значення опису"
+
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "Спроба синхронного виклику там, де це заборонено"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: невідомий підпис %s для RemoveAccessible"
index c232401..214d39e 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -1,10 +1,24 @@
+# #-#-#-#-#  vi.po (at-spi2-core master)  #-#-#-#-#
 # Vietnamese translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Nguyễn Thái Ngọc Duy <pclouds@gmail.com>,  2011.
 #
+# #-#-#-#-#  vi.po (atk master)  #-#-#-#-#
+# Vietnamese translation for ATK.
+# Bản dịch tiếng Việt dành cho atk.
+# This file is distributed under the same license as the ATK package.
+# Copyright © 2015 GNOME i18n Project for Vietnamese.
+# T.M.Thanh <tmthanh@yahoo.com>, 2002.
+# Pham Thanh Long <lngt@ngonngu.net>, 2007.
+# Clytie Siddall <clytie@riverland.net.au>, 2005-2009.
+# Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2011.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2015.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  vi.po (at-spi2-core master)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core master\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +31,20 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"#-#-#-#-#  vi.po (atk master)  #-#-#-#-#\n"
+"Project-Id-Version: atk master\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2015-03-23 15:52+0000\n"
+"PO-Revision-Date: 2015-09-27 14:40+0700\n"
+"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <gnome-vi-list@gnome.org>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 2.91.7\n"
 
 #: ../atspi/atspi-misc.c:290
 #, c-format
@@ -38,14 +66,16 @@ msgstr "AT-SPI: Lỗi trong GetItems, sender=%s, error=%s"
 msgid ""
 "AT-SPI: Called _atspi_dbus_return_accessible_from_message with strange "
 "signature %s"
-msgstr "AT-SPI: _atspi_dbus_return_accessible_from_message được gọi với chữ ký lạ %s"
+msgstr ""
+"AT-SPI: _atspi_dbus_return_accessible_from_message được gọi với chữ ký lạ %s"
 
 #: ../atspi/atspi-misc.c:616
 #, c-format
 msgid ""
 "AT-SPI: Called _atspi_dbus_return_hyperlink_from_message with strange "
 "signature %s"
-msgstr "AT-SPI: _atspi_dbus_return_hyperlink_from_message được gọi với chữ ký lạ %s"
+msgstr ""
+"AT-SPI: _atspi_dbus_return_hyperlink_from_message được gọi với chữ ký lạ %s"
 
 #: ../atspi/atspi-misc.c:641
 #, c-format
@@ -85,9 +115,788 @@ msgstr "Chưa cài đặt streamable content"
 #: ../atspi/atspi-event-listener.c:510
 msgid ""
 "called atspi_event_listener_register_from_callback with a NULL event_type"
-msgstr "atspi_event_listener_register_from_callback được gọi với event_type là NULL"
+msgstr ""
+"atspi_event_listener_register_from_callback được gọi với event_type là NULL"
 
 #: ../atspi/atspi-event-listener.c:777
 #, c-format
 msgid "Got invalid signature %s for signal %s from interface %s\n"
 msgstr "Nhận được chữ ký không hợp lệ %s cho tín hiệu %s từ giao tiếp %s\n"
+
+#: ../atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "Liên kết đã chọn"
+
+#: ../atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Xác định đối tượng AtkHyperlink được chọn hay chưa"
+
+#: ../atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "Số của điểm neo"
+
+#: ../atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Số neo gắn với đối tượng AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "Chỉ mục cuối"
+
+#: ../atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "Chỉ mục cuối của đối tượng AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "Chỉ mục đầu"
+
+#: ../atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "Chỉ mục đầu của đối tượng AtkHyperlink"
+
+#: ../atk/atkobject.c:97
+msgid "invalid"
+msgstr "không hợp lệ"
+
+#: ../atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "nhãn tăng tốc"
+
+#: ../atk/atkobject.c:99
+msgid "alert"
+msgstr "cảnh báo"
+
+#: ../atk/atkobject.c:100
+msgid "animation"
+msgstr "hoạt hình"
+
+#: ../atk/atkobject.c:101
+msgid "arrow"
+msgstr "mũi tên"
+
+#: ../atk/atkobject.c:102
+msgid "calendar"
+msgstr "lịch"
+
+#: ../atk/atkobject.c:103
+msgid "canvas"
+msgstr "vùng vẽ"
+
+#: ../atk/atkobject.c:104
+msgid "check box"
+msgstr "hộp chọn"
+
+#: ../atk/atkobject.c:105
+msgid "check menu item"
+msgstr "mục trình đơn chọn"
+
+#: ../atk/atkobject.c:106
+msgid "color chooser"
+msgstr "bộ chọn màu"
+
+#: ../atk/atkobject.c:107
+msgid "column header"
+msgstr "tên cột"
+
+#: ../atk/atkobject.c:108
+msgid "combo box"
+msgstr "hộp kết hợp"
+
+#: ../atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "bộ chỉnh ngày tháng"
+
+#: ../atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "biểu tượng môi trường"
+
+#: ../atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "khung môi trường"
+
+#: ../atk/atkobject.c:112
+msgid "dial"
+msgstr "quay số"
+
+#: ../atk/atkobject.c:113
+msgid "dialog"
+msgstr "hộp thoại"
+
+#: ../atk/atkobject.c:114
+msgid "directory pane"
+msgstr "ô thư mục"
+
+#: ../atk/atkobject.c:115
+msgid "drawing area"
+msgstr "vùng vẽ"
+
+#: ../atk/atkobject.c:116
+msgid "file chooser"
+msgstr "bộ chọn tập tin"
+
+#: ../atk/atkobject.c:117
+msgid "filler"
+msgstr "bộ tô đầy"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "bộ chọn phông"
+
+#: ../atk/atkobject.c:120
+msgid "frame"
+msgstr "khung"
+
+#: ../atk/atkobject.c:121
+msgid "glass pane"
+msgstr "ô kính"
+
+#: ../atk/atkobject.c:122
+msgid "html container"
+msgstr "thùng chứa html"
+
+#: ../atk/atkobject.c:123
+msgid "icon"
+msgstr "biểu tượng"
+
+#: ../atk/atkobject.c:124
+msgid "image"
+msgstr "ảnh"
+
+#: ../atk/atkobject.c:125
+msgid "internal frame"
+msgstr "khung nội bộ"
+
+#: ../atk/atkobject.c:126
+msgid "label"
+msgstr "nhãn"
+
+#: ../atk/atkobject.c:127
+msgid "layered pane"
+msgstr "khung phân lớp"
+
+#: ../atk/atkobject.c:128
+msgid "list"
+msgstr "danh sách"
+
+#: ../atk/atkobject.c:129
+msgid "list item"
+msgstr "mục danh sách"
+
+#: ../atk/atkobject.c:130
+msgid "menu"
+msgstr "trình đơn"
+
+#: ../atk/atkobject.c:131
+msgid "menu bar"
+msgstr "thanh trình đơn"
+
+#: ../atk/atkobject.c:132
+msgid "menu item"
+msgstr "mục trình đơn"
+
+#: ../atk/atkobject.c:133
+msgid "option pane"
+msgstr "ô tùy chọn"
+
+#: ../atk/atkobject.c:134
+msgid "page tab"
+msgstr "thẻ trang"
+
+#: ../atk/atkobject.c:135
+msgid "page tab list"
+msgstr "danh sách thẻ trang"
+
+#: ../atk/atkobject.c:136
+msgid "panel"
+msgstr "bảng điều khiển"
+
+#: ../atk/atkobject.c:137
+msgid "password text"
+msgstr "chuỗi mật khẩu"
+
+#: ../atk/atkobject.c:138
+msgid "popup menu"
+msgstr "trình đơn bật lên"
+
+#: ../atk/atkobject.c:139
+msgid "progress bar"
+msgstr "thanh tiến trình"
+
+#: ../atk/atkobject.c:140
+msgid "push button"
+msgstr "nút bấm"
+
+#: ../atk/atkobject.c:141
+msgid "radio button"
+msgstr "nút chọn"
+
+#: ../atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "mục trình đơn chọn một"
+
+#: ../atk/atkobject.c:143
+msgid "root pane"
+msgstr "ô gốc"
+
+#: ../atk/atkobject.c:144
+msgid "row header"
+msgstr "tên hàng"
+
+#: ../atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "thanh cuộn"
+
+#: ../atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "ô cuộn"
+
+#: ../atk/atkobject.c:147
+msgid "separator"
+msgstr "thanh phân cách"
+
+#: ../atk/atkobject.c:148
+msgid "slider"
+msgstr "con trượt"
+
+#: ../atk/atkobject.c:149
+msgid "split pane"
+msgstr "ngăn cách bảng"
+
+#: ../atk/atkobject.c:150
+msgid "spin button"
+msgstr "nút xoay"
+
+#: ../atk/atkobject.c:151
+msgid "statusbar"
+msgstr "thanh trạng thái"
+
+#: ../atk/atkobject.c:152
+msgid "table"
+msgstr "bảng"
+
+#: ../atk/atkobject.c:153
+msgid "table cell"
+msgstr "ô bảng"
+
+#: ../atk/atkobject.c:154
+msgid "table column header"
+msgstr "tên cột bảng"
+
+#: ../atk/atkobject.c:155
+msgid "table row header"
+msgstr "tên hàng bảng"
+
+#: ../atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "mục trình đơn tách rời"
+
+#: ../atk/atkobject.c:157
+msgid "terminal"
+msgstr "thiết bị cuối"
+
+#: ../atk/atkobject.c:158
+msgid "text"
+msgstr "chữ"
+
+#: ../atk/atkobject.c:159
+msgid "toggle button"
+msgstr "nút bật/tắt"
+
+#: ../atk/atkobject.c:160
+msgid "tool bar"
+msgstr "thanh công cụ"
+
+#: ../atk/atkobject.c:161
+msgid "tool tip"
+msgstr "mẹo công cụ"
+
+#: ../atk/atkobject.c:162
+msgid "tree"
+msgstr "cây"
+
+#: ../atk/atkobject.c:163
+msgid "tree table"
+msgstr "bảng cây"
+
+#: ../atk/atkobject.c:164
+msgid "unknown"
+msgstr "không rõ"
+
+#: ../atk/atkobject.c:165
+msgid "viewport"
+msgstr "cổng xem"
+
+#: ../atk/atkobject.c:166
+msgid "window"
+msgstr "cửa sổ"
+
+#: ../atk/atkobject.c:167
+msgid "header"
+msgstr "phần đầu"
+
+#: ../atk/atkobject.c:168
+msgid "footer"
+msgstr "phần chân"
+
+#: ../atk/atkobject.c:169
+msgid "paragraph"
+msgstr "đoạn văn"
+
+#: ../atk/atkobject.c:170
+msgid "ruler"
+msgstr "thước"
+
+#: ../atk/atkobject.c:171
+msgid "application"
+msgstr "ứng dụng"
+
+#: ../atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "tự động hoàn tất"
+
+#: ../atk/atkobject.c:173
+msgid "edit bar"
+msgstr "thanh sửa"
+
+#: ../atk/atkobject.c:174
+msgid "embedded component"
+msgstr "thành phần nhúng"
+
+#: ../atk/atkobject.c:175
+msgid "entry"
+msgstr "mục nhập"
+
+#: ../atk/atkobject.c:176
+msgid "chart"
+msgstr "sơ đồ"
+
+#: ../atk/atkobject.c:177
+msgid "caption"
+msgstr "tiêu đề"
+
+#: ../atk/atkobject.c:178
+msgid "document frame"
+msgstr "khung tài liệu"
+
+#: ../atk/atkobject.c:179
+msgid "heading"
+msgstr "tiêu đề"
+
+#: ../atk/atkobject.c:180
+msgid "page"
+msgstr "trang"
+
+#: ../atk/atkobject.c:181
+msgid "section"
+msgstr "phần"
+
+#: ../atk/atkobject.c:182
+msgid "redundant object"
+msgstr "đối tượng thừa"
+
+#: ../atk/atkobject.c:183
+msgid "form"
+msgstr "mẫu"
+
+#: ../atk/atkobject.c:184
+msgid "link"
+msgstr "liên kết"
+
+#: ../atk/atkobject.c:185
+msgid "input method window"
+msgstr "cửa sổ cách gõ"
+
+#: ../atk/atkobject.c:186
+msgid "table row"
+msgstr "hàng bảng"
+
+#: ../atk/atkobject.c:187
+msgid "tree item"
+msgstr "nút cây"
+
+#: ../atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "bảng tính tài liệu"
+
+#: ../atk/atkobject.c:189
+msgid "document presentation"
+msgstr "trình diễn tài liệu"
+
+#: ../atk/atkobject.c:190
+msgid "document text"
+msgstr "văn bản tài liệu"
+
+#: ../atk/atkobject.c:191
+msgid "document web"
+msgstr "web tài liệu"
+
+#: ../atk/atkobject.c:192
+msgid "document email"
+msgstr "thư tài liệu"
+
+#: ../atk/atkobject.c:193
+msgid "comment"
+msgstr "bình luận"
+
+#: ../atk/atkobject.c:194
+msgid "list box"
+msgstr "ô danh sách"
+
+#: ../atk/atkobject.c:195
+msgid "grouping"
+msgstr "nhóm"
+
+#: ../atk/atkobject.c:196
+msgid "image map"
+msgstr "bản đồ ảnh"
+
+#: ../atk/atkobject.c:197
+msgid "notification"
+msgstr "thông báo"
+
+#: ../atk/atkobject.c:198
+msgid "info bar"
+msgstr "thanh thông tin"
+
+#: ../atk/atkobject.c:199
+msgid "level bar"
+msgstr "thanh mức"
+
+#: ../atk/atkobject.c:200
+msgid "title bar"
+msgstr "thanh tiêu đề"
+
+#: ../atk/atkobject.c:201
+msgid "block quote"
+msgstr "khối trích dẫn"
+
+#: ../atk/atkobject.c:202
+msgid "audio"
+msgstr "âm thanh"
+
+#: ../atk/atkobject.c:203
+msgid "video"
+msgstr "phim"
+
+#: ../atk/atkobject.c:204
+msgid "definition"
+msgstr "định nghĩa"
+
+#: ../atk/atkobject.c:205
+msgid "article"
+msgstr "bài viết"
+
+#: ../atk/atkobject.c:206
+msgid "landmark"
+msgstr "mốc"
+
+#: ../atk/atkobject.c:207
+msgid "log"
+msgstr "nhật ký"
+
+#: ../atk/atkobject.c:208
+msgid "marquee"
+msgstr "màn che"
+
+#: ../atk/atkobject.c:209
+msgid "math"
+msgstr "toán"
+
+#: ../atk/atkobject.c:210
+msgid "rating"
+msgstr "đánh giá"
+
+#: ../atk/atkobject.c:211
+msgid "timer"
+msgstr "bộ định giờ"
+
+#: ../atk/atkobject.c:212
+msgid "description list"
+msgstr "danh sách mô tả"
+
+#: ../atk/atkobject.c:213
+msgid "description term"
+msgstr "điều khoản mô tả"
+
+#: ../atk/atkobject.c:214
+msgid "description value"
+msgstr "giá trị mô tả"
+
+#: ../atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "Tên truy cập được"
+
+#: ../atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+"Tên của thể hiện đối tượng được định dạng cho truy cập kĩ thuật để giúp đỡ"
+
+#: ../atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "Mô tả truy cập được"
+
+#: ../atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Mô tả của đối tượng được định dạng cho truy cập kĩ thuật để giúp đỡ"
+
+#: ../atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "Cấp trên truy cập được"
+
+#: ../atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "Cha của bộ tiếp cận hiện tại được trả về bởi atk_object_get_parent()"
+
+#: ../atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "Giá trị truy cập được"
+
+#: ../atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "Dùng để thông báo giá trị đã thay đổi"
+
+#: ../atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "Vai trò truy cập được"
+
+#: ../atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "Vai trò có khả năng truy cập của đối tượng này"
+
+#: ../atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "Lớp truy cập được"
+
+#: ../atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "Lớp có khả năng truy cập của đối tượng"
+
+#: ../atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "Giá trị MDI truy cập được"
+
+#: ../atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "Giá trị MDI có khả năng truy cập của đối tượng này"
+
+#: ../atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "Tiêu đề bảng truy cập được"
+
+#: ../atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Dùng để thông báo tiêu đề bảng đã thay đổi; không dùng thuộc tính này mà nên "
+"dùng accessible-table-caption-object (đối tượng tiêu đề bảng truy cập được)"
+
+#: ../atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "Tiêu đề cột bảng truy cập được"
+
+#: ../atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "Dùng để thông báo tiêu đề cột bảng đã thay đổi."
+
+#: ../atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "Mô tả cột bảng truy cập được"
+
+#: ../atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "Dùng để thông báo mô tả cột bảng đã thay đổi"
+
+#: ../atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "Tên hàng bảng truy cập được"
+
+#: ../atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "Dùng để thông báo tên hàng trong bảng đã thay đổi."
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "Mô tả hàng bảng truy cập được"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "Dùng để thông báo mô tả hàng bảng đã thay đổi"
+
+#: ../atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "Tóm tắt bảng truy cập được"
+
+#: ../atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "Dùng để thông báo tóm tắt bảng đã thay đổi"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "Đối tượng tiêu đề bảng truy cập được"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "Dùng để thông báo tiêu đề bảng đã thay đổi"
+
+#: ../atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "Số liên kết siêu văn bản truy cập được"
+
+#: ../atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Tổng số liên kết thuộc về AtkHypertext hiện tại"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:194
+msgid "very weak"
+msgstr "rất yếu"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:201
+msgid "weak"
+msgstr "yếu"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "chấp nhận được"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:215
+msgid "strong"
+msgstr "mạnh"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: ../atk/atkvalue.c:222
+msgid "very strong"
+msgstr "rất mạnh"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:230
+msgid "very low"
+msgstr "rất thấp"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:238
+msgid "medium"
+msgstr "trung bình"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:246
+msgid "high"
+msgstr "cao"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:254
+msgid "very high"
+msgstr "rất cao"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:262
+msgid "very bad"
+msgstr "rất tệ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:270
+msgid "bad"
+msgstr "tệ"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:278
+msgid "good"
+msgstr "tốt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:286
+msgid "very good"
+msgstr "rất tốt"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: ../atk/atkvalue.c:294
+msgid "best"
+msgstr "cực kỳ tốt"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "Dùng để thông báo cấp trên đã thay đổi"
diff --git a/po/wa.po b/po/wa.po
new file mode 100644 (file)
index 0000000..3dda80c
--- /dev/null
+++ b/po/wa.po
@@ -0,0 +1,526 @@
+# translation of atk.HEAD.po to Walloon
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Pablo Saratxaga <pablo@walon.org>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2005-11-21 19:45+0100\n"
+"Last-Translator: Pablo Saratxaga <pablo@walon.org>\n"
+"Language-Team: Walloon <linux-wa@walon.org>\n"
+"Language: wa\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Loyén di tchoezi"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Fén d' l' indecse"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Li fén d' l' indecse di l' objet AtkHyperlink"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Comince di l' indecse"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Li cmince di l' indecse di l' objet AtkHyperlink"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "nén valide"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "etikete do-rascourti"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "abranle"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "animåcion"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "fletche"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "calindrî"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr ""
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "boesse a clitchî"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "elemint d' menu avou boesse a clitchî"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "tchoezixheu di coleurs"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "tiestire di colone"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr ""
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr ""
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "imådjete sol sicribanne"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr ""
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr ""
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "purnea di kesse"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr ""
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr ""
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "tchoezixheu di fitchîs"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr ""
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "tchoezixheu di fontes"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr ""
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr ""
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr ""
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "imådjete"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "imådje"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr ""
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "etikete"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr ""
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "djivêye"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "elemint d' djivêye"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "menu"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "bår di menu"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "elemint d' menu"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr ""
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "linwete"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "djivêye di linwetes"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr ""
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "tecse po scret"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "aspitant menu"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "bår d' avançmint"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "boton a tchôkî"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "boton radio"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "elemint d' menu avou boton radio"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "mwaisse panea"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "tiestire di roye"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "bår d' acinseur"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr ""
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "separateu"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr ""
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr ""
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr ""
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "bår d' estat"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "tåvlea"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "celule di tåvlea"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "tiestire di colone di tåvlea"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "tiestire di roye di tåvlea"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "elemint d' menu distaetchåve"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "terminå"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "tecse"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr ""
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "bår ås usteyes"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "racsegne"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "åbe"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "tåvlea èn åbe"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "nén cnoxhou"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "purnea"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "tiestire"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "pînote"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "hagnon"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "abranle"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "programe"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "bår d' aspougnaedje"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "ravalé componint"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+msgid "chart"
+msgstr ""
+
+#: atk/atkobject.c:154
+msgid "caption"
+msgstr ""
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:156
+msgid "heading"
+msgstr "tiestire"
+
+#: atk/atkobject.c:157
+msgid "page"
+msgstr "pådje"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "pînote"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr "Est eployî po notifyî ki l' rascourti do tåvlea a candjî"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Est eployî po notifyî ki l' tecse do tåvlea a candjî"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Li nombe di loyén k' a l' AtkHypertext do moumint"
diff --git a/po/xh.po b/po/xh.po
new file mode 100644 (file)
index 0000000..a5e901d
--- /dev/null
+++ b/po/xh.po
@@ -0,0 +1,541 @@
+# Xhosa translation of atk
+# Copyright (C) 2005 Canonical Ltd.
+# This file is distributed under the same license as the atk package.
+# Translation by Canonical Ltd <translations@canonical.com> with thanks to
+# Translation World CC in South Africa, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: atk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2005-02-17 10:54+0200\n"
+"Last-Translator: Canonical Ltd <translations@canonical.com>\n"
+"Language-Team: Xhosa <xh-translate@ubuntu.com>\n"
+"Language: xh\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Unxulumaniso olukhethiweyo"
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Icacisa ukuba ingaba umba we-AtkHyperlink ukhethiwe na"
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Inani lee-Ankile"
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Inani lee-ankile elinxulunyaniswa nelungu le-AtkHyperlink"
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Phelisa isalathiso"
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Isiphelo sesalathiso somba we-AtkHyperlink"
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Qalisa isalathiso"
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Isalathiso sokuqalisa somba we-AtkHyperlink"
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "ayisebenzi"
+
+#: atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ileyibhile yesinqumlisi"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "isiqaphelisi"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "oopopayi"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "isalathisi"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "ikhalenda"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "i-canvas yokuzobela"
+
+#: atk/atkobject.c:81
+msgid "check box"
+msgstr "uphawu olufakwa ebhokisini"
+
+#: atk/atkobject.c:82
+msgid "check menu item"
+msgstr "okukhethwa kwimenyu yokuqinisekisa"
+
+#: atk/atkobject.c:83
+msgid "color chooser"
+msgstr "isikhethi sombala"
+
+#: atk/atkobject.c:84
+msgid "column header"
+msgstr "okubhalwa emantla oluhlu"
+
+#: atk/atkobject.c:85
+msgid "combo box"
+msgstr "ibhokisi enoludwe ekunokukhethwa kulo"
+
+#: atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "umhleli weentsuku"
+
+#: atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "umfanekiso ongumqondiso kwi-desktop"
+
+#: atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "isakhelo se-desktop"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "nxibelelana"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "ingxoxo"
+
+#: atk/atkobject.c:91
+msgid "directory pane"
+msgstr "isahlulo sefestile kavimba weefayili"
+
+#: atk/atkobject.c:92
+msgid "drawing area"
+msgstr "indawo yokuzoba"
+
+#: atk/atkobject.c:93
+msgid "file chooser"
+msgstr "umkhethi weefayili"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "umgcini weefayili"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "umkhethi wefonti"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "isakhelo"
+
+#: atk/atkobject.c:98
+msgid "glass pane"
+msgstr "isahlulo sefestile yeglasi"
+
+#: atk/atkobject.c:99
+msgid "html container"
+msgstr "isiqulathi se-html"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "umfanekiso ongumqondiso"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "umfanekiso"
+
+#: atk/atkobject.c:102
+msgid "internal frame"
+msgstr "isakhelo sangaphakathi"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "ileyibhile"
+
+#: atk/atkobject.c:104
+msgid "layered pane"
+msgstr "isahlulo sefestile esinomaleko"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "uludwe"
+
+#: atk/atkobject.c:106
+msgid "list item"
+msgstr "okukhethwa kuludwe"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "imenyu"
+
+#: atk/atkobject.c:108
+msgid "menu bar"
+msgstr "umgca wemenyu"
+
+#: atk/atkobject.c:109
+msgid "menu item"
+msgstr "okukhethwa kwimenyu"
+
+#: atk/atkobject.c:110
+msgid "option pane"
+msgstr "okukhethwa kuludwe"
+
+#: atk/atkobject.c:111
+msgid "page tab"
+msgstr "i-tab yephepha"
+
+#: atk/atkobject.c:112
+msgid "page tab list"
+msgstr "uludwe lwe-tab yephepha"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "indawo yolawulo"
+
+#: atk/atkobject.c:114
+msgid "password text"
+msgstr "umbhalo we-password"
+
+#: atk/atkobject.c:115
+msgid "popup menu"
+msgstr "imenyu yokukhetha okuvelayo"
+
+#: atk/atkobject.c:116
+msgid "progress bar"
+msgstr "umgca wenkqubela"
+
+#: atk/atkobject.c:117
+msgid "push button"
+msgstr "iqhosha elicinezelwayo"
+
+#: atk/atkobject.c:118
+msgid "radio button"
+msgstr "iqhosha lokukhetha"
+
+#: atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "okukhethwa kwimenyu ye-radio"
+
+#: atk/atkobject.c:120
+msgid "root pane"
+msgstr "umva weskrini"
+
+#: atk/atkobject.c:121
+msgid "row header"
+msgstr "okubhalwe emantla omgca"
+
+#: atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "umgca wokuhlisa usenyusa"
+
+#: atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "ifestile yokuhlisa usenyusa"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "isahluli"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "islayida"
+
+#: atk/atkobject.c:126
+msgid "split pane"
+msgstr "ifestile yokwahlukanisa"
+
+#: atk/atkobject.c:127
+msgid "spin button"
+msgstr "iqhosa lokujikelezisa"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "umgca wobume"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "itheyibhile"
+
+#: atk/atkobject.c:130
+msgid "table cell"
+msgstr "iseli yetheyibhile"
+
+#: atk/atkobject.c:131
+msgid "table column header"
+msgstr "okubhalwa emantla oluhlu lwetheyibhile"
+
+#: atk/atkobject.c:132
+msgid "table row header"
+msgstr "okubhalwa emantla omgca wetheyibhile"
+
+#: atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr "susa okukhethwa kwimenyu"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "i-terminal"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "umbhalo"
+
+#: atk/atkobject.c:136
+msgid "toggle button"
+msgstr "iqhosha le-toggle"
+
+#: atk/atkobject.c:137
+msgid "tool bar"
+msgstr "umgca wezixhobo"
+
+#: atk/atkobject.c:138
+msgid "tool tip"
+msgstr "inkcazelo yesixhobo"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "imo-mthi"
+
+#: atk/atkobject.c:140
+msgid "tree table"
+msgstr "itheyibhile yenkcazelo"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "ayaziwa"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "ikroba lokubuka"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "ifestile"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "okubhalwa emantla ephepha"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "okubhalwa emazantsi ephepha"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "umhlathi"
+
+#: atk/atkobject.c:147
+#, fuzzy
+msgid "ruler"
+msgstr "isiqaphelisi"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "inkqubo yekhompyutha"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "igqibezela ngokwayo"
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr "umgca wokuhlela"
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr "inxalenye eqhotyoshelweyo"
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "isiqaphelisi"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "inkqubo yekhompyutha"
+
+#: atk/atkobject.c:155
+#, fuzzy
+msgid "document frame"
+msgstr "isakhelo se-desktop"
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "okubhalwa emantla ephepha"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "umfanekiso"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "isakhelo"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Igama eliFikelelekayo"
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "Igama leenkcukacha zomba elilungiselelwe ubugcisa obuncedisayo"
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Inkcazelo eFikelelekayo"
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "Inkcazelo ngomba, ilungiselelwe ubugcisa obuncedisayo"
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Unozala oFikelelekayo"
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Isetyenziselwa ukwazisa ukuba unozala utshintsile"
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Ixabiso eliFikelelekayo"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Isetyenziselwa ukwazisa ukuba ixabiso litshintshile"
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Indima eFikelelekayo"
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Indima efikelelekayo yalo mba"
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Umaleko ofikelelekayo"
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Umaleko ofikelelekayo walo mba"
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Ixabiso elifikelelekayo le-MDI"
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Ixabiso elifikelelekayo le-MDI yalo mba"
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Inkcazelo yeTheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"Isetyenziselwa ukwazisa ukuba inkcazelo yetheyibhile itshintshile; olu phawu "
+"malungasetyenziswa. Kodwa makusetyenziswe accessible-table-caption-object"
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr "Okubhalwa kuLuhlu lweTheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+"Isetyenziselwa ukwazisa ukuba okubhalwa emantla oluhlu lwetheyibhile "
+"kutshintshile"
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr "Inkcazelo yoLuhlu lweTheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+"Isetyenziselwa ukwazisa ukuba inkcazelo yoluhlu lwetheyibhile itshintshile"
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr "Okubhalwa kuMgca weTheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+"Isetyenziselwa ukwazisa ukuba okubhalwa emantla omgca wetheyibhile "
+"kutshintshile"
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr "Inkcazelo yoMgca weTheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+"Isetyenziselwa ukwazisa ukuba inkcazelo yomgca wetheyibhile itshintshile"
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr "Isishwankathelo Setheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+"Isetyenziselwa ukwazisa ukuba isishwankathelo setheyibhile sitshintshile"
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr "Umba weNkcazelo yeTheyibhile eFikelelekayo"
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Isetyenziselwa ukwazisa ukuba inkcazelo yetheyibhile itshintshile"
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr "Inani leziNxulumanisi eziFikelelekayo zeHypertext"
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr "Inani lezinxulumanisi ezikwi-AtkHypertext yangoku"
diff --git a/po/yi.po b/po/yi.po
new file mode 100644 (file)
index 0000000..d4556c4
--- /dev/null
+++ b/po/yi.po
@@ -0,0 +1,572 @@
+# atk.gnome-2-2
+# Yiddish version
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Raphael Finkel <raphael@cs.uky.edu>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-21 15:05+0800\n"
+"PO-Revision-Date: 2003-03-19\n"
+"Last-Translator: Raphael Finkel <raphael@cs.uky.edu>\n"
+"Language-Team: Yiddish <raphael@cs.uky.edu>\n"
+"Language: yi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr ""
+
+#: atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr ""
+
+#: atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr ""
+
+#: atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:119
+msgid "End index"
+msgstr ""
+
+#: atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr ""
+
+#: atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr ""
+
+#: atk/atkobject.c:74
+msgid "invalid"
+msgstr "אומלעקסיק"
+
+#: atk/atkobject.c:75
+#, fuzzy
+msgid "accelerator label"
+msgstr "פֿאַרגיכערער עטיקעט"
+
+#: atk/atkobject.c:76
+msgid "alert"
+msgstr "היט זיך"
+
+#: atk/atkobject.c:77
+msgid "animation"
+msgstr "אַנימאַציע"
+
+#: atk/atkobject.c:78
+msgid "arrow"
+msgstr "פֿײַל"
+
+#: atk/atkobject.c:79
+msgid "calendar"
+msgstr "לוח"
+
+#: atk/atkobject.c:80
+msgid "canvas"
+msgstr "לײַװנט"
+
+#: atk/atkobject.c:81
+#, fuzzy
+msgid "check box"
+msgstr "פֿײגעלע־קעסטל"
+
+#: atk/atkobject.c:82
+#, fuzzy
+msgid "check menu item"
+msgstr "פֿײגעלע־מעניו אײנס"
+
+#: atk/atkobject.c:83
+#, fuzzy
+msgid "color chooser"
+msgstr "פֿאַרבקלײַבער"
+
+#: atk/atkobject.c:84
+#, fuzzy
+msgid "column header"
+msgstr "זײַל קאָפּ־צעטל"
+
+#: atk/atkobject.c:85
+#, fuzzy
+msgid "combo box"
+msgstr "קאָמבאָניר־קעסטל"
+
+#: atk/atkobject.c:86
+#, fuzzy
+msgid "dateeditor"
+msgstr "טאָג־רעדאַגירער"
+
+#: atk/atkobject.c:87
+#, fuzzy
+msgid "desktop icon"
+msgstr "עקראַנפֿלאַך בילדל"
+
+#: atk/atkobject.c:88
+#, fuzzy
+msgid "desktop frame"
+msgstr "עקראַנפֿלאַך ראָם"
+
+#: atk/atkobject.c:89
+msgid "dial"
+msgstr "זײגער־פּנים"
+
+#: atk/atkobject.c:90
+msgid "dialog"
+msgstr "דיִאַלאָג"
+
+#: atk/atkobject.c:91
+#, fuzzy
+msgid "directory pane"
+msgstr "פּאַפּקע־רשימה טאַפֿליע"
+
+#: atk/atkobject.c:92
+#, fuzzy
+msgid "drawing area"
+msgstr "צײכן־שטח"
+
+#: atk/atkobject.c:93
+#, fuzzy
+msgid "file chooser"
+msgstr "טעקע סעלעקטירער"
+
+#: atk/atkobject.c:94
+msgid "filler"
+msgstr "אײַנפֿיל"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:96
+#, fuzzy
+msgid "fontchooser"
+msgstr "שריפֿט סעלעקטירער"
+
+#: atk/atkobject.c:97
+msgid "frame"
+msgstr "ראָם"
+
+#: atk/atkobject.c:98
+#, fuzzy
+msgid "glass pane"
+msgstr "גלעזערנע טאַפֿליע"
+
+#: atk/atkobject.c:99
+#, fuzzy
+msgid "html container"
+msgstr "HTML קאַסטן"
+
+#: atk/atkobject.c:100
+msgid "icon"
+msgstr "בילדל"
+
+#: atk/atkobject.c:101
+msgid "image"
+msgstr "בילד"
+
+#: atk/atkobject.c:102
+#, fuzzy
+msgid "internal frame"
+msgstr "אינערלעכע ראָם"
+
+#: atk/atkobject.c:103
+msgid "label"
+msgstr "עטיקעט"
+
+#: atk/atkobject.c:104
+#, fuzzy
+msgid "layered pane"
+msgstr "שיכטטאַפֿליע"
+
+#: atk/atkobject.c:105
+msgid "list"
+msgstr "רשימה"
+
+#: atk/atkobject.c:106
+#, fuzzy
+msgid "list item"
+msgstr "רשימה אײנס"
+
+#: atk/atkobject.c:107
+msgid "menu"
+msgstr "מעניו"
+
+#: atk/atkobject.c:108
+#, fuzzy
+msgid "menu bar"
+msgstr "מעניו־װירע"
+
+#: atk/atkobject.c:109
+#, fuzzy
+msgid "menu item"
+msgstr "מעניו־אײנס"
+
+#: atk/atkobject.c:110
+#, fuzzy
+msgid "option pane"
+msgstr "אָפּציע טאַפֿליע"
+
+#: atk/atkobject.c:111
+#, fuzzy
+msgid "page tab"
+msgstr "זײַטהענטל"
+
+#: atk/atkobject.c:112
+#, fuzzy
+msgid "page tab list"
+msgstr "זײַטהענטל רשימה"
+
+#: atk/atkobject.c:113
+msgid "panel"
+msgstr "טאַפֿליע"
+
+#: atk/atkobject.c:114
+#, fuzzy
+msgid "password text"
+msgstr "שפּריכװאָרט־טעקסט"
+
+#: atk/atkobject.c:115
+#, fuzzy
+msgid "popup menu"
+msgstr "ױפֿשפּרינג־מעניו"
+
+#: atk/atkobject.c:116
+#, fuzzy
+msgid "progress bar"
+msgstr "פּראָגרעס־װירע"
+
+#: atk/atkobject.c:117
+#, fuzzy
+msgid "push button"
+msgstr "דרוקקנעפּל"
+
+#: atk/atkobject.c:118
+#, fuzzy
+msgid "radio button"
+msgstr "ראַדיאָ־קנעפּל"
+
+#: atk/atkobject.c:119
+#, fuzzy
+msgid "radio menu item"
+msgstr "ראַדיאָ־מעניו אײנס"
+
+#: atk/atkobject.c:120
+#, fuzzy
+msgid "root pane"
+msgstr "װאָרצל־טאַפֿליע"
+
+#: atk/atkobject.c:121
+#, fuzzy
+msgid "row header"
+msgstr "שורה קאָפּ־צעטל"
+
+#: atk/atkobject.c:122
+#, fuzzy
+msgid "scroll bar"
+msgstr "דורכבלעטערער"
+
+#: atk/atkobject.c:123
+#, fuzzy
+msgid "scroll pane"
+msgstr "דורכבלעטער־טאַפֿליע"
+
+#: atk/atkobject.c:124
+msgid "separator"
+msgstr "צעשײדער"
+
+#: atk/atkobject.c:125
+msgid "slider"
+msgstr "גליטשער"
+
+#: atk/atkobject.c:126
+#, fuzzy
+msgid "split pane"
+msgstr "צעשפּאַלטענע טאַפֿליע"
+
+#: atk/atkobject.c:127
+#, fuzzy
+msgid "spin button"
+msgstr "דרײקנעפּל"
+
+#: atk/atkobject.c:128
+msgid "statusbar"
+msgstr "סטאַטוסװירע"
+
+#: atk/atkobject.c:129
+msgid "table"
+msgstr "טאַבעלע"
+
+#: atk/atkobject.c:130
+#, fuzzy
+msgid "table cell"
+msgstr "טאַבעלע צעל"
+
+#: atk/atkobject.c:131
+#, fuzzy
+msgid "table column header"
+msgstr "טאַבעלע זײַל קאָפּ־צעטל"
+
+#: atk/atkobject.c:132
+#, fuzzy
+msgid "table row header"
+msgstr "טאַבעלע שורה קאָפּ־צעטל"
+
+#: atk/atkobject.c:133
+#, fuzzy
+msgid "tear off menu item"
+msgstr "אָפּרײַסעװדיק מעניו־אײנס"
+
+#: atk/atkobject.c:134
+msgid "terminal"
+msgstr "טערמינאַל"
+
+#: atk/atkobject.c:135
+msgid "text"
+msgstr "טעקסט"
+
+#: atk/atkobject.c:136
+#, fuzzy
+msgid "toggle button"
+msgstr "פֿאַרקער־קנעפּל"
+
+#: atk/atkobject.c:137
+#, fuzzy
+msgid "tool bar"
+msgstr "מכשיר װײַזער"
+
+#: atk/atkobject.c:138
+#, fuzzy
+msgid "tool tip"
+msgstr "מכשיר פּינטל"
+
+#: atk/atkobject.c:139
+msgid "tree"
+msgstr "בױם"
+
+#: atk/atkobject.c:140
+#, fuzzy
+msgid "tree table"
+msgstr "בױם־טאַבעלע"
+
+#: atk/atkobject.c:141
+msgid "unknown"
+msgstr "אומבאַקאַנט"
+
+#: atk/atkobject.c:142
+msgid "viewport"
+msgstr "געשטאַלט־פֿענצטער"
+
+#: atk/atkobject.c:143
+msgid "window"
+msgstr "פֿענצטער"
+
+#: atk/atkobject.c:144
+msgid "header"
+msgstr "קאָפּצעטל"
+
+#: atk/atkobject.c:145
+msgid "footer"
+msgstr "פֿוסצעטל"
+
+#: atk/atkobject.c:146
+msgid "paragraph"
+msgstr "פּאַראַגראַף"
+
+#: atk/atkobject.c:147
+msgid "ruler"
+msgstr "װירע"
+
+#: atk/atkobject.c:148
+msgid "application"
+msgstr "אַפּליקאַציע"
+
+#: atk/atkobject.c:149
+msgid "autocomplete"
+msgstr ""
+
+#: atk/atkobject.c:150
+msgid "edit bar"
+msgstr ""
+
+#: atk/atkobject.c:151
+msgid "embedded component"
+msgstr ""
+
+#: atk/atkobject.c:152
+msgid "entry"
+msgstr ""
+
+#: atk/atkobject.c:153
+#, fuzzy
+msgid "chart"
+msgstr "היט זיך"
+
+#: atk/atkobject.c:154
+#, fuzzy
+msgid "caption"
+msgstr "אַפּליקאַציע"
+
+#: atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: atk/atkobject.c:156
+#, fuzzy
+msgid "heading"
+msgstr "קאָפּצעטל"
+
+#: atk/atkobject.c:157
+#, fuzzy
+msgid "page"
+msgstr "בילד"
+
+#: atk/atkobject.c:158
+msgid "section"
+msgstr ""
+
+#: atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: atk/atkobject.c:160
+#, fuzzy
+msgid "form"
+msgstr "ראָם"
+
+#: atk/atkobject.c:161
+msgid "link"
+msgstr ""
+
+#: atk/atkobject.c:162
+msgid "input method window"
+msgstr ""
+
+#: atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr ""
+
+#: atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr ""
+
+#: atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr ""
+
+#: atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr ""
+
+#: atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr ""
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr ""
+
+#: atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr ""
+
+#: atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr ""
+
+#: atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr ""
+
+#: atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr ""
+
+#: atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr ""
+
+#: atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr ""
+
+#: atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr ""
+
+#: atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr ""
+
+#: atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
index 17f8fa1..6c98078 100644 (file)
@@ -1,3 +1,4 @@
+# #-#-#-#-#  zh_CN.po (at-spi2-core master)  #-#-#-#-#
 # Chinese (China) translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Aron Xu <aronxu@gnome.org>, 2011.
 # Sphinx Jiang <yishanj13@gmail.com>, 2014.
 #
-
+# #-#-#-#-#  zh_CN.po (ATK HEAD)  #-#-#-#-#
+# Simplified Chinese translation for atk.
+# Copyright (C) 2003 THE ATK'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the ATK package.
+#
+# Funda Wang <fundawang@en2china.com>, 2003.
+# Wang Xiaozhe <wangxz00@mails.tsinghua.edu.cn>, 2003.
+# QAed by Funda Wang <fundawang@linux.net.cn>, 2004.
+# Ray Wang <wanglei1123@gmail.com>, 2009.
+# YunQiang Su <wzssyqa@gmail.com>, 2011.
+# Tong Hui <tonghuix@gmail.com>, 2014.
+# Sphinx Jiang <yishanj13@gmail.com>, 2014.
+# lumingzh <lumingzh@qq.com>, 2022.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: at-spi2-core master\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
-"spi&keywords=I18N+L10N&component=general\n"
-"POT-Creation-Date: 2014-02-22 03:45+0000\n"
-"PO-Revision-Date: 2014-02-23 19:00+0800\n"
-"Last-Translator: Sphinx Jiang <yishanj13@gmail.com>\n"
-"Language-Team: Chinese Simplified <i18n-zh@googlegroups.com>\n"
+"Project-Id-Version: ATK HEAD\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/at-spi2-core/issues\n"
+"POT-Creation-Date: 2022-07-25 14:47+0000\n"
+"PO-Revision-Date: 2022-09-11 07:55+0800\n"
+"Last-Translator: lumingzh <lumingzh@qq.com>\n"
+"Language-Team: Chinese - China <i18n-zh@googlegroups.com>\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"#-#-#-#-#  zh_CN.po (at-spi2-core master)  #-#-#-#-#\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"X-Generator: Gtranslator 42.0\n"
+"#-#-#-#-#  zh_CN.po (ATK HEAD)  #-#-#-#-#\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Lokalize 1.5\n"
 
-#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1036
-#: ../atspi/atspi-value.c:111
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "选中链接"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "指明 AtkHyperlink 对象是否已被选择"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "定位数量"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "同 AtkHyperlink 对象相关的定位数量"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "结束索引"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink 对象的结束索引"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "开始索引"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink 对象的开始索引"
+
+#: atk/atkobject.c:98
+msgid "invalid"
+msgstr "无效"
+
+#: atk/atkobject.c:99
+msgid "accelerator label"
+msgstr "加速标签"
+
+#: atk/atkobject.c:100
+msgid "alert"
+msgstr "警告"
+
+#: atk/atkobject.c:101
+msgid "animation"
+msgstr "动画"
+
+#: atk/atkobject.c:102
+msgid "arrow"
+msgstr "箭头"
+
+#: atk/atkobject.c:103
+msgid "calendar"
+msgstr "日历"
+
+#: atk/atkobject.c:104
+msgid "canvas"
+msgstr "画布"
+
+#: atk/atkobject.c:105
+msgid "check box"
+msgstr "复选框"
+
+#: atk/atkobject.c:106
+msgid "check menu item"
+msgstr "复选菜单项"
+
+#: atk/atkobject.c:107
+msgid "color chooser"
+msgstr "颜色选择器"
+
+#: atk/atkobject.c:108
+msgid "column header"
+msgstr "列头"
+
+#: atk/atkobject.c:109
+msgid "combo box"
+msgstr "组合框"
+
+#: atk/atkobject.c:110
+msgid "dateeditor"
+msgstr "日期编辑器"
+
+#: atk/atkobject.c:111
+msgid "desktop icon"
+msgstr "桌面图标"
+
+#: atk/atkobject.c:112
+msgid "desktop frame"
+msgstr "桌面框架"
+
+#: atk/atkobject.c:113
+msgid "dial"
+msgstr "拨号"
+
+#: atk/atkobject.c:114
+msgid "dialog"
+msgstr "对话框"
+
+#: atk/atkobject.c:115
+msgid "directory pane"
+msgstr "目录面板"
+
+#: atk/atkobject.c:116
+msgid "drawing area"
+msgstr "绘图区"
+
+#: atk/atkobject.c:117
+msgid "file chooser"
+msgstr "文件选择器"
+
+#: atk/atkobject.c:118
+msgid "filler"
+msgstr "填充器"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:120
+msgid "fontchooser"
+msgstr "字体选择器"
+
+#: atk/atkobject.c:121
+msgid "frame"
+msgstr "框架"
+
+#: atk/atkobject.c:122
+msgid "glass pane"
+msgstr "玻璃面板"
+
+#: atk/atkobject.c:123
+msgid "html container"
+msgstr "HTML 容器"
+
+#: atk/atkobject.c:124
+msgid "icon"
+msgstr "图标"
+
+#: atk/atkobject.c:125
+msgid "image"
+msgstr "图像"
+
+#: atk/atkobject.c:126
+msgid "internal frame"
+msgstr "内部框架"
+
+#: atk/atkobject.c:127
+msgid "label"
+msgstr "标签"
+
+#: atk/atkobject.c:128
+msgid "layered pane"
+msgstr "布局面板"
+
+#: atk/atkobject.c:129
+msgid "list"
+msgstr "列表"
+
+#: atk/atkobject.c:130
+msgid "list item"
+msgstr "列表项"
+
+#: atk/atkobject.c:131
+msgid "menu"
+msgstr "菜单"
+
+#: atk/atkobject.c:132
+msgid "menu bar"
+msgstr "菜单栏"
+
+#: atk/atkobject.c:133
+msgid "menu button"
+msgstr "菜单按钮"
+
+#: atk/atkobject.c:134
+msgid "menu item"
+msgstr "菜单项"
+
+#: atk/atkobject.c:135
+msgid "option pane"
+msgstr "选项面板"
+
+#: atk/atkobject.c:136
+msgid "page tab"
+msgstr "选项卡"
+
+#: atk/atkobject.c:137
+msgid "page tab list"
+msgstr "选项卡列表"
+
+#: atk/atkobject.c:138
+msgid "panel"
+msgstr "面板"
+
+#: atk/atkobject.c:139
+msgid "password text"
+msgstr "密码文本"
+
+#: atk/atkobject.c:140
+msgid "popup menu"
+msgstr "弹出菜单"
+
+#: atk/atkobject.c:141
+msgid "progress bar"
+msgstr "进度条"
+
+#: atk/atkobject.c:142
+msgid "push button"
+msgstr "按钮"
+
+#: atk/atkobject.c:143
+msgid "radio button"
+msgstr "单选钮"
+
+#: atk/atkobject.c:144
+msgid "radio menu item"
+msgstr "单选菜单项"
+
+#: atk/atkobject.c:145
+msgid "root pane"
+msgstr "根面板"
+
+#: atk/atkobject.c:146
+msgid "row header"
+msgstr "行头"
+
+#: atk/atkobject.c:147
+msgid "scroll bar"
+msgstr "滚动条"
+
+#: atk/atkobject.c:148
+msgid "scroll pane"
+msgstr "滚动面板"
+
+#: atk/atkobject.c:149
+msgid "separator"
+msgstr "分隔条"
+
+#: atk/atkobject.c:150
+msgid "slider"
+msgstr "滑块"
+
+#: atk/atkobject.c:151
+msgid "split pane"
+msgstr "拆分面板"
+
+#: atk/atkobject.c:152
+msgid "spin button"
+msgstr "微调钮"
+
+#: atk/atkobject.c:153
+msgid "statusbar"
+msgstr "状态栏"
+
+#: atk/atkobject.c:154
+msgid "table"
+msgstr "表格"
+
+#: atk/atkobject.c:155
+msgid "table cell"
+msgstr "表格单元"
+
+#: atk/atkobject.c:156
+msgid "table column header"
+msgstr "表格列头"
+
+#: atk/atkobject.c:157
+msgid "table row header"
+msgstr "表格行头"
+
+#: atk/atkobject.c:158
+msgid "tear off menu item"
+msgstr "可分离菜单项"
+
+#: atk/atkobject.c:159
+msgid "terminal"
+msgstr "终端"
+
+#: atk/atkobject.c:160
+msgid "text"
+msgstr "文本"
+
+#: atk/atkobject.c:161
+msgid "toggle button"
+msgstr "切换按钮"
+
+#: atk/atkobject.c:162
+msgid "tool bar"
+msgstr "工具栏"
+
+#: atk/atkobject.c:163
+msgid "tool tip"
+msgstr "工具提示"
+
+#: atk/atkobject.c:164
+msgid "tree"
+msgstr "树"
+
+#: atk/atkobject.c:165
+msgid "tree table"
+msgstr "树型表格"
+
+#: atk/atkobject.c:166
+msgid "unknown"
+msgstr "未知"
+
+#: atk/atkobject.c:167
+msgid "viewport"
+msgstr "视区"
+
+#: atk/atkobject.c:168
+msgid "window"
+msgstr "窗口"
+
+#: atk/atkobject.c:169
+msgid "header"
+msgstr "页眉"
+
+#: atk/atkobject.c:170
+msgid "footer"
+msgstr "页脚"
+
+#: atk/atkobject.c:171
+msgid "paragraph"
+msgstr "段落"
+
+#: atk/atkobject.c:172
+msgid "ruler"
+msgstr "标尺"
+
+#: atk/atkobject.c:173
+msgid "application"
+msgstr "应用程序"
+
+#: atk/atkobject.c:174
+msgid "autocomplete"
+msgstr "自动补全"
+
+#: atk/atkobject.c:175
+msgid "edit bar"
+msgstr "编辑栏"
+
+#: atk/atkobject.c:176
+msgid "embedded component"
+msgstr "嵌入组件"
+
+#: atk/atkobject.c:177
+msgid "entry"
+msgstr "输入"
+
+#: atk/atkobject.c:178
+msgid "chart"
+msgstr "图表"
+
+#: atk/atkobject.c:179
+msgid "caption"
+msgstr "题目"
+
+#: atk/atkobject.c:180
+msgid "document frame"
+msgstr "文档框架"
+
+#: atk/atkobject.c:181
+msgid "heading"
+msgstr "标题"
+
+#: atk/atkobject.c:182
+msgid "page"
+msgstr "页面"
+
+#: atk/atkobject.c:183
+msgid "section"
+msgstr "节"
+
+#: atk/atkobject.c:184
+msgid "redundant object"
+msgstr "冗余对象"
+
+#: atk/atkobject.c:185
+msgid "form"
+msgstr "窗体"
+
+#: atk/atkobject.c:186
+msgid "link"
+msgstr "链接"
+
+#: atk/atkobject.c:187
+msgid "input method window"
+msgstr "输入法窗口"
+
+#: atk/atkobject.c:188
+msgid "table row"
+msgstr "表格行"
+
+#: atk/atkobject.c:189
+msgid "tree item"
+msgstr "树条目"
+
+#: atk/atkobject.c:190
+msgid "document spreadsheet"
+msgstr "电子表格文档"
+
+#: atk/atkobject.c:191
+msgid "document presentation"
+msgstr "演示文档"
+
+#: atk/atkobject.c:192
+msgid "document text"
+msgstr "字处理文档"
+
+#: atk/atkobject.c:193
+msgid "document web"
+msgstr "网页文档"
+
+#: atk/atkobject.c:194
+msgid "document email"
+msgstr "电子邮件文档"
+
+#: atk/atkobject.c:195
+msgid "comment"
+msgstr "注释"
+
+#: atk/atkobject.c:196
+msgid "list box"
+msgstr "列表盒"
+
+#: atk/atkobject.c:197
+msgid "grouping"
+msgstr "分组"
+
+#: atk/atkobject.c:198
+msgid "image map"
+msgstr "位图"
+
+#: atk/atkobject.c:199
+msgid "notification"
+msgstr "通知"
+
+#: atk/atkobject.c:200
+msgid "info bar"
+msgstr "信息栏"
+
+#: atk/atkobject.c:201
+msgid "level bar"
+msgstr "级别栏"
+
+#: atk/atkobject.c:202
+msgid "title bar"
+msgstr "标题栏"
+
+#: atk/atkobject.c:203
+msgid "block quote"
+msgstr "块引用"
+
+#: atk/atkobject.c:204
+msgid "audio"
+msgstr "音频"
+
+#: atk/atkobject.c:205
+msgid "video"
+msgstr "视频"
+
+#: atk/atkobject.c:206
+msgid "definition"
+msgstr "定义"
+
+#: atk/atkobject.c:207
+msgid "article"
+msgstr "文章"
+
+#: atk/atkobject.c:208
+msgid "landmark"
+msgstr "界标"
+
+#: atk/atkobject.c:209
+msgid "log"
+msgstr "日志"
+
+#: atk/atkobject.c:210
+msgid "marquee"
+msgstr "选取框"
+
+#: atk/atkobject.c:211
+msgid "math"
+msgstr "数学"
+
+#: atk/atkobject.c:212
+msgid "rating"
+msgstr "评级"
+
+#: atk/atkobject.c:213
+msgid "timer"
+msgstr "定时器"
+
+#: atk/atkobject.c:214
+msgid "description list"
+msgstr "描述列表"
+
+#: atk/atkobject.c:215
+msgid "description term"
+msgstr "描述术语"
+
+#: atk/atkobject.c:216
+msgid "description value"
+msgstr "描述值"
+
+#: atk/atkobject.c:392
+msgid "Accessible Name"
+msgstr "容易理解的名称"
+
+#: atk/atkobject.c:393
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "为辅助技术识别而格式化的对象实例名"
+
+#: atk/atkobject.c:399
+msgid "Accessible Description"
+msgstr "容易理解的解释"
+
+#: atk/atkobject.c:400
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "一个对象的解释,为辅助技术识别而格式化"
+
+#: atk/atkobject.c:406
+msgid "Accessible Parent"
+msgstr "可访问的父控件"
+
+#: atk/atkobject.c:407
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "atk_object_get_parent() 所返回的当前可访问控件的父类"
+
+#: atk/atkobject.c:423
+msgid "Accessible Value"
+msgstr "可访问的值"
+
+#: atk/atkobject.c:424
+msgid "Is used to notify that the value has changed"
+msgstr "用来通知值已被改变"
+
+#: atk/atkobject.c:432
+msgid "Accessible Role"
+msgstr "可访问的角色"
+
+#: atk/atkobject.c:433
+msgid "The accessible role of this object"
+msgstr "此对象的可访问角色"
+
+#: atk/atkobject.c:440
+msgid "Accessible Layer"
+msgstr "可访问层"
+
+#: atk/atkobject.c:441
+msgid "The accessible layer of this object"
+msgstr "此对象的可访问层"
+
+#: atk/atkobject.c:449
+msgid "Accessible MDI Value"
+msgstr "可访问的MDI值"
+
+#: atk/atkobject.c:450
+msgid "The accessible MDI value of this object"
+msgstr "此对象的可访问的MDI值"
+
+#: atk/atkobject.c:466
+msgid "Accessible Table Caption"
+msgstr "可访问的表格标题"
+
+#: atk/atkobject.c:467
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"用来通知表格标题已被改变;不应使用此属性。请用 accessible-table-caption-"
+"object 代替"
+
+#: atk/atkobject.c:481
+msgid "Accessible Table Column Header"
+msgstr "可访问的表格列头"
+
+#: atk/atkobject.c:482
+msgid "Is used to notify that the table column header has changed"
+msgstr "用来通知表格列头已被改变"
+
+#: atk/atkobject.c:497
+msgid "Accessible Table Column Description"
+msgstr "可访问的表格列描述"
+
+#: atk/atkobject.c:498
+msgid "Is used to notify that the table column description has changed"
+msgstr "用来通知表格列描述已被改变"
+
+#: atk/atkobject.c:513
+msgid "Accessible Table Row Header"
+msgstr "可访问的表格行头"
+
+#: atk/atkobject.c:514
+msgid "Is used to notify that the table row header has changed"
+msgstr "用来通知表格行头已被改变"
+
+#: atk/atkobject.c:528
+msgid "Accessible Table Row Description"
+msgstr "可访问的表格行描述"
+
+#: atk/atkobject.c:529
+msgid "Is used to notify that the table row description has changed"
+msgstr "用来通知表格行描述已被改变"
+
+#: atk/atkobject.c:535
+msgid "Accessible Table Summary"
+msgstr "可访问的表格摘要"
+
+#: atk/atkobject.c:536
+msgid "Is used to notify that the table summary has changed"
+msgstr "用来通知表格摘要已被改变"
+
+#: atk/atkobject.c:542
+msgid "Accessible Table Caption Object"
+msgstr "可访问的表格标题对象"
+
+#: atk/atkobject.c:543
+msgid "Is used to notify that the table caption has changed"
+msgstr "用来通知表格标题已被改变"
+
+#: atk/atkobject.c:549
+msgid "Number of Accessible Hypertext Links"
+msgstr "可访问的超文本链接数"
+
+#: atk/atkobject.c:550
+msgid "The number of links which the current AtkHypertext has"
+msgstr "当前 AtkHypertext 拥有的链接数"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "很弱"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "弱"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "可接受的"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "强"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "很强"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "很低"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "中等"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "高"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "很高"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "很差"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "差"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "好"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "很好"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "极好"
+
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1063 atspi/atspi-value.c:111
 msgid "The application no longer exists"
 msgstr "该应用程序已经不存在"
 
-#: ../atspi/atspi-misc.c:1779
-msgid "Attempted synchronous call where prohibited"
-msgstr "试图进行禁止的同步调用"
+#~ msgid "Attempted synchronous call where prohibited"
+#~ msgstr "试图进行禁止的同步调用"
 
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI:RemoveAccessible 使用了未知签名 %s"
@@ -91,3 +884,6 @@ msgstr "试图进行禁止的同步调用"
 
 #~ msgid "Got invalid signature %s for signal %s from interface %s\n"
 #~ msgstr "信号 %2$s 从接口%3$s 得到错误签名 %1$s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "用来通知父控件已被改变"
index 80e32a4..42d5465 100644 (file)
@@ -1,10 +1,19 @@
+# #-#-#-#-#  zh_HK.po (at-spi2-core 1.91.91)  #-#-#-#-#
 # Chinese (Hong Kong) translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2011.
 #
+# #-#-#-#-#  zh_HK.po (atk 2.1.0)  #-#-#-#-#
+# Chinese (Hong Kong) translation of atk.
+# Copyright (C) 2003-06 Free Software Foundation, Inc.
+# Abel Cheung <abel@oaka.org>, 2003.
+# Li-Jen Hsin <hsin@med.cgu.edu.tw>, 2004.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  zh_HK.po (at-spi2-core 1.91.91)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core 1.91.91\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +26,19 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.6.3\n"
+"#-#-#-#-#  zh_HK.po (atk 2.1.0)  #-#-#-#-#\n"
+"Project-Id-Version: atk 2.1.0\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2014-03-06 03:47+0000\n"
+"PO-Revision-Date: 2014-03-09 11:27+0800\n"
+"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
+"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
+"Language: zh_HK\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.3\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -27,6 +49,688 @@ msgstr "應用程式已不存在"
 msgid "Attempted synchronous call where prohibited"
 msgstr "在禁止處嘗試同步化"
 
+#: ../atk/atkhyperlink.c:128
+msgid "Selected Link"
+msgstr "選擇的連結"
+
+#: ../atk/atkhyperlink.c:129
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "顯示 AtkHyperlink 物件是否被選擇"
+
+#: ../atk/atkhyperlink.c:135
+msgid "Number of Anchors"
+msgstr "標定的數目"
+
+#: ../atk/atkhyperlink.c:136
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "與 AtkHyperlink 物件有關的標定數目"
+
+#: ../atk/atkhyperlink.c:144
+msgid "End index"
+msgstr "結尾索引"
+
+#: ../atk/atkhyperlink.c:145
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink 物件的結尾索引"
+
+#: ../atk/atkhyperlink.c:153
+msgid "Start index"
+msgstr "起點索引"
+
+#: ../atk/atkhyperlink.c:154
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink 物件的起點索引"
+
+#: ../atk/atkobject.c:105
+msgid "invalid"
+msgstr "無效"
+
+#: ../atk/atkobject.c:106
+msgid "accelerator label"
+msgstr "捷徑鍵標籤"
+
+#: ../atk/atkobject.c:107
+msgid "alert"
+msgstr "警示"
+
+#: ../atk/atkobject.c:108
+msgid "animation"
+msgstr "動畫"
+
+#: ../atk/atkobject.c:109
+msgid "arrow"
+msgstr "箭頭"
+
+#: ../atk/atkobject.c:110
+msgid "calendar"
+msgstr "月曆"
+
+#: ../atk/atkobject.c:111
+msgid "canvas"
+msgstr "畫布"
+
+#: ../atk/atkobject.c:112
+msgid "check box"
+msgstr "核取方塊"
+
+#: ../atk/atkobject.c:113
+msgid "check menu item"
+msgstr "核取選單項目"
+
+#: ../atk/atkobject.c:114
+msgid "color chooser"
+msgstr "顏色選擇元件"
+
+#: ../atk/atkobject.c:115
+msgid "column header"
+msgstr "欄位標頭"
+
+#: ../atk/atkobject.c:116
+msgid "combo box"
+msgstr "組合方塊"
+
+#: ../atk/atkobject.c:117
+msgid "dateeditor"
+msgstr "日期編輯器"
+
+#: ../atk/atkobject.c:118
+msgid "desktop icon"
+msgstr "桌面圖示"
+
+#: ../atk/atkobject.c:119
+msgid "desktop frame"
+msgstr "桌面框架"
+
+#: ../atk/atkobject.c:120
+msgid "dial"
+msgstr "設置值"
+
+#: ../atk/atkobject.c:121
+msgid "dialog"
+msgstr "對話盒"
+
+#: ../atk/atkobject.c:122
+msgid "directory pane"
+msgstr "目錄窗格"
+
+#: ../atk/atkobject.c:123
+msgid "drawing area"
+msgstr "繪圖區域"
+
+#: ../atk/atkobject.c:124
+msgid "file chooser"
+msgstr "檔案選擇元件"
+
+#: ../atk/atkobject.c:125
+msgid "filler"
+msgstr "填充元件"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:127
+msgid "fontchooser"
+msgstr "字型選擇元件"
+
+#: ../atk/atkobject.c:128
+msgid "frame"
+msgstr "框架"
+
+#: ../atk/atkobject.c:129
+msgid "glass pane"
+msgstr "頂層分格"
+
+#: ../atk/atkobject.c:130
+msgid "html container"
+msgstr "HTML 容器元件"
+
+#: ../atk/atkobject.c:131
+msgid "icon"
+msgstr "圖示"
+
+#: ../atk/atkobject.c:132
+msgid "image"
+msgstr "圖片"
+
+#: ../atk/atkobject.c:133
+msgid "internal frame"
+msgstr "內部框架"
+
+#: ../atk/atkobject.c:134
+msgid "label"
+msgstr "標籤"
+
+#: ../atk/atkobject.c:135
+msgid "layered pane"
+msgstr "多層分格"
+
+#: ../atk/atkobject.c:136
+msgid "list"
+msgstr "清單"
+
+#: ../atk/atkobject.c:137
+msgid "list item"
+msgstr "清單項目"
+
+#: ../atk/atkobject.c:138
+msgid "menu"
+msgstr "選單"
+
+#: ../atk/atkobject.c:139
+msgid "menu bar"
+msgstr "選單列"
+
+#: ../atk/atkobject.c:140
+msgid "menu item"
+msgstr "選單項目"
+
+#: ../atk/atkobject.c:141
+msgid "option pane"
+msgstr "選項窗格"
+
+#: ../atk/atkobject.c:142
+msgid "page tab"
+msgstr "分頁標籤"
+
+#: ../atk/atkobject.c:143
+msgid "page tab list"
+msgstr "分頁標籤清單"
+
+#: ../atk/atkobject.c:144
+msgid "panel"
+msgstr "面板"
+
+#: ../atk/atkobject.c:145
+msgid "password text"
+msgstr "密碼文字"
+
+#: ../atk/atkobject.c:146
+msgid "popup menu"
+msgstr "彈出式選單"
+
+#: ../atk/atkobject.c:147
+msgid "progress bar"
+msgstr "進度列"
+
+#: ../atk/atkobject.c:148
+msgid "push button"
+msgstr "按鈕"
+
+#: ../atk/atkobject.c:149
+msgid "radio button"
+msgstr "單選按鈕"
+
+#: ../atk/atkobject.c:150
+msgid "radio menu item"
+msgstr "單選選單項目"
+
+#: ../atk/atkobject.c:151
+msgid "root pane"
+msgstr "根窗格"
+
+#: ../atk/atkobject.c:152
+msgid "row header"
+msgstr "列標頭"
+
+#: ../atk/atkobject.c:153
+msgid "scroll bar"
+msgstr "捲動列"
+
+#: ../atk/atkobject.c:154
+msgid "scroll pane"
+msgstr "捲動分格"
+
+#: ../atk/atkobject.c:155
+msgid "separator"
+msgstr "分隔線"
+
+#: ../atk/atkobject.c:156
+msgid "slider"
+msgstr "滑動鈕"
+
+#: ../atk/atkobject.c:157
+msgid "split pane"
+msgstr "分割窗格"
+
+#: ../atk/atkobject.c:158
+msgid "spin button"
+msgstr "微調按鈕"
+
+#: ../atk/atkobject.c:159
+msgid "statusbar"
+msgstr "狀態列"
+
+#: ../atk/atkobject.c:160
+msgid "table"
+msgstr "表格"
+
+#: ../atk/atkobject.c:161
+msgid "table cell"
+msgstr "儲存格"
+
+#: ../atk/atkobject.c:162
+msgid "table column header"
+msgstr "表格直欄標頭"
+
+#: ../atk/atkobject.c:163
+msgid "table row header"
+msgstr "表格橫列標頭"
+
+#: ../atk/atkobject.c:164
+msgid "tear off menu item"
+msgstr "卸下選單項目"
+
+#: ../atk/atkobject.c:165
+msgid "terminal"
+msgstr "終端機"
+
+#: ../atk/atkobject.c:166
+msgid "text"
+msgstr "文字"
+
+#: ../atk/atkobject.c:167
+msgid "toggle button"
+msgstr "切換按鈕"
+
+#: ../atk/atkobject.c:168
+msgid "tool bar"
+msgstr "工具列"
+
+#: ../atk/atkobject.c:169
+msgid "tool tip"
+msgstr "工具提示"
+
+#: ../atk/atkobject.c:170
+msgid "tree"
+msgstr "樹狀資料元件"
+
+#: ../atk/atkobject.c:171
+msgid "tree table"
+msgstr "樹狀資料表格"
+
+#: ../atk/atkobject.c:172
+msgid "unknown"
+msgstr "不明"
+
+#: ../atk/atkobject.c:173
+msgid "viewport"
+msgstr "視埠"
+
+#: ../atk/atkobject.c:174
+msgid "window"
+msgstr "視窗"
+
+#: ../atk/atkobject.c:175
+msgid "header"
+msgstr "頁首"
+
+#: ../atk/atkobject.c:176
+msgid "footer"
+msgstr "頁尾"
+
+#: ../atk/atkobject.c:177
+msgid "paragraph"
+msgstr "段落"
+
+#: ../atk/atkobject.c:178
+msgid "ruler"
+msgstr "水平線"
+
+#: ../atk/atkobject.c:179
+msgid "application"
+msgstr "應用程式"
+
+#: ../atk/atkobject.c:180
+msgid "autocomplete"
+msgstr "自動完成"
+
+#: ../atk/atkobject.c:181
+msgid "edit bar"
+msgstr "編輯列"
+
+#: ../atk/atkobject.c:182
+msgid "embedded component"
+msgstr "內嵌組成元件"
+
+#: ../atk/atkobject.c:183
+msgid "entry"
+msgstr "項目"
+
+#: ../atk/atkobject.c:184
+msgid "chart"
+msgstr "圖表"
+
+#: ../atk/atkobject.c:185
+msgid "caption"
+msgstr "題目"
+
+#: ../atk/atkobject.c:186
+msgid "document frame"
+msgstr "文件框架"
+
+#: ../atk/atkobject.c:187
+msgid "heading"
+msgstr "標題"
+
+#: ../atk/atkobject.c:188
+msgid "page"
+msgstr "頁"
+
+#: ../atk/atkobject.c:189
+msgid "section"
+msgstr "節"
+
+#: ../atk/atkobject.c:190
+msgid "redundant object"
+msgstr "冗餘物件"
+
+#: ../atk/atkobject.c:191
+msgid "form"
+msgstr "表單"
+
+#: ../atk/atkobject.c:192
+msgid "link"
+msgstr "連結"
+
+#: ../atk/atkobject.c:193
+msgid "input method window"
+msgstr "輸入法視窗"
+
+#: ../atk/atkobject.c:194
+msgid "table row"
+msgstr "表格列"
+
+#: ../atk/atkobject.c:195
+msgid "tree item"
+msgstr "樹狀項目"
+
+#: ../atk/atkobject.c:196
+msgid "document spreadsheet"
+msgstr "文件試算表"
+
+#: ../atk/atkobject.c:197
+msgid "document presentation"
+msgstr "文件簡報"
+
+#: ../atk/atkobject.c:198
+msgid "document text"
+msgstr "文件文字"
+
+#: ../atk/atkobject.c:199
+msgid "document web"
+msgstr "文件網頁"
+
+#: ../atk/atkobject.c:200
+msgid "document email"
+msgstr "文件郵件"
+
+#: ../atk/atkobject.c:201
+msgid "comment"
+msgstr "註解"
+
+#: ../atk/atkobject.c:202
+msgid "list box"
+msgstr "清單方塊"
+
+#: ../atk/atkobject.c:203
+msgid "grouping"
+msgstr "羣組"
+
+#: ../atk/atkobject.c:204
+msgid "image map"
+msgstr "影像地圖"
+
+#: ../atk/atkobject.c:205
+msgid "notification"
+msgstr "通知"
+
+#: ../atk/atkobject.c:206
+msgid "info bar"
+msgstr "資訊列"
+
+#: ../atk/atkobject.c:207
+msgid "level bar"
+msgstr "等級列"
+
+#: ../atk/atkobject.c:208
+msgid "title bar"
+msgstr "標題列"
+
+#: ../atk/atkobject.c:209
+msgid "block quote"
+msgstr "引言區塊"
+
+#: ../atk/atkobject.c:210
+msgid "audio"
+msgstr "音效"
+
+#: ../atk/atkobject.c:211
+msgid "video"
+msgstr "影片"
+
+#: ../atk/atkobject.c:212
+msgid "definition"
+msgstr "定義"
+
+#: ../atk/atkobject.c:213
+msgid "article"
+msgstr "文章"
+
+#: ../atk/atkobject.c:214
+msgid "landmark"
+msgstr "地標"
+
+#: ../atk/atkobject.c:215
+msgid "log"
+msgstr "紀錄"
+
+#: ../atk/atkobject.c:216
+msgid "marquee"
+msgstr "跑馬燈"
+
+#: ../atk/atkobject.c:217
+msgid "math"
+msgstr "數學"
+
+#: ../atk/atkobject.c:218
+msgid "rating"
+msgstr "評等"
+
+#: ../atk/atkobject.c:219
+msgid "timer"
+msgstr "計時"
+
+#: ../atk/atkobject.c:220
+msgid "description list"
+msgstr "描述清單"
+
+#: ../atk/atkobject.c:221
+msgid "description term"
+msgstr "描述語詞"
+
+#: ../atk/atkobject.c:222
+msgid "description value"
+msgstr "描述數值"
+
+#: ../atk/atkobject.c:401
+msgid "Accessible Name"
+msgstr "輔助鍵名稱"
+
+#: ../atk/atkobject.c:402
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "已格式化的物件實體名稱,便於輔助技術存取"
+
+#: ../atk/atkobject.c:408
+msgid "Accessible Description"
+msgstr "輔助鍵描述"
+
+#: ../atk/atkobject.c:409
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "已格式化的物件描述,便於輔助技術存取"
+
+#: ../atk/atkobject.c:415
+msgid "Accessible Parent"
+msgstr "輔助鍵母元件"
+
+#: ../atk/atkobject.c:416
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "由 atk_object_get_parent() 傳回目前無障礙功能的上層"
+
+#: ../atk/atkobject.c:432
+msgid "Accessible Value"
+msgstr "輔助鍵設定值"
+
+#: ../atk/atkobject.c:433
+msgid "Is used to notify that the value has changed"
+msgstr "用來知會該設定值已有變動"
+
+#: ../atk/atkobject.c:441
+msgid "Accessible Role"
+msgstr "輔助鍵類型"
+
+#: ../atk/atkobject.c:442
+msgid "The accessible role of this object"
+msgstr "此物件的輔助鍵類型"
+
+#: ../atk/atkobject.c:450
+msgid "Accessible Layer"
+msgstr "輔助鍵層級"
+
+#: ../atk/atkobject.c:451
+msgid "The accessible layer of this object"
+msgstr "此物件的輔助鍵層級"
+
+#: ../atk/atkobject.c:459
+msgid "Accessible MDI Value"
+msgstr "輔助鍵 MDI 值"
+
+#: ../atk/atkobject.c:460
+msgid "The accessible MDI value of this object"
+msgstr "此物件的輔助鍵 MDI 值"
+
+#: ../atk/atkobject.c:476
+msgid "Accessible Table Caption"
+msgstr "輔助鍵表格標題"
+
+#: ../atk/atkobject.c:477
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"用來知會表格標題已經改變;不應使用此屬性。應使用 accessible-table-caption-"
+"object 代替"
+
+#: ../atk/atkobject.c:491
+msgid "Accessible Table Column Header"
+msgstr "輔助鍵表格直欄標頭"
+
+#: ../atk/atkobject.c:492
+msgid "Is used to notify that the table column header has changed"
+msgstr "用來知會表格直列標頭已變動"
+
+#: ../atk/atkobject.c:507
+msgid "Accessible Table Column Description"
+msgstr "輔助鍵表格直欄描述"
+
+#: ../atk/atkobject.c:508
+msgid "Is used to notify that the table column description has changed"
+msgstr "用來知會表格直欄描述以已變動"
+
+#: ../atk/atkobject.c:523
+msgid "Accessible Table Row Header"
+msgstr "輔助鍵表格橫列標頭"
+
+#: ../atk/atkobject.c:524
+msgid "Is used to notify that the table row header has changed"
+msgstr "用來知會表格橫列標頭已變動"
+
+#: ../atk/atkobject.c:538
+msgid "Accessible Table Row Description"
+msgstr "輔助鍵表格橫列描述"
+
+#: ../atk/atkobject.c:539
+msgid "Is used to notify that the table row description has changed"
+msgstr "用來知會表格橫列描述已變動"
+
+#: ../atk/atkobject.c:545
+msgid "Accessible Table Summary"
+msgstr "輔助鍵表格總結"
+
+#: ../atk/atkobject.c:546
+msgid "Is used to notify that the table summary has changed"
+msgstr "用來知會表格總結描述已變動"
+
+#: ../atk/atkobject.c:552
+msgid "Accessible Table Caption Object"
+msgstr "輔助鍵表格標題物件"
+
+#: ../atk/atkobject.c:553
+msgid "Is used to notify that the table caption has changed"
+msgstr "用來知會表格標題物件已變動"
+
+#: ../atk/atkobject.c:559
+msgid "Number of Accessible Hypertext Links"
+msgstr "輔助鍵超連結總數"
+
+#: ../atk/atkobject.c:560
+msgid "The number of links which the current AtkHypertext has"
+msgstr "目前 AtkHypertext 含有的超連結數目"
+
+#: ../atk/atkvalue.c:188
+msgid "very weak"
+msgstr "非常弱"
+
+#: ../atk/atkvalue.c:189
+msgid "weak"
+msgstr "弱"
+
+#: ../atk/atkvalue.c:190
+#| msgid "table"
+msgid "acceptable"
+msgstr "可接受"
+
+#: ../atk/atkvalue.c:191
+msgid "strong"
+msgstr "強"
+
+#: ../atk/atkvalue.c:192
+msgid "very strong"
+msgstr "非常強"
+
+#: ../atk/atkvalue.c:193
+msgid "very low"
+msgstr "非常低"
+
+#: ../atk/atkvalue.c:194
+msgid "medium"
+msgstr "普通"
+
+#: ../atk/atkvalue.c:195
+msgid "high"
+msgstr "高"
+
+#: ../atk/atkvalue.c:196
+msgid "very high"
+msgstr "非常高"
+
+#: ../atk/atkvalue.c:197
+msgid "very bad"
+msgstr "非常差"
+
+#: ../atk/atkvalue.c:198
+msgid "bad"
+msgstr "差"
+
+#: ../atk/atkvalue.c:199
+msgid "good"
+msgstr "良好"
+
+#: ../atk/atkvalue.c:200
+msgid "very good"
+msgstr "非常好"
+
+#: ../atk/atkvalue.c:201
+msgid "best"
+msgstr "最好"
+
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: RemoveAccessible 有不明的簽章 %s"
 
@@ -89,3 +793,6 @@ msgstr "在禁止處嘗試同步化"
 
 #~ msgid "AT-SPI: Got error: %s\n"
 #~ msgstr "AT-SPI:得到錯誤:%s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "用來知會母元件已有變動"
index d6fbb03..89bc557 100644 (file)
@@ -1,10 +1,19 @@
+# #-#-#-#-#  zh_TW.po (at-spi2-core 1.91.91)  #-#-#-#-#
 # Chinese (Taiwan) translation for at-spi2-core.
 # Copyright (C) 2011 at-spi2-core's COPYRIGHT HOLDER
 # This file is distributed under the same license as the at-spi2-core package.
 # Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2011.
 #
+# #-#-#-#-#  zh_TW.po (atk 2.1.0)  #-#-#-#-#
+# Chinese (Taiwan) translation of atk.
+# Copyright (C) 2003-06 Free Software Foundation, Inc.
+# Abel Cheung <abel@oaka.org>, 2003.
+# Li-Jen Hsin <hsin@med.cgu.edu.tw>, 2004.
+#
+#, fuzzy
 msgid ""
 msgstr ""
+"#-#-#-#-#  zh_TW.po (at-spi2-core 1.91.91)  #-#-#-#-#\n"
 "Project-Id-Version: at-spi2-core 1.91.91\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=at-"
 "spi&keywords=I18N+L10N&component=general\n"
@@ -17,6 +26,19 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.6.3\n"
+"#-#-#-#-#  zh_TW.po (atk 2.1.0)  #-#-#-#-#\n"
+"Project-Id-Version: atk 2.1.0\n"
+"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
+"product=atk&keywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2018-03-12 08:32+0000\n"
+"PO-Revision-Date: 2018-03-26 16:51+0800\n"
+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
+"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.0.6\n"
 
 #: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
 #: ../atspi/atspi-value.c:111
@@ -27,6 +49,780 @@ msgstr "應用程式已不存在"
 msgid "Attempted synchronous call where prohibited"
 msgstr "在禁止處嘗試同步化"
 
+#: atk/atkhyperlink.c:126
+msgid "Selected Link"
+msgstr "選擇的連結"
+
+#: atk/atkhyperlink.c:127
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "顯示 AtkHyperlink 物件是否被選擇"
+
+#: atk/atkhyperlink.c:133
+msgid "Number of Anchors"
+msgstr "標定的數目"
+
+#: atk/atkhyperlink.c:134
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "與 AtkHyperlink 物件有關的標定數目"
+
+#: atk/atkhyperlink.c:142
+msgid "End index"
+msgstr "結尾索引"
+
+#: atk/atkhyperlink.c:143
+msgid "The end index of the AtkHyperlink object"
+msgstr "AtkHyperlink 物件的結尾索引"
+
+#: atk/atkhyperlink.c:151
+msgid "Start index"
+msgstr "起點索引"
+
+#: atk/atkhyperlink.c:152
+msgid "The start index of the AtkHyperlink object"
+msgstr "AtkHyperlink 物件的起點索引"
+
+#: atk/atkobject.c:97
+msgid "invalid"
+msgstr "無效"
+
+#: atk/atkobject.c:98
+msgid "accelerator label"
+msgstr "捷徑鍵標籤"
+
+#: atk/atkobject.c:99
+msgid "alert"
+msgstr "警示"
+
+#: atk/atkobject.c:100
+msgid "animation"
+msgstr "動畫"
+
+#: atk/atkobject.c:101
+msgid "arrow"
+msgstr "箭頭"
+
+#: atk/atkobject.c:102
+msgid "calendar"
+msgstr "月曆"
+
+#: atk/atkobject.c:103
+msgid "canvas"
+msgstr "畫布"
+
+#: atk/atkobject.c:104
+msgid "check box"
+msgstr "勾選盒"
+
+#: atk/atkobject.c:105
+msgid "check menu item"
+msgstr "勾選選單項目"
+
+#: atk/atkobject.c:106
+msgid "color chooser"
+msgstr "顏色選擇元件"
+
+#: atk/atkobject.c:107
+msgid "column header"
+msgstr "欄位標頭"
+
+#: atk/atkobject.c:108
+msgid "combo box"
+msgstr "組合方塊"
+
+#: atk/atkobject.c:109
+msgid "dateeditor"
+msgstr "日期編輯器"
+
+#: atk/atkobject.c:110
+msgid "desktop icon"
+msgstr "桌面圖示"
+
+#: atk/atkobject.c:111
+msgid "desktop frame"
+msgstr "桌面框架"
+
+#: atk/atkobject.c:112
+msgid "dial"
+msgstr "設置值"
+
+#: atk/atkobject.c:113
+msgid "dialog"
+msgstr "對話盒"
+
+#: atk/atkobject.c:114
+msgid "directory pane"
+msgstr "目錄窗格"
+
+#: atk/atkobject.c:115
+msgid "drawing area"
+msgstr "繪圖區域"
+
+#: atk/atkobject.c:116
+msgid "file chooser"
+msgstr "檔案選擇元件"
+
+#: atk/atkobject.c:117
+msgid "filler"
+msgstr "填充元件"
+
+#. I know it looks wrong but that is what Java returns
+#: atk/atkobject.c:119
+msgid "fontchooser"
+msgstr "字型選擇元件"
+
+#: atk/atkobject.c:120
+msgid "frame"
+msgstr "框架"
+
+#: atk/atkobject.c:121
+msgid "glass pane"
+msgstr "頂層分格"
+
+#: atk/atkobject.c:122
+msgid "html container"
+msgstr "HTML 容器元件"
+
+#: atk/atkobject.c:123
+msgid "icon"
+msgstr "圖示"
+
+#: atk/atkobject.c:124
+msgid "image"
+msgstr "影像"
+
+#: atk/atkobject.c:125
+msgid "internal frame"
+msgstr "內部框架"
+
+#: atk/atkobject.c:126
+msgid "label"
+msgstr "標籤"
+
+#: atk/atkobject.c:127
+msgid "layered pane"
+msgstr "多層分格"
+
+#: atk/atkobject.c:128
+msgid "list"
+msgstr "清單"
+
+#: atk/atkobject.c:129
+msgid "list item"
+msgstr "清單項目"
+
+#: atk/atkobject.c:130
+msgid "menu"
+msgstr "選單"
+
+#: atk/atkobject.c:131
+msgid "menu bar"
+msgstr "選單列"
+
+#: atk/atkobject.c:132
+msgid "menu item"
+msgstr "選單項目"
+
+#: atk/atkobject.c:133
+msgid "option pane"
+msgstr "選項窗格"
+
+#: atk/atkobject.c:134
+msgid "page tab"
+msgstr "分頁標籤"
+
+#: atk/atkobject.c:135
+msgid "page tab list"
+msgstr "分頁標籤清單"
+
+#: atk/atkobject.c:136
+msgid "panel"
+msgstr "面板"
+
+#: atk/atkobject.c:137
+msgid "password text"
+msgstr "密碼文字"
+
+#: atk/atkobject.c:138
+msgid "popup menu"
+msgstr "彈出式選單"
+
+#: atk/atkobject.c:139
+msgid "progress bar"
+msgstr "進度列"
+
+#: atk/atkobject.c:140
+msgid "push button"
+msgstr "推送按鈕"
+
+#: atk/atkobject.c:141
+msgid "radio button"
+msgstr "單選按鈕"
+
+#: atk/atkobject.c:142
+msgid "radio menu item"
+msgstr "單選選單項目"
+
+#: atk/atkobject.c:143
+msgid "root pane"
+msgstr "根窗格"
+
+#: atk/atkobject.c:144
+msgid "row header"
+msgstr "列標頭"
+
+#: atk/atkobject.c:145
+msgid "scroll bar"
+msgstr "捲動列"
+
+#: atk/atkobject.c:146
+msgid "scroll pane"
+msgstr "捲動分格"
+
+#: atk/atkobject.c:147
+msgid "separator"
+msgstr "分隔線"
+
+#: atk/atkobject.c:148
+msgid "slider"
+msgstr "滑動鈕"
+
+#: atk/atkobject.c:149
+msgid "split pane"
+msgstr "分割窗格"
+
+#: atk/atkobject.c:150
+msgid "spin button"
+msgstr "微調按鈕"
+
+#: atk/atkobject.c:151
+msgid "statusbar"
+msgstr "狀態列"
+
+#: atk/atkobject.c:152
+msgid "table"
+msgstr "表格"
+
+#: atk/atkobject.c:153
+msgid "table cell"
+msgstr "儲存格"
+
+#: atk/atkobject.c:154
+msgid "table column header"
+msgstr "表格直欄標頭"
+
+#: atk/atkobject.c:155
+msgid "table row header"
+msgstr "表格橫列標頭"
+
+#: atk/atkobject.c:156
+msgid "tear off menu item"
+msgstr "卸下選單項目"
+
+#: atk/atkobject.c:157
+msgid "terminal"
+msgstr "終端機"
+
+#: atk/atkobject.c:158
+msgid "text"
+msgstr "文字"
+
+#: atk/atkobject.c:159
+msgid "toggle button"
+msgstr "切換按鈕"
+
+#: atk/atkobject.c:160
+msgid "tool bar"
+msgstr "工具列"
+
+#: atk/atkobject.c:161
+msgid "tool tip"
+msgstr "工具提示"
+
+#: atk/atkobject.c:162
+msgid "tree"
+msgstr "樹狀資料元件"
+
+#: atk/atkobject.c:163
+msgid "tree table"
+msgstr "樹狀資料表格"
+
+#: atk/atkobject.c:164
+msgid "unknown"
+msgstr "不明"
+
+#: atk/atkobject.c:165
+msgid "viewport"
+msgstr "視接口"
+
+#: atk/atkobject.c:166
+msgid "window"
+msgstr "視窗"
+
+#: atk/atkobject.c:167
+msgid "header"
+msgstr "頁首"
+
+#: atk/atkobject.c:168
+msgid "footer"
+msgstr "頁尾"
+
+#: atk/atkobject.c:169
+msgid "paragraph"
+msgstr "段落"
+
+#: atk/atkobject.c:170
+msgid "ruler"
+msgstr "尺規"
+
+#: atk/atkobject.c:171
+msgid "application"
+msgstr "應用程式"
+
+#: atk/atkobject.c:172
+msgid "autocomplete"
+msgstr "自動完成"
+
+#: atk/atkobject.c:173
+msgid "edit bar"
+msgstr "編輯列"
+
+#: atk/atkobject.c:174
+msgid "embedded component"
+msgstr "內嵌組成元件"
+
+#: atk/atkobject.c:175
+msgid "entry"
+msgstr "項目"
+
+#: atk/atkobject.c:176
+msgid "chart"
+msgstr "圖表"
+
+#: atk/atkobject.c:177
+msgid "caption"
+msgstr "圖標"
+
+#: atk/atkobject.c:178
+msgid "document frame"
+msgstr "文件框架"
+
+#: atk/atkobject.c:179
+msgid "heading"
+msgstr "標題"
+
+#: atk/atkobject.c:180
+msgid "page"
+msgstr "頁面"
+
+#: atk/atkobject.c:181
+msgid "section"
+msgstr "區段"
+
+#: atk/atkobject.c:182
+msgid "redundant object"
+msgstr "冗餘物件"
+
+#: atk/atkobject.c:183
+msgid "form"
+msgstr "表單"
+
+#: atk/atkobject.c:184
+msgid "link"
+msgstr "連結"
+
+#: atk/atkobject.c:185
+msgid "input method window"
+msgstr "輸入法視窗"
+
+#: atk/atkobject.c:186
+msgid "table row"
+msgstr "表格列"
+
+#: atk/atkobject.c:187
+msgid "tree item"
+msgstr "樹狀項目"
+
+#: atk/atkobject.c:188
+msgid "document spreadsheet"
+msgstr "文件試算表"
+
+#: atk/atkobject.c:189
+msgid "document presentation"
+msgstr "文件簡報"
+
+#: atk/atkobject.c:190
+msgid "document text"
+msgstr "文件文字"
+
+#: atk/atkobject.c:191
+msgid "document web"
+msgstr "文件網頁"
+
+#: atk/atkobject.c:192
+msgid "document email"
+msgstr "文件郵件"
+
+#: atk/atkobject.c:193
+msgid "comment"
+msgstr "註解"
+
+#: atk/atkobject.c:194
+msgid "list box"
+msgstr "清單方塊"
+
+#: atk/atkobject.c:195
+msgid "grouping"
+msgstr "群組"
+
+#: atk/atkobject.c:196
+msgid "image map"
+msgstr "影像地圖"
+
+#: atk/atkobject.c:197
+msgid "notification"
+msgstr "通知"
+
+#: atk/atkobject.c:198
+msgid "info bar"
+msgstr "資訊列"
+
+#: atk/atkobject.c:199
+msgid "level bar"
+msgstr "等級列"
+
+#: atk/atkobject.c:200
+msgid "title bar"
+msgstr "標題列"
+
+#: atk/atkobject.c:201
+msgid "block quote"
+msgstr "引言區塊"
+
+#: atk/atkobject.c:202
+msgid "audio"
+msgstr "音訊"
+
+#: atk/atkobject.c:203
+msgid "video"
+msgstr "視訊"
+
+#: atk/atkobject.c:204
+msgid "definition"
+msgstr "定義"
+
+#: atk/atkobject.c:205
+msgid "article"
+msgstr "文章"
+
+#: atk/atkobject.c:206
+msgid "landmark"
+msgstr "地標"
+
+#: atk/atkobject.c:207
+msgid "log"
+msgstr "紀錄"
+
+#: atk/atkobject.c:208
+msgid "marquee"
+msgstr "跑馬燈"
+
+#: atk/atkobject.c:209
+msgid "math"
+msgstr "數學"
+
+#: atk/atkobject.c:210
+msgid "rating"
+msgstr "評等"
+
+#: atk/atkobject.c:211
+msgid "timer"
+msgstr "計時"
+
+#: atk/atkobject.c:212
+msgid "description list"
+msgstr "描述清單"
+
+#: atk/atkobject.c:213
+msgid "description term"
+msgstr "描述語詞"
+
+#: atk/atkobject.c:214
+msgid "description value"
+msgstr "描述數值"
+
+#: atk/atkobject.c:372
+msgid "Accessible Name"
+msgstr "輔助鍵名稱"
+
+#: atk/atkobject.c:373
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr "已格式化的物件實體名稱,便於輔助技術存取"
+
+#: atk/atkobject.c:379
+msgid "Accessible Description"
+msgstr "輔助鍵描述"
+
+#: atk/atkobject.c:380
+msgid "Description of an object, formatted for assistive technology access"
+msgstr "已格式化的物件描述,便於輔助技術存取"
+
+#: atk/atkobject.c:386
+msgid "Accessible Parent"
+msgstr "輔助鍵母元件"
+
+#: atk/atkobject.c:387
+msgid "Parent of the current accessible as returned by atk_object_get_parent()"
+msgstr "由 atk_object_get_parent() 傳回目前無障礙功能的上層"
+
+#: atk/atkobject.c:403
+msgid "Accessible Value"
+msgstr "輔助鍵設定值"
+
+#: atk/atkobject.c:404
+msgid "Is used to notify that the value has changed"
+msgstr "用來知會該設定值已有變動"
+
+#: atk/atkobject.c:412
+msgid "Accessible Role"
+msgstr "輔助鍵類型"
+
+#: atk/atkobject.c:413
+msgid "The accessible role of this object"
+msgstr "此物件的輔助鍵類型"
+
+#: atk/atkobject.c:421
+msgid "Accessible Layer"
+msgstr "輔助鍵層級"
+
+#: atk/atkobject.c:422
+msgid "The accessible layer of this object"
+msgstr "此物件的輔助鍵層級"
+
+#: atk/atkobject.c:430
+msgid "Accessible MDI Value"
+msgstr "輔助鍵 MDI 值"
+
+#: atk/atkobject.c:431
+msgid "The accessible MDI value of this object"
+msgstr "此物件的輔助鍵 MDI 值"
+
+#: atk/atkobject.c:447
+msgid "Accessible Table Caption"
+msgstr "輔助鍵表格標題"
+
+#: atk/atkobject.c:448
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+"用來知會表格標題已經改變;不應使用此屬性。應使用 accessible-table-caption-"
+"object 代替"
+
+#: atk/atkobject.c:462
+msgid "Accessible Table Column Header"
+msgstr "輔助鍵表格直欄標頭"
+
+#: atk/atkobject.c:463
+msgid "Is used to notify that the table column header has changed"
+msgstr "用來知會表格直列標頭已變動"
+
+#: atk/atkobject.c:478
+msgid "Accessible Table Column Description"
+msgstr "輔助鍵表格直欄描述"
+
+#: atk/atkobject.c:479
+msgid "Is used to notify that the table column description has changed"
+msgstr "用來知會表格直欄描述以已變動"
+
+#: atk/atkobject.c:494
+msgid "Accessible Table Row Header"
+msgstr "輔助鍵表格橫列標頭"
+
+#: atk/atkobject.c:495
+msgid "Is used to notify that the table row header has changed"
+msgstr "用來知會表格橫列標頭已變動"
+
+#: atk/atkobject.c:509
+msgid "Accessible Table Row Description"
+msgstr "輔助鍵表格橫列描述"
+
+#: atk/atkobject.c:510
+msgid "Is used to notify that the table row description has changed"
+msgstr "用來知會表格橫列描述已變動"
+
+#: atk/atkobject.c:516
+msgid "Accessible Table Summary"
+msgstr "輔助鍵表格總結"
+
+#: atk/atkobject.c:517
+msgid "Is used to notify that the table summary has changed"
+msgstr "用來知會表格總結描述已變動"
+
+#: atk/atkobject.c:523
+msgid "Accessible Table Caption Object"
+msgstr "輔助鍵表格標題物件"
+
+#: atk/atkobject.c:524
+msgid "Is used to notify that the table caption has changed"
+msgstr "用來知會表格標題物件已變動"
+
+#: atk/atkobject.c:530
+msgid "Number of Accessible Hypertext Links"
+msgstr "輔助鍵超連結總數"
+
+#: atk/atkobject.c:531
+msgid "The number of links which the current AtkHypertext has"
+msgstr "目前 AtkHypertext 含有的超連結數目"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:194
+msgid "very weak"
+msgstr "非常弱"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:201
+msgid "weak"
+msgstr "弱"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:208
+msgid "acceptable"
+msgstr "可接受"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:215
+msgid "strong"
+msgstr "強"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a password-strength meter. Note that what such a
+#. * widget presents is controlled by application developers. Thus
+#. * assistive technologies such as screen readers are expected to
+#. * present this string alone or as a token in a list.
+#.
+#: atk/atkvalue.c:222
+msgid "very strong"
+msgstr "非常強"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:230
+msgid "very low"
+msgstr "非常低"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:238
+msgid "medium"
+msgstr "普通"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:246
+msgid "high"
+msgstr "高"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a volume slider. Note that what such a widget
+#. * presents (e.g. temperature, volume, price) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:254
+msgid "very high"
+msgstr "非常高"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:262
+msgid "very bad"
+msgstr "非常差"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:270
+msgid "bad"
+msgstr "差"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:278
+msgid "good"
+msgstr "良好"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:286
+msgid "very good"
+msgstr "非常好"
+
+#. Translators: This string describes a range within value-related
+#. * widgets such as a hard drive usage. Note that what such a widget
+#. * presents (e.g. hard drive usage, network traffic) is controlled by
+#. * application developers. Thus assistive technologies such as screen
+#. * readers are expected to present this string alone or as a token in
+#. * a list.
+#.
+#: atk/atkvalue.c:294
+msgid "best"
+msgstr "最好"
+
 #~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
 #~ msgstr "AT-SPI: RemoveAccessible 有不明的簽章 %s"
 
@@ -89,3 +885,6 @@ msgstr "在禁止處嘗試同步化"
 
 #~ msgid "AT-SPI: Got error: %s\n"
 #~ msgstr "AT-SPI:得到錯誤:%s\n"
+
+#~ msgid "Is used to notify that the parent has changed"
+#~ msgstr "用來知會母元件已有變動"
diff --git a/po/zu.po b/po/zu.po
new file mode 100644 (file)
index 0000000..10c9fc2
--- /dev/null
+++ b/po/zu.po
@@ -0,0 +1,529 @@
+# Zulu translation for atk.
+# Copyright (C)
+# This file is distributed under the same license as the atk package.
+# Priscilla Mahlangu <priny@translate.za>, 2011.
+# F Wolff <friedel@translate.org.za>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=atk&ke"
+"ywords=I18N+L10N&component=general\n"
+"POT-Creation-Date: 2011-03-30 11:30+0000\n"
+"PO-Revision-Date: 2011-04-08 16:50+0200\n"
+"Last-Translator: F Wolff <friedel@translate.org.za>\n"
+"Language-Team: translate-discuss-af@lists.sourceforge.net\n"
+"Language: zu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.0-beta4\n"
+"X-Project-Style: gnome\n"
+
+#: ../atk/atkhyperlink.c:103
+msgid "Selected Link"
+msgstr "Isixhumanisi esikhethiwe"
+
+#: ../atk/atkhyperlink.c:104
+msgid "Specifies whether the AtkHyperlink object is selected"
+msgstr "Kucacisa ukuthi yingabe into ye-AtkHyperlink ikhethiwe yini"
+
+#: ../atk/atkhyperlink.c:110
+msgid "Number of Anchors"
+msgstr "Inani lama-Anchors"
+
+#: ../atk/atkhyperlink.c:111
+msgid "The number of anchors associated with the AtkHyperlink object"
+msgstr "Inani lama-anchors elihlanganiswe nento ye-AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:119
+msgid "End index"
+msgstr "Inkomba yokugcina"
+
+#: ../atk/atkhyperlink.c:120
+msgid "The end index of the AtkHyperlink object"
+msgstr "Inkomba yokugcina yento ye-AtkHyperlink"
+
+#: ../atk/atkhyperlink.c:128
+msgid "Start index"
+msgstr "Inkomba yokuqala"
+
+#: ../atk/atkhyperlink.c:129
+msgid "The start index of the AtkHyperlink object"
+msgstr "Inkomba yokuqala yento ye-AtkHyperlink"
+
+#: ../atk/atkobject.c:74
+msgid "invalid"
+msgstr "okungavumelekile"
+
+#: ../atk/atkobject.c:75
+msgid "accelerator label"
+msgstr "ilebula lokusheshisa"
+
+#: ../atk/atkobject.c:76
+msgid "alert"
+msgstr "yazisa"
+
+#: ../atk/atkobject.c:77
+msgid "animation"
+msgstr "ukugxwayiza"
+
+#: ../atk/atkobject.c:78
+msgid "arrow"
+msgstr "umcibisholo"
+
+#: ../atk/atkobject.c:79
+msgid "calendar"
+msgstr "ikhalenda"
+
+#: ../atk/atkobject.c:80
+msgid "canvas"
+msgstr "useyili"
+
+#: ../atk/atkobject.c:81
+msgid "check box"
+msgstr "ibhokisi lokuhlola"
+
+#: ../atk/atkobject.c:82
+msgid "check menu item"
+msgstr "hlola intwana yemenyu"
+
+#: ../atk/atkobject.c:83
+msgid "color chooser"
+msgstr "isikhethi sombala"
+
+#: ../atk/atkobject.c:84
+msgid "column header"
+msgstr "inhloko yekholomu"
+
+#: ../atk/atkobject.c:85
+msgid "combo box"
+msgstr "ibhokisi le-combo"
+
+#: ../atk/atkobject.c:86
+msgid "dateeditor"
+msgstr "isihleli sedethi"
+
+#: ../atk/atkobject.c:87
+msgid "desktop icon"
+msgstr "isithonjana sobuso bekhompuyutha"
+
+#: ../atk/atkobject.c:88
+msgid "desktop frame"
+msgstr "ifulema yobuso bekhompyutha"
+
+#: ../atk/atkobject.c:89
+msgid "dial"
+msgstr "chofoza"
+
+#: ../atk/atkobject.c:90
+msgid "dialog"
+msgstr "ibhokisi"
+
+#: ../atk/atkobject.c:91
+msgid "directory pane"
+msgstr "iwindi lohlu lwemibhalo"
+
+#: ../atk/atkobject.c:92
+msgid "drawing area"
+msgstr "indawo yokudweba"
+
+#: ../atk/atkobject.c:93
+msgid "file chooser"
+msgstr "isikhethi sefayela"
+
+#: ../atk/atkobject.c:94
+msgid "filler"
+msgstr "isigcwalisi"
+
+#. I know it looks wrong but that is what Java returns
+#: ../atk/atkobject.c:96
+msgid "fontchooser"
+msgstr "isikhethi sombalo"
+
+#: ../atk/atkobject.c:97
+msgid "frame"
+msgstr "ufulema"
+
+#: ../atk/atkobject.c:98
+msgid "glass pane"
+msgstr "iwindi lengilasi"
+
+#: ../atk/atkobject.c:99
+msgid "html container"
+msgstr "idlelo le-html"
+
+#: ../atk/atkobject.c:100
+msgid "icon"
+msgstr "isithonjana"
+
+#: ../atk/atkobject.c:101
+msgid "image"
+msgstr "isithombe"
+
+#: ../atk/atkobject.c:102
+msgid "internal frame"
+msgstr "ifulema yangaphakathi"
+
+#: ../atk/atkobject.c:103
+msgid "label"
+msgstr "ilebula"
+
+#: ../atk/atkobject.c:104
+msgid "layered pane"
+msgstr "iwindi le-layered"
+
+#: ../atk/atkobject.c:105
+msgid "list"
+msgstr "uhlu"
+
+#: ../atk/atkobject.c:106
+msgid "list item"
+msgstr "intwana yohlu"
+
+#: ../atk/atkobject.c:107
+msgid "menu"
+msgstr "imenyu"
+
+#: ../atk/atkobject.c:108
+msgid "menu bar"
+msgstr "ibha yemenyu"
+
+#: ../atk/atkobject.c:109
+msgid "menu item"
+msgstr "intwana yemenyu"
+
+#: ../atk/atkobject.c:110
+msgid "option pane"
+msgstr "iwindi lenketho"
+
+#: ../atk/atkobject.c:111
+msgid "page tab"
+msgstr "itabhu lekhasi"
+
+#: ../atk/atkobject.c:112
+msgid "page tab list"
+msgstr "uhlu lwetebhu lekhasi"
+
+#: ../atk/atkobject.c:113
+msgid "panel"
+msgstr "iwindi"
+
+#: ../atk/atkobject.c:114
+msgid "password text"
+msgstr "umbalo wephasiwedi"
+
+#: ../atk/atkobject.c:115
+msgid "popup menu"
+msgstr "imenyu eyisigelekeqe"
+
+#: ../atk/atkobject.c:116
+msgid "progress bar"
+msgstr "ibha yokuqhubekayo"
+
+#: ../atk/atkobject.c:117
+msgid "push button"
+msgstr "sunduza inkinobho"
+
+#: ../atk/atkobject.c:118
+msgid "radio button"
+msgstr "inkinobho yokusakaza"
+
+#: ../atk/atkobject.c:119
+msgid "radio menu item"
+msgstr "intwana yemenyu yesisakazi"
+
+#: ../atk/atkobject.c:120
+msgid "root pane"
+msgstr "iwindi elingumsuka"
+
+#: ../atk/atkobject.c:121
+msgid "row header"
+msgstr "isihloko somugqa"
+
+#: ../atk/atkobject.c:122
+msgid "scroll bar"
+msgstr "insika yokwehlisa nokwenyusa"
+
+#: ../atk/atkobject.c:123
+msgid "scroll pane"
+msgstr "iwindi yokwehlisa nokwenyusa"
+
+#: ../atk/atkobject.c:124
+msgid "separator"
+msgstr "isihlukanisi"
+
+#: ../atk/atkobject.c:125
+msgid "slider"
+msgstr "isishelelisi"
+
+#: ../atk/atkobject.c:126
+msgid "split pane"
+msgstr ""
+
+#: ../atk/atkobject.c:127
+msgid "spin button"
+msgstr ""
+
+#: ../atk/atkobject.c:128
+msgid "statusbar"
+msgstr "umudwa ochaza ngesimo"
+
+#: ../atk/atkobject.c:129
+msgid "table"
+msgstr "ithebula"
+
+#: ../atk/atkobject.c:130
+msgid "table cell"
+msgstr ""
+
+#: ../atk/atkobject.c:131
+msgid "table column header"
+msgstr "okungaphezulu kwekholomu yethebula"
+
+#: ../atk/atkobject.c:132
+msgid "table row header"
+msgstr "okungaphezulu komugqa wethebula"
+
+#: ../atk/atkobject.c:133
+msgid "tear off menu item"
+msgstr ""
+
+#: ../atk/atkobject.c:134
+msgid "terminal"
+msgstr ""
+
+#: ../atk/atkobject.c:135
+msgid "text"
+msgstr "umbhalo"
+
+#: ../atk/atkobject.c:136
+msgid "toggle button"
+msgstr ""
+
+#: ../atk/atkobject.c:137
+msgid "tool bar"
+msgstr "ibha yamathuluzi"
+
+#: ../atk/atkobject.c:138
+msgid "tool tip"
+msgstr "ithiphu lethukuzi"
+
+#: ../atk/atkobject.c:139
+msgid "tree"
+msgstr "isihlahla"
+
+#: ../atk/atkobject.c:140
+msgid "tree table"
+msgstr "ithebula lesihlahla"
+
+#: ../atk/atkobject.c:141
+msgid "unknown"
+msgstr "akwaziwa"
+
+#: ../atk/atkobject.c:142
+msgid "viewport"
+msgstr ""
+
+#: ../atk/atkobject.c:143
+msgid "window"
+msgstr "iwindi"
+
+#: ../atk/atkobject.c:144
+msgid "header"
+msgstr "okuphezulu"
+
+#: ../atk/atkobject.c:145
+msgid "footer"
+msgstr "okungezansi"
+
+#: ../atk/atkobject.c:146
+msgid "paragraph"
+msgstr "indima"
+
+#: ../atk/atkobject.c:147
+msgid "ruler"
+msgstr ""
+
+#: ../atk/atkobject.c:148
+msgid "application"
+msgstr "uhlelo lokusebenza"
+
+#: ../atk/atkobject.c:149
+msgid "autocomplete"
+msgstr "ukuqedela ngokuzenzakalela"
+
+#: ../atk/atkobject.c:150
+msgid "edit bar"
+msgstr "hlela ibha"
+
+#: ../atk/atkobject.c:151
+#, fuzzy
+msgid "embedded component"
+msgstr "shumeka "
+
+#: ../atk/atkobject.c:152
+msgid "entry"
+msgstr "okufakiweyo"
+
+#: ../atk/atkobject.c:153
+msgid "chart"
+msgstr ""
+
+#: ../atk/atkobject.c:154
+msgid "caption"
+msgstr "izwibela"
+
+#: ../atk/atkobject.c:155
+msgid "document frame"
+msgstr ""
+
+#: ../atk/atkobject.c:156
+msgid "heading"
+msgstr "isihloko"
+
+#: ../atk/atkobject.c:157
+msgid "page"
+msgstr "ikhasi"
+
+#: ../atk/atkobject.c:158
+msgid "section"
+msgstr "isigaba"
+
+#: ../atk/atkobject.c:159
+msgid "redundant object"
+msgstr ""
+
+#: ../atk/atkobject.c:160
+msgid "form"
+msgstr "ifomu"
+
+#: ../atk/atkobject.c:161
+msgid "link"
+msgstr "isixhumanisi"
+
+#: ../atk/atkobject.c:162
+msgid "input method window"
+msgstr "iwindi lendlela yokufaka"
+
+#: ../atk/atkobject.c:488
+msgid "Accessible Name"
+msgstr "Igama elifinyelelekayo"
+
+#: ../atk/atkobject.c:489
+msgid "Object instance’s name formatted for assistive technology access"
+msgstr ""
+
+#: ../atk/atkobject.c:495
+msgid "Accessible Description"
+msgstr "Incazelo efinyelelekayo"
+
+#: ../atk/atkobject.c:496
+msgid "Description of an object, formatted for assistive technology access"
+msgstr ""
+
+#: ../atk/atkobject.c:502
+msgid "Accessible Parent"
+msgstr "Umzali ofinyelelekayo"
+
+#: ../atk/atkobject.c:503
+msgid "Is used to notify that the parent has changed"
+msgstr "Bengazisa ukuthi umzali useshintshile"
+
+#: ../atk/atkobject.c:509
+msgid "Accessible Value"
+msgstr "Inani elifinyelelekayo"
+
+#: ../atk/atkobject.c:510
+msgid "Is used to notify that the value has changed"
+msgstr "Bengazise ukuthi inani lishintshile"
+
+#: ../atk/atkobject.c:518
+msgid "Accessible Role"
+msgstr "Indima efinyelelekayo"
+
+#: ../atk/atkobject.c:519
+msgid "The accessible role of this object"
+msgstr "Indima efinyalelekayo yale nto"
+
+#: ../atk/atkobject.c:527
+msgid "Accessible Layer"
+msgstr "Isindlali esifinyelelekayo"
+
+#: ../atk/atkobject.c:528
+msgid "The accessible layer of this object"
+msgstr "Isindlali esifinyelelkayo sale nto"
+
+#: ../atk/atkobject.c:536
+msgid "Accessible MDI Value"
+msgstr "Inani le-MDI elifinyelelekayo"
+
+#: ../atk/atkobject.c:537
+msgid "The accessible MDI value of this object"
+msgstr "Inani le-MDI elifinyelelekayo lale nto"
+
+#: ../atk/atkobject.c:545
+msgid "Accessible Table Caption"
+msgstr "Amazwibela wethebula afinyelelekayo"
+
+#: ../atk/atkobject.c:546
+msgid ""
+"Is used to notify that the table caption has changed; this property should "
+"not be used. accessible-table-caption-object should be used instead"
+msgstr ""
+
+#: ../atk/atkobject.c:552
+msgid "Accessible Table Column Header"
+msgstr ""
+
+#: ../atk/atkobject.c:553
+msgid "Is used to notify that the table column header has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:559
+msgid "Accessible Table Column Description"
+msgstr ""
+
+#: ../atk/atkobject.c:560
+msgid "Is used to notify that the table column description has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:566
+msgid "Accessible Table Row Header"
+msgstr ""
+
+#: ../atk/atkobject.c:567
+msgid "Is used to notify that the table row header has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:573
+msgid "Accessible Table Row Description"
+msgstr ""
+
+#: ../atk/atkobject.c:574
+msgid "Is used to notify that the table row description has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:580
+msgid "Accessible Table Summary"
+msgstr ""
+
+#: ../atk/atkobject.c:581
+msgid "Is used to notify that the table summary has changed"
+msgstr ""
+
+#: ../atk/atkobject.c:587
+msgid "Accessible Table Caption Object"
+msgstr ""
+
+#: ../atk/atkobject.c:588
+msgid "Is used to notify that the table caption has changed"
+msgstr "Bengazisa ukuthi amazwibela wethebula ashintshile"
+
+#: ../atk/atkobject.c:594
+msgid "Number of Accessible Hypertext Links"
+msgstr ""
+
+#: ../atk/atkobject.c:595
+msgid "The number of links which the current AtkHypertext has"
+msgstr ""
diff --git a/registryd/de-marshaller.c b/registryd/de-marshaller.c
deleted file mode 100644 (file)
index f109484..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * AT-SPI - Assistive Technology Service Provider Interface
- * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
- *
- * Copyright 2008 Novell, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * 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 <stdlib.h>
-#include <glib.h>
-#include <glib-object.h>
-#include <dbus/dbus.h>
-
-#include "de-types.h"
-
-dbus_bool_t spi_dbus_message_iter_get_struct(DBusMessageIter *iter, ...)
-{
-  va_list args;
-  DBusMessageIter iter_struct;
-  int type;
-  void *ptr;
-
-  dbus_message_iter_recurse(iter, &iter_struct);
-  va_start(args, iter);
-  for (;;)
-  {
-    type = va_arg(args, int);
-    if (type == DBUS_TYPE_INVALID) break;
-    if (type != dbus_message_iter_get_arg_type(&iter_struct))
-    {
-      va_end(args);
-      return FALSE;
-    }
-    ptr = va_arg(args, void *);
-    dbus_message_iter_get_basic(&iter_struct, ptr);
-    dbus_message_iter_next(&iter_struct);
-  }
-  dbus_message_iter_next(iter);
-  va_end(args);
-  return TRUE;
-}
-
-dbus_bool_t spi_dbus_message_iter_append_struct(DBusMessageIter *iter, ...)
-{
-  va_list args;
-  DBusMessageIter iter_struct;
-  int type;
-  void *ptr;
-
-  if (!dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL, &iter_struct)) return FALSE;
-  va_start(args, iter);
-  for (;;)
-  {
-    type = va_arg(args, int);
-    if (type == DBUS_TYPE_INVALID) break;
-    ptr = va_arg(args, void *);
-    dbus_message_iter_append_basic(&iter_struct, type, ptr);
-  }
-  if (!dbus_message_iter_close_container(iter, &iter_struct))
-  {
-    va_end(args);
-    return FALSE;
-  }
-  va_end(args);
-  return TRUE;
-}
-
-dbus_bool_t spi_dbus_marshal_deviceEvent(DBusMessage *message, const Accessibility_DeviceEvent *e)
-{
-  DBusMessageIter iter;
-
-  if (!message) return FALSE;
-  dbus_message_iter_init_append(message, &iter);
-  return spi_dbus_message_iter_append_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_UINT32, &e->hw_code, DBUS_TYPE_UINT32, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
-}
-
-dbus_bool_t spi_dbus_demarshal_deviceEvent(DBusMessage *message, Accessibility_DeviceEvent *e)
-{
-  DBusMessageIter iter;
-  dbus_uint16_t hw_code;
-  dbus_uint16_t modifiers;
-
-  dbus_message_iter_init(message, &iter);
-  if (spi_dbus_message_iter_get_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT32, &e->hw_code, DBUS_TYPE_INT32, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID))
-    return TRUE;
-  /* TODO: Perhaps remove the below code for 2.1 */
-  if (!spi_dbus_message_iter_get_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &hw_code, DBUS_TYPE_INT16, &modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID))
-    return FALSE;
-  e->hw_code = hw_code;
-  e->modifiers = modifiers;
-  return TRUE;
-}
index ea05dda..bfdac08 100644 (file)
 
 typedef unsigned long Accessibility_ControllerEventMask;
 
-typedef enum {
-    Accessibility_KEY_PRESSED_EVENT,
-    Accessibility_KEY_RELEASED_EVENT,
-    Accessibility_BUTTON_PRESSED_EVENT,
-    Accessibility_BUTTON_RELEASED_EVENT,
+typedef enum
+{
+  Accessibility_KEY_PRESSED_EVENT,
+  Accessibility_KEY_RELEASED_EVENT,
 } Accessibility_EventType;
 
-typedef enum {
-    Accessibility_KEY_PRESSED,
-    Accessibility_KEY_RELEASED,
+typedef enum
+{
+  Accessibility_KEY_PRESSED,
+  Accessibility_KEY_RELEASED,
 } Accessibility_KeyEventType;
 
-typedef enum {
-    Accessibility_KEY_PRESS,
-    Accessibility_KEY_RELEASE,
-    Accessibility_KEY_PRESSRELEASE,
-    Accessibility_KEY_SYM,
-    Accessibility_KEY_STRING,
-    Accessibility_KEY_LOCKMODIFIERS,
-    Accessibility_KEY_UNLOCKMODIFIERS,
+typedef enum
+{
+  Accessibility_KEY_PRESS,
+  Accessibility_KEY_RELEASE,
+  Accessibility_KEY_PRESSRELEASE,
+  Accessibility_KEY_SYM,
+  Accessibility_KEY_STRING,
+  Accessibility_KEY_LOCKMODIFIERS,
+  Accessibility_KEY_UNLOCKMODIFIERS,
 } Accessibility_KeySynthType;
 
-typedef struct _Accessibility_DeviceEvent Accessibility_DeviceEvent;
-struct _Accessibility_DeviceEvent
+typedef struct
 {
   Accessibility_EventType type;
   dbus_uint32_t id;
   dbus_uint32_t hw_code;
   dbus_uint32_t modifiers;
   dbus_uint32_t timestamp;
-  char * event_string;
+  char *event_string;
   dbus_bool_t is_text;
-};
+} Accessibility_DeviceEvent;
 
-typedef struct _Accessibility_EventListenerMode Accessibility_EventListenerMode;
-struct _Accessibility_EventListenerMode
+typedef struct
 {
   dbus_bool_t synchronous;
   dbus_bool_t preemptive;
   dbus_bool_t global;
-};
+} Accessibility_EventListenerMode;
 
-typedef struct _Accessibility_KeyDefinition Accessibility_KeyDefinition;
-struct _Accessibility_KeyDefinition
+typedef struct
 {
   dbus_int32_t keycode;
   dbus_int32_t keysym;
   char *keystring;
   dbus_int32_t unused;
-};
+} Accessibility_KeyDefinition;
 
 #endif /* SPI_DE_TYPES_H_ */
index 6556048..5bf37e5 100644 (file)
 
 #include <config.h>
 
-#undef  SPI_XKB_DEBUG
-#undef  SPI_DEBUG
-#undef  SPI_KEYEVENT_DEBUG
+#undef SPI_XKB_DEBUG
+#undef SPI_DEBUG
+#undef SPI_KEYEVENT_DEBUG
 
-#include <string.h>
 #include <ctype.h>
 #include <stdio.h>
+#include <string.h>
 #include <sys/time.h>
 
 #define XK_MISCELLANY
 
 #include <dbus/dbus.h>
 
-#include "paths.h"
-#include "keymasks.h"
 #include "de-types.h"
-#include "de-marshaller.h"
 #include "display.h"
 #include "event-source.h"
+#include "keymasks.h"
+#include "marshal-dbus.h"
+#include "paths.h"
 
-#include "deviceeventcontroller-x11.h"
 #include "deviceeventcontroller.h"
-#include "reentrant-list.h"
 
-#include "introspection.h"
+#include "deviceeventcontroller-x11.h"
+#include "reentrant-list.h"
 
 static void spi_dec_x11_emit_modifier_event (SpiDEController *controller,
-                            guint prev_mask,
-                            guint current_mask);
+                                             guint prev_mask,
+                                             guint current_mask);
 
 #define CHECK_RELEASE_DELAY 20
-#define BIT(c, x)       (c[x/8]&(1<<(x%8)))
+#define BIT(c, x) (c[x / 8] & (1 << (x % 8)))
 static guint check_release_handler = 0;
 static Accessibility_DeviceEvent pressed_event;
 static void wait_for_release_event (XEvent *event, SpiDEController *controller);
 
 static int spi_error_code = 0;
-struct _SpiPoint {
-    gint x;
-    gint y;
-};
-typedef struct _SpiPoint SpiPoint;
-static SpiPoint last_mouse_pos_static = {0, 0}; 
+typedef struct
+{
+  gint x;
+  gint y;
+} SpiPoint;
+static SpiPoint last_mouse_pos_static = { 0, 0 };
 static SpiPoint *last_mouse_pos = &last_mouse_pos_static;
 static unsigned int mouse_mask_state = 0;
 static unsigned int mouse_button_mask =
-  Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask;
+    Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask;
 static unsigned int key_modifier_mask =
-  Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | LockMask | ControlMask | SPI_KEYMASK_NUMLOCK;
+    Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | LockMask | ControlMask | SPI_KEYMASK_NUMLOCK;
 extern unsigned int _numlock_physical_mask;
 
-static XModifierKeymap* xmkeymap = NULL;
-
+static XModifierKeymap *xmkeymap = NULL;
 
 static int (*x_default_error_handler) (Display *display, XErrorEvent *error_event);
 
-static void     spi_controller_register_with_devices          (SpiDEController           *controller);
-static gboolean spi_device_event_controller_forward_key_event (SpiDEController           *controller,
-                                                              const XEvent              *event);
+static void spi_controller_register_with_devices (SpiDEController *controller);
+static gboolean spi_device_event_controller_forward_key_event (SpiDEController *controller,
+                                                               const XEvent *event);
 
 static SpiDEController *saved_controller;
 
@@ -102,66 +100,76 @@ static SpiDEController *saved_controller;
 static SpiDEControllerPrivate *
 spi_device_event_controller_get_instance_private (SpiDEController *controller)
 {
-        return g_type_instance_get_private ((GTypeInstance *) controller, SPI_DEVICE_EVENT_CONTROLLER_TYPE);
+  return g_type_instance_get_private ((GTypeInstance *) controller, SPI_DEVICE_EVENT_CONTROLLER_TYPE);
 }
 
 static unsigned int
 keysym_mod_mask (KeySym keysym, KeyCode keycode)
 {
-       /* we really should use XKB and look directly at the keymap */
-       /* this is very inelegant */
-       Display *display = spi_get_display ();
-       unsigned int mods_rtn = 0;
-       unsigned int retval = 0;
-       KeySym sym_rtn;
-
-       if (XkbLookupKeySym (display, keycode, 0, &mods_rtn, &sym_rtn) &&
-           (sym_rtn == keysym)) {
-               retval = 0;
-       }
-       else if (XkbLookupKeySym (display, keycode, ShiftMask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = ShiftMask;
-       }
-       else if (XkbLookupKeySym (display, keycode, Mod2Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = Mod2Mask;
-       }
-       else if (XkbLookupKeySym (display, keycode, Mod3Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = Mod3Mask;
-       }
-       else if (XkbLookupKeySym (display, keycode, Mod4Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = Mod4Mask;
-       }
-       else if (XkbLookupKeySym (display, keycode, Mod5Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = Mod5Mask;
-       }
-       else if (XkbLookupKeySym (display, keycode, 
-                                 ShiftMask | Mod2Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = (Mod2Mask | ShiftMask);
-       }
-       else if (XkbLookupKeySym (display, keycode, 
-                                 ShiftMask | Mod3Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = (Mod3Mask | ShiftMask);
-       }
-       else if (XkbLookupKeySym (display, keycode, 
-                                 ShiftMask | Mod4Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = (Mod4Mask | ShiftMask);
-       }
-       else if (XkbLookupKeySym (display, keycode,
-                                 ShiftMask | Mod5Mask, &mods_rtn, &sym_rtn) &&
-                (sym_rtn == keysym)) {
-               retval = (Mod5Mask | ShiftMask);
-       }
-       else
-               retval = 0xFFFF;
-       return retval;
+  /* we really should use XKB and look directly at the keymap */
+  /* this is very inelegant */
+  Display *display = spi_get_display ();
+  unsigned int mods_rtn = 0;
+  unsigned int retval = 0;
+  KeySym sym_rtn;
+
+  if (XkbLookupKeySym (display, keycode, 0, &mods_rtn, &sym_rtn) &&
+      (sym_rtn == keysym))
+    {
+      retval = 0;
+    }
+  else if (XkbLookupKeySym (display, keycode, ShiftMask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = ShiftMask;
+    }
+  else if (XkbLookupKeySym (display, keycode, Mod2Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = Mod2Mask;
+    }
+  else if (XkbLookupKeySym (display, keycode, Mod3Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = Mod3Mask;
+    }
+  else if (XkbLookupKeySym (display, keycode, Mod4Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = Mod4Mask;
+    }
+  else if (XkbLookupKeySym (display, keycode, Mod5Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = Mod5Mask;
+    }
+  else if (XkbLookupKeySym (display, keycode,
+                            ShiftMask | Mod2Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = (Mod2Mask | ShiftMask);
+    }
+  else if (XkbLookupKeySym (display, keycode,
+                            ShiftMask | Mod3Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = (Mod3Mask | ShiftMask);
+    }
+  else if (XkbLookupKeySym (display, keycode,
+                            ShiftMask | Mod4Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = (Mod4Mask | ShiftMask);
+    }
+  else if (XkbLookupKeySym (display, keycode,
+                            ShiftMask | Mod5Mask, &mods_rtn, &sym_rtn) &&
+           (sym_rtn == keysym))
+    {
+      retval = (Mod5Mask | ShiftMask);
+    }
+  else
+    retval = 0xFFFF;
+  return retval;
 }
 
 static gboolean
@@ -179,17 +187,17 @@ replace_map_keysym (SpiDEControllerPrivate *priv, KeyCode keycode, KeySym keysym
   if (desc && desc->map)
     {
       gint offset = desc->map->key_sym_map[keycode].offset;
-      desc->map->syms[offset] = keysym; 
+      desc->map->syms[offset] = keysym;
     }
   else
     {
       fprintf (stderr, "Error changing key map: empty server structure\n");
-    }          
+    }
   XkbSetMap (dpy, XkbAllMapComponentsMask, desc);
   /**
-   *  FIXME: the use of XkbChangeMap, and the reuse of the priv->xkb_desc structure, 
+   *  FIXME: the use of XkbChangeMap, and the reuse of the priv->xkb_desc structure,
    * would be far preferable.
-   * HOWEVER it does not seem to work using XFree 4.3. 
+   * HOWEVER it does not seem to work using XFree 4.3.
    **/
   /*       XkbChangeMap (dpy, priv->xkb_desc, priv->changes); */
   XFlush (dpy);
@@ -213,159 +221,127 @@ spi_dec_reset_reserved (gpointer data)
 
 static gint
 spi_dec_x11_get_keycode (SpiDEController *controller,
-                          gint keysym,
-                          gchar *key_str,
-                          gboolean fix,
-                          guint *modmask)
+                         gint keysym,
+                         gchar *key_str,
+                         gboolean fix,
+                         guint *modmask)
 {
-       KeyCode keycode = 0;
+  KeyCode keycode = 0;
   if (key_str && key_str[0])
-               keysym = XStringToKeysym(key_str);
-       keycode = XKeysymToKeycode (spi_get_display (), (KeySym) keysym);
-       if (!keycode && fix)
-       {
-          SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
-               /* if there's no keycode available, fix it */
-               if (replace_map_keysym (priv, priv->reserved_keycode, keysym))
-               {
-                       keycode = priv->reserved_keycode;
-                       /* 
-                        * queue a timer to restore the old keycode.  Ugly, but required 
-                        * due to races / asynchronous X delivery.   
-                        * Long-term fix is to extend the X keymap here instead of replace entries.
-                        */
-                       priv->reserved_reset_timeout = g_timeout_add (500, spi_dec_reset_reserved, priv);
-                       g_source_set_name_by_id (priv->reserved_reset_timeout, "[at-spi2-core] spi_dec_reset_reserved");
-               }               
-               if (modmask)
-                       *modmask = 0;
-               return keycode;
-       }
-       if (modmask) 
-               *modmask = keysym_mod_mask (keysym, keycode);
-       return keycode;
+    keysym = XStringToKeysym (key_str);
+  keycode = XKeysymToKeycode (spi_get_display (), (KeySym) keysym);
+  if (!keycode && fix)
+    {
+      SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
+      /* if there's no keycode available, fix it */
+      if (replace_map_keysym (priv, priv->reserved_keycode, keysym))
+        {
+          keycode = priv->reserved_keycode;
+          /*
+           * queue a timer to restore the old keycode.  Ugly, but required
+           * due to races / asynchronous X delivery.
+           * Long-term fix is to extend the X keymap here instead of replace entries.
+           */
+          priv->reserved_reset_timeout = g_timeout_add (500, spi_dec_reset_reserved, priv);
+          g_source_set_name_by_id (priv->reserved_reset_timeout, "[at-spi2-core] spi_dec_reset_reserved");
+        }
+      if (modmask)
+        *modmask = 0;
+      return keycode;
+    }
+  if (modmask)
+    *modmask = keysym_mod_mask (keysym, keycode);
+  return keycode;
 }
 
-static void
-spi_dec_set_unlatch_pending (SpiDEController *controller, unsigned mask)
-{
-  SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
-#ifdef SPI_XKB_DEBUG
-  if (priv->xkb_latch_mask) fprintf (stderr, "unlatch pending! %x\n", 
-                                    priv->xkb_latch_mask);
-#endif
-  priv->pending_xkb_mod_relatch_mask |= priv->xkb_latch_mask; 
-}
 static gboolean
 spi_dec_button_update_and_emit (SpiDEController *controller,
-                               guint mask_return)
+                                guint mask_return)
 {
-  Accessibility_DeviceEvent mouse_e;
   gchar event_detail[3];
-  gboolean is_consumed = FALSE;
 
   if ((mask_return & mouse_button_mask) !=
-      (mouse_mask_state & mouse_button_mask)) 
+      (mouse_mask_state & mouse_button_mask))
     {
       int button_number = 0;
       gboolean is_down = False;
-      
+
       if (!(mask_return & Button1Mask) &&
-         (mouse_mask_state & Button1Mask)) 
-       {
-         mouse_mask_state &= ~Button1Mask;
-         button_number = 1;
-       } 
+          (mouse_mask_state & Button1Mask))
+        {
+          mouse_mask_state &= ~Button1Mask;
+          button_number = 1;
+        }
       else if ((mask_return & Button1Mask) &&
-              !(mouse_mask_state & Button1Mask)) 
-       {
-         mouse_mask_state |= Button1Mask;
-         button_number = 1;
-         is_down = True;
-       } 
+               !(mouse_mask_state & Button1Mask))
+        {
+          mouse_mask_state |= Button1Mask;
+          button_number = 1;
+          is_down = True;
+        }
       else if (!(mask_return & Button2Mask) &&
-              (mouse_mask_state & Button2Mask)) 
-       {
-         mouse_mask_state &= ~Button2Mask;
-         button_number = 2;
-       } 
+               (mouse_mask_state & Button2Mask))
+        {
+          mouse_mask_state &= ~Button2Mask;
+          button_number = 2;
+        }
       else if ((mask_return & Button2Mask) &&
-              !(mouse_mask_state & Button2Mask)) 
-       {
-         mouse_mask_state |= Button2Mask;
-         button_number = 2;
-         is_down = True;
-       } 
+               !(mouse_mask_state & Button2Mask))
+        {
+          mouse_mask_state |= Button2Mask;
+          button_number = 2;
+          is_down = True;
+        }
       else if (!(mask_return & Button3Mask) &&
-              (mouse_mask_state & Button3Mask)) 
-       {
-         mouse_mask_state &= ~Button3Mask;
-         button_number = 3;
-       } 
+               (mouse_mask_state & Button3Mask))
+        {
+          mouse_mask_state &= ~Button3Mask;
+          button_number = 3;
+        }
       else if ((mask_return & Button3Mask) &&
-              !(mouse_mask_state & Button3Mask)) 
-       {
-         mouse_mask_state |= Button3Mask;
-         button_number = 3;
-         is_down = True;
-       } 
+               !(mouse_mask_state & Button3Mask))
+        {
+          mouse_mask_state |= Button3Mask;
+          button_number = 3;
+          is_down = True;
+        }
       else if (!(mask_return & Button4Mask) &&
-              (mouse_mask_state & Button4Mask)) 
-       {
-         mouse_mask_state &= ~Button4Mask;
-         button_number = 4;
-       } 
+               (mouse_mask_state & Button4Mask))
+        {
+          mouse_mask_state &= ~Button4Mask;
+          button_number = 4;
+        }
       else if ((mask_return & Button4Mask) &&
-              !(mouse_mask_state & Button4Mask)) 
-       {
-         mouse_mask_state |= Button4Mask;
-         button_number = 4;
-         is_down = True;
-       } 
+               !(mouse_mask_state & Button4Mask))
+        {
+          mouse_mask_state |= Button4Mask;
+          button_number = 4;
+          is_down = True;
+        }
       else if (!(mask_return & Button5Mask) &&
-              (mouse_mask_state & Button5Mask)) 
-       {
-         mouse_mask_state &= ~Button5Mask;
-         button_number = 5;
-       }
+               (mouse_mask_state & Button5Mask))
+        {
+          mouse_mask_state &= ~Button5Mask;
+          button_number = 5;
+        }
       else if ((mask_return & Button5Mask) &&
-              !(mouse_mask_state & Button5Mask)) 
-       {
-         mouse_mask_state |= Button5Mask;
-         button_number = 5;
-         is_down = True;
-       }
-      if (button_number) {
-#ifdef SPI_DEBUG                 
-       fprintf (stderr, "Button %d %s\n",
-                button_number, (is_down) ? "Pressed" : "Released");
+               !(mouse_mask_state & Button5Mask))
+        {
+          mouse_mask_state |= Button5Mask;
+          button_number = 5;
+          is_down = True;
+        }
+      if (button_number)
+        {
+#ifdef SPI_DEBUG
+          fprintf (stderr, "Button %d %s\n",
+                   button_number, (is_down) ? "Pressed" : "Released");
 #endif
-       snprintf (event_detail, 3, "%d%c", button_number,
-                 (is_down) ? 'p' : 'r');
-       /* TODO: FIXME distinguish between physical and 
-        * logical buttons 
-        */
-       mouse_e.type      = (is_down) ? 
-         Accessibility_BUTTON_PRESSED_EVENT :
-         Accessibility_BUTTON_RELEASED_EVENT;
-       mouse_e.id        = button_number;
-       mouse_e.hw_code   = button_number;
-       mouse_e.modifiers = (dbus_uint16_t) mouse_mask_state; 
-       mouse_e.timestamp = 0;
-       mouse_e.event_string = "";
-       mouse_e.is_text   = FALSE;
-       is_consumed = 
-         spi_controller_notify_mouselisteners (controller, 
-                                               &mouse_e);
-       if (!is_consumed)
-         {
-           dbus_uint32_t x = last_mouse_pos->x, y = last_mouse_pos->y;
-           spi_dec_dbus_emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Button", event_detail, x, y);
-         }
-       else
-         spi_dec_set_unlatch_pending (controller, mask_return);
-      }
+          snprintf (event_detail, 3, "%d%c", button_number,
+                    (is_down) ? 'p' : 'r');
+          dbus_uint32_t x = last_mouse_pos->x, y = last_mouse_pos->y;
+          spi_dec_dbus_emit (controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Button", event_detail, x, y);
+        }
       return TRUE;
     }
   else
@@ -375,10 +351,12 @@ spi_dec_button_update_and_emit (SpiDEController *controller,
 }
 
 static guint
-spi_dec_x11_mouse_check (SpiDEController *controller, 
-                    int *x, int *y, gboolean *moved)
+spi_dec_x11_mouse_check (SpiDEController *controller,
+                         int *x,
+                         int *y,
+                         gboolean *moved)
 {
-  int win_x_return,win_y_return;
+  int win_x_return, win_y_return;
   unsigned int mask_return;
   Window root_return, child_return;
   Display *display = spi_get_display ();
@@ -388,30 +366,31 @@ spi_dec_x11_mouse_check (SpiDEController *controller,
       return 0;
     }
 
-  XQueryPointer(display, DefaultRootWindow (display),
-                &root_return, &child_return,
-                x, y,
-                &win_x_return, &win_y_return, &mask_return);
-  /* 
+  XQueryPointer (display, DefaultRootWindow (display),
+                 &root_return, &child_return,
+                 x, y,
+                 &win_x_return, &win_y_return, &mask_return);
+  /*
    * Since many clients grab the pointer, and X goes an automatic
    * pointer grab on mouse-down, we often must detect mouse button events
-   * by polling rather than via a button grab. 
-   * The while loop (rather than if) is used since it's possible that 
+   * by polling rather than via a button grab.
+   * The while loop (rather than if) is used since it's possible that
    * multiple buttons have changed state since we last checked.
    */
-  if (mask_return != mouse_mask_state) 
+  if (mask_return != mouse_mask_state)
     {
-      while (spi_dec_button_update_and_emit (controller, mask_return));
+      while (spi_dec_button_update_and_emit (controller, mask_return))
+        ;
     }
 
-  if (*x != last_mouse_pos->x || *y != last_mouse_pos->y) 
+  if (*x != last_mouse_pos->x || *y != last_mouse_pos->y)
     {
       // TODO: combine these two signals?
       dbus_uint32_t ix = *x, iy = *y;
-      spi_dec_dbus_emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Abs", "", ix, iy);
+      spi_dec_dbus_emit (controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Abs", "", ix, iy);
       ix -= last_mouse_pos->x;
       iy -= last_mouse_pos->y;
-      spi_dec_dbus_emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Rel", "", ix, iy);
+      spi_dec_dbus_emit (controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Rel", "", ix, iy);
       last_mouse_pos->x = *x;
       last_mouse_pos->y = *y;
       *moved = True;
@@ -428,40 +407,15 @@ spi_dec_x11_mouse_check (SpiDEController *controller,
 static int
 spi_dec_ungrab_mouse (gpointer data)
 {
-       Display *display = spi_get_display ();
-       if (display)
-         {
-           XUngrabButton (spi_get_display (), AnyButton, AnyModifier,
-                          XDefaultRootWindow (spi_get_display ()));
-         }
-       return FALSE;
-}
-#endif
-
-static void
-spi_dec_init_mouse_listener (SpiDEController *dec)
-{
-#ifdef GRAB_BUTTON
   Display *display = spi_get_display ();
-
   if (display)
     {
-      if (XGrabButton (display, AnyButton, AnyModifier,
-                      spi_get_root_window (),
-                      True, ButtonPressMask | ButtonReleaseMask,
-                      GrabModeSync, GrabModeAsync, None, None) != Success) {
-#ifdef SPI_DEBUG
-       fprintf (stderr, "WARNING: could not grab mouse buttons!\n");
-#endif
-       ;
-      }
-      XSync (display, False);
-#ifdef SPI_DEBUG
-      fprintf (stderr, "mouse buttons grabbed\n");
-#endif
+      XUngrabButton (spi_get_display (), AnyButton, AnyModifier,
+                     XDefaultRootWindow (spi_get_display ()));
     }
-#endif
+  return FALSE;
 }
+#endif
 
 static void
 spi_dec_clear_unlatch_pending (SpiDEController *controller)
@@ -472,87 +426,63 @@ spi_dec_clear_unlatch_pending (SpiDEController *controller)
 
 static void
 spi_device_event_controller_forward_mouse_event (SpiDEController *controller,
-                                                XEvent *xevent)
+                                                 XEvent *xevent)
 {
-  Accessibility_DeviceEvent mouse_e;
   gchar event_detail[3];
-  gboolean is_consumed = FALSE;
-  gboolean xkb_mod_unlatch_occurred;
   XButtonEvent *xbutton_event = (XButtonEvent *) xevent;
   dbus_uint32_t ix, iy;
 
   int button = xbutton_event->button;
-  
+
   unsigned int mouse_button_state = xbutton_event->state;
 
   switch (button)
     {
     case 1:
-           mouse_button_state |= Button1Mask;
-           break;
+      mouse_button_state |= Button1Mask;
+      break;
     case 2:
-           mouse_button_state |= Button2Mask;
-           break;
+      mouse_button_state |= Button2Mask;
+      break;
     case 3:
-           mouse_button_state |= Button3Mask;
-           break;
+      mouse_button_state |= Button3Mask;
+      break;
     case 4:
-           mouse_button_state |= Button4Mask;
-           break;
+      mouse_button_state |= Button4Mask;
+      break;
     case 5:
-           mouse_button_state |= Button5Mask;
-           break;
+      mouse_button_state |= Button5Mask;
+      break;
     }
 
   last_mouse_pos->x = ((XButtonEvent *) xevent)->x_root;
   last_mouse_pos->y = ((XButtonEvent *) xevent)->y_root;
 
-#ifdef SPI_DEBUG  
+#ifdef SPI_DEBUG
   fprintf (stderr, "mouse button %d %s (%x)\n",
-          xbutton_event->button, 
-          (xevent->type == ButtonPress) ? "Press" : "Release",
-          mouse_button_state);
+           xbutton_event->button,
+           (xevent->type == ButtonPress) ? "Press" : "Release",
+           mouse_button_state);
 #endif
   snprintf (event_detail, 3, "%d%c", button,
-           (xevent->type == ButtonPress) ? 'p' : 'r');
-
-  /* TODO: FIXME distinguish between physical and logical buttons */
-  mouse_e.type      = (xevent->type == ButtonPress) ? 
-                      Accessibility_BUTTON_PRESSED_EVENT :
-                      Accessibility_BUTTON_RELEASED_EVENT;
-  mouse_e.id        = button;
-  mouse_e.hw_code   = button;
-  mouse_e.modifiers = (dbus_uint16_t) xbutton_event->state;
-  mouse_e.timestamp = (dbus_uint32_t) xbutton_event->time;
-  mouse_e.event_string = "";
-  mouse_e.is_text   = FALSE;
-  if ((mouse_button_state & mouse_button_mask) != 
-       (mouse_mask_state & mouse_button_mask))
-    { 
+            (xevent->type == ButtonPress) ? 'p' : 'r');
+
+  if ((mouse_button_state & mouse_button_mask) !=
+      (mouse_mask_state & mouse_button_mask))
+    {
       if ((mouse_mask_state & key_modifier_mask) !=
-         (mouse_button_state & key_modifier_mask))
-       spi_dec_x11_emit_modifier_event (controller, 
-                                    mouse_mask_state, mouse_button_state);
+          (mouse_button_state & key_modifier_mask))
+        spi_dec_x11_emit_modifier_event (controller,
+                                         mouse_mask_state, mouse_button_state);
       mouse_mask_state = mouse_button_state;
-      is_consumed = 
-       spi_controller_notify_mouselisteners (controller, &mouse_e);
       ix = last_mouse_pos->x;
       iy = last_mouse_pos->y;
-      spi_dec_dbus_emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Button", event_detail, ix, iy);
+      spi_dec_dbus_emit (controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "Button", event_detail, ix, iy);
     }
 
-  xkb_mod_unlatch_occurred = (xevent->type == ButtonPress ||
-                             xevent->type == ButtonRelease);
-  
-  /* if client wants to consume this event, and XKB latch state was
-   *   unset by this button event, we reset it
-   */
-  if (is_consumed && xkb_mod_unlatch_occurred)
-    spi_dec_set_unlatch_pending (controller, mouse_mask_state);
-  
   XAllowEvents (spi_get_display (),
-               (is_consumed) ? SyncPointer : ReplayPointer,
-               CurrentTime);
+                ReplayPointer,
+                CurrentTime);
 }
 
 static void
@@ -572,7 +502,7 @@ global_filter_fn (XEvent *xevent, void *data)
           gboolean is_consumed;
 
           is_consumed =
-            spi_device_event_controller_forward_key_event (controller, xevent);
+              spi_device_event_controller_forward_key_event (controller, xevent);
 
           if (is_consumed)
             {
@@ -587,10 +517,10 @@ global_filter_fn (XEvent *xevent, void *data)
               for (i = 0; i < n_events; i++)
                 {
                   XNextEvent (display, &next_event);
-                 if (next_event.type != KeyPress &&
-                     next_event.type != KeyRelease)
-                       g_warning ("Unexpected event type %d in queue", next_event.type);
-                 }
+                  if (next_event.type != KeyPress &&
+                      next_event.type != KeyRelease)
+                    g_warning ("Unexpected event type %d in queue", next_event.type);
+                }
 
               XAllowEvents (display, AsyncKeyboard, CurrentTime);
               if (n_events)
@@ -612,84 +542,91 @@ global_filter_fn (XEvent *xevent, void *data)
     }
   if (xevent->type == priv->xkb_base_event_code)
     {
-      XkbAnyEvent * xkb_ev = (XkbAnyEvent *) xevent;
+      XkbAnyEvent *xkb_ev = (XkbAnyEvent *) xevent;
       /* ugly but probably necessary...*/
       XSynchronize (display, TRUE);
 
       if (xkb_ev->xkb_type == XkbStateNotify)
         {
-         XkbStateNotifyEvent *xkb_snev =
-                 (XkbStateNotifyEvent *) xkb_ev;
-         /* check the mouse, to catch mouse events grabbed by
-          * another client; in case we should revert this XKB delatch 
-          */
-         if (!priv->pending_xkb_mod_relatch_mask)
-           {
-             int x, y;
-             gboolean moved;
-             spi_dec_x11_mouse_check (controller, &x, &y, &moved);
-           }
-         /* we check again, since the previous call may have 
-            changed this flag */
-         if (priv->pending_xkb_mod_relatch_mask)
-           {
-             unsigned int feedback_mask;
+          XkbStateNotifyEvent *xkb_snev =
+              (XkbStateNotifyEvent *) xkb_ev;
+          /* check the mouse, to catch mouse events grabbed by
+           * another client; in case we should revert this XKB delatch
+           */
+          if (!priv->pending_xkb_mod_relatch_mask)
+            {
+              int x, y;
+              gboolean moved;
+              spi_dec_x11_mouse_check (controller, &x, &y, &moved);
+            }
+          /* we check again, since the previous call may have
+             changed this flag */
+          if (priv->pending_xkb_mod_relatch_mask)
+            {
+              unsigned int feedback_mask;
 #ifdef SPI_XKB_DEBUG
-             fprintf (stderr, "relatching %x\n",
-                      priv->pending_xkb_mod_relatch_mask);
+              fprintf (stderr, "relatching %x\n",
+                       priv->pending_xkb_mod_relatch_mask);
 #endif
-             /* temporarily turn off the latch bell, if it's on */
-             XkbGetControls (display,
-                             XkbAccessXFeedbackMask,
-                             priv->xkb_desc);
-             feedback_mask = priv->xkb_desc->ctrls->ax_options;
-             if (feedback_mask & XkbAX_StickyKeysFBMask)
-             {
-               XkbControlsChangesRec changes = {XkbAccessXFeedbackMask,
-                                                0, False};      
-               priv->xkb_desc->ctrls->ax_options
-                             &= ~(XkbAX_StickyKeysFBMask);
-               XkbChangeControls (display, priv->xkb_desc, &changes);
-             }
-             /* TODO: account for lock as well as latch */
-             XkbLatchModifiers (display,
-                                XkbUseCoreKbd,
-                                priv->pending_xkb_mod_relatch_mask,
-                                priv->pending_xkb_mod_relatch_mask);
-             if (feedback_mask & XkbAX_StickyKeysFBMask)
-             { 
-               XkbControlsChangesRec changes = {XkbAccessXFeedbackMask,
-                                                0, False};      
-               priv->xkb_desc->ctrls->ax_options = feedback_mask;
-               XkbChangeControls (display, priv->xkb_desc, &changes);
-             }
+              /* temporarily turn off the latch bell, if it's on */
+              XkbGetControls (display,
+                              XkbAccessXFeedbackMask,
+                              priv->xkb_desc);
+              feedback_mask = priv->xkb_desc->ctrls->ax_options;
+              if (feedback_mask & XkbAX_StickyKeysFBMask)
+                {
+                  XkbControlsChangesRec changes = { XkbAccessXFeedbackMask,
+                                                    0, False };
+                  priv->xkb_desc->ctrls->ax_options &= ~(XkbAX_StickyKeysFBMask);
+                  XkbChangeControls (display, priv->xkb_desc, &changes);
+                }
+              /* TODO: account for lock as well as latch */
+              XkbLatchModifiers (display,
+                                 XkbUseCoreKbd,
+                                 priv->pending_xkb_mod_relatch_mask,
+                                 priv->pending_xkb_mod_relatch_mask);
+              if (feedback_mask & XkbAX_StickyKeysFBMask)
+                {
+                  XkbControlsChangesRec changes = { XkbAccessXFeedbackMask,
+                                                    0, False };
+                  priv->xkb_desc->ctrls->ax_options = feedback_mask;
+                  XkbChangeControls (display, priv->xkb_desc, &changes);
+                }
 #ifdef SPI_XKB_DEBUG
-             fprintf (stderr, "relatched %x\n",
-                      priv->pending_xkb_mod_relatch_mask);
+              fprintf (stderr, "relatched %x\n",
+                       priv->pending_xkb_mod_relatch_mask);
 #endif
-             priv->pending_xkb_mod_relatch_mask = 0;
-           }
-         else
-           {
-             priv->xkb_latch_mask = xkb_snev->latched_mods;
-           }
-       }
+              priv->pending_xkb_mod_relatch_mask = 0;
+            }
+          else
+            {
+              priv->xkb_latch_mask = xkb_snev->latched_mods;
+            }
+        }
       XSynchronize (display, FALSE);
     }
-  
+
   return;
 }
 
+static gboolean
+spi_clear_error_state (void)
+{
+  gboolean retval = spi_error_code != 0;
+  spi_error_code = 0;
+  return retval;
+}
+
 static int
 _spi_controller_device_error_handler (Display *display, XErrorEvent *error)
 {
-  if (error->error_code == BadAccess) 
-    {  
+  if (error->error_code == BadAccess)
+    {
       g_message ("Could not complete key grab: grab already in use.\n");
       spi_error_code = BadAccess;
       return 0;
     }
-  else 
+  else
     {
       return (*x_default_error_handler) (display, error);
     }
@@ -701,7 +638,7 @@ spi_controller_register_with_devices (SpiDEController *controller)
   SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
   int event_base, error_base, major_version, minor_version;
 
-  if (XTestQueryExtension (spi_get_display(), &event_base, &error_base, &major_version, &minor_version))
+  if (XTestQueryExtension (spi_get_display (), &event_base, &error_base, &major_version, &minor_version))
     {
       XTestGrabControl (spi_get_display (), True);
     }
@@ -711,71 +648,71 @@ spi_controller_register_with_devices (SpiDEController *controller)
   /* register with: (translated) keystroke handler */
 
   priv->have_xkb = XkbQueryExtension (spi_get_display (),
-                                     &priv->xkb_major_extension_opcode,
-                                     &priv->xkb_base_event_code,
-                                     &priv->xkb_base_error_code, NULL, NULL);
+                                      &priv->xkb_major_extension_opcode,
+                                      &priv->xkb_base_event_code,
+                                      &priv->xkb_base_error_code, NULL, NULL);
   if (priv->have_xkb)
     {
       gint i;
       guint64 reserved = 0;
       priv->xkb_desc = XkbGetMap (spi_get_display (), XkbKeySymsMask, XkbUseCoreKbd);
       XkbSelectEvents (spi_get_display (),
-                      XkbUseCoreKbd,
-                      XkbStateNotifyMask, XkbStateNotifyMask);     
-      _numlock_physical_mask = XkbKeysymToModifiers (spi_get_display (), 
-                                                    XK_Num_Lock);
+                       XkbUseCoreKbd,
+                       XkbStateNotifyMask, XkbStateNotifyMask);
+      _numlock_physical_mask = XkbKeysymToModifiers (spi_get_display (),
+                                                     XK_Num_Lock);
       for (i = priv->xkb_desc->max_key_code; i >= priv->xkb_desc->min_key_code; --i)
-      {
-         if (priv->xkb_desc->map->key_sym_map[i].kt_index[0] == XkbOneLevelIndex)
-         { 
-             if (XkbKeycodeToKeysym (spi_get_display (), i, 0, 0) != 0)
-             {
-                 /* don't use this one if there's a grab client! */
-
-                 /* Runtime errors are generated from these functions,
-                  * that are then quashed. Equivalent to:
-                  * try
-                  *   {Blah}
-                  * except
-                  *   {;}
-                  */
-
-                 spi_x_error_trap ();
-                 XGrabKey (spi_get_display (), i, 0, 
-                           spi_get_root_window (),
-                           TRUE,
-                           GrabModeSync, GrabModeSync);
-                 XSync (spi_get_display (), TRUE);
-                 XUngrabKey (spi_get_display (), i, 0, 
-                             spi_get_root_window ());
-                 if (!spi_x_error_release ())
-                 {
-                     reserved = i;
-                     break;
-                 }
-             }
-         }
-      }
-      if (reserved) 
-      {
-         priv->reserved_keycode = reserved;
-         priv->reserved_keysym = XkbKeycodeToKeysym (spi_get_display (), reserved, 0, 0);
-      }
+        {
+          if (priv->xkb_desc->map->key_sym_map[i].kt_index[0] == XkbOneLevelIndex)
+            {
+              if (XkbKeycodeToKeysym (spi_get_display (), i, 0, 0) != 0)
+                {
+                  /* don't use this one if there's a grab client! */
+
+                  /* Runtime errors are generated from these functions,
+                   * that are then quashed. Equivalent to:
+                   * try
+                   *   {Blah}
+                   * except
+                   *   {;}
+                   */
+
+                  spi_x_error_trap ();
+                  XGrabKey (spi_get_display (), i, 0,
+                            spi_get_root_window (),
+                            TRUE,
+                            GrabModeSync, GrabModeSync);
+                  XSync (spi_get_display (), TRUE);
+                  XUngrabKey (spi_get_display (), i, 0,
+                              spi_get_root_window ());
+                  if (!spi_x_error_release ())
+                    {
+                      reserved = i;
+                      break;
+                    }
+                }
+            }
+        }
+      if (reserved)
+        {
+          priv->reserved_keycode = reserved;
+          priv->reserved_keysym = XkbKeycodeToKeysym (spi_get_display (), reserved, 0, 0);
+        }
       else
-      { 
-         priv->reserved_keycode = XKeysymToKeycode (spi_get_display (), XK_numbersign);
-         priv->reserved_keysym = XK_numbersign;
-      }
+        {
+          priv->reserved_keycode = XKeysymToKeycode (spi_get_display (), XK_numbersign);
+          priv->reserved_keysym = XK_numbersign;
+        }
 #ifdef SPI_RESERVED_DEBUG
       unsigned sym = 0;
       sym = XKeycodeToKeysym (spi_get_display (), reserved, 0);
       fprintf (stderr, "%x\n", sym);
-      fprintf (stderr, "setting the reserved keycode to %d (%s)\n", 
-              reserved, 
-              XKeysymToString (XKeycodeToKeysym (spi_get_display (),
-                                                            reserved, 0)));
+      fprintf (stderr, "setting the reserved keycode to %d (%s)\n",
+               reserved,
+               XKeysymToString (XKeycodeToKeysym (spi_get_display (),
+                                                  reserved, 0)));
 #endif
-    }  
+    }
 
   spi_set_filter (global_filter_fn, controller);
   spi_set_events (KeyPressMask | KeyReleaseMask);
@@ -789,11 +726,11 @@ spi_keystroke_from_x_key_event (XKeyEvent *x_key_event)
   Accessibility_DeviceEvent key_event;
   KeySym keysym;
   const int cbuf_bytes = 20;
-  char cbuf [21];
+  char cbuf[21];
   int nbytes;
 
-  nbytes = XLookupString (x_key_event, cbuf, cbuf_bytes, &keysym, NULL);  
-  key_event.id = (dbus_int32_t)(keysym);
+  nbytes = XLookupString (x_key_event, cbuf, cbuf_bytes, &keysym, NULL);
+  key_event.id = (dbus_int32_t) (keysym);
   key_event.hw_code = (dbus_int16_t) x_key_event->keycode;
   if (((XEvent *) x_key_event)->type == KeyPress)
     {
@@ -802,109 +739,109 @@ spi_keystroke_from_x_key_event (XKeyEvent *x_key_event)
   else
     {
       key_event.type = Accessibility_KEY_RELEASED_EVENT;
-    } 
-  key_event.modifiers = (dbus_uint16_t)(x_key_event->state);
+    }
+  key_event.modifiers = (dbus_uint16_t) (x_key_event->state);
   key_event.is_text = FALSE;
   switch (keysym)
     {
-      case ' ':
-        key_event.event_string = g_strdup ("space");
-        break;
-      case XK_Tab:
-        key_event.event_string = g_strdup ("Tab");
-       break;
-      case XK_BackSpace:
-        key_event.event_string = g_strdup ("Backspace");
-       break;
-      case XK_Return:
-        key_event.event_string = g_strdup ("Return");
-       break;
-      case XK_Home:
-        key_event.event_string = g_strdup ("Home");
-       break;
-      case XK_Page_Down:
-        key_event.event_string = g_strdup ("Page_Down");
-       break;
-      case XK_Page_Up:
-        key_event.event_string = g_strdup ("Page_Up");
-       break;
-      case XK_F1:
-        key_event.event_string = g_strdup ("F1");
-       break;
-      case XK_F2:
-        key_event.event_string = g_strdup ("F2");
-       break;
-      case XK_F3:
-        key_event.event_string = g_strdup ("F3");
-       break;
-      case XK_F4:
-        key_event.event_string = g_strdup ("F4");
-       break;
-      case XK_F5:
-        key_event.event_string = g_strdup ("F5");
-       break;
-      case XK_F6:
-        key_event.event_string = g_strdup ("F6");
-       break;
-      case XK_F7:
-        key_event.event_string = g_strdup ("F7");
-       break;
-      case XK_F8:
-        key_event.event_string = g_strdup ("F8");
-       break;
-      case XK_F9:
-        key_event.event_string = g_strdup ("F9");
-       break;
-      case XK_F10:
-        key_event.event_string = g_strdup ("F10");
-       break;
-      case XK_F11:
-        key_event.event_string = g_strdup ("F11");
-       break;
-      case XK_F12:
-        key_event.event_string = g_strdup ("F12");
-       break;
-      case XK_End:
-        key_event.event_string = g_strdup ("End");
-       break;
-      case XK_Escape:
-        key_event.event_string = g_strdup ("Escape");
-       break;
-      case XK_Up:
-        key_event.event_string = g_strdup ("Up");
-       break;
-      case XK_Down:
-        key_event.event_string = g_strdup ("Down");
-       break;
-      case XK_Left:
-        key_event.event_string = g_strdup ("Left");
-       break;
-      case XK_Right:
-        key_event.event_string = g_strdup ("Right");
-       break;
-      default:
-        if (nbytes > 0)
-          {
-           gunichar c;
-           cbuf[nbytes] = '\0'; /* OK since length is cbuf_bytes+1 */
-            key_event.event_string = g_strdup (cbuf);
-           c = keysym2ucs (keysym);
-           if (c > 0 && !g_unichar_iscntrl (c))
-             {
-               key_event.is_text = TRUE; 
-               /* incorrect for some composed chars? */
-             }
-          }
-        else
-          {
-            key_event.event_string = g_strdup ("");
-          }
+    case ' ':
+      key_event.event_string = g_strdup ("space");
+      break;
+    case XK_Tab:
+      key_event.event_string = g_strdup ("Tab");
+      break;
+    case XK_BackSpace:
+      key_event.event_string = g_strdup ("Backspace");
+      break;
+    case XK_Return:
+      key_event.event_string = g_strdup ("Return");
+      break;
+    case XK_Home:
+      key_event.event_string = g_strdup ("Home");
+      break;
+    case XK_Page_Down:
+      key_event.event_string = g_strdup ("Page_Down");
+      break;
+    case XK_Page_Up:
+      key_event.event_string = g_strdup ("Page_Up");
+      break;
+    case XK_F1:
+      key_event.event_string = g_strdup ("F1");
+      break;
+    case XK_F2:
+      key_event.event_string = g_strdup ("F2");
+      break;
+    case XK_F3:
+      key_event.event_string = g_strdup ("F3");
+      break;
+    case XK_F4:
+      key_event.event_string = g_strdup ("F4");
+      break;
+    case XK_F5:
+      key_event.event_string = g_strdup ("F5");
+      break;
+    case XK_F6:
+      key_event.event_string = g_strdup ("F6");
+      break;
+    case XK_F7:
+      key_event.event_string = g_strdup ("F7");
+      break;
+    case XK_F8:
+      key_event.event_string = g_strdup ("F8");
+      break;
+    case XK_F9:
+      key_event.event_string = g_strdup ("F9");
+      break;
+    case XK_F10:
+      key_event.event_string = g_strdup ("F10");
+      break;
+    case XK_F11:
+      key_event.event_string = g_strdup ("F11");
+      break;
+    case XK_F12:
+      key_event.event_string = g_strdup ("F12");
+      break;
+    case XK_End:
+      key_event.event_string = g_strdup ("End");
+      break;
+    case XK_Escape:
+      key_event.event_string = g_strdup ("Escape");
+      break;
+    case XK_Up:
+      key_event.event_string = g_strdup ("Up");
+      break;
+    case XK_Down:
+      key_event.event_string = g_strdup ("Down");
+      break;
+    case XK_Left:
+      key_event.event_string = g_strdup ("Left");
+      break;
+    case XK_Right:
+      key_event.event_string = g_strdup ("Right");
+      break;
+    default:
+      if (nbytes > 0)
+        {
+          gunichar c;
+          cbuf[nbytes] = '\0'; /* OK since length is cbuf_bytes+1 */
+          key_event.event_string = g_strdup (cbuf);
+          c = keysym2ucs (keysym);
+          if (c > 0 && !g_unichar_iscntrl (c))
+            {
+              key_event.is_text = TRUE;
+              /* incorrect for some composed chars? */
+            }
+        }
+      else
+        {
+          key_event.event_string = g_strdup ("");
+        }
     }
 
   key_event.timestamp = (dbus_uint32_t) x_key_event->time;
 #ifdef SPI_KEYEVENT_DEBUG
   {
-    char *pressed_str  = "pressed";
+    char *pressed_str = "pressed";
     char *released_str = "released";
     char *state_ptr;
 
@@ -912,26 +849,25 @@ spi_keystroke_from_x_key_event (XKeyEvent *x_key_event)
       state_ptr = pressed_str;
     else
       state_ptr = released_str;
+
     fprintf (stderr,
-            "Key %lu %s (%c), modifiers %d; string=%s [%x] %s\n",
-            (unsigned long) keysym,
-            state_ptr,
-            keysym ? (int) keysym : '*',
-            (int) x_key_event->state,
-            key_event.event_string,
-            key_event.event_string[0],
-            (key_event.is_text == TRUE) ? "(text)" : "(not text)");
+             "Key %lu %s (%c), modifiers %d; string=%s [%x] %s\n",
+             (unsigned long) keysym,
+             state_ptr,
+             keysym ? (int) keysym : '*',
+             (int) x_key_event->state,
+             key_event.event_string,
+             key_event.event_string[0],
+             (key_event.is_text == TRUE) ? "(text)" : "(not text)");
   }
 #endif
 #ifdef SPI_DEBUG
   fprintf (stderr, "%s%c\n",
-     (x_key_event->state & Mod1Mask)?"Alt-":"",
-     ((x_key_event->state & ShiftMask)^(x_key_event->state & LockMask))?
-     g_ascii_toupper (keysym) : g_ascii_tolower (keysym));
+           (x_key_event->state & Mod1Mask) ? "Alt-" : "",
+           ((x_key_event->state & ShiftMask) ^ (x_key_event->state & LockMask)) ? g_ascii_toupper (keysym) : g_ascii_tolower (keysym));
   fprintf (stderr, "serial: %x Time: %x\n", x_key_event->serial, x_key_event->time);
 #endif /* SPI_DEBUG */
-  return key_event;    
+  return key_event;
 }
 
 static gboolean
@@ -940,12 +876,12 @@ spi_dec_x11_grab_key (SpiDEController *controller,
                       Accessibility_ControllerEventMask mod_mask)
 {
   XGrabKey (spi_get_display (),
-           key_val,
-           mod_mask,
-           spi_get_root_window (),
-           True,
-           GrabModeSync,
-           GrabModeSync);
+            key_val,
+            mod_mask,
+            spi_get_root_window (),
+            True,
+            GrabModeSync,
+            GrabModeSync);
   XSync (spi_get_display (), False);
   return spi_clear_error_state ();
 }
@@ -956,9 +892,9 @@ spi_dec_x11_ungrab_key (SpiDEController *controller,
                         Accessibility_ControllerEventMask mod_mask)
 {
   XUngrabKey (spi_get_display (),
-             key_val,
-             mod_mask,
-             spi_get_root_window ());
+              key_val,
+              mod_mask,
+              spi_get_root_window ());
 }
 
 static unsigned int
@@ -967,26 +903,26 @@ xkb_get_slowkeys_delay (SpiDEController *controller)
   unsigned int retval = 0;
   SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
 #ifdef HAVE_XKB
-#ifdef XKB_HAS_GET_SLOW_KEYS_DELAY     
+#ifdef XKB_HAS_GET_SLOW_KEYS_DELAY
   retval = XkbGetSlowKeysDelay (spi_get_display (),
-                               XkbUseCoreKbd, &bounce_delay);
+                                XkbUseCoreKbd, &bounce_delay);
 #else
   if (!(priv->xkb_desc == (XkbDescPtr) BadAlloc || priv->xkb_desc == NULL))
     {
       Status s = XkbGetControls (spi_get_display (),
-                                XkbAllControlsMask, priv->xkb_desc);
+                                 XkbAllControlsMask, priv->xkb_desc);
       if (s == Success)
         {
-        if (priv->xkb_desc->ctrls->enabled_ctrls & XkbSlowKeysMask)
-                retval = priv->xkb_desc->ctrls->slow_keys_delay;
-       }
+          if (priv->xkb_desc->ctrls->enabled_ctrls & XkbSlowKeysMask)
+            retval = priv->xkb_desc->ctrls->slow_keys_delay;
+        }
     }
 #endif
 #endif
 #ifdef SPI_XKB_DEBUG
-       fprintf (stderr, "SlowKeys delay: %d\n", (int) retval);
+  fprintf (stderr, "SlowKeys delay: %d\n", (int) retval);
 #endif
-        return retval;
+  return retval;
 }
 
 static unsigned int
@@ -995,19 +931,19 @@ xkb_get_bouncekeys_delay (SpiDEController *controller)
   unsigned int retval = 0;
   SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
 #ifdef HAVE_XKB
-#ifdef XKB_HAS_GET_BOUNCE_KEYS_DELAY   
+#ifdef XKB_HAS_GET_BOUNCE_KEYS_DELAY
   retval = XkbGetBounceKeysDelay (spi_get_display (),
-                                 XkbUseCoreKbd, &bounce_delay);
+                                  XkbUseCoreKbd, &bounce_delay);
 #else
   if (!(priv->xkb_desc == (XkbDescPtr) BadAlloc || priv->xkb_desc == NULL))
     {
       Status s = XkbGetControls (spi_get_display (),
-                                XkbAllControlsMask, priv->xkb_desc);
+                                 XkbAllControlsMask, priv->xkb_desc);
       if (s == Success)
         {
-         if (priv->xkb_desc->ctrls->enabled_ctrls & XkbBounceKeysMask)
-                 retval = priv->xkb_desc->ctrls->debounce_delay;
-       }
+          if (priv->xkb_desc->ctrls->enabled_ctrls & XkbBounceKeysMask)
+            retval = priv->xkb_desc->ctrls->debounce_delay;
+        }
     }
 #endif
 #endif
@@ -1021,210 +957,223 @@ static gboolean
 spi_dec_x11_synth_keycode_press (SpiDEController *controller,
                                  unsigned int keycode)
 {
-       unsigned int time = CurrentTime;
-       unsigned int bounce_delay;
-#ifdef THIS_IS_BROKEN 
-       unsigned int elapsed_msec;
-       struct timeval tv;
+  unsigned int time = CurrentTime;
+  unsigned int bounce_delay;
+#ifdef THIS_IS_BROKEN
+  unsigned int elapsed_msec;
+  struct timeval tv;
 #endif
-       SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
-
-       spi_x_error_trap ();
-       if (keycode == priv->last_release_keycode)
-       {
-               bounce_delay = xkb_get_bouncekeys_delay (controller); 
-                if (bounce_delay)
-               {
+  SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
+
+  spi_x_error_trap ();
+  if (keycode == priv->last_release_keycode)
+    {
+      bounce_delay = xkb_get_bouncekeys_delay (controller);
+      if (bounce_delay)
+        {
 #ifdef THIS_IS_BROKEN
-                       gettimeofday (&tv, NULL);
-                       elapsed_msec =
-                               (tv.tv_sec - priv->last_release_time.tv_sec) * 1000
-                               + (tv.tv_usec - priv->last_release_time.tv_usec) / 1000;
-# ifdef SPI_XKB_DEBUG
-                       fprintf (stderr, "%d ms elapsed (%ld usec)\n", elapsed_msec,
-                                (long) (tv.tv_usec - priv->last_release_time.tv_usec));
-# endif
-                       if (elapsed_msec < bounce_delay)
-                               time = bounce_delay - elapsed_msec + 1;
+          gettimeofday (&tv, NULL);
+          elapsed_msec =
+              (tv.tv_sec - priv->last_release_time.tv_sec) * 1000 + (tv.tv_usec - priv->last_release_time.tv_usec) / 1000;
+#ifdef SPI_XKB_DEBUG
+          fprintf (stderr, "%d ms elapsed (%ld usec)\n", elapsed_msec,
+                   (long) (tv.tv_usec - priv->last_release_time.tv_usec));
+#endif
+          if (elapsed_msec < bounce_delay)
+            time = bounce_delay - elapsed_msec + 1;
 #else
-                       time = bounce_delay + 10;
-                       /* fudge for broken XTest */
+          time = bounce_delay + 10;
+          /* fudge for broken XTest */
 #endif
-#ifdef SPI_XKB_DEBUG                   
-                       fprintf (stderr, "waiting %d ms\n", time);
+#ifdef SPI_XKB_DEBUG
+          fprintf (stderr, "waiting %d ms\n", time);
 #endif
-               }
-       }
-        XTestFakeKeyEvent (spi_get_display (), keycode, True, time);
-       priv->last_press_keycode = keycode;
-       XFlush (spi_get_display ());
-       XSync (spi_get_display (), False);
-       gettimeofday (&priv->last_press_time, NULL);
-       return TRUE;
+        }
+    }
+  XTestFakeKeyEvent (spi_get_display (), keycode, True, time);
+  priv->last_press_keycode = keycode;
+  XFlush (spi_get_display ());
+  XSync (spi_get_display (), False);
+  gettimeofday (&priv->last_press_time, NULL);
+  return TRUE;
 }
 
 static gboolean
 spi_dec_x11_synth_keycode_release (SpiDEController *controller,
-                          unsigned int keycode)
+                                   unsigned int keycode)
 {
-       unsigned int time = CurrentTime;
-       unsigned int slow_delay;
+  unsigned int time = CurrentTime;
+  unsigned int slow_delay;
 #ifdef THIS_IS_BROKEN_DUNNO_WHY
-       unsigned int elapsed_msec;
-       struct timeval tv;
+  unsigned int elapsed_msec;
+  struct timeval tv;
 #endif
-       SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
-
-       spi_x_error_trap ();
-       if (keycode == priv->last_press_keycode)
-       {
-               slow_delay = xkb_get_slowkeys_delay (controller);
-               if (slow_delay)
-               {
+  SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
+
+  spi_x_error_trap ();
+  if (keycode == priv->last_press_keycode)
+    {
+      slow_delay = xkb_get_slowkeys_delay (controller);
+      if (slow_delay)
+        {
 #ifdef THIS_IS_BROKEN_DUNNO_WHY
-                       gettimeofday (&tv, NULL);
-                       elapsed_msec =
-                               (tv.tv_sec - priv->last_press_time.tv_sec) * 1000
-                               + (tv.tv_usec - priv->last_press_time.tv_usec) / 1000;
-# ifdef SPI_XKB_DEBUG
-                       fprintf (stderr, "%d ms elapsed (%ld usec)\n", elapsed_msec,
-                                (long) (tv.tv_usec - priv->last_press_time.tv_usec));
-# endif
-                       if (elapsed_msec < slow_delay)
-                               time = slow_delay - elapsed_msec + 1;
+          gettimeofday (&tv, NULL);
+          elapsed_msec =
+              (tv.tv_sec - priv->last_press_time.tv_sec) * 1000 + (tv.tv_usec - priv->last_press_time.tv_usec) / 1000;
+#ifdef SPI_XKB_DEBUG
+          fprintf (stderr, "%d ms elapsed (%ld usec)\n", elapsed_msec,
+                   (long) (tv.tv_usec - priv->last_press_time.tv_usec));
+#endif
+          if (elapsed_msec < slow_delay)
+            time = slow_delay - elapsed_msec + 1;
 #else
-                       time = slow_delay + 10;
-                       /* our XTest seems broken, we have to add slop as above */
+          time = slow_delay + 10;
+          /* our XTest seems broken, we have to add slop as above */
 #endif
-#ifdef SPI_XKB_DEBUG                   
-                       fprintf (stderr, "waiting %d ms\n", time);
+#ifdef SPI_XKB_DEBUG
+          fprintf (stderr, "waiting %d ms\n", time);
 #endif
-               }
-       }
-        XTestFakeKeyEvent (spi_get_display (), keycode, False, time);
-       priv->last_release_keycode = keycode;
-       XSync (spi_get_display (), False);
-       gettimeofday (&priv->last_release_time, NULL);
-       return TRUE;
+        }
+    }
+  XTestFakeKeyEvent (spi_get_display (), keycode, False, time);
+  priv->last_release_keycode = keycode;
+  XSync (spi_get_display (), False);
+  gettimeofday (&priv->last_release_time, NULL);
+  return TRUE;
 }
 
 static gboolean
 spi_dec_x11_lock_modifiers (SpiDEController *controller, unsigned modifiers)
 {
-    SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
-    
-    if (priv->have_xkb) {
-        return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd, 
-                                  modifiers, modifiers);
-    } else {
-       int mod_index;
-       if (xmkeymap==NULL)
-         xmkeymap = XGetModifierMapping(spi_get_display ());
-       for (mod_index=0;mod_index<8;mod_index++)
-           if (modifiers & (1<<mod_index))
-               spi_dec_x11_synth_keycode_press(controller, xmkeymap->modifiermap[mod_index]);
-       return TRUE;
+  SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
+
+  if (priv->have_xkb)
+    {
+      return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd,
+                               modifiers, modifiers);
+    }
+  else
+    {
+      int mod_index;
+      if (xmkeymap == NULL)
+        xmkeymap = XGetModifierMapping (spi_get_display ());
+      for (mod_index = 0; mod_index < 8; mod_index++)
+        if (modifiers & (1 << mod_index))
+          spi_dec_x11_synth_keycode_press (controller, xmkeymap->modifiermap[mod_index]);
+      return TRUE;
     }
 }
 
 static gboolean
 spi_dec_x11_unlock_modifiers (SpiDEController *controller, unsigned modifiers)
 {
-    SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
-    
-    if (priv->have_xkb) {
-        return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd, 
-                                  modifiers, 0);
-    } else {
-       int mod_index;
-       if (xmkeymap==NULL)
-         xmkeymap = XGetModifierMapping(spi_get_display ());
-
-       for (mod_index=0;mod_index<8;mod_index++)
-           if (modifiers & (1<<mod_index))
-               spi_dec_x11_synth_keycode_release(controller, xmkeymap->modifiermap[mod_index]);
-       return TRUE;
+  SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
+
+  if (priv->have_xkb)
+    {
+      return XkbLockModifiers (spi_get_display (), XkbUseCoreKbd,
+                               modifiers, 0);
+    }
+  else
+    {
+      int mod_index;
+      if (xmkeymap == NULL)
+        xmkeymap = XGetModifierMapping (spi_get_display ());
+
+      for (mod_index = 0; mod_index < 8; mod_index++)
+        if (modifiers & (1 << mod_index))
+          spi_dec_x11_synth_keycode_release (controller, xmkeymap->modifiermap[mod_index]);
+      return TRUE;
     }
 }
 
 static KeySym
 keysym_for_unichar (SpiDEController *controller, gunichar unichar)
 {
-       return (KeySym) ucs2keysym ((long) unichar);
+  return (KeySym) ucs2keysym ((long) unichar);
 }
 
 static gboolean
 spi_dec_x11_synth_keystring (SpiDEController *controller, guint synth_type, gint keycode, const char *keystring)
 {
-       /* probably we need to create and inject an XIM handler eventually. */
-       /* for now, try to match the string to existing 
-        * keycode+modifier states. 
-         */
-       KeySym *keysyms;
-       gint maxlen = 0;
-       gunichar unichar = 0;
-       gint i = 0;
-       gboolean retval = TRUE;
-       const gchar *c;
-       KeySym keysym;
-
-       if (!(keystring && *keystring && g_utf8_validate (keystring, -1, &c))) { 
-               retval = FALSE;
-       } 
-       else {
+  /* probably we need to create and inject an XIM handler eventually. */
+  /* for now, try to match the string to existing
+   * keycode+modifier states.
+   */
+  KeySym *keysyms;
+  gint maxlen = 0;
+  gunichar unichar = 0;
+  gint i = 0;
+  gboolean retval = TRUE;
+  const gchar *c;
+  KeySym keysym;
+
+  if (!(keystring && *keystring && g_utf8_validate (keystring, -1, &c)))
+    {
+      retval = FALSE;
+    }
+  else
+    {
 #ifdef SPI_DEBUG
-               fprintf (stderr, "[keystring synthesis attempted on %s]\n", keystring);
+      fprintf (stderr, "[keystring synthesis attempted on %s]\n", keystring);
 #endif
-               maxlen = strlen (keystring) + 1;
-               keysyms = g_new0 (KeySym, maxlen);
-
-               while (keystring && (unichar = g_utf8_get_char (keystring))) {
-                       char bytes[6];
-                       gint mbytes;
-                       
-                       mbytes = g_unichar_to_utf8 (unichar, bytes);
-                       bytes[mbytes] = '\0';
+      maxlen = strlen (keystring) + 1;
+      keysyms = g_new0 (KeySym, maxlen);
+
+      while (keystring && (unichar = g_utf8_get_char (keystring)))
+        {
+          char bytes[6];
+          gint mbytes;
+
+          mbytes = g_unichar_to_utf8 (unichar, bytes);
+          bytes[mbytes] = '\0';
 #ifdef SPI_DEBUG
-                       fprintf (stderr, "[unichar %s]", bytes);
+          fprintf (stderr, "[unichar %s]", bytes);
 #endif
-                       keysym = keysym_for_unichar (controller, unichar);
-                       if (keysym == NoSymbol) {
+          keysym = keysym_for_unichar (controller, unichar);
+          if (keysym == NoSymbol)
+            {
 #ifdef SPI_DEBUG
-                               fprintf (stderr, "no keysym for %s", bytes);
+              fprintf (stderr, "no keysym for %s", bytes);
 #endif
-                               retval = FALSE;
-                               break;
-                       }
-                       keysyms[i++] = keysym;
-                       keystring = g_utf8_next_char (keystring); 
-               }
-               keysyms[i++] = 0;
-               XSynchronize (spi_get_display (), TRUE);
-               for (i = 0; keysyms[i]; ++i) {
-                       if (!spi_dec_synth_keysym (controller, keysyms[i])) {
+              retval = FALSE;
+              break;
+            }
+          keysyms[i++] = keysym;
+          keystring = g_utf8_next_char (keystring);
+        }
+      keysyms[i++] = 0;
+      XSynchronize (spi_get_display (), TRUE);
+      for (i = 0; keysyms[i]; ++i)
+        {
+          if (!spi_dec_synth_keysym (controller, keysyms[i]))
+            {
 #ifdef SPI_DEBUG
-                               fprintf (stderr, "could not synthesize %c\n",
-                                        (int) keysyms[i]);
+              fprintf (stderr, "could not synthesize %c\n",
+                       (int) keysyms[i]);
 #endif
-                               retval = FALSE;
-                               break;
-                       }
-               }
-               XSynchronize (spi_get_display (), FALSE);
-
-               g_free (keysyms);
-       }
-
-       if (synth_type == Accessibility_KEY_SYM) {
-               keysym = keycode;
-       }
-       else {
-               keysym = XkbKeycodeToKeysym (spi_get_display (), keycode, 0, 0);
-       }
-       if (XkbKeysymToModifiers (spi_get_display (), keysym) == 0)  {
-               spi_dec_clear_unlatch_pending (controller);
-       }
-       return retval;
+              retval = FALSE;
+              break;
+            }
+        }
+      XSynchronize (spi_get_display (), FALSE);
+
+      g_free (keysyms);
+    }
+
+  if (synth_type == Accessibility_KEY_SYM)
+    {
+      keysym = keycode;
+    }
+  else
+    {
+      keysym = XkbKeycodeToKeysym (spi_get_display (), keycode, 0, 0);
+    }
+  if (XkbKeysymToModifiers (spi_get_display (), keysym) == 0)
+    {
+      spi_dec_clear_unlatch_pending (controller);
+    }
+  return retval;
 }
 
 static void
@@ -1238,8 +1187,6 @@ spi_dec_x11_init (SpiDEController *controller)
   gettimeofday (&priv->last_release_time, NULL);
   spi_controller_register_with_devices (controller);
 
-  spi_dec_init_mouse_listener (controller);
-
   saved_controller = controller;
 }
 
@@ -1258,7 +1205,7 @@ spi_dec_x11_finalize (SpiDEController *controller)
 
 static gboolean
 spi_device_event_controller_forward_key_event (SpiDEController *controller,
-                                              const XEvent    *event)
+                                               const XEvent *event)
 {
   SpiDEControllerPrivate *priv = spi_device_event_controller_get_instance_private (controller);
   Accessibility_DeviceEvent key_event;
@@ -1273,11 +1220,10 @@ spi_device_event_controller_forward_key_event (SpiDEController *controller,
 
   /* relay to listeners, and decide whether to consume it or not */
   ret = spi_controller_notify_keylisteners (controller, &key_event, TRUE);
-  g_free(key_event.event_string);
+  g_free (key_event.event_string);
   return ret;
 }
 
-
 static gboolean
 is_key_released (long code)
 {
@@ -1293,7 +1239,7 @@ static gboolean
 check_release (gpointer data)
 {
   gboolean released;
-  Accessibility_DeviceEvent *event = (Accessibility_DeviceEvent *)data;
+  Accessibility_DeviceEvent *event = (Accessibility_DeviceEvent *) data;
   KeyCode code = event->hw_code;
 
   released = is_key_released (code);
@@ -1308,8 +1254,8 @@ check_release (gpointer data)
 }
 
 static void
-wait_for_release_event (XEvent          *event,
-                                    SpiDEController *controller)
+wait_for_release_event (XEvent *event,
+                        SpiDEController *controller)
 {
   pressed_event = spi_keystroke_from_x_key_event ((XKeyEvent *) event);
   check_release_handler = g_timeout_add (CHECK_RELEASE_DELAY, check_release, &pressed_event);
@@ -1317,25 +1263,24 @@ wait_for_release_event (XEvent          *event,
 }
 
 static void
-spi_dec_x11_emit_modifier_event (SpiDEController *controller, guint prev_mask, 
-                            guint current_mask)
+spi_dec_x11_emit_modifier_event (SpiDEController *controller, guint prev_mask, guint current_mask)
 {
   dbus_uint32_t d1, d2;
 
 #ifdef SPI_XKB_DEBUG
-  fprintf (stderr, "MODIFIER CHANGE EVENT! %x to %x\n", 
-          prev_mask, current_mask);
+  fprintf (stderr, "MODIFIER CHANGE EVENT! %x to %x\n",
+           prev_mask, current_mask);
 #endif
 
   /* set bits for the virtual modifiers like NUMLOCK */
-  if (prev_mask & _numlock_physical_mask) 
+  if (prev_mask & _numlock_physical_mask)
     prev_mask |= SPI_KEYMASK_NUMLOCK;
-  if (current_mask & _numlock_physical_mask) 
+  if (current_mask & _numlock_physical_mask)
     current_mask |= SPI_KEYMASK_NUMLOCK;
 
   d1 = prev_mask & key_modifier_mask;
   d2 = current_mask & key_modifier_mask;
-      spi_dec_dbus_emit(controller, SPI_DBUS_INTERFACE_EVENT_KEYBOARD, "Modifiers", "", d1, d2);
+  spi_dec_dbus_emit (controller, SPI_DBUS_INTERFACE_EVENT_KEYBOARD, "Modifiers", "", d1, d2);
 }
 
 static void
@@ -1350,53 +1295,53 @@ spi_dec_x11_generate_mouse_event (SpiDEController *controller,
 
   switch (eventName[0])
     {
-      case 'b':
-        switch (eventName[1])
-         {
-         /* TODO: check number of buttons before parsing */
-         case '1':
-                   button = 1;
-                   break;
-         case '2':
-                 button = 2;
-                 break;
-         case '3':
-                 button = 3;
-                 break;
-         case '4':
-                 button = 4;
-                 break;
-         case '5':
-                 button = 5;
-                 break;
-         default:
-                 err = TRUE;
-         }
-       if (!err)
-         {
-           if (x != -1 && y != -1)
-             {
-               XTestFakeMotionEvent (display, DefaultScreen (display),
-                                     x, y, 0);
-             }
-           XTestFakeButtonEvent (display, button, !(eventName[2] == 'r'), 0);
-           if (eventName[2] == 'c')
-             XTestFakeButtonEvent (display, button, FALSE, 1);
-           else if (eventName[2] == 'd')
-             {
-             XTestFakeButtonEvent (display, button, FALSE, 1);
-             XTestFakeButtonEvent (display, button, TRUE, 2);
-             XTestFakeButtonEvent (display, button, FALSE, 3);
-             }
-         }
-       break;
-      case 'r': /* relative motion */ 
-       XTestFakeRelativeMotionEvent (display, x, y, 0);
-        break;
-      case 'a': /* absolute motion */
-       XTestFakeMotionEvent (display, DefaultScreen (display),
-                             x, y, 0);
-        break;
+    case 'b':
+      switch (eventName[1])
+        {
+        /* TODO: check number of buttons before parsing */
+        case '1':
+          button = 1;
+          break;
+        case '2':
+          button = 2;
+          break;
+        case '3':
+          button = 3;
+          break;
+        case '4':
+          button = 4;
+          break;
+        case '5':
+          button = 5;
+          break;
+        default:
+          err = TRUE;
+        }
+      if (!err)
+        {
+          if (x != -1 && y != -1)
+            {
+              XTestFakeMotionEvent (display, DefaultScreen (display),
+                                    x, y, 0);
+            }
+          XTestFakeButtonEvent (display, button, !(eventName[2] == 'r'), 0);
+          if (eventName[2] == 'c')
+            XTestFakeButtonEvent (display, button, FALSE, 1);
+          else if (eventName[2] == 'd')
+            {
+              XTestFakeButtonEvent (display, button, FALSE, 1);
+              XTestFakeButtonEvent (display, button, TRUE, 2);
+              XTestFakeButtonEvent (display, button, FALSE, 3);
+            }
+        }
+      break;
+    case 'r': /* relative motion */
+      XTestFakeRelativeMotionEvent (display, x, y, 0);
+      break;
+    case 'a': /* absolute motion */
+      XTestFakeMotionEvent (display, DefaultScreen (display),
+                            x, y, 0);
+      break;
     }
 }
 
index 62e2984..a39b57d 100644 (file)
@@ -1,13 +1,14 @@
 #ifndef _DEVICEEVENTCONTROLLER_X11_H_
 #define _DEVICEEVENTCONTROLLER_X11_H_
 
-#include <glib.h>
+#include <X11/XKBlib.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/extensions/XTest.h>
-#include <X11/XKBlib.h>
+#include <glib.h>
 
-typedef struct {
+typedef struct
+{
   Display *xevie_display;
   unsigned int last_press_keycode;
   unsigned int last_release_keycode;
@@ -22,7 +23,14 @@ typedef struct {
   XkbDescPtr xkb_desc;
   KeyCode reserved_keycode;
   KeySym reserved_keysym;
-  guint  reserved_reset_timeout;
+  guint reserved_reset_timeout;
 } SpiDEControllerPrivate;
 
+#ifdef HAVE_X11
+void spi_dec_setup_x11 (SpiDEControllerClass *klass);
+#endif
+
+long ucs2keysym (long ucs);
+long keysym2ucs (long keysym);
+
 #endif /* _DEVICEEVENTCONTROLLER_X11_H_ */
index 0fe6555..4f02a54 100644 (file)
 
 #include "config.h"
 
-#undef  SPI_XKB_DEBUG
-#undef  SPI_DEBUG
-#undef  SPI_KEYEVENT_DEBUG
+#undef SPI_XKB_DEBUG
+#undef SPI_DEBUG
+#undef SPI_KEYEVENT_DEBUG
 
-#include <string.h>
 #include <ctype.h>
 #include <stdio.h>
+#include <string.h>
 #include <sys/time.h>
 
 #include <glib.h>
 
 #include <dbus/dbus.h>
 
-#include "paths.h"
 #include "de-types.h"
-#include "de-marshaller.h"
 #include "keymasks.h"
+#include "marshal-dbus.h"
+#include "paths.h"
 
 #include "deviceeventcontroller.h"
-#include "reentrant-list.h"
 #include "introspection.h"
+#include "reentrant-list.h"
 
 #ifdef HAVE_X11
 #include "deviceeventcontroller-x11.h"
-#include "display.h"
-#include "event-source.h"
 #endif
 
-#define CHECK_RELEASE_DELAY 20
-#define BIT(c, x)       (c[x/8]&(1<<(x%8)))
-static SpiDEController *saved_controller;
-
 /* Our parent Gtk object type */
 #define PARENT_TYPE G_TYPE_OBJECT
 
@@ -65,50 +59,43 @@ static SpiDEController *saved_controller;
  * Otherwise, there is no private data and so we use a dummy struct.
  * This is so that G_ADD_PRIVATE() will have a type to work with.
  */
-typedef struct {
+typedef struct
+{
   int _dummy;
 } SpiDEControllerPrivate;
 #endif
 
-/* A pointer to our parent object class */
-static int spi_error_code = 0;
-struct _SpiPoint {
-    gint x;
-    gint y;
-};
-typedef struct _SpiPoint SpiPoint;
+typedef struct
+{
+  gint x;
+  gint y;
+} SpiPoint;
 
-static unsigned int mouse_mask_state = 0;
 static unsigned int key_modifier_mask =
-  SPI_KEYMASK_MOD1 | SPI_KEYMASK_MOD2 | SPI_KEYMASK_MOD3 | SPI_KEYMASK_MOD4 |
-  SPI_KEYMASK_MOD5 | SPI_KEYMASK_SHIFT | SPI_KEYMASK_SHIFTLOCK |
-  SPI_KEYMASK_CONTROL | SPI_KEYMASK_NUMLOCK;
+    SPI_KEYMASK_MOD1 | SPI_KEYMASK_MOD2 | SPI_KEYMASK_MOD3 | SPI_KEYMASK_MOD4 |
+    SPI_KEYMASK_MOD5 | SPI_KEYMASK_SHIFT | SPI_KEYMASK_SHIFTLOCK |
+    SPI_KEYMASK_CONTROL | SPI_KEYMASK_NUMLOCK;
 unsigned int _numlock_physical_mask = SPI_KEYMASK_MOD2; /* a guess, will be reset */
 
-static gboolean have_mouse_listener = FALSE;
-static gboolean have_mouse_event_listener = FALSE;
-
-
-typedef struct {
-  guint                             ref_count : 30;
-  guint                             pending_add : 1;
-  guint                             pending_remove : 1;
+typedef struct
+{
+  guint ref_count : 30;
+  guint pending_add : 1;
+  guint pending_remove : 1;
 
   Accessibility_ControllerEventMask mod_mask;
-  dbus_uint32_t               key_val;  /* KeyCode */
+  dbus_uint32_t key_val; /* KeyCode */
 } DEControllerGrabMask;
 
-
-gboolean spi_controller_update_key_grabs               (SpiDEController           *controller,
-                                                              Accessibility_DeviceEvent *recv);
+gboolean spi_controller_update_key_grabs (SpiDEController *controller,
+                                          Accessibility_DeviceEvent *recv);
 
 static gboolean eventtype_seq_contains_event (dbus_uint32_t types,
-                                             const Accessibility_DeviceEvent *event);
+                                              const Accessibility_DeviceEvent *event);
 static gboolean spi_dec_poll_mouse_moving (gpointer data);
 static gboolean spi_dec_poll_mouse_idle (gpointer data);
 
-G_DEFINE_TYPE_WITH_CODE(SpiDEController, spi_device_event_controller, G_TYPE_OBJECT,
-                        G_ADD_PRIVATE (SpiDEController))
+G_DEFINE_TYPE_WITH_CODE (SpiDEController, spi_device_event_controller, G_TYPE_OBJECT, G_ADD_PRIVATE (SpiDEController))
 
 static gint
 spi_dec_plat_get_keycode (SpiDEController *controller,
@@ -132,8 +119,10 @@ spi_dec_plat_get_keycode (SpiDEController *controller,
 }
 
 static guint
-spi_dec_plat_mouse_check (SpiDEController *controller, 
-                    int *x, int *y, gboolean *moved)
+spi_dec_plat_mouse_check (SpiDEController *controller,
+                          int *x,
+                          int *y,
+                          gboolean *moved)
 {
   SpiDEControllerClass *klass;
   klass = SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS (controller);
@@ -171,7 +160,7 @@ spi_dec_plat_ungrab_key (SpiDEController *controller, guint key_val, Accessibili
 
 static gboolean
 spi_dec_plat_synth_keycode_press (SpiDEController *controller,
-                        unsigned int keycode)
+                                  unsigned int keycode)
 {
   SpiDEControllerClass *klass;
   klass = SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS (controller);
@@ -183,7 +172,7 @@ spi_dec_plat_synth_keycode_press (SpiDEController *controller,
 
 static gboolean
 spi_dec_plat_synth_keycode_release (SpiDEController *controller,
-                          unsigned int keycode)
+                                    unsigned int keycode)
 {
   SpiDEControllerClass *klass;
   klass = SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS (controller);
@@ -227,8 +216,7 @@ spi_dec_plat_synth_keystring (SpiDEController *controller, guint synth_type, gin
 }
 
 static void
-spi_dec_plat_emit_modifier_event (SpiDEController *controller, guint prev_mask, 
-                            guint current_mask)
+spi_dec_plat_emit_modifier_event (SpiDEController *controller, guint prev_mask, guint current_mask)
 {
   SpiDEControllerClass *klass;
   klass = SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS (controller);
@@ -248,22 +236,22 @@ spi_dec_plat_generate_mouse_event (SpiDEController *controller,
     klass->plat.generate_mouse_event (controller, x, y, eventName);
 }
 
-DBusMessage *
+static DBusMessage *
 invalid_arguments_error (DBusMessage *message)
 {
-    DBusMessage *reply;
-    gchar       *errmsg;
-
-    errmsg= g_strdup_printf (
-            "Method \"%s\" with signature \"%s\" on interface \"%s\" was supplied with invalid arguments\n",
-            dbus_message_get_member (message),
-            dbus_message_get_signature (message),
-            dbus_message_get_interface (message));
-    reply = dbus_message_new_error (message,
-                                    DBUS_ERROR_INVALID_ARGS,
-                                    errmsg);
-    g_free (errmsg);
-    return reply;
+  DBusMessage *reply;
+  gchar *errmsg;
+
+  errmsg = g_strdup_printf (
+      "Method \"%s\" with signature \"%s\" on interface \"%s\" was supplied with invalid arguments\n",
+      dbus_message_get_member (message),
+      dbus_message_get_signature (message),
+      dbus_message_get_interface (message));
+  reply = dbus_message_new_error (message,
+                                  DBUS_ERROR_INVALID_ARGS,
+                                  errmsg);
+  g_free (errmsg);
+  return reply;
 }
 
 /* Private methods */
@@ -271,23 +259,19 @@ static dbus_bool_t
 spi_dbus_add_disconnect_match (DBusConnection *bus, const char *name)
 {
   char *match = g_strdup_printf ("interface=%s,member=NameOwnerChanged,arg0=%s", DBUS_INTERFACE_DBUS, name);
-  if (match)
-  {
-    DBusError error;
-    dbus_error_init (&error);
-    dbus_bus_add_match (bus, match, &error);
-    g_free (match);
-    if (dbus_error_is_set (&error))
-      {
-        dbus_error_free (&error);
-        return FALSE;
-      }
-    else
-      {
-        return TRUE;
-      }
-  }
-  else return FALSE;
+  DBusError error;
+  dbus_error_init (&error);
+  dbus_bus_add_match (bus, match, &error);
+  g_free (match);
+  if (dbus_error_is_set (&error))
+    {
+      dbus_error_free (&error);
+      return FALSE;
+    }
+  else
+    {
+      return TRUE;
+    }
 }
 
 static dbus_bool_t
@@ -295,22 +279,23 @@ spi_dbus_remove_disconnect_match (DBusConnection *bus, const char *name)
 {
   char *match = g_strdup_printf ("interface=%s,member=NameOwnerChanged,arg0=%s", DBUS_INTERFACE_DBUS, name);
   if (match)
-  {
-    DBusError error;
-    dbus_error_init (&error);
-    dbus_bus_remove_match (bus, match, &error);
-    g_free (match);
-    if (dbus_error_is_set (&error))
-      {
-        dbus_error_free (&error);
-        return FALSE;
-      }
-    else
-      {
-        return TRUE;
-      }
-  }
-  else return FALSE;
+    {
+      DBusError error;
+      dbus_error_init (&error);
+      dbus_bus_remove_match (bus, match, &error);
+      g_free (match);
+      if (dbus_error_is_set (&error))
+        {
+          dbus_error_free (&error);
+          return FALSE;
+        }
+      else
+        {
+          return TRUE;
+        }
+    }
+  else
+    return FALSE;
 }
 
 static DEControllerGrabMask *
@@ -344,20 +329,18 @@ spi_grab_mask_compare_values (gconstpointer p1, gconstpointer p2)
       return 0;
     }
   else
-    { 
+    {
       return ((l1->mod_mask != l2->mod_mask) || (l1->key_val != l2->key_val));
     }
 }
 
 void
-spi_dec_dbus_emit (SpiDEController *controller, const char *interface,
-                   const char *name, const char *minor, int a1, int a2)
+spi_dec_dbus_emit (SpiDEController *controller, const char *interface, const char *name, const char *minor, int a1, int a2)
 {
   DBusMessage *signal = NULL;
-  DBusMessageIter iter, iter_struct, iter_variant;
+  DBusMessageIter iter, iter_dict, iter_variant;
   int nil = 0;
   const char *path = SPI_DBUS_PATH_ROOT;
-  const char *bus_name = dbus_bus_get_unique_name (controller->bus);
 
   signal = dbus_message_new_signal (path, interface, name);
 
@@ -367,14 +350,11 @@ spi_dec_dbus_emit (SpiDEController *controller, const char *interface,
   dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &a1);
   dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &a2);
   dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "i", &iter_variant);
-      dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_INT32, &nil);
+  dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_INT32, &nil);
   dbus_message_iter_close_container (&iter, &iter_variant);
 
-  dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL,
-                                    &iter_struct);
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &bus_name);
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
-  dbus_message_iter_close_container (&iter, &iter_struct);
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_dict);
+  dbus_message_iter_close_container (&iter, &iter_dict);
 
   dbus_connection_send (controller->bus, signal, NULL);
   dbus_message_unref (signal);
@@ -383,7 +363,7 @@ spi_dec_dbus_emit (SpiDEController *controller, const char *interface,
 static gboolean
 spi_dec_poll_mouse_moved (gpointer data)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(data);
+  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER (data);
   int x, y;
   gboolean moved;
   guint mask_return;
@@ -391,10 +371,10 @@ spi_dec_poll_mouse_moved (gpointer data)
   mask_return = spi_dec_plat_mouse_check (controller, &x, &y, &moved);
 
   if ((mask_return & key_modifier_mask) !=
-      (mouse_mask_state & key_modifier_mask)) 
+      (controller->mouse_mask_state & key_modifier_mask))
     {
-      spi_dec_plat_emit_modifier_event (controller, mouse_mask_state, mask_return);
-      mouse_mask_state = mask_return;
+      spi_dec_plat_emit_modifier_event (controller, controller->mouse_mask_state, mask_return);
+      controller->mouse_mask_state = mask_return;
     }
 
   return moved;
@@ -403,30 +383,34 @@ spi_dec_poll_mouse_moved (gpointer data)
 static gboolean
 spi_dec_poll_mouse_idle (gpointer data)
 {
-  if (!have_mouse_event_listener && !have_mouse_listener)
+  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER (data);
+
+  if (!controller->have_mouse_event_listener)
     return FALSE;
-  else if (!spi_dec_poll_mouse_moved (data))
+  else if (!spi_dec_poll_mouse_moved (controller))
     return TRUE;
   else
     {
       guint id;
-      id = g_timeout_add (20, spi_dec_poll_mouse_moving, data);
+      id = g_timeout_add (20, spi_dec_poll_mouse_moving, controller);
       g_source_set_name_by_id (id, "[at-spi2-core] spi_dec_poll_mouse_moving");
-      return FALSE;        
+      return FALSE;
     }
 }
 
 static gboolean
 spi_dec_poll_mouse_moving (gpointer data)
 {
-  if (!have_mouse_event_listener && !have_mouse_listener)
+  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER (data);
+
+  if (!controller->have_mouse_event_listener)
     return FALSE;
-  else if (spi_dec_poll_mouse_moved (data))
+  else if (spi_dec_poll_mouse_moved (controller))
     return TRUE;
   else
     {
       guint id;
-      id = g_timeout_add (100, spi_dec_poll_mouse_idle, data);
+      id = g_timeout_add (100, spi_dec_poll_mouse_idle, controller);
       g_source_set_name_by_id (id, "[at-spi2-core] check_release");
       return FALSE;
     }
@@ -434,10 +418,10 @@ spi_dec_poll_mouse_moving (gpointer data)
 
 /**
  * Eventually we can use this to make the marshalling of mask types
- * more sane, but for now we just use this to detect 
+ * more sane, but for now we just use this to detect
  * the use of 'virtual' masks such as numlock and convert them to
  * system-specific mask values (i.e. ModMask).
- * 
+ *
  **/
 static Accessibility_ControllerEventMask
 spi_dec_translate_mask (Accessibility_ControllerEventMask mask)
@@ -452,85 +436,62 @@ spi_dec_translate_mask (Accessibility_ControllerEventMask mask)
       tmp_mask = mask ^ SPI_KEYMASK_NUMLOCK;
       tmp_mask |= _numlock_physical_mask;
     }
+
   return tmp_mask;
 }
 
 static DEControllerKeyListener *
 spi_dec_key_listener_new (const char *bus_name,
-                         const char *path,
-                         GSList *keys,
-                         const Accessibility_ControllerEventMask mask,
-                         const dbus_uint32_t types,
-                         const Accessibility_EventListenerMode  *mode)
+                          const char *path,
+                          GSList *keys,
+                          const Accessibility_ControllerEventMask mask,
+                          const dbus_uint32_t types,
+                          const Accessibility_EventListenerMode *mode)
 {
   DEControllerKeyListener *key_listener = g_new0 (DEControllerKeyListener, 1);
-  key_listener->listener.bus_name = g_strdup(bus_name);
-  key_listener->listener.path = g_strdup(path);
+  key_listener->listener.bus_name = g_strdup (bus_name);
+  key_listener->listener.path = g_strdup (path);
   key_listener->listener.type = SPI_DEVICE_TYPE_KBD;
   key_listener->keys = keys;
   key_listener->mask = spi_dec_translate_mask (mask);
   key_listener->listener.types = types;
   if (mode)
-  {
-    key_listener->mode = (Accessibility_EventListenerMode *) g_malloc(sizeof(Accessibility_EventListenerMode));
-    memcpy(key_listener->mode, mode, sizeof(*mode));
-  }
+    {
+      key_listener->mode = (Accessibility_EventListenerMode *) g_malloc (sizeof (Accessibility_EventListenerMode));
+      memcpy (key_listener->mode, mode, sizeof (*mode));
+    }
   else
     key_listener->mode = NULL;
 
 #ifdef SPI_DEBUG
   g_print ("new listener, with mask %x, is_global %d, keys %p (%d)\n",
-          (unsigned int) key_listener->mask,
+           (unsigned int) key_listener->mask,
            (int) (mode ? mode->global : 0),
-          (void *) key_listener->keys,
-          (int) (key_listener->keys ? g_slist_length(key_listener->keys) : 0));
+           (void *) key_listener->keys,
+           (int) (key_listener->keys ? g_slist_length (key_listener->keys) : 0));
 #endif
 
-  return key_listener; 
-}
-
-static DEControllerListener *
-spi_dec_listener_new (const char *bus_name,
-                     const char *path,
-                     dbus_uint32_t types)
-{
-  DEControllerListener *listener = g_new0 (DEControllerListener, 1);
-  listener->bus_name = g_strdup(bus_name);
-  listener->path = g_strdup(path);
-  listener->type = SPI_DEVICE_TYPE_MOUSE;
-  listener->types = types;
-  return listener;     
-}
-
-static DEControllerListener *
-spi_listener_clone (DEControllerListener *listener)
-{
-  DEControllerListener *clone = g_new0 (DEControllerListener, 1);
-  clone->bus_name = g_strdup (listener->bus_name);
-  clone->path = g_strdup (listener->path);
-  clone->type = listener->type;
-  clone->types = listener->types;
-  return clone;
+  return key_listener;
 }
 
-static GSList *keylist_clone (GSList *s)
+static GSList *
+keylist_clone (GSList *s)
 {
   GSList *d = NULL;
   GSList *l;
 
-  for (l = s; l; l = g_slist_next(l))
-  {
-    Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *)g_malloc(sizeof(Accessibility_KeyDefinition));
-    if (kd)
+  for (l = s; l; l = g_slist_next (l))
     {
-      Accessibility_KeyDefinition *kds = (Accessibility_KeyDefinition *)l->data;
-      kd->keycode = kds->keycode;
-      kd->keysym = kds->keysym;
-      kd->keystring = g_strdup(kds->keystring);
-      d = g_slist_append(d, kd);
+      Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *) g_malloc (sizeof (Accessibility_KeyDefinition));
+      if (kd)
+        {
+          Accessibility_KeyDefinition *kds = (Accessibility_KeyDefinition *) l->data;
+          kd->keycode = kds->keycode;
+          kd->keysym = kds->keysym;
+          kd->keystring = g_strdup (kds->keystring);
+          d = g_slist_append (d, kd);
+        }
     }
-  }
   return d;
 }
 
@@ -545,33 +506,36 @@ spi_key_listener_clone (DEControllerKeyListener *key_listener)
   clone->mask = key_listener->mask;
   clone->listener.types = key_listener->listener.types;
   if (key_listener->mode)
-  {
-    clone->mode = (Accessibility_EventListenerMode *)g_malloc(sizeof(Accessibility_EventListenerMode));
-    if (clone->mode) memcpy(clone->mode, key_listener->mode, sizeof(Accessibility_EventListenerMode));
-  }
+    {
+      clone->mode = (Accessibility_EventListenerMode *) g_malloc (sizeof (Accessibility_EventListenerMode));
+      if (clone->mode)
+        memcpy (clone->mode, key_listener->mode, sizeof (Accessibility_EventListenerMode));
+    }
   else
     clone->mode = NULL;
   return clone;
 }
 
-static void keylist_free(GSList *keys)
+static void
+keylist_free (GSList *keys)
 {
   GSList *l;
 
-  for (l = keys; l; l = g_slist_next(l))
-  {
-    Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *)l->data;
-    g_free(kd->keystring);
-    g_free(kd);
-  }
+  for (l = keys; l; l = g_slist_next (l))
+    {
+      Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *) l->data;
+      g_free (kd->keystring);
+      g_free (kd);
+    }
   g_slist_free (keys);
 }
 
 static void
 spi_key_listener_data_free (DEControllerKeyListener *key_listener)
 {
-  keylist_free(key_listener->keys);
-  if (key_listener->mode) g_free(key_listener->mode);
+  keylist_free (key_listener->keys);
+  if (key_listener->mode)
+    g_free (key_listener->mode);
   g_free (key_listener->listener.bus_name);
   g_free (key_listener->listener.path);
   g_free (key_listener);
@@ -584,33 +548,25 @@ spi_key_listener_clone_free (DEControllerKeyListener *clone)
 }
 
 static void
-spi_listener_clone_free (DEControllerListener *clone)
+spi_dec_listener_free (DEControllerListener *listener)
 {
-  g_free (clone->path);
-  g_free (clone->bus_name);
-  g_free (clone);
-}
-
-static void
-spi_dec_listener_free (DEControllerListener    *listener)
-{
-  if (listener->type == SPI_DEVICE_TYPE_KBD) 
+  if (listener->type == SPI_DEVICE_TYPE_KBD)
     spi_key_listener_data_free ((DEControllerKeyListener *) listener);
   else
-  {
-    g_free (listener->bus_name);
-    g_free (listener->path);
-  }
+    {
+      g_free (listener->bus_name);
+      g_free (listener->path);
+    }
 }
 
 static void
-_register_keygrab (SpiDEController      *controller,
-                  DEControllerGrabMask *grab_mask)
+_register_keygrab (SpiDEController *controller,
+                   DEControllerGrabMask *grab_mask)
 {
   GList *l;
 
   l = g_list_find_custom (controller->keygrabs_list, grab_mask,
-                         spi_grab_mask_compare_values);
+                          spi_grab_mask_compare_values);
   if (l)
     {
       DEControllerGrabMask *cur_mask = l->data;
@@ -619,24 +575,24 @@ _register_keygrab (SpiDEController      *controller,
       if (cur_mask->pending_remove)
         {
           cur_mask->pending_remove = FALSE;
-       }
+        }
     }
   else
     {
       controller->keygrabs_list =
-        g_list_prepend (controller->keygrabs_list,
-                       spi_grab_mask_clone (grab_mask));
+          g_list_prepend (controller->keygrabs_list,
+                          spi_grab_mask_clone (grab_mask));
     }
 }
 
 static void
-_deregister_keygrab (SpiDEController      *controller,
-                    DEControllerGrabMask *grab_mask)
+_deregister_keygrab (SpiDEController *controller,
+                     DEControllerGrabMask *grab_mask)
 {
   GList *l;
 
   l = g_list_find_custom (controller->keygrabs_list, grab_mask,
-                         spi_grab_mask_compare_values);
+                          spi_grab_mask_compare_values);
 
   if (l)
     {
@@ -646,15 +602,15 @@ _deregister_keygrab (SpiDEController      *controller,
       if (cur_mask->ref_count <= 0)
         {
           cur_mask->pending_remove = TRUE;
-       }
+        }
     }
 }
 
 static void
-handle_keygrab (SpiDEController         *controller,
-               DEControllerKeyListener *key_listener,
-               void                   (*process_cb) (SpiDEController *controller,
-                                                     DEControllerGrabMask *grab_mask))
+handle_keygrab (SpiDEController *controller,
+                DEControllerKeyListener *key_listener,
+                void (*process_cb) (SpiDEController *controller,
+                                    DEControllerGrabMask *grab_mask))
 {
   DEControllerGrabMask grab_mask = { 0 };
 
@@ -671,30 +627,30 @@ handle_keygrab (SpiDEController         *controller,
     {
       GSList *l;
 
-      for (l = key_listener->keys; l; l = g_slist_next(l))
+      for (l = key_listener->keys; l; l = g_slist_next (l))
         {
-         Accessibility_KeyDefinition *keydef = l->data;
-         long key_val;
-         key_val = spi_dec_plat_get_keycode (controller, keydef->keysym, keydef->keystring, FALSE, NULL);
-         if (!key_val)
-           key_val = keydef->keycode;
-         grab_mask.key_val = key_val;
-         process_cb (controller, &grab_mask);
-       }
+          Accessibility_KeyDefinition *keydef = l->data;
+          long key_val;
+          key_val = spi_dec_plat_get_keycode (controller, keydef->keysym, keydef->keystring, FALSE, NULL);
+          if (!key_val)
+            key_val = keydef->keycode;
+          grab_mask.key_val = key_val;
+          process_cb (controller, &grab_mask);
+        }
     }
 }
 
 static gboolean
-spi_controller_register_global_keygrabs (SpiDEController         *controller,
-                                        DEControllerKeyListener *key_listener)
+spi_controller_register_global_keygrabs (SpiDEController *controller,
+                                         DEControllerKeyListener *key_listener)
 {
   handle_keygrab (controller, key_listener, _register_keygrab);
   return spi_controller_update_key_grabs (controller, NULL);
 }
 
 static void
-spi_controller_deregister_global_keygrabs (SpiDEController         *controller,
-                                          DEControllerKeyListener *key_listener)
+spi_controller_deregister_global_keygrabs (SpiDEController *controller,
+                                           DEControllerKeyListener *key_listener)
 {
   handle_keygrab (controller, key_listener, _deregister_keygrab);
   spi_controller_update_key_grabs (controller, NULL);
@@ -721,49 +677,49 @@ append_keystroke_listener (DBusMessageIter *iter, DEControllerKeyListener *liste
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &d_uint);
   if (!dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY,
                                          "(iisi)", &iter_subarray))
-  {
-    dbus_message_iter_close_container (iter, &iter_struct);
-    return;
-  }
+    {
+      dbus_message_iter_close_container (iter, &iter_struct);
+      return;
+    }
   for (kl = listener->keys; kl; kl = kl->next)
-  {
-    Accessibility_KeyDefinition *kd = kl->data;
-    if (!dbus_message_iter_open_container (&iter_subarray, DBUS_TYPE_STRUCT,
-                                         NULL, &iter_substruct))
-      break;
-    dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_INT32, &kd->keycode);
-    dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_INT32, &kd->keysym);
-    dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_STRING, &kd->keystring);
-    dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_INT32, &kd->unused);
-    dbus_message_iter_close_container (&iter_subarray, &iter_substruct);
-  }
+    {
+      Accessibility_KeyDefinition *kd = kl->data;
+      if (!dbus_message_iter_open_container (&iter_subarray, DBUS_TYPE_STRUCT,
+                                             NULL, &iter_substruct))
+        break;
+      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_INT32, &kd->keycode);
+      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_INT32, &kd->keysym);
+      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_STRING, &kd->keystring);
+      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_INT32, &kd->unused);
+      dbus_message_iter_close_container (&iter_subarray, &iter_substruct);
+    }
   dbus_message_iter_close_container (&iter_struct, &iter_subarray);
   d_uint = listener->mask;
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &d_uint);
   if (dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_STRUCT,
-                                         NULL, &iter_substruct))
-  {
-    if (listener->mode)
-    {
-      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
-                                      &listener->mode->synchronous);
-      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
-                                      &listener->mode->preemptive);
-      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
-                                      &listener->mode->global);
-    }
-    else
-    {
-      dbus_bool_t dummy_val = FALSE;
-      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
-                                      &dummy_val);
-      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
-                                      &dummy_val);
-      dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
-                                      &dummy_val);
-    }
-    dbus_message_iter_close_container (&iter_struct, &iter_substruct);
-  }
+                                        NULL, &iter_substruct))
+    {
+      if (listener->mode)
+        {
+          dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
+                                          &listener->mode->synchronous);
+          dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
+                                          &listener->mode->preemptive);
+          dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
+                                          &listener->mode->global);
+        }
+      else
+        {
+          dbus_bool_t dummy_val = FALSE;
+          dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
+                                          &dummy_val);
+          dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
+                                          &dummy_val);
+          dbus_message_iter_append_basic (&iter_substruct, DBUS_TYPE_BOOLEAN,
+                                          &dummy_val);
+        }
+      dbus_message_iter_close_container (&iter_struct, &iter_substruct);
+    }
   dbus_message_iter_close_container (iter, &iter_struct);
 }
 
@@ -775,8 +731,8 @@ notify_keystroke_listener (SpiDEController *controller,
   const char *path = SPI_DBUS_PATH_DEC;
   const char *interface = SPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER;
   const char *name = (enable
-                      ? "KeystrokeListenerRegistered"
-                      : "KeystrokeListenerDeregistered");
+                          ? "KeystrokeListenerRegistered"
+                          : "KeystrokeListenerDeregistered");
   DBusMessage *signal;
   DBusMessageIter iter;
 
@@ -789,95 +745,43 @@ notify_keystroke_listener (SpiDEController *controller,
   dbus_message_unref (signal);
 }
 
-static void
-append_mouse_listener (DBusMessageIter *iter, DEControllerListener *listener)
-{
-  DBusMessageIter iter_struct;
-  dbus_uint32_t d_uint;
-
-  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
-                                         &iter_struct))
-    return;
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING,
-                                  &listener->bus_name);
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH,
-                                  &listener->path);
-  d_uint = listener->types;
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_UINT32, &d_uint);
-  dbus_message_iter_close_container (iter, &iter_struct);
-}
-
-static void
-notify_mouse_listener (SpiDEController *controller,
-                       DEControllerListener *listener,
-                       gboolean enable)
-{
-  const char *path = SPI_DBUS_PATH_DEC;
-  const char *interface = SPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER;
-  const char *name = (enable
-                      ? "DeviceListenerRegistered"
-                      : "DeviceListenerDeregistered");
-  DBusMessage *signal;
-  DBusMessageIter iter;
-
-  signal = dbus_message_new_signal (path, interface, name);
-  if (!signal)
-    return;
-  dbus_message_iter_init_append (signal, &iter);
-  append_mouse_listener (&iter, listener);
-  dbus_connection_send (controller->bus, signal, NULL);
-  dbus_message_unref (signal);
-}
-
 static gboolean
-spi_controller_register_device_listener (SpiDEController      *controller,
-                                        DEControllerListener *listener)
+spi_controller_register_device_listener (SpiDEController *controller,
+                                         DEControllerListener *listener)
 {
   DEControllerKeyListener *key_listener;
   gboolean retval;
-  
-  switch (listener->type) {
-  case SPI_DEVICE_TYPE_KBD:
+
+  switch (listener->type)
+    {
+    case SPI_DEVICE_TYPE_KBD:
       key_listener = (DEControllerKeyListener *) listener;
 
       controller->key_listeners = g_list_prepend (controller->key_listeners,
-                                                 key_listener);
+                                                  key_listener);
       spi_dbus_add_disconnect_match (controller->bus, key_listener->listener.bus_name);
       if (key_listener->mode->global)
         {
-         retval = spi_controller_register_global_keygrabs (controller, key_listener);
-       }
+          retval = spi_controller_register_global_keygrabs (controller, key_listener);
+        }
       else
-         retval = TRUE;
+        retval = TRUE;
       if (retval)
-       notify_keystroke_listener (controller, key_listener, TRUE);
-      break;
-  case SPI_DEVICE_TYPE_MOUSE:
-      controller->mouse_listeners = g_list_prepend (controller->mouse_listeners, listener);
-      if (!have_mouse_listener)
-        {
-          have_mouse_listener = TRUE;
-          if (!have_mouse_event_listener) {
-            guint id;
-            id = g_timeout_add (100, spi_dec_poll_mouse_idle, controller);
-            g_source_set_name_by_id (id, "[at-spi2-core] spi_dec_poll_mouse_idle");
-          }
-        }
-      spi_dbus_add_disconnect_match (controller->bus, listener->bus_name);
-      notify_mouse_listener (controller, listener, TRUE);
+        notify_keystroke_listener (controller, key_listener, TRUE);
       break;
-  default:
+    default:
+      g_assert_not_reached ();
       break;
-  }
+    }
   return FALSE;
 }
 
 static void
 set_reply (DBusPendingCall *pending, void *user_data)
 {
-    void **replyptr = (void **)user_data;
+  void **replyptr = (void **) user_data;
 
-    *replyptr = dbus_pending_call_steal_reply (pending);
+  *replyptr = dbus_pending_call_steal_reply (pending);
 }
 
 static GSList *hung_processes = NULL;
@@ -893,15 +797,15 @@ reset_hung_process (DBusPendingCall *pending, void *data)
   dbus_pending_call_unref (pending);
 
   for (l = hung_processes; l; l = l->next)
-  {
-    if (!strcmp (l->data, dest))
     {
-      gpointer l_data = l->data;
-      hung_processes = g_slist_remove (hung_processes, l_data);
-      g_free (l_data);
-      break;
+      if (!strcmp (l->data, dest))
+        {
+          gpointer l_data = l->data;
+          hung_processes = g_slist_remove (hung_processes, l_data);
+          g_free (l_data);
+          break;
+        }
     }
-  }
 }
 
 static gint
@@ -919,15 +823,15 @@ reset_hung_process_from_ping (DBusPendingCall *pending, void *data)
   GSList *l;
 
   for (l = hung_processes; l; l = l->next)
-  {
-    if (!strcmp (l->data, data))
     {
-      gpointer l_data = l->data;
-      hung_processes = g_slist_remove (hung_processes, l_data);
-      g_free (l_data);
-      break;
+      if (!strcmp (l->data, data))
+        {
+          gpointer l_data = l->data;
+          hung_processes = g_slist_remove (hung_processes, l_data);
+          g_free (l_data);
+          break;
+        }
     }
-  }
   g_free (data);
   dbus_pending_call_unref (pending);
 }
@@ -935,161 +839,97 @@ reset_hung_process_from_ping (DBusPendingCall *pending, void *data)
 static DBusMessage *
 send_and_allow_reentry (DBusConnection *bus, DBusMessage *message, int timeout, DBusError *error)
 {
-    DBusPendingCall *pending;
-    DBusMessage *reply = NULL;
+  DBusPendingCall *pending;
+  DBusMessage *reply = NULL;
   struct timeval tv;
 
-    if (!dbus_connection_send_with_reply (bus, message, &pending, -1))
+  if (!dbus_connection_send_with_reply (bus, message, &pending, -1))
     {
-        return NULL;
+      return NULL;
     }
-    dbus_pending_call_set_notify (pending, set_reply, (void *)&reply, NULL);
-    gettimeofday (&tv, NULL);
-    while (!reply)
+  dbus_pending_call_set_notify (pending, set_reply, (void *) &reply, NULL);
+  gettimeofday (&tv, NULL);
+  while (!reply)
     {
       if (!dbus_connection_read_write_dispatch (bus, timeout) ||
           time_elapsed (&tv) > timeout)
-      {
-        const char *dest = dbus_message_get_destination (message);
-        GSList *l;
-        gchar *bus_name_dup;
-        dbus_message_ref (message);
-        dbus_pending_call_set_notify (pending, reset_hung_process, message,
-                                      (DBusFreeFunction) dbus_message_unref);
-        message = dbus_message_new_method_call (dest, "/",
-                                                "org.freedesktop.DBus.Peer",
-                                                "Ping");
-        if (!message)
-          return NULL;
-        dbus_connection_send_with_reply (bus, message, &pending, -1);
-        dbus_message_unref (message);
-        if (!pending)
-          return NULL;
-        bus_name_dup = g_strdup (dest);
-        dbus_pending_call_set_notify (pending, reset_hung_process_from_ping,
-                                      bus_name_dup, NULL);
-        for (l = hung_processes; l; l = l->next)
-          if (!strcmp (l->data, dest))
+        {
+          const char *dest = dbus_message_get_destination (message);
+          GSList *l;
+          gchar *bus_name_dup;
+          dbus_message_ref (message);
+          dbus_pending_call_set_notify (pending, reset_hung_process, message,
+                                        (DBusFreeFunction) dbus_message_unref);
+          message = dbus_message_new_method_call (dest, "/",
+                                                  "org.freedesktop.DBus.Peer",
+                                                  "Ping");
+          if (!message)
+            return NULL;
+          dbus_connection_send_with_reply (bus, message, &pending, -1);
+          dbus_message_unref (message);
+          if (!pending)
             return NULL;
-        hung_processes = g_slist_prepend (hung_processes, g_strdup (dest));
-        return NULL;
-      }
+          bus_name_dup = g_strdup (dest);
+          dbus_pending_call_set_notify (pending, reset_hung_process_from_ping,
+                                        bus_name_dup, NULL);
+          for (l = hung_processes; l; l = l->next)
+            if (!strcmp (l->data, dest))
+              return NULL;
+          hung_processes = g_slist_prepend (hung_processes, g_strdup (dest));
+          return NULL;
+        }
     }
-    dbus_pending_call_unref (pending);
-    return reply;
+  dbus_pending_call_unref (pending);
+  return reply;
 }
 static gboolean
-Accessibility_DeviceEventListener_NotifyEvent(SpiDEController *controller,
-                                              SpiRegistry *registry,
-                                              DEControllerListener *listener,
-                                              const Accessibility_DeviceEvent *key_event)
-{
-  DBusMessage *message = dbus_message_new_method_call(listener->bus_name,
-                                                      listener->path,
-                                                      SPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER,
-                                                      "NotifyEvent");
+Accessibility_DeviceEventListener_NotifyEvent (SpiDEController *controller,
+                                               DEControllerListener *listener,
+                                               const Accessibility_DeviceEvent *key_event)
+{
+  DBusMessage *message = dbus_message_new_method_call (listener->bus_name,
+                                                       listener->path,
+                                                       SPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER,
+                                                       "NotifyEvent");
   dbus_bool_t consumed = FALSE;
   GSList *l;
   gboolean hung = FALSE;
 
   for (l = hung_processes; l; l = l->next)
-  {
-    if (!strcmp (l->data, listener->bus_name))
-    {
-      dbus_message_set_no_reply (message, TRUE);
-      hung = TRUE;
-      break;
-    }
-  }
-
-  if (spi_dbus_marshal_deviceEvent(message, key_event))
-  {
-    DBusMessage *reply;
-
-    if (hung)
     {
-      dbus_connection_send (controller->bus, message, NULL);
-      dbus_message_unref (message);
-      return FALSE;
-    }
-
-    reply = send_and_allow_reentry (controller->bus, message, 3000, NULL);
-    if (reply)
-    {
-      dbus_message_get_args(reply, NULL, DBUS_TYPE_BOOLEAN, &consumed, DBUS_TYPE_INVALID);
-      dbus_message_unref(reply);
-    }
-  }
-  dbus_message_unref(message);
-  return consumed;
-}
-
-gboolean
-spi_controller_notify_mouselisteners (SpiDEController                 *controller,
-                                     const Accessibility_DeviceEvent *event)
-{
-  GList   *l;
-  GSList  *notify = NULL, *l2;
-  GList  **listeners = &controller->mouse_listeners;
-  gboolean is_consumed;
-#ifdef SPI_KEYEVENT_DEBUG
-  gboolean found = FALSE;
-#endif
-  if (!listeners)
-    {
-      return FALSE;
-    }
-
-  for (l = *listeners; l; l = l->next)
-    {
-       DEControllerListener *listener = l->data;
-
-       if (eventtype_seq_contains_event (listener->types, event))
-         {
-          /* we clone (don't dup) the listener, to avoid refcount inc. */
-          notify = g_slist_prepend (notify,
-                                    spi_listener_clone (listener));
-#ifdef SPI_KEYEVENT_DEBUG
-           found = TRUE;
-#endif
-         }
-    }
-
-#ifdef SPI_KEYEVENT_DEBUG
-  if (!found)
-    {
-      g_print ("no match for event\n");
+      if (!strcmp (l->data, listener->bus_name))
+        {
+          dbus_message_set_no_reply (message, TRUE);
+          hung = TRUE;
+          break;
+        }
     }
-#endif
 
-  is_consumed = FALSE;
-  for (l2 = notify; l2 && !is_consumed; l2 = l2->next)
+  if (spi_dbus_marshal_deviceEvent (message, key_event))
     {
-      DEControllerListener *listener = l2->data;
-
-      is_consumed = Accessibility_DeviceEventListener_NotifyEvent (controller, controller->registry, listener, event);
+      DBusMessage *reply;
 
-      spi_listener_clone_free ((DEControllerListener *) l2->data);
-    }
+      if (hung)
+        {
+          dbus_connection_send (controller->bus, message, NULL);
+          dbus_message_unref (message);
+          return FALSE;
+        }
 
-  for (; l2; l2 = l2->next)
-    {
-      DEControllerListener *listener = l2->data;
-      spi_listener_clone_free (listener);
-      /* clone doesn't have its own ref, so don't use spi_device_listener_free */
+      reply = send_and_allow_reentry (controller->bus, message, 3000, NULL);
+      if (reply)
+        {
+          dbus_message_get_args (reply, NULL, DBUS_TYPE_BOOLEAN, &consumed, DBUS_TYPE_INVALID);
+          dbus_message_unref (reply);
+        }
     }
-
-  g_slist_free (notify);
-
-#ifdef SPI_DEBUG
-  if (is_consumed) g_message ("consumed\n");
-#endif
-  return is_consumed;
+  dbus_message_unref (message);
+  return consumed;
 }
 
 static gboolean
-key_set_contains_key (GSList                          *key_set,
-                         const Accessibility_DeviceEvent *key_event)
+key_set_contains_key (GSList *key_set,
+                      const Accessibility_DeviceEvent *key_event)
 {
   gint i;
   gint len;
@@ -1104,40 +944,40 @@ key_set_contains_key (GSList                          *key_set,
     }
 
   len = g_slist_length (key_set);
-  
+
   if (len == 0) /* special case, means "all keys/any key" */
     {
 #ifdef SPI_DEBUG
-      g_print ("anykey\n");        
+      g_print ("anykey\n");
 #endif
       return TRUE;
     }
 
-  for (l = key_set,i = 0; l; l = g_slist_next(l),i++)
+  for (l = key_set, i = 0; l; l = g_slist_next (l), i++)
     {
       Accessibility_KeyDefinition *kd = l->data;
-#ifdef SPI_KEYEVENT_DEBUG          
+#ifdef SPI_KEYEVENT_DEBUG
       g_print ("key_set[%d] event = %d, code = %d; key_event %d, code %d, string %s\n",
-                i,
-                (int) kd->keysym,
-                (int) kd->keycode,
-                (int) key_event->id,
-                (int) key_event->hw_code,
-                key_event->event_string); 
+               i,
+               (int) kd->keysym,
+               (int) kd->keycode,
+               (int) key_event->id,
+               (int) key_event->hw_code,
+               key_event->event_string);
 #endif
       if (kd->keysym == (dbus_uint32_t) key_event->id)
         {
           return TRUE;
-       }
+        }
       if (kd->keycode == (dbus_uint32_t) key_event->hw_code)
         {
           return TRUE;
-       }
+        }
       if (key_event->event_string && key_event->event_string[0] &&
-         !strcmp (kd->keystring, key_event->event_string))
+          !strcmp (kd->keystring, key_event->event_string))
         {
           return TRUE;
-       }
+        }
     }
 
   return FALSE;
@@ -1145,7 +985,7 @@ key_set_contains_key (GSList                          *key_set,
 
 static gboolean
 eventtype_seq_contains_event (dbus_uint32_t types,
-                                 const Accessibility_DeviceEvent *event)
+                              const Accessibility_DeviceEvent *event)
 {
   if (types == 0) /* special case, means "all events/any event" */
     {
@@ -1157,12 +997,12 @@ eventtype_seq_contains_event (dbus_uint32_t types,
 
 static gboolean
 spi_key_event_matches_listener (const Accessibility_DeviceEvent *key_event,
-                               DEControllerKeyListener         *listener,
-                               dbus_bool_t                    is_system_global)
+                                DEControllerKeyListener *listener,
+                                dbus_bool_t is_system_global)
 {
   if (((key_event->modifiers & 0xFF) == (dbus_uint16_t) (listener->mask & 0xFF)) &&
-       key_set_contains_key (listener->keys, key_event) &&
-       eventtype_seq_contains_event (listener->listener.types, key_event) && 
+      key_set_contains_key (listener->keys, key_event) &&
+      eventtype_seq_contains_event (listener->listener.types, key_event) &&
       (is_system_global == listener->mode->global))
     {
       return TRUE;
@@ -1174,13 +1014,13 @@ spi_key_event_matches_listener (const Accessibility_DeviceEvent *key_event,
 }
 
 gboolean
-spi_controller_notify_keylisteners (SpiDEController                 *controller,
-                                   Accessibility_DeviceEvent       *key_event,
-                                   dbus_bool_t                    is_system_global)
+spi_controller_notify_keylisteners (SpiDEController *controller,
+                                    Accessibility_DeviceEvent *key_event,
+                                    dbus_bool_t is_system_global)
 {
-  GList   *l;
-  GSList  *notify = NULL, *l2;
-  GList  **key_listeners = &controller->key_listeners;
+  GList *l;
+  GSList *notify = NULL, *l2;
+  GList **key_listeners = &controller->key_listeners;
   gboolean is_consumed;
 
   if (!key_listeners)
@@ -1190,18 +1030,18 @@ spi_controller_notify_keylisteners (SpiDEController                 *controller,
 
   /* set the NUMLOCK event mask bit if appropriate: see bug #143702 */
   if (key_event->modifiers & _numlock_physical_mask)
-      key_event->modifiers |= SPI_KEYMASK_NUMLOCK;
+    key_event->modifiers |= SPI_KEYMASK_NUMLOCK;
 
   for (l = *key_listeners; l; l = l->next)
     {
-       DEControllerKeyListener *key_listener = l->data;
+      DEControllerKeyListener *key_listener = l->data;
 
-       if (spi_key_event_matches_listener (key_event, key_listener, is_system_global))
-         {
-          /* we clone (don't dup) the listener, to avoid refcount inc. */
-          notify = g_slist_prepend (notify,
-                                    spi_key_listener_clone (key_listener));
-         }
+      if (spi_key_event_matches_listener (key_event, key_listener, is_system_global))
+        {
+          /* we clone (don't dup) the listener, to avoid refcount inc. */
+          notify = g_slist_prepend (notify,
+                                    spi_key_listener_clone (key_listener));
+        }
     }
 
 #ifdef SPI_KEYEVENT_DEBUG
@@ -1214,17 +1054,17 @@ spi_controller_notify_keylisteners (SpiDEController                 *controller,
   is_consumed = FALSE;
   for (l2 = notify; l2 && !is_consumed; l2 = l2->next)
     {
-      DEControllerKeyListener *key_listener = l2->data;            
+      DEControllerKeyListener *key_listener = l2->data;
 
-      is_consumed = Accessibility_DeviceEventListener_NotifyEvent (controller, controller->registry, &key_listener->listener, key_event) &&
-                   key_listener->mode->preemptive;
+      is_consumed = Accessibility_DeviceEventListener_NotifyEvent (controller, &key_listener->listener, key_event) &&
+                    key_listener->mode->preemptive;
 
       spi_key_listener_clone_free (key_listener);
     }
 
   for (; l2; l2 = l2->next)
     {
-      DEControllerKeyListener *key_listener = l2->data;            
+      DEControllerKeyListener *key_listener = l2->data;
       spi_key_listener_clone_free (key_listener);
       /* clone doesn't have its own ref, so don't use spi_dec_listener_free */
     }
@@ -1232,27 +1072,20 @@ spi_controller_notify_keylisteners (SpiDEController                 *controller,
   g_slist_free (notify);
 
 #ifdef SPI_DEBUG
-  if (is_consumed) g_message ("consumed\n");
+  if (is_consumed)
+    g_message ("consumed\n");
 #endif
   return is_consumed;
 }
 
 gboolean
-spi_clear_error_state (void)
-{
-       gboolean retval = spi_error_code != 0;
-       spi_error_code = 0;
-       return retval;
-}
-
-gboolean
-spi_controller_update_key_grabs (SpiDEController           *controller,
-                                Accessibility_DeviceEvent *recv)
+spi_controller_update_key_grabs (SpiDEController *controller,
+                                 Accessibility_DeviceEvent *recv)
 {
   GList *l, *next;
-  gboolean   update_failed = FALSE;
+  gboolean update_failed = FALSE;
   long keycode = 0;
-  
+
   g_return_val_if_fail (controller != NULL, FALSE);
 
   /*
@@ -1275,16 +1108,16 @@ spi_controller_update_key_grabs (SpiDEController           *controller,
       next = l->next;
 
       re_issue_grab = recv &&
-             (recv->modifiers & grab_mask->mod_mask) &&
-             (grab_mask->key_val == keycode);
+                      (recv->modifiers & grab_mask->mod_mask) &&
+                      (grab_mask->key_val == keycode);
 
 #ifdef SPI_DEBUG
       fprintf (stderr, "mask=%lx %lx (%c%c) %s\n",
-              (long int) grab_mask->key_val,
-              (long int) grab_mask->mod_mask,
-              grab_mask->pending_add ? '+' : '.',
-              grab_mask->pending_remove ? '-' : '.',
-              re_issue_grab ? "re-issue": "");
+               (long int) grab_mask->key_val,
+               (long int) grab_mask->mod_mask,
+               grab_mask->pending_add ? '+' : '.',
+               grab_mask->pending_remove ? '-' : '.',
+               re_issue_grab ? "re-issue" : "");
 #endif
 
       do_remove = FALSE;
@@ -1292,32 +1125,34 @@ spi_controller_update_key_grabs (SpiDEController           *controller,
       if (grab_mask->pending_add && grab_mask->pending_remove)
         {
           do_remove = TRUE;
-       }
+        }
       else if (grab_mask->pending_remove)
         {
 #ifdef SPI_DEBUG
-      fprintf (stderr, "ungrabbing, mask=%x\n", grab_mask->mod_mask);
+          fprintf (stderr, "ungrabbing, mask=%x\n", grab_mask->mod_mask);
 #endif
-         spi_dec_plat_ungrab_key (controller,
-                              grab_mask->key_val,
-                              grab_mask->mod_mask);
+          spi_dec_plat_ungrab_key (controller,
+                                   grab_mask->key_val,
+                                   grab_mask->mod_mask);
 
           do_remove = TRUE;
-       }
+        }
       else if (grab_mask->pending_add || re_issue_grab)
         {
 
 #ifdef SPI_DEBUG
-         fprintf (stderr, "grab %d with mask %x\n", grab_mask->key_val, grab_mask->mod_mask);
+          fprintf (stderr, "grab %d with mask %x\n", grab_mask->key_val, grab_mask->mod_mask);
 #endif
-         update_failed = spi_dec_plat_grab_key (controller,
-                                              grab_mask->key_val,
-                                              grab_mask->mod_mask);
-         if (update_failed) {
-                 while (grab_mask->ref_count > 0) --grab_mask->ref_count;
-                 do_remove = TRUE;
-         }
-       }
+          update_failed = spi_dec_plat_grab_key (controller,
+                                                 grab_mask->key_val,
+                                                 grab_mask->mod_mask);
+          if (update_failed)
+            {
+              while (grab_mask->ref_count > 0)
+                --grab_mask->ref_count;
+              do_remove = TRUE;
+            }
+        }
 
       grab_mask->pending_add = FALSE;
       grab_mask->pending_remove = FALSE;
@@ -1326,15 +1161,14 @@ spi_controller_update_key_grabs (SpiDEController           *controller,
         {
           g_assert (grab_mask->ref_count <= 0);
 
-         controller->keygrabs_list = g_list_delete_link (
-           controller->keygrabs_list, l);
+          controller->keygrabs_list = g_list_delete_link (
+              controller->keygrabs_list, l);
 
-         spi_grab_mask_free (grab_mask);
-       }
-
-    } 
+          spi_grab_mask_free (grab_mask);
+        }
+    }
 
-  return ! update_failed;
+  return !update_failed;
 }
 
 /*
@@ -1344,13 +1178,13 @@ static void
 spi_device_event_controller_object_finalize (GObject *object)
 {
   SpiDEController *controller;
-  GObjectClass *parent_class = G_OBJECT_CLASS(spi_device_event_controller_parent_class);
+  GObjectClass *parent_class = G_OBJECT_CLASS (spi_device_event_controller_parent_class);
   SpiDEControllerClass *klass;
 
   controller = SPI_DEVICE_EVENT_CONTROLLER (object);
   klass = SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS (controller);
 #ifdef SPI_DEBUG
-  fprintf(stderr, "spi_device_event_controller_object_finalize called\n");
+  fprintf (stderr, "spi_device_event_controller_object_finalize called\n");
 #endif
   if (klass->plat.finalize)
     klass->plat.finalize (controller);
@@ -1363,110 +1197,75 @@ spi_device_event_controller_object_finalize (GObject *object)
  *     method implementation
  */
 static DBusMessage *
-impl_register_keystroke_listener (DBusConnection *bus,
-                                 DBusMessage *message,
-                                 void *user_data)
+impl_register_keystroke_listener (DBusMessage *message, SpiDEController *controller)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
   DEControllerKeyListener *dec_listener;
   DBusMessageIter iter, iter_array;
   const char *path;
   GSList *keys = NULL;
-  dbus_int32_t mask, type;
+  dbus_int32_t mask, types;
   Accessibility_EventListenerMode *mode;
- dbus_bool_t ret;
 dbus_bool_t ret;
   DBusMessage *reply = NULL;
   char *keystring;
 
   if (strcmp (dbus_message_get_signature (message), "oa(iisi)uu(bbb)") != 0)
     return invalid_arguments_error (message);
 
-  dbus_message_iter_init(message, &iter);
-  dbus_message_iter_get_basic(&iter, &path);
-  dbus_message_iter_next(&iter);
-  dbus_message_iter_recurse(&iter, &iter_array);
-  while (dbus_message_iter_get_arg_type(&iter_array) != DBUS_TYPE_INVALID)
-  {
-    Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *)g_malloc(sizeof(Accessibility_KeyDefinition));
-    if (!spi_dbus_message_iter_get_struct(&iter_array, DBUS_TYPE_INT32, &kd->keycode, DBUS_TYPE_INT32, &kd->keysym, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_INVALID))
+  dbus_message_iter_init (message, &iter);
+  dbus_message_iter_get_basic (&iter, &path);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
     {
-      g_free(kd);
-      break;
+      Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *) g_malloc (sizeof (Accessibility_KeyDefinition));
+      if (!spi_dbus_message_iter_get_struct (&iter_array, DBUS_TYPE_INT32, &kd->keycode, DBUS_TYPE_INT32, &kd->keysym, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_INVALID))
+        {
+          g_free (kd);
+          break;
+        }
+      kd->keystring = g_strdup (keystring);
+      keys = g_slist_append (keys, kd);
     }
-    kd->keystring = g_strdup (keystring);
-    keys = g_slist_append(keys, kd);
-  }
-  dbus_message_iter_next(&iter);
-  dbus_message_iter_get_basic(&iter, &mask);
-  dbus_message_iter_next(&iter);
-  dbus_message_iter_get_basic(&iter, &type);
-  dbus_message_iter_next(&iter);
-  mode = (Accessibility_EventListenerMode *)g_malloc(sizeof(Accessibility_EventListenerMode));
-  if (mode)
-  {
-    spi_dbus_message_iter_get_struct(&iter, DBUS_TYPE_BOOLEAN, &mode->synchronous, DBUS_TYPE_BOOLEAN, &mode->preemptive, DBUS_TYPE_BOOLEAN, &mode->global, DBUS_TYPE_INVALID);
-  }
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &mask);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &types);
+  dbus_message_iter_next (&iter);
+  mode = g_new0 (Accessibility_EventListenerMode, 1);
+  spi_dbus_message_iter_get_struct (&iter, DBUS_TYPE_BOOLEAN, &mode->synchronous, DBUS_TYPE_BOOLEAN, &mode->preemptive, DBUS_TYPE_BOOLEAN, &mode->global, DBUS_TYPE_INVALID);
+
 #ifdef SPI_DEBUG
   fprintf (stderr, "registering keystroke listener %s:%s with maskVal %lu\n",
-          dbus_message_get_sender(message), path, (unsigned long) mask);
+           dbus_message_get_sender (message), path, (unsigned long) mask);
 #endif
-  dec_listener = spi_dec_key_listener_new (dbus_message_get_sender(message), path, keys, mask, type, mode);
+  dec_listener = spi_dec_key_listener_new (dbus_message_get_sender (message), path, keys, mask, types, mode);
   g_free (mode);
   ret = spi_controller_register_device_listener (
-         controller, (DEControllerListener *) dec_listener);
+      controller, (DEControllerListener *) dec_listener);
   reply = dbus_message_new_method_return (message);
   if (reply)
-  {
-    dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
-  }
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
+    }
   return reply;
 }
 
-/*
- * DBus Accessibility::DEController::RegisterDeviceEventListener
- *     method implementation
- */
-static DBusMessage *
-impl_register_device_event_listener (DBusConnection *bus,
-                                 DBusMessage *message,
-                                 void *user_data)
+typedef struct
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
-  DEControllerListener *dec_listener;
-  const char *path;
-  dbus_int32_t event_types;
-  dbus_bool_t ret;
-  DBusMessage *reply = NULL;
-
-  if (!dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_UINT32, &event_types, DBUS_TYPE_INVALID))
-  {
-    return invalid_arguments_error (message);
-  }
-  dec_listener = spi_dec_listener_new (dbus_message_get_sender(message), path, event_types);
-  ret =  spi_controller_register_device_listener (
-         controller, (DEControllerListener *) dec_listener);
-  reply = dbus_message_new_method_return (message);
-  if (reply)
-  {
-    dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
-  }
-  return reply;
-}
-
-typedef struct {
-       DBusConnection *bus;
-       DEControllerListener    *listener;
+  DBusConnection *bus;
+  DEControllerListener *listener;
 } RemoveListenerClosure;
 
 static SpiReEntrantContinue
-remove_listener_cb (GList * const *list,
-                   gpointer       user_data)
+remove_listener_cb (GList *const *list,
+                    gpointer user_data)
 {
-  DEControllerListener  *listener = (*list)->data;
+  DEControllerListener *listener = (*list)->data;
   RemoveListenerClosure *ctx = user_data;
 
-  if (!strcmp(ctx->listener->bus_name, listener->bus_name) &&
-      !strcmp(ctx->listener->path, listener->path))
+  if (!strcmp (ctx->listener->bus_name, listener->bus_name) &&
+      !strcmp (ctx->listener->path, listener->path))
     {
       spi_re_entrant_list_delete_link (list);
       spi_dbus_remove_disconnect_match (ctx->bus, listener->bus_name);
@@ -1477,47 +1276,30 @@ remove_listener_cb (GList * const *list,
 }
 
 static SpiReEntrantContinue
-copy_key_listener_cb (GList * const *list,
-                     gpointer       user_data)
+copy_key_listener_cb (GList *const *list,
+                      gpointer user_data)
 {
-  DEControllerKeyListener  *key_listener = (*list)->data;
-  RemoveListenerClosure    *ctx = user_data;
+  DEControllerKeyListener *key_listener = (*list)->data;
+  RemoveListenerClosure *ctx = user_data;
 
-  if (!strcmp(ctx->listener->bus_name, key_listener->listener.bus_name) &&
-      !strcmp(ctx->listener->path, key_listener->listener.path))
+  if (!strcmp (ctx->listener->bus_name, key_listener->listener.bus_name) &&
+      !strcmp (ctx->listener->path, key_listener->listener.path))
     {
       /* TODO: FIXME aggregate keys in case the listener is registered twice */
-      DEControllerKeyListener *ctx_key_listener = 
-       (DEControllerKeyListener *) ctx->listener; 
-      keylist_free (ctx_key_listener->keys);       
-      ctx_key_listener->keys = keylist_clone(key_listener->keys);
+      DEControllerKeyListener *ctx_key_listener =
+          (DEControllerKeyListener *) ctx->listener;
+      keylist_free (ctx_key_listener->keys);
+      ctx_key_listener->keys = keylist_clone (key_listener->keys);
     }
 
   return SPI_RE_ENTRANT_CONTINUE;
 }
 
 static void
-spi_controller_deregister_device_listener (SpiDEController            *controller,
-                                          DEControllerListener *listener)
-{
-  RemoveListenerClosure  ctx;
-
-  ctx.bus = controller->bus;
-  ctx.listener = listener;
-
-  notify_mouse_listener (controller, listener, FALSE);
-
-  spi_re_entrant_list_foreach (&controller->mouse_listeners,
-                              remove_listener_cb, &ctx);
-  if (!controller->mouse_listeners)
-    have_mouse_listener = FALSE;
-}
-
-static void
-spi_deregister_controller_key_listener (SpiDEController            *controller,
-                                       DEControllerKeyListener    *key_listener)
+spi_deregister_controller_key_listener (SpiDEController *controller,
+                                        DEControllerKeyListener *key_listener)
 {
-  RemoveListenerClosure  ctx;
+  RemoveListenerClosure ctx;
 
   ctx.bus = controller->bus;
   ctx.listener = (DEControllerListener *) spi_key_listener_clone (key_listener);
@@ -1525,16 +1307,16 @@ spi_deregister_controller_key_listener (SpiDEController            *controller,
   notify_keystroke_listener (controller, key_listener, FALSE);
 
   /* special case, copy keyset from existing controller list entry */
-  if (g_slist_length(key_listener->keys) == 0)
+  if (g_slist_length (key_listener->keys) == 0)
     {
       spi_re_entrant_list_foreach (&controller->key_listeners,
-                                 copy_key_listener_cb, &ctx);
+                                   copy_key_listener_cb, &ctx);
     }
 
   spi_controller_deregister_global_keygrabs (controller, key_listener);
 
   spi_re_entrant_list_foreach (&controller->key_listeners,
-                               remove_listener_cb, &ctx);
+                               remove_listener_cb, &ctx);
 
   spi_key_listener_clone_free ((DEControllerKeyListener *) ctx.listener);
 }
@@ -1544,27 +1326,17 @@ spi_remove_device_listeners (SpiDEController *controller, const char *bus_name)
 {
   GList *l, *tmp;
 
-  for (l = controller->mouse_listeners; l; l = tmp)
-  {
-    DEControllerListener *listener = l->data;
-    tmp = l->next;
-    if (!strcmp (listener->bus_name, bus_name))
-    {
-      spi_controller_deregister_device_listener (controller, listener);
-      tmp = controller->mouse_listeners;
-    }
-  }
   for (l = controller->key_listeners; l; l = tmp)
-  {
-    DEControllerKeyListener *key_listener = l->data;
-    tmp = l->next;
-    if (!strcmp (key_listener->listener.bus_name, bus_name))
     {
-      /* TODO: untangle the below line(s) */
-      spi_deregister_controller_key_listener (controller, key_listener);
-      tmp = controller->key_listeners;
+      DEControllerKeyListener *key_listener = l->data;
+      tmp = l->next;
+      if (!strcmp (key_listener->listener.bus_name, bus_name))
+        {
+          /* TODO: untangle the below line(s) */
+          spi_deregister_controller_key_listener (controller, key_listener);
+          tmp = controller->key_listeners;
+        }
     }
-  }
 }
 
 /*
@@ -1572,11 +1344,8 @@ spi_remove_device_listeners (SpiDEController *controller, const char *bus_name)
  *     method implementation
  */
 static DBusMessage *
-impl_deregister_keystroke_listener (DBusConnection *bus,
-                                 DBusMessage *message,
-                                 void *user_data)
+impl_deregister_keystroke_listener (DBusMessage *message, SpiDEController *controller)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
   DEControllerKeyListener *key_listener;
   DBusMessageIter iter, iter_array;
   const char *path;
@@ -1584,38 +1353,38 @@ impl_deregister_keystroke_listener (DBusConnection *bus,
   dbus_int32_t mask, type;
   DBusMessage *reply = NULL;
 
-  dbus_message_iter_init(message, &iter);
+  dbus_message_iter_init (message, &iter);
   if (strcmp (dbus_message_get_signature (message), "oa(iisi)uu") != 0)
-  {
-    g_warning ("Received DeregisterKeystrokeListener with strange signature '%s'", dbus_message_get_signature (message));
-    return invalid_arguments_error (message);
-  }
-
-  dbus_message_iter_get_basic(&iter, &path);
-  dbus_message_iter_next(&iter);
-  dbus_message_iter_recurse(&iter, &iter_array);
-  while (dbus_message_iter_get_arg_type(&iter_array) != DBUS_TYPE_INVALID)
-  {
-    Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *)g_malloc(sizeof(Accessibility_KeyDefinition));
-  char *keystring;
+    {
+      g_warning ("Received DeregisterKeystrokeListener with strange signature '%s'", dbus_message_get_signature (message));
+      return invalid_arguments_error (message);
+    }
 
-    if (!spi_dbus_message_iter_get_struct(&iter_array, DBUS_TYPE_INT32, &kd->keycode, DBUS_TYPE_INT32, &kd->keysym, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_INVALID))
+  dbus_message_iter_get_basic (&iter, &path);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_recurse (&iter, &iter_array);
+  while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
     {
-      g_free(kd);
-      break;
+      Accessibility_KeyDefinition *kd = (Accessibility_KeyDefinition *) g_malloc (sizeof (Accessibility_KeyDefinition));
+      char *keystring;
+
+      if (!spi_dbus_message_iter_get_struct (&iter_array, DBUS_TYPE_INT32, &kd->keycode, DBUS_TYPE_INT32, &kd->keysym, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_INVALID))
+        {
+          g_free (kd);
+          break;
+        }
+      kd->keystring = g_strdup (keystring);
+      keys = g_slist_append (keys, kd);
     }
-    kd->keystring = g_strdup (keystring);
-    keys = g_slist_append(keys, kd);
-  }
-  dbus_message_iter_next(&iter);
-  dbus_message_iter_get_basic(&iter, &mask);
-  dbus_message_iter_next(&iter);
-  dbus_message_iter_get_basic(&iter, &type);
-  dbus_message_iter_next(&iter);
-  key_listener = spi_dec_key_listener_new (dbus_message_get_sender(message), path, keys, mask, type, NULL);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &mask);
+  dbus_message_iter_next (&iter);
+  dbus_message_iter_get_basic (&iter, &type);
+  dbus_message_iter_next (&iter);
+  key_listener = spi_dec_key_listener_new (dbus_message_get_sender (message), path, keys, mask, type, NULL);
 #ifdef SPI_DEREGISTER_DEBUG
   fprintf (stderr, "deregistering keystroke listener %p with maskVal %lu\n",
-          (void *) l, (unsigned long) mask->value);
+           (void *) l, (unsigned long) mask->value);
 #endif
 
   spi_deregister_controller_key_listener (controller, key_listener);
@@ -1625,38 +1394,9 @@ impl_deregister_keystroke_listener (DBusConnection *bus,
   return reply;
 }
 
-/*
- * DBus Accessibility::DEController::DeregisterDeviceEventListener
- *     method implementation
- */
 static DBusMessage *
-impl_deregister_device_event_listener (DBusConnection *bus,
-                                 DBusMessage *message,
-                                 void *user_data)
+impl_get_keystroke_listeners (DBusMessage *message, SpiDEController *controller)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
-  DEControllerListener *listener;
-  const char *path;
-  dbus_int32_t event_types;
-  DBusMessage *reply = NULL;
-
-  if (!dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_UINT32, &event_types, DBUS_TYPE_INVALID))
-  {
-    return invalid_arguments_error (message);
-  }
-  listener = spi_dec_listener_new (dbus_message_get_sender(message), path, event_types);
-  spi_controller_deregister_device_listener (
-         controller, listener);
-  reply = dbus_message_new_method_return (message);
-  return reply;
-}
-
-static DBusMessage *
-impl_get_keystroke_listeners (DBusConnection *bus,
-                                 DBusMessage *message,
-                                 void *user_data)
-{
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
   DBusMessageIter iter, iter_array;
   DBusMessage *reply = dbus_message_new_method_return (message);
   GList *l;
@@ -1668,33 +1408,9 @@ impl_get_keystroke_listeners (DBusConnection *bus,
   dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
                                     "(souua(iisi)u(bbb))", &iter_array);
   for (l = controller->key_listeners; l; l = l->next)
-  {
-    append_keystroke_listener (&iter_array, l->data);
-  }
-  dbus_message_iter_close_container (&iter, &iter_array);
-  return reply;
-}
-
-static DBusMessage *
-impl_get_device_event_listeners (DBusConnection *bus,
-                                 DBusMessage *message,
-                                 void *user_data)
-{
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
-  DBusMessageIter iter, iter_array;
-  GList *l;
-  DBusMessage *reply = dbus_message_new_method_return (message);
-
-  if (!reply)
-    return NULL;
-
-  dbus_message_iter_init_append (reply, &iter);
-  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY,
-                                    "(sou)", &iter_array);
-  for (l = controller->key_listeners; l; l = l->next)
-  {
-    append_mouse_listener (&iter_array, l->data);
-  }
+    {
+      append_keystroke_listener (&iter_array, l->data);
+    }
   dbus_message_iter_close_container (&iter, &iter_array);
   return reply;
 }
@@ -1702,65 +1418,65 @@ impl_get_device_event_listeners (DBusConnection *bus,
 static unsigned
 get_modifier_state (SpiDEController *controller)
 {
-       spi_dec_poll_mouse_moved (controller);
-       return mouse_mask_state;
+  spi_dec_poll_mouse_moved (controller);
+  return controller->mouse_mask_state;
 }
 
 gboolean
 spi_dec_synth_keysym (SpiDEController *controller, long keysym)
 {
-       long key_synth_code;
-       unsigned int modifiers, synth_mods, lock_mods;
+  long key_synth_code;
+  unsigned int modifiers, synth_mods, lock_mods;
 
-       key_synth_code = spi_dec_plat_get_keycode (controller, keysym, NULL, TRUE, &synth_mods);
+  key_synth_code = spi_dec_plat_get_keycode (controller, keysym, NULL, TRUE, &synth_mods);
 
-       if ((key_synth_code == 0) || (synth_mods == 0xFF)) return FALSE;
+  if ((key_synth_code == 0) || (synth_mods == 0xFF))
+    return FALSE;
 
-       /* TODO: set the modifiers accordingly! */
-       modifiers = get_modifier_state (controller);
-       /* side-effect; we may unset mousebutton modifiers here! */
+  /* TODO: set the modifiers accordingly! */
+  modifiers = get_modifier_state (controller);
+  /* side-effect; we may unset mousebutton modifiers here! */
 
-       lock_mods = 0;
-       if (synth_mods != modifiers) {
-               lock_mods = synth_mods & ~modifiers;
-               spi_dec_plat_lock_modifiers (controller, lock_mods);
-               if (modifiers & SPI_KEYMASK_SHIFTLOCK)
-                       spi_dec_plat_unlock_modifiers (controller, SPI_KEYMASK_SHIFTLOCK);
-       }
-       spi_dec_plat_synth_keycode_press (controller, key_synth_code);
-       spi_dec_plat_synth_keycode_release (controller, key_synth_code);
+  lock_mods = 0;
+  if (synth_mods != modifiers)
+    {
+      lock_mods = synth_mods & ~modifiers;
+      spi_dec_plat_lock_modifiers (controller, lock_mods);
+      if (modifiers & SPI_KEYMASK_SHIFTLOCK)
+        spi_dec_plat_unlock_modifiers (controller, SPI_KEYMASK_SHIFTLOCK);
+    }
+  spi_dec_plat_synth_keycode_press (controller, key_synth_code);
+  spi_dec_plat_synth_keycode_release (controller, key_synth_code);
 
-       if (synth_mods != modifiers) {
-               spi_dec_plat_unlock_modifiers (controller, lock_mods);
-               if (modifiers & SPI_KEYMASK_SHIFTLOCK)
-                       spi_dec_plat_lock_modifiers (controller, SPI_KEYMASK_SHIFTLOCK);
-       }
-       return TRUE;
+  if (synth_mods != modifiers)
+    {
+      spi_dec_plat_unlock_modifiers (controller, lock_mods);
+      if (modifiers & SPI_KEYMASK_SHIFTLOCK)
+        spi_dec_plat_lock_modifiers (controller, SPI_KEYMASK_SHIFTLOCK);
+    }
+  return TRUE;
 }
 
-
-
 /*
  * DBus Accessibility::DEController::RegisterKeystrokeListener
  *     method implementation
  */
 static DBusMessage *
-impl_generate_keyboard_event (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_generate_keyboard_event (DBusMessage *message, SpiDEController *controller)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
   dbus_int32_t keycode;
   char *keystring;
   dbus_uint32_t synth_type;
   DBusMessage *reply = NULL;
 
-  if (!dbus_message_get_args(message, NULL, DBUS_TYPE_INT32, &keycode, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_UINT32, &synth_type, DBUS_TYPE_INVALID))
-  {
-    return invalid_arguments_error (message);
-  }
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &keycode, DBUS_TYPE_STRING, &keystring, DBUS_TYPE_UINT32, &synth_type, DBUS_TYPE_INVALID))
+    {
+      return invalid_arguments_error (message);
+    }
 
 #ifdef SPI_DEBUG
-       fprintf (stderr, "synthesizing keystroke %ld, type %d\n",
-                (long) keycode, (int) synth_type);
+  fprintf (stderr, "synthesizing keystroke %ld, type %d\n",
+           (long) keycode, (int) synth_type);
 #endif
   /* TODO: hide/wrap/remove X dependency */
 
@@ -1768,39 +1484,39 @@ impl_generate_keyboard_event (DBusConnection *bus, DBusMessage *message, void *u
    * TODO: when initializing, query for XTest extension before using,
    * and fall back to XSendEvent() if XTest is not available.
    */
-  
+
   switch (synth_type)
     {
-      case Accessibility_KEY_PRESS:
-             spi_dec_plat_synth_keycode_press (controller, keycode);
-             break;
-      case Accessibility_KEY_PRESSRELEASE:
-             spi_dec_plat_synth_keycode_press (controller, keycode);
-      case Accessibility_KEY_RELEASE:
-             spi_dec_plat_synth_keycode_release (controller, keycode);
-             break;
-      case Accessibility_KEY_SYM:
-#ifdef SPI_XKB_DEBUG         
-             fprintf (stderr, "KeySym synthesis\n");
+    case Accessibility_KEY_PRESS:
+      spi_dec_plat_synth_keycode_press (controller, keycode);
+      break;
+    case Accessibility_KEY_PRESSRELEASE:
+      spi_dec_plat_synth_keycode_press (controller, keycode);
+    case Accessibility_KEY_RELEASE:
+      spi_dec_plat_synth_keycode_release (controller, keycode);
+      break;
+    case Accessibility_KEY_SYM:
+#ifdef SPI_XKB_DEBUG
+      fprintf (stderr, "KeySym synthesis\n");
 #endif
-             /* 
-              * note: we are using long for 'keycode'
-              * in our arg list; it can contain either
-              * a keycode or a keysym.
-              */
-             spi_dec_synth_keysym (controller, keycode);
-             break;
-      case Accessibility_KEY_STRING:
-             if (!spi_dec_plat_synth_keystring (controller, synth_type, keycode, keystring))
-                     fprintf (stderr, "Keystring synthesis failure, string=%s\n",
-                              keystring);
-             break;
-      case Accessibility_KEY_LOCKMODIFIERS:
-             spi_dec_plat_lock_modifiers (controller, keycode);
-             break;
-      case Accessibility_KEY_UNLOCKMODIFIERS:
-             spi_dec_plat_unlock_modifiers (controller, keycode);
-             break;
+      /*
+       * note: we are using long for 'keycode'
+       * in our arg list; it can contain either
+       * a keycode or a keysym.
+       */
+      spi_dec_synth_keysym (controller, keycode);
+      break;
+    case Accessibility_KEY_STRING:
+      if (!spi_dec_plat_synth_keystring (controller, synth_type, keycode, keystring))
+        fprintf (stderr, "Keystring synthesis failure, string=%s\n",
+                 keystring);
+      break;
+    case Accessibility_KEY_LOCKMODIFIERS:
+      spi_dec_plat_lock_modifiers (controller, keycode);
+      break;
+    case Accessibility_KEY_UNLOCKMODIFIERS:
+      spi_dec_plat_unlock_modifiers (controller, keycode);
+      break;
     }
   reply = dbus_message_new_method_return (message);
   return reply;
@@ -1808,73 +1524,70 @@ impl_generate_keyboard_event (DBusConnection *bus, DBusMessage *message, void *u
 
 /* Accessibility::DEController::GenerateMouseEvent */
 static DBusMessage *
-impl_generate_mouse_event (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_generate_mouse_event (DBusMessage *message, SpiDEController *controller)
 {
-  dbus_int32_t       x;
-  dbus_int32_t       y;
+  dbus_int32_t x;
+  dbus_int32_t y;
   char *eventName;
   DBusMessage *reply = NULL;
 
-  if (!dbus_message_get_args(message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_STRING, &eventName, DBUS_TYPE_INVALID))
-  {
-    return invalid_arguments_error (message);
-  }
+  if (!dbus_message_get_args (message, NULL, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, &y, DBUS_TYPE_STRING, &eventName, DBUS_TYPE_INVALID))
+    {
+      return invalid_arguments_error (message);
+    }
 
 #ifdef SPI_DEBUG
   fprintf (stderr, "generating mouse %s event at %ld, %ld\n",
-          eventName, (long int) x, (long int) y);
+           eventName, (long int) x, (long int) y);
 #endif
-  spi_dec_plat_generate_mouse_event (saved_controller, x, y, eventName);
+  spi_dec_plat_generate_mouse_event (controller, x, y, eventName);
   reply = dbus_message_new_method_return (message);
   return reply;
 }
 
 /* Accessibility::DEController::NotifyListenersSync */
 static DBusMessage *
-impl_notify_listeners_sync (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_notify_listeners_sync (DBusMessage *message, SpiDEController *controller)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
   Accessibility_DeviceEvent event;
   dbus_bool_t ret;
   DBusMessage *reply = NULL;
 
-  if (!spi_dbus_demarshal_deviceEvent(message, &event))
-  {
-    return invalid_arguments_error (message);
-  }
+  if (!spi_dbus_demarshal_deviceEvent (message, &event))
+    {
+      return invalid_arguments_error (message);
+    }
 #ifdef SPI_DEBUG
   g_print ("notifylistening listeners synchronously: controller %p, event id %d\n",
-          controller, (int) event.id);
+           controller, (int) event.id);
 #endif
   ret = spi_controller_notify_keylisteners (controller,
-                                            (Accessibility_DeviceEvent *) 
-                                            &event, FALSE) ?
-         TRUE : FALSE; 
+                                            (Accessibility_DeviceEvent *) &event, FALSE)
+            ? TRUE
+            : FALSE;
   reply = dbus_message_new_method_return (message);
   if (reply)
-  {
-    dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
-  }
+    {
+      dbus_message_append_args (reply, DBUS_TYPE_BOOLEAN, &ret, DBUS_TYPE_INVALID);
+    }
   return reply;
 }
 
 static DBusMessage *
-impl_notify_listeners_async (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_notify_listeners_async (DBusMessage *message, SpiDEController *controller)
 {
-  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data);
   Accessibility_DeviceEvent event;
   DBusMessage *reply = NULL;
 
-  if (!spi_dbus_demarshal_deviceEvent(message, &event))
-  {
-    return invalid_arguments_error (message);
-  }
+  if (!spi_dbus_demarshal_deviceEvent (message, &event))
+    {
+      return invalid_arguments_error (message);
+    }
 #ifdef SPI_DEBUG
   g_print ("notifylistening listeners asynchronously: controller %p, event id %d\n",
-          controller, (int) event.id);
+           controller, (int) event.id);
 #endif
-  spi_controller_notify_keylisteners (controller, (Accessibility_DeviceEvent *)
-                                     &event, FALSE); 
+  spi_controller_notify_keylisteners (controller, (Accessibility_DeviceEvent *) &event, FALSE);
   reply = dbus_message_new_method_return (message);
   return reply;
 }
@@ -1882,7 +1595,7 @@ impl_notify_listeners_async (DBusConnection *bus, DBusMessage *message, void *us
 static void
 spi_device_event_controller_class_init (SpiDEControllerClass *klass)
 {
-  GObjectClass * object_class = (GObjectClass *) klass;
+  GObjectClass *object_class = (GObjectClass *) klass;
 
   spi_device_event_controller_parent_class = g_type_class_peek_parent (klass);
 
@@ -1901,27 +1614,24 @@ spi_device_event_controller_init (SpiDEController *device_event_controller)
   klass = SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS (device_event_controller);
 
   device_event_controller->message_queue = g_queue_new ();
-  saved_controller = device_event_controller;
 
   if (klass->plat.init)
     klass->plat.init (device_event_controller);
 }
 
-
 /*---------------------------------------------------------------------------*/
 
 static const char *introspection_header =
-"<?xml version=\"1.0\"?>\n";
+    "<?xml version=\"1.0\"?>\n";
 
 static const char *introspection_node_element =
-"<node name=\"%s\">\n";
+    "<node name=\"%s\">\n";
 
 static const char *introspection_footer =
-"</node>";
+    "</node>";
 
 static DBusMessage *
-impl_Introspect (DBusConnection * bus,
-                 DBusMessage * message, void *user_data)
+impl_Introspect (DBusMessage *message, SpiDEController *controller)
 {
   GString *output;
   gchar *final;
@@ -1930,66 +1640,60 @@ impl_Introspect (DBusConnection * bus,
 
   DBusMessage *reply;
 
-  output = g_string_new(introspection_header);
+  output = g_string_new (introspection_header);
 
-  g_string_append_printf(output, introspection_node_element, pathstr);
+  g_string_append_printf (output, introspection_node_element, pathstr);
 
   g_string_append (output, spi_org_a11y_atspi_DeviceEventController);
 
-  g_string_append(output, introspection_footer);
-  final = g_string_free(output, FALSE);
+  g_string_append (output, introspection_footer);
+  final = g_string_free (output, FALSE);
 
   reply = dbus_message_new_method_return (message);
-  dbus_message_append_args(reply, DBUS_TYPE_STRING, &final, DBUS_TYPE_INVALID);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &final, DBUS_TYPE_INVALID);
 
-  g_free(final);
+  g_free (final);
   return reply;
 }
 
 /*---------------------------------------------------------------------------*/
 
 static void
-handle_dec_method_from_idle (DBusConnection *bus, DBusMessage *message, void *user_data)
+handle_message (DBusMessage *message, SpiDEController *controller)
 {
-  const gchar *iface   = dbus_message_get_interface (message);
-  const gchar *member  = dbus_message_get_member (message);
+  const gchar *iface = dbus_message_get_interface (message);
+  const gchar *member = dbus_message_get_member (message);
   DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
   DBusMessage *reply = NULL;
 
   if (!strcmp (iface, SPI_DBUS_INTERFACE_DEC))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "RegisterKeystrokeListener"))
-          reply = impl_register_keystroke_listener (bus, message, user_data);
-      else if (!strcmp (member, "RegisterDeviceEventListener"))
-          reply = impl_register_device_event_listener (bus, message, user_data);
+      if (!strcmp (member, "RegisterKeystrokeListener"))
+        reply = impl_register_keystroke_listener (message, controller);
       else if (!strcmp (member, "DeregisterKeystrokeListener"))
-          reply = impl_deregister_keystroke_listener (bus, message, user_data);
-      else if (!strcmp (member, "DeregisterDeviceEventListener"))
-          reply = impl_deregister_device_event_listener (bus, message, user_data);
+        reply = impl_deregister_keystroke_listener (message, controller);
       else if (!strcmp (member, "GetKeystrokeListeners"))
-          reply = impl_get_keystroke_listeners (bus, message, user_data);
-      else if (!strcmp (member, "GetDeviceEventListeners"))
-          reply = impl_get_device_event_listeners (bus, message, user_data);
+        reply = impl_get_keystroke_listeners (message, controller);
       else if (!strcmp (member, "GenerateKeyboardEvent"))
-          reply = impl_generate_keyboard_event (bus, message, user_data);
+        reply = impl_generate_keyboard_event (message, controller);
       else if (!strcmp (member, "GenerateMouseEvent"))
-          reply = impl_generate_mouse_event (bus, message, user_data);
+        reply = impl_generate_mouse_event (message, controller);
       else if (!strcmp (member, "NotifyListenersSync"))
-          reply = impl_notify_listeners_sync (bus, message, user_data);
+        reply = impl_notify_listeners_sync (message, controller);
       else if (!strcmp (member, "NotifyListenersAsync"))
-          reply = impl_notify_listeners_async (bus, message, user_data);
+        reply = impl_notify_listeners_async (message, controller);
       else
-          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (!strcmp (iface, "org.freedesktop.DBus.Introspectable"))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "Introspect"))
-          reply = impl_Introspect (bus, message, user_data);
+      if (!strcmp (member, "Introspect"))
+        reply = impl_Introspect (message, controller);
       else
-          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (result == DBUS_HANDLER_RESULT_HANDLED)
@@ -1999,7 +1703,7 @@ handle_dec_method_from_idle (DBusConnection *bus, DBusMessage *message, void *us
           reply = dbus_message_new_method_return (message);
         }
 
-      dbus_connection_send (bus, reply, NULL);
+      dbus_connection_send (controller->bus, reply, NULL);
       dbus_message_unref (reply);
     }
 }
@@ -2007,12 +1711,13 @@ handle_dec_method_from_idle (DBusConnection *bus, DBusMessage *message, void *us
 static gboolean
 message_queue_dispatch (gpointer data)
 {
-  saved_controller->message_queue_idle = 0;
-  while (!g_queue_is_empty (saved_controller->message_queue))
+  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER (data);
+
+  controller->message_queue_idle = 0;
+  while (!g_queue_is_empty (controller->message_queue))
     {
-      DBusMessage *message = g_queue_pop_head (saved_controller->message_queue);
-      data = g_queue_pop_head (saved_controller->message_queue);
-      handle_dec_method_from_idle (saved_controller->bus, message, data);
+      DBusMessage *message = g_queue_pop_head (controller->message_queue);
+      handle_message (message, controller);
       dbus_message_unref (message);
     }
   return FALSE;
@@ -2021,40 +1726,38 @@ message_queue_dispatch (gpointer data)
 static DBusHandlerResult
 handle_dec_method (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
-  const gchar *iface   = dbus_message_get_interface (message);
-  const gchar *member  = dbus_message_get_member (message);
-  const gint   type    = dbus_message_get_type (message);
+  SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER (user_data);
+  const gchar *iface = dbus_message_get_interface (message);
+  const gchar *member = dbus_message_get_member (message);
+  const gint type = dbus_message_get_type (message);
 
   /* Check for basic reasons not to handle */
-  if (type   != DBUS_MESSAGE_TYPE_METHOD_CALL ||
+  if (type != DBUS_MESSAGE_TYPE_METHOD_CALL ||
       member == NULL ||
-      iface  == NULL)
-      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+      iface == NULL)
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
   dbus_message_ref (message);
-  g_queue_push_tail (saved_controller->message_queue, message);
-  g_queue_push_tail (saved_controller->message_queue, user_data);
-  if (!saved_controller->message_queue_idle) {
-    saved_controller->message_queue_idle = g_idle_add (message_queue_dispatch, NULL);
-    g_source_set_name_by_id (saved_controller->message_queue_idle, "[at-spi2-core] message_queue_dispatch");
-  }
+  g_queue_push_tail (controller->message_queue, message);
+  if (!controller->message_queue_idle)
+    {
+      controller->message_queue_idle = g_idle_add (message_queue_dispatch, controller);
+      g_source_set_name_by_id (controller->message_queue_idle, "[at-spi2-core] message_queue_dispatch");
+    }
   return DBUS_HANDLER_RESULT_HANDLED;
 }
 
-static DBusObjectPathVTable dec_vtable =
-{
+static DBusObjectPathVTable dec_vtable = {
   NULL,
   &handle_dec_method,
   NULL, NULL, NULL, NULL
 };
 
 SpiDEController *
-spi_registry_dec_new (SpiRegistry *reg, DBusConnection *bus)
+spi_registry_dec_new (DBusConnection *bus)
 {
   SpiDEController *dec = g_object_new (SPI_DEVICE_EVENT_CONTROLLER_TYPE, NULL);
 
-  dec->registry = g_object_ref (reg);
-  reg->dec = g_object_ref (dec);
   dec->bus = bus;
 
   dbus_connection_register_object_path (bus, SPI_DBUS_PATH_DEC, &dec_vtable, dec);
@@ -2063,21 +1766,19 @@ spi_registry_dec_new (SpiRegistry *reg, DBusConnection *bus)
 }
 
 void
-spi_device_event_controller_start_poll_mouse (SpiRegistry *registry)
+spi_device_event_controller_start_poll_mouse (SpiDEController *dec)
 {
-  if (!have_mouse_event_listener)
+  if (!dec->have_mouse_event_listener)
     {
-      have_mouse_event_listener = TRUE;
-      if (!have_mouse_listener) {
-        guint id;
-        id = g_timeout_add (100, spi_dec_poll_mouse_idle, registry->dec);
-        g_source_set_name_by_id (id, "[at-spi2-core] spi_dec_poll_mouse_idle");
-      }
+      dec->have_mouse_event_listener = TRUE;
+      guint id;
+      id = g_timeout_add (100, spi_dec_poll_mouse_idle, dec);
+      g_source_set_name_by_id (id, "[at-spi2-core] spi_dec_poll_mouse_idle");
     }
 }
 
 void
-spi_device_event_controller_stop_poll_mouse (void)
+spi_device_event_controller_stop_poll_mouse (SpiDEController *dec)
 {
-  have_mouse_event_listener = FALSE;
+  dec->have_mouse_event_listener = FALSE;
 }
index 46ea169..a78148c 100644 (file)
 #ifndef SPI_DEVICE_EVENT_CONTROLLER_H_
 #define SPI_DEVICE_EVENT_CONTROLLER_H_
 
-#ifdef HAVE_X11
-#include <X11/Xlib.h>
-#endif
 #include <dbus/dbus.h>
 
 typedef struct _SpiDEController SpiDEController;
 
-#include "registry.h"
 #include "de-types.h"
+#include "registry.h"
 
 G_BEGIN_DECLS
 
-#define SPI_DEVICE_EVENT_CONTROLLER_TYPE        (spi_device_event_controller_get_type ())
-#define SPI_DEVICE_EVENT_CONTROLLER(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_DEVICE_EVENT_CONTROLLER_TYPE, SpiDEController))
-#define SPI_DEVICE_EVENT_CONTROLLER_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), SPI_DEVICE_EVENT_CONTROLLER_TYPE, SpiDEControllerClass))
-#define SPI_IS_DEVICE_EVENT_CONTROLLER(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), SPI_DEVICE_EVENT_CONTROLLER_TYPE))
+#define SPI_DEVICE_EVENT_CONTROLLER_TYPE (spi_device_event_controller_get_type ())
+#define SPI_DEVICE_EVENT_CONTROLLER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_DEVICE_EVENT_CONTROLLER_TYPE, SpiDEController))
+#define SPI_DEVICE_EVENT_CONTROLLER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SPI_DEVICE_EVENT_CONTROLLER_TYPE, SpiDEControllerClass))
+#define SPI_IS_DEVICE_EVENT_CONTROLLER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SPI_DEVICE_EVENT_CONTROLLER_TYPE))
 #define SPI_IS_DEVICE_EVENT_CONTROLLER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SPI_DEVICE_EVENT_CONTROLLER_TYPE))
 #define SPI_DEVICE_EVENT_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SPI_DEVICE_EVENT_CONTROLLER_TYPE, SpiDEControllerClass))
 
-struct _SpiDEController {
-       GObject parent;
-       DBusConnection *bus;
-       SpiRegistry    *registry;
-       GList          *key_listeners;
-       GList          *mouse_listeners;
-       GList          *keygrabs_list;
-       GQueue *message_queue;
-       guint message_queue_idle;
+struct _SpiDEController
+{
+  GObject parent;
+  DBusConnection *bus;
+  GList *key_listeners;
+  GList *mouse_listeners;
+  GList *keygrabs_list;
+  GQueue *message_queue;
+  guint message_queue_idle;
+
+  guint mouse_mask_state;
+  gboolean have_mouse_event_listener;
 };
 
-typedef enum {
+typedef enum
+{
   SPI_DEVICE_TYPE_KBD,
-  SPI_DEVICE_TYPE_MOUSE,
   SPI_DEVICE_TYPE_LAST_DEFINED
 } SpiDeviceTypeCategory;
 
-typedef struct {
+typedef struct
+{
   char *bus_name;
   char *path;
   SpiDeviceTypeCategory type;
   gulong types;
 } DEControllerListener;
 
-typedef struct {
+typedef struct
+{
   DEControllerListener listener;
 
- GSList *keys;
 GSList *keys;
   Accessibility_ControllerEventMask mask;
-  Accessibility_EventListenerMode  *mode;      
+  Accessibility_EventListenerMode *mode;
 } DEControllerKeyListener;
 
 typedef struct
@@ -83,22 +85,22 @@ typedef struct
                        gboolean fix,
                        guint *modmask);
 
-  guint (*mouse_check) (SpiDEController *controller, 
-                       gint *x,
-                       gint *y,
-                       gboolean *moved);
+  guint (*mouse_check) (SpiDEController *controller,
+                        gint *x,
+                        gint *y,
+                        gboolean *moved);
 
-  gboolean (*register_global_keygrabs) (SpiDEController         *controller,
-                                       DEControllerKeyListener *key_listener);
+  gboolean (*register_global_keygrabs) (SpiDEController *controller,
+                                        DEControllerKeyListener *key_listener);
 
-  void (*deregister_global_keygrabs) (SpiDEController         *controller,
-                                     DEControllerKeyListener *key_listener);
+  void (*deregister_global_keygrabs) (SpiDEController *controller,
+                                      DEControllerKeyListener *key_listener);
 
   gboolean (*synth_keycode_press) (SpiDEController *controller,
-                                  guint keycode);
+                                   guint keycode);
 
   gboolean (*synth_keycode_release) (SpiDEController *controller,
-                                  guint keycode);
+                                     guint keycode);
 
   gboolean (*lock_modifiers) (SpiDEController *controller,
                               unsigned modifiers);
@@ -120,8 +122,8 @@ typedef struct
                       Accessibility_ControllerEventMask mod_mask);
 
   void (*emit_modifier_event) (SpiDEController *controller,
-                              guint prev_mask,
-                              guint current_mask);
+                               guint prev_mask,
+                               guint current_mask);
 
   void (*generate_mouse_event) (SpiDEController *controller,
                                 gint x,
@@ -132,46 +134,32 @@ typedef struct
   void (*finalize) (SpiDEController *controller);
 } SpiDEControllerPlat;
 
-typedef struct {
+typedef struct
+{
   GObjectClass parent_class;
   SpiDEControllerPlat plat;
 } SpiDEControllerClass;
 
-GType            spi_device_event_controller_get_type (void);
-SpiDEController *spi_device_event_controller_new      (SpiRegistry    *registry,
-                                                       DBusConnection *bus);
+GType spi_device_event_controller_get_type (void);
 
-gboolean spi_clear_error_state (void);
-
-void spi_device_event_controller_start_poll_mouse (SpiRegistry *registry);
-void spi_device_event_controller_stop_poll_mouse (void);
+void spi_device_event_controller_start_poll_mouse (SpiDEController *dec);
+void spi_device_event_controller_stop_poll_mouse (SpiDEController *dec);
 
 void spi_remove_device_listeners (SpiDEController *controller, const char *bus_name);
 
-SpiDEController *spi_registry_dec_new (SpiRegistry *reg, DBusConnection *bus);
+SpiDEController *spi_registry_dec_new (DBusConnection *bus);
 
 gboolean
-spi_controller_notify_mouselisteners (SpiDEController                 *controller,
-                                     const Accessibility_DeviceEvent *event);
+spi_controller_notify_keylisteners (SpiDEController *controller,
+                                    Accessibility_DeviceEvent *key_event,
+                                    dbus_bool_t is_system_global);
 
-gboolean
-spi_controller_notify_keylisteners (SpiDEController                 *controller,
-                                   Accessibility_DeviceEvent       *key_event,
-                                   dbus_bool_t                    is_system_global);
-
-gboolean spi_controller_update_key_grabs               (SpiDEController           *controller,
-                                                              Accessibility_DeviceEvent *recv);
+gboolean spi_controller_update_key_grabs (SpiDEController *controller,
+                                          Accessibility_DeviceEvent *recv);
 
 gboolean spi_dec_synth_keysym (SpiDEController *controller, long keysym);
 
-void spi_dec_dbus_emit(SpiDEController *controller, const char *interface, const char *name, const char *minor, int a1, int a2);
-
-#ifdef HAVE_X11
-void spi_dec_setup_x11 (SpiDEControllerClass *klass);
-#endif
-
-long ucs2keysym (long ucs);
-long keysym2ucs(long keysym);
+void spi_dec_dbus_emit (SpiDEController *controller, const char *interface, const char *name, const char *minor, int a1, int a2);
 
 G_END_DECLS
 
index 011f294..16e1c5d 100644 (file)
 
 #include <glib.h>
 
+#include <X11/Xatom.h>
 #include <X11/Xlib.h>
-#include <X11/Xutil.h>
 #include <X11/Xos.h>
-#include <X11/Xatom.h>
+#include <X11/Xutil.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 
 static Display *default_display = NULL;
 
-Display *spi_set_display (const char *display_name)
+Display *
+spi_set_display (const char *display_name)
 {
-        /* 
-        * TODO - Should we ever do anything different might need to
-         * close previous display.
-         */
-        default_display = XOpenDisplay (display_name);  
-        if (!default_display)
-        {
-                g_warning ("AT-SPI: Cannot open default display");
-                exit (1);
-        }
- return default_display;
+  /*
+   * TODO - Should we ever do anything different might need to
+   * close previous display.
+   */
+  default_display = XOpenDisplay (display_name);
+  if (!default_display)
+    {
+      g_warning ("AT-SPI: Cannot open default display");
+      exit (1);
+    }
 return default_display;
 }
 
-Display *spi_get_display ()
+Display *
+spi_get_display ()
 {
-       if (!default_display)
-               spi_set_display (NULL);
+  if (!default_display)
+    spi_set_display (NULL);
 
-       return default_display;
+  return default_display;
 }
 
-Window spi_get_root_window ()
+Window
+spi_get_root_window ()
 {
-       if (!default_display)
-               spi_set_display (NULL);
+  if (!default_display)
+    spi_set_display (NULL);
 
-        return DefaultRootWindow (default_display);
+  return DefaultRootWindow (default_display);
 }
 
 static int (*old_x_error_handler) (Display *, XErrorEvent *);
 static int x_error_code;
 
-static int spi_x_error_handler (Display *display, XErrorEvent *error)
+static int
+spi_x_error_handler (Display *display, XErrorEvent *error)
 {
-       if (error->error_code)
-               x_error_code = error->error_code;
-       else
-               x_error_code = 0;
-  
-       return 0;
+  if (error->error_code)
+    x_error_code = error->error_code;
+  else
+    x_error_code = 0;
+
+  return 0;
 }
 
-void spi_x_error_trap (void)
+void
+spi_x_error_trap (void)
 {
-       old_x_error_handler = XSetErrorHandler (spi_x_error_handler);
+  old_x_error_handler = XSetErrorHandler (spi_x_error_handler);
 }
 
-int spi_x_error_release (void)
+int
+spi_x_error_release (void)
 {
-       XSetErrorHandler (old_x_error_handler);
-       return x_error_code;
+  XSetErrorHandler (old_x_error_handler);
+  return x_error_code;
 }
index e82908a..d73c9b6 100644 (file)
 
 #include "event-source.h"
 
-typedef struct _DisplaySource
+typedef struct
 {
   GSource source;
-  
+
   Display *display;
-  GPollFD  event_poll_fd;
+  GPollFD event_poll_fd;
 } DisplaySource;
 
 /*---------------------------------------------------------------------------*/
 
-static void (*_spi_default_filter) (XEvent*, void*) = NULL;
-static void_spi_default_filter_data = NULL;
+static void (*_spi_default_filter) (XEvent *, void *) = NULL;
+static void *_spi_default_filter_data = NULL;
 
 /*---------------------------------------------------------------------------*/
 
-static gboolean  
+static gboolean
 event_prepare (GSource *source, gint *timeout)
 {
-  Display *display = ((DisplaySource *)source)->display;
+  Display *display = ((DisplaySource *) source)->display;
   gboolean retval;
-  
+
   *timeout = -1;
   retval = XPending (display);
-  
+
   return retval;
 }
 
-static gboolean  
-event_check (GSource *source) 
+static gboolean
+event_check (GSource *source)
 {
-  DisplaySource *display_source = (DisplaySource*)source;
+  DisplaySource *display_source = (DisplaySource *) source;
   gboolean retval;
 
   if (display_source->event_poll_fd.revents & G_IO_IN)
@@ -65,12 +65,12 @@ event_check (GSource *source)
   return retval;
 }
 
-static gboolean  
-event_dispatch (GSource *source, GSourceFunc callback, gpointer  user_data)
+static gboolean
+event_dispatch (GSource *source, GSourceFunc callback, gpointer user_data)
 {
-  Display *display = ((DisplaySource*)source)->display;
+  Display *display = ((DisplaySource *) source)->display;
   XEvent xevent;
+
   /* TODO - Should this be "if (XPending (display))"?
    *        The effect of this might be to run other main loop functions
    *        before dispatching the next XEvent.
@@ -80,19 +80,19 @@ event_dispatch (GSource *source, GSourceFunc callback, gpointer  user_data)
       XNextEvent (display, &xevent);
 
       switch (xevent.type)
-       {
-       case KeyPress:
-       case KeyRelease:
-         break;
-       default:
-         if (XFilterEvent (&xevent, None))
-           continue;
-       }
-      
+        {
+        case KeyPress:
+        case KeyRelease:
+          break;
+        default:
+          if (XFilterEvent (&xevent, None))
+            continue;
+        }
+
       if (_spi_default_filter)
         {
           _spi_default_filter (&xevent, _spi_default_filter_data);
-        }  
+        }
     }
 
   return TRUE;
@@ -113,9 +113,9 @@ display_source_new (Display *display)
   GSource *source = g_source_new (&event_funcs, sizeof (DisplaySource));
   DisplaySource *display_source = (DisplaySource *) source;
   g_source_set_name (source, "[at-spi2-core] display_source_funcs");
-  
+
   display_source->display = display;
-  
+
   return source;
 }
 
@@ -123,7 +123,7 @@ display_source_new (Display *display)
 
 static DisplaySource *spi_display_source = NULL;
 
-void 
+void
 spi_events_init (Display *display)
 {
   GSource *source;
@@ -131,13 +131,13 @@ spi_events_init (Display *display)
   int connection_number = ConnectionNumber (display);
 
   source = display_source_new (display);
-  spi_display_source = (DisplaySource*) source;
+  spi_display_source = (DisplaySource *) source;
 
   g_source_set_priority (source, G_PRIORITY_DEFAULT);
-  
+
   spi_display_source->event_poll_fd.fd = connection_number;
   spi_display_source->event_poll_fd.events = G_IO_IN;
-  
+
   g_source_add_poll (source, &spi_display_source->event_poll_fd);
   g_source_set_can_recurse (source, TRUE);
   g_source_attach (source, NULL);
@@ -159,14 +159,14 @@ spi_set_events (long event_mask)
 {
   long xevent_mask = StructureNotifyMask | PropertyChangeMask;
   xevent_mask |= event_mask;
-      
-  XSelectInput (spi_display_source->display, 
+
+  XSelectInput (spi_display_source->display,
                 DefaultRootWindow (spi_display_source->display),
                 xevent_mask);
 }
 
 void
-spi_set_filter (void (*filter) (XEvent*, void*), void* data)
+spi_set_filter (void (*filter) (XEvent *, void *), void *data)
 {
   _spi_default_filter = filter;
   _spi_default_filter_data = data;
index ad080f7..1ddd34b 100644 (file)
@@ -28,6 +28,6 @@
 void spi_events_init (Display *display);
 void spi_events_uninit ();
 void spi_set_events (long event_mask);
-void spi_set_filter (void (*filter) (XEvent*, void*), void* data);
+void spi_set_filter (void (*filter) (XEvent *, void *), void *data);
 
 #endif /* SPI_EVENT_SOURCE_H_ */
diff --git a/registryd/introspection.c b/registryd/introspection.c
deleted file mode 100644 (file)
index 5b694ad..0000000
+++ /dev/null
@@ -1,860 +0,0 @@
-
-/*
- * This file has been auto-generated from the introspection data available
- * in the at-spi2-core repository. The D-Bus procol is defined in this
- * repository, which can be found at:
- *
- * http://download.gnome.org/sources/at-spi2-core/0.1/
- *
- * DO NOT EDIT.
- */
-
-
-const char *spi_org_a11y_atspi_Accessible = 
-"<interface name=\"org.a11y.atspi.Accessible\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"name\" type=\"s\" />"
-""
-"  <property access=\"read\" name=\"description\" type=\"s\" />"
-""
-"  <property access=\"read\" name=\"parent\" type=\"(so)\">"
-"    "
-"  </property>"
-""
-"  <property access=\"read\" name=\"childCount\" type=\"i\" />"
-""
-"  <method name=\"GetChildAtIndex\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetChildren\">"
-"    <arg direction=\"out\" type=\"a(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetIndexInParent\">"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetRelationSet\">"
-"    <arg direction=\"out\" type=\"a(ua(so))\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetRole\">"
-"    <arg direction=\"out\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GetRoleName\">"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetLocalizedRoleName\">"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetState\">"
-"    <arg direction=\"out\" type=\"au\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetAttributes\">"
-"    <arg direction=\"out\" type=\"a{ss}\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetApplication\">"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Action = 
-"<interface name=\"org.a11y.atspi.Action\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"nActions\" type=\"i\" />"
-""
-"  <method name=\"GetDescription\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetName\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetKeyBinding\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetActions\">"
-"    <arg direction=\"out\" name=\"index\" type=\"a(sss)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"DoAction\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Application = 
-"<interface name=\"org.a11y.atspi.Application\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"toolkitName\" type=\"s\" />"
-""
-"  <property access=\"read\" name=\"version\" type=\"s\" />"
-""
-"  <property access=\"read\" name=\"id\" type=\"i\" />"
-""
-"  <method name=\"GetLocale\">"
-"    <arg direction=\"in\" name=\"lctype\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"RegisterEventListener\">"
-"    <arg direction=\"in\" name=\"event\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"DeregisterEventListener\">"
-"    <arg direction=\"in\" name=\"event\" type=\"s\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Collection = 
-"<interface name=\"org.a11y.atspi.Collection\" version=\"0.1.7\">"
-""
-"  <method name=\"GetMatches\">"
-"    <arg direction=\"in\" name=\"rule\" type=\"(auuasuauusub)\" />"
-"    "
-"    <arg direction=\"in\" name=\"sortby\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"count\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"traverse\" type=\"b\" />"
-"    <arg direction=\"out\" type=\"a(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetMatchesTo\">"
-"    <arg direction=\"in\" name=\"current_object\" type=\"o\" />"
-"    "
-"    <arg direction=\"in\" name=\"rule\" type=\"(auuasuauusub)\" />"
-"    "
-"    <arg direction=\"in\" name=\"sortby\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"tree\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"recurse\" type=\"b\" />"
-"    <arg direction=\"in\" name=\"count\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"traverse\" type=\"b\" />"
-"    <arg direction=\"out\" type=\"a(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetMatchesFrom\">"
-"    <arg direction=\"in\" name=\"current_object\" type=\"o\" />"
-"    "
-"    <arg direction=\"in\" name=\"rule\" type=\"(auuasuauusub)\" />"
-"    "
-"    <arg direction=\"in\" name=\"sortby\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"tree\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"count\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"traverse\" type=\"b\" />"
-"    <arg direction=\"out\" type=\"a(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetActiveDescendant\">"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Component = 
-"<interface name=\"org.a11y.atspi.Component\" version=\"0.1.7\">"
-""
-"  <method name=\"Contains\">"
-"    <arg direction=\"in\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coord_type\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"GetAccessibleAtPoint\">"
-"    <arg direction=\"in\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coord_type\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetExtents\">"
-"    <arg direction=\"in\" name=\"coord_type\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"(iiii)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetPosition\">"
-"    <arg direction=\"in\" name=\"coord_type\" type=\"u\" />"
-"    <arg direction=\"out\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"y\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetSize\">"
-"    <arg direction=\"out\" name=\"width\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"height\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetLayer\">"
-"    <arg direction=\"out\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GetMDIZOrder\">"
-"    <arg direction=\"out\" type=\"n\" />"
-"  </method>"
-""
-"  <method name=\"GrabFocus\">"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"GetAlpha\">"
-"    <arg direction=\"out\" type=\"d\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Document = 
-"<interface name=\"org.a11y.atspi.Document\" version=\"0.1.7\">"
-""
-"  <method name=\"GetLocale\">"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetAttributeValue\">"
-"    <arg direction=\"in\" name=\"attributename\" type=\"s\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetAttributes\">"
-"    <arg direction=\"out\" type=\"{ss}\" />"
-"    "
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Hypertext = 
-"<interface name=\"org.a11y.atspi.Hypertext\" version=\"0.1.7\">"
-""
-"  <method name=\"GetNLinks\">"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetLink\">"
-"    <arg direction=\"in\" name=\"linkIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetLinkIndex\">"
-"    <arg direction=\"in\" name=\"characterIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Hyperlink = 
-"<interface name=\"org.a11y.atspi.Hyperlink\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"nAnchors\" type=\"n\" />"
-""
-"  <property access=\"read\" name=\"startIndex\" type=\"i\" />"
-""
-"  <property access=\"read\" name=\"endIndex\" type=\"i\" />"
-""
-"  <method name=\"GetObject\">"
-"    <arg direction=\"in\" name=\"i\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetURI\">"
-"    <arg direction=\"in\" name=\"i\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"IsValid\">"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Image = 
-"<interface name=\"org.a11y.atspi.Image\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"imageDescription\" type=\"s\" />"
-""
-"  <property access=\"read\" name=\"imageLocale\" type=\"s\" />"
-""
-"  <method name=\"GetImageExtents\">"
-"    <arg direction=\"in\" name=\"coordType\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"(iiii)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetImagePosition\">"
-"    <arg direction=\"out\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coordType\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GetImageSize\">"
-"    <arg direction=\"out\" name=\"width\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"height\" type=\"i\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Selection = 
-"<interface name=\"org.a11y.atspi.Selection\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"nSelectedChildren\" type=\"i\" />"
-""
-"  <method name=\"GetSelectedChild\">"
-"    <arg direction=\"in\" name=\"selectedChildIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"SelectChild\">"
-"    <arg direction=\"in\" name=\"childIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"DeselectSelectedChild\">"
-"    <arg direction=\"in\" name=\"selectedChildIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"IsChildSelected\">"
-"    <arg direction=\"in\" name=\"childIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"SelectAll\">"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"ClearSelection\">"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"deSelectChild\">"
-"    <arg direction=\"in\" name=\"childIndex\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Table = 
-"<interface name=\"org.a11y.atspi.Table\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"nRows\" type=\"i\" />"
-""
-"  <property access=\"read\" name=\"nColumns\" type=\"i\" />"
-""
-"  <property access=\"read\" name=\"caption\" type=\"(so)\">"
-"    "
-"  </property>"
-""
-"  <property access=\"read\" name=\"summary\" type=\"(so)\">"
-"    "
-"  </property>"
-""
-"  <property access=\"read\" name=\"nSelectedRows\" type=\"i\" />"
-""
-"  <property access=\"read\" name=\"nSelectedColumns\" type=\"i\" />"
-""
-"  <method name=\"GetAccessibleAt\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetIndexAt\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetRowAtIndex\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetColumnAtIndex\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetRowDescription\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetColumnDescription\">"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetRowExtentAt\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetColumnExtentAt\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetRowHeader\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetColumnHeader\">"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"(so)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetSelectedRows\">"
-"    <arg direction=\"out\" type=\"ai\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetSelectedColumns\">"
-"    <arg direction=\"out\" type=\"ai\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"IsRowSelected\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"IsColumnSelected\">"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"IsSelected\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"AddRowSelection\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"AddColumnSelection\">"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"RemoveRowSelection\">"
-"    <arg direction=\"in\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"RemoveColumnSelection\">"
-"    <arg direction=\"in\" name=\"column\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"GetRowColumnExtentsAtIndex\">"
-"    <arg direction=\"in\" name=\"index\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"    <arg direction=\"out\" name=\"row\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"col\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"row_extents\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"col_extents\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"is_selected\" type=\"b\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Text = 
-"<interface name=\"org.a11y.atspi.Text\" version=\"0.1.7\">"
-""
-"  <property access=\"read\" name=\"characterCount\" type=\"i\" />"
-""
-"  <property access=\"read\" name=\"caretOffset\" type=\"i\" />"
-""
-"  <method name=\"GetText\">"
-"    <arg direction=\"in\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endOffset\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"SetCaretOffset\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"GetTextBeforeOffset\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"type\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"    <arg direction=\"out\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"endOffset\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetTextAtOffset\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"type\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"    <arg direction=\"out\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"endOffset\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetTextAfterOffset\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"type\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"    <arg direction=\"out\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"endOffset\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetCharacterAtOffset\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetAttributeValue\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"attributeName\" type=\"s\" />"
-"    <arg direction=\"out\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"GetAttributes\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"a{ss}\" />"
-"    <arg direction=\"out\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"endOffset\" type=\"i\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetDefaultAttributes\">"
-"    <arg direction=\"out\" type=\"a{ss}\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetCharacterExtents\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"width\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"height\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coordType\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GetOffsetAtPoint\">"
-"    <arg direction=\"in\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coordType\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetNSelections\">"
-"    <arg direction=\"out\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"GetSelection\">"
-"    <arg direction=\"in\" name=\"selectionNum\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"endOffset\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"AddSelection\">"
-"    <arg direction=\"in\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endOffset\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"RemoveSelection\">"
-"    <arg direction=\"in\" name=\"selectionNum\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"SetSelection\">"
-"    <arg direction=\"in\" name=\"selectionNum\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endOffset\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"GetRangeExtents\">"
-"    <arg direction=\"in\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"width\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"height\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coordType\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GetBoundedRanges\">"
-"    <arg direction=\"in\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"width\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"height\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"coordType\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"xClipType\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"yClipType\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"a(iisv)\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetAttributeRun\">"
-"    <arg direction=\"in\" name=\"offset\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"includeDefaults\" type=\"b\" />"
-"    <arg direction=\"out\" type=\"a{ss}\" />"
-"    <arg direction=\"out\" name=\"startOffset\" type=\"i\" />"
-"    <arg direction=\"out\" name=\"endOffset\" type=\"i\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"GetDefaultAttributeSet\">"
-"    <arg direction=\"out\" type=\"as\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_EditableText = 
-"<interface name=\"org.a11y.atspi.EditableText\" version=\"0.1.7\">"
-""
-"  <method name=\"SetTextContents\">"
-"    <arg direction=\"in\" name=\"newContents\" type=\"s\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"InsertText\">"
-"    <arg direction=\"in\" name=\"position\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"text\" type=\"s\" />"
-"    <arg direction=\"in\" name=\"length\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"CopyText\">"
-"    <arg direction=\"in\" name=\"startPos\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endPos\" type=\"i\" />"
-"  </method>"
-""
-"  <method name=\"CutText\">"
-"    <arg direction=\"in\" name=\"startPos\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endPos\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"DeleteText\">"
-"    <arg direction=\"in\" name=\"startPos\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"endPos\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"PasteText\">"
-"    <arg direction=\"in\" name=\"position\" type=\"i\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Cache = 
-"<interface name=\"org.a11y.atspi.Cache\" version=\"0.1.7\">"
-""
-"  <method name=\"GetItems\">"
-"    <arg direction=\"out\" name=\"nodes\" type=\"a((so)(so)a(so)assusau)\" />"
-"    "
-"  </method>"
-""
-"  <signal name=\"AddAccessible\">"
-"    <arg name=\"nodeAdded\" type=\"((so)(so)a(so)assusau)\" />"
-"    "
-"  </signal>"
-""
-"  <signal name=\"RemoveAccessible\">"
-"    <arg name=\"nodeRemoved\" type=\"(so)\" />"
-"    "
-"  </signal>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Value = 
-"<interface name=\"org.a11y.atspi.Value\" version=\"0.1.7\">"
-""
-"        <property access=\"read\" name=\"minimumValue\" type=\"d\" />"
-""
-"        <property access=\"read\" name=\"maximumValue\" type=\"d\" />"
-""
-"        <property access=\"read\" name=\"minimumIncrement\" type=\"d\" />"
-""
-"        <property access=\"readwrite\" name=\"currentValue\" type=\"d\" />"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_Registry = 
-"<interface name=\"org.a11y.atspi.Registry\" version=\"0.1.7\">"
-""
-"  <method name=\"RegisterEvent\">"
-"    <arg direction=\"in\" name=\"event\" type=\"s\">"
-"    </arg>"
-"  </method>"
-""
-"  <method name=\"DeregisterEvent\">"
-"    <arg direction=\"in\" name=\"event\" type=\"s\">"
-"    </arg>"
-"  </method>"
-""
-"  <method name=\"GetRegisteredEvents\">"
-"    <arg direction=\"out\" name=\"events\" type=\"a(ss)\">"
-"    </arg>"
-"  </method>"
-""
-"  <signal name=\"EventListenerRegistered\">"
-"    <arg direction=\"out\" name=\"bus\" type=\"s\" />"
-"    <arg direction=\"out\" name=\"path\" type=\"s\" />"
-"  </signal>"
-""
-"  <signal name=\"EventListenerDeregistered\">"
-"    <arg direction=\"out\" name=\"bus\" type=\"s\" />"
-"    <arg direction=\"out\" name=\"path\" type=\"s\" />"
-"  </signal>"
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_DeviceEventController = 
-"<interface name=\"org.a11y.atspi.DeviceEventController\" version=\"0.1.7\">"
-""
-"  <method name=\"RegisterKeystrokeListener\">"
-"    <arg direction=\"in\" name=\"listener\" type=\"o\" />"
-"    <arg direction=\"in\" name=\"keys\" type=\"a(iisi)\">"
-"      "
-"    </arg>"
-"    <arg direction=\"in\" name=\"mask\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"type\" type=\"au\">"
-"      "
-"    </arg>"
-"    <arg direction=\"in\" name=\"mode\" type=\"(bbb)\">"
-"      "
-"    </arg>"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"DeregisterKeystrokeListener\">"
-"    <arg direction=\"in\" name=\"listener\" type=\"o\" />"
-"    <arg direction=\"in\" name=\"keys\" type=\"a(iisi)\">"
-"      "
-"    </arg>"
-"    <arg direction=\"in\" name=\"mask\" type=\"u\" />"
-"    <arg direction=\"in\" name=\"type\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"RegisterDeviceEventListener\">"
-"    <arg direction=\"in\" name=\"listener\" type=\"o\" />"
-"    <arg direction=\"in\" name=\"types\" type=\"u\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <method name=\"DeregisterDeviceEventListener\">"
-"    <arg direction=\"in\" name=\"listener\" type=\"o\" />"
-"    <arg direction=\"in\" name=\"types\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GetKeystrokeListeners\">"
-"    <arg direction=\"out\" type=\"a(souua(iisi)u(bbb))\" />"
-"  </method>"
-""
-"  <method name=\"GetDeviceEventListeners\">"
-"    <arg direction=\"out\" type=\"a(sou)\" />"
-"  </method>"
-""
-"  <method name=\"GenerateKeyboardEvent\">"
-"    <arg direction=\"in\" name=\"keycode\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"keystring\" type=\"s\" />"
-"    <arg direction=\"in\" name=\"type\" type=\"u\" />"
-"  </method>"
-""
-"  <method name=\"GenerateMouseEvent\">"
-"    <arg direction=\"in\" name=\"x\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"y\" type=\"i\" />"
-"    <arg direction=\"in\" name=\"eventName\" type=\"s\" />"
-"  </method>"
-""
-"  <method name=\"NotifyListenersSync\">"
-"    <arg direction=\"in\" name=\"event\" type=\"(uiuuisb)\" />"
-"    <arg direction=\"out\" type=\"b\" />"
-"    "
-"  </method>"
-""
-"  <method name=\"NotifyListenersAsync\">"
-"    <arg direction=\"in\" name=\"event\" type=\"(uiuuisb)\" />"
-"    "
-"  </method>"
-""
-"</interface>"
-"";
-
-const char *spi_org_a11y_atspi_DeviceEventListener = 
-"<interface name=\"org.a11y.atspi.DeviceEventListener\" version=\"0.1.7\">"
-""
-"  <method name=\"NotifyEvent\">"
-"    <arg direction=\"in\" name=\"event\" type=\"(uiuuisb)\" />"
-"    "
-"    <arg direction=\"out\" type=\"b\" />"
-"  </method>"
-""
-"  <signal name=\"KeystrokeListenerRegistered\">"
-"    <arg name=\"listener\" type=\"(souua(iisi)u(bbb))\" />"
-"  </signal>"
-""
-"  <signal name=\"KeystrokeListenerDeregistered\">"
-"    <arg name=\"listener\" type=\"(souua(iisi)u(bbb))\" />"
-"  </signal>"
-""
-"  <signal name=\"DeviceListenerRegistered\">"
-"    <arg name=\"listener\" type=\"(sou)\" />"
-"  </signal>"
-""
-"  <signal name=\"DeviceListenerDeregistered\">"
-"    <arg name=\"listener\" type=\"(sou)\" />"
-"  </signal>"
-""
-"</interface>"
-"";
-
diff --git a/registryd/introspection.h b/registryd/introspection.h
deleted file mode 100644 (file)
index 5c28333..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-
-/*
- * This file has been auto-generated from the introspection data available
- * in the at-spi2-core repository. The D-Bus procol is defined in this
- * repository, which can be found at:
- *
- * http://download.gnome.org/sources/at-spi2-core/0.1/
- *
- * DO NOT EDIT.
- */
-
-#ifndef SPI_INTROSPECTION_DATA_H_
-#define SPI_INTROSPECTION_DATA_H_
-
-
-extern const char *spi_org_a11y_atspi_Accessible;
-
-extern const char *spi_org_a11y_atspi_Action;
-
-extern const char *spi_org_a11y_atspi_Application;
-
-extern const char *spi_org_a11y_atspi_Collection;
-
-extern const char *spi_org_a11y_atspi_Component;
-
-extern const char *spi_org_a11y_atspi_Document;
-
-extern const char *spi_org_a11y_atspi_Hypertext;
-
-extern const char *spi_org_a11y_atspi_Hyperlink;
-
-extern const char *spi_org_a11y_atspi_Image;
-
-extern const char *spi_org_a11y_atspi_Selection;
-
-extern const char *spi_org_a11y_atspi_Table;
-
-extern const char *spi_org_a11y_atspi_Text;
-
-extern const char *spi_org_a11y_atspi_EditableText;
-
-extern const char *spi_org_a11y_atspi_Cache;
-
-extern const char *spi_org_a11y_atspi_Value;
-
-extern const char *spi_org_a11y_atspi_Registry;
-
-extern const char *spi_org_a11y_atspi_DeviceEventController;
-
-extern const char *spi_org_a11y_atspi_DeviceEventListener;
-
-
-#endif /* SPI_INTROSPECTION_DATA_H_ */
index 9f6c2c9..1ee64b3 100644 (file)
@@ -31,21 +31,21 @@ G_BEGIN_DECLS
 typedef unsigned long SpiKeyMaskType;
 
 /* Values taken from Xlib.h */
-#define SPI_KEYMASK_ALT       (1<<3)  /* Mod1Mask */
-#define SPI_KEYMASK_MOD1      (1<<3)  /* Mod1Mask */
-#define SPI_KEYMASK_MOD2      (1<<4)  /* Mod2Mask */
-#define SPI_KEYMASK_MOD3      (1<<5)  /* Mod3Mask */
-#define SPI_KEYMASK_MOD4      (1<<6)  /* Mod4Mask */
-#define SPI_KEYMASK_MOD5      (1<<7)  /* Mod5Mask */
-#define SPI_KEYMASK_BUTTON1   (1L<<8)  /* Button1Mask */
-#define SPI_KEYMASK_BUTTON2   (1L<<9)  /* Button2Mask */
-#define SPI_KEYMASK_BUTTON3   (1L<<10)  /* Button3Mask */
-#define SPI_KEYMASK_BUTTON4   (1L<<11)  /* Button4Mask */
-#define SPI_KEYMASK_BUTTON5   (1L<<12)  /* Button5Mask */
-#define SPI_KEYMASK_CONTROL   (1<<2)  /* ControlMask */
-#define SPI_KEYMASK_SHIFT     (1<<0)  /* ShiftMask */
-#define SPI_KEYMASK_SHIFTLOCK (1<<1)  /* LockMask */
-#define SPI_KEYMASK_NUMLOCK   (1<<14)
+#define SPI_KEYMASK_ALT (1 << 3)       /* Mod1Mask */
+#define SPI_KEYMASK_MOD1 (1 << 3)      /* Mod1Mask */
+#define SPI_KEYMASK_MOD2 (1 << 4)      /* Mod2Mask */
+#define SPI_KEYMASK_MOD3 (1 << 5)      /* Mod3Mask */
+#define SPI_KEYMASK_MOD4 (1 << 6)      /* Mod4Mask */
+#define SPI_KEYMASK_MOD5 (1 << 7)      /* Mod5Mask */
+#define SPI_KEYMASK_BUTTON1 (1L << 8)  /* Button1Mask */
+#define SPI_KEYMASK_BUTTON2 (1L << 9)  /* Button2Mask */
+#define SPI_KEYMASK_BUTTON3 (1L << 10) /* Button3Mask */
+#define SPI_KEYMASK_BUTTON4 (1L << 11) /* Button4Mask */
+#define SPI_KEYMASK_BUTTON5 (1L << 12) /* Button5Mask */
+#define SPI_KEYMASK_CONTROL (1 << 2)   /* ControlMask */
+#define SPI_KEYMASK_SHIFT (1 << 0)     /* ShiftMask */
+#define SPI_KEYMASK_SHIFTLOCK (1 << 1) /* LockMask */
+#define SPI_KEYMASK_NUMLOCK (1 << 14)
 #define SPI_KEYMASK_UNMODIFIED 0
 
 G_END_DECLS
diff --git a/registryd/marshal-dbus.c b/registryd/marshal-dbus.c
new file mode 100644 (file)
index 0000000..8c65bfe
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
+ *
+ * Copyright 2008 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <dbus/dbus.h>
+#include <glib-object.h>
+#include <glib.h>
+#include <stdlib.h>
+
+#include "de-types.h"
+
+dbus_bool_t
+spi_dbus_message_iter_get_struct (DBusMessageIter *iter, ...)
+{
+  va_list args;
+  DBusMessageIter iter_struct;
+  int type;
+  void *ptr;
+
+  dbus_message_iter_recurse (iter, &iter_struct);
+  va_start (args, iter);
+  for (;;)
+    {
+      type = va_arg (args, int);
+      if (type == DBUS_TYPE_INVALID)
+        break;
+      if (type != dbus_message_iter_get_arg_type (&iter_struct))
+        {
+          va_end (args);
+          return FALSE;
+        }
+      ptr = va_arg (args, void *);
+      dbus_message_iter_get_basic (&iter_struct, ptr);
+      dbus_message_iter_next (&iter_struct);
+    }
+  dbus_message_iter_next (iter);
+  va_end (args);
+  return TRUE;
+}
+
+dbus_bool_t
+spi_dbus_message_iter_append_struct (DBusMessageIter *iter, ...)
+{
+  va_list args;
+  DBusMessageIter iter_struct;
+  int type;
+  void *ptr;
+
+  if (!dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL, &iter_struct))
+    return FALSE;
+  va_start (args, iter);
+  for (;;)
+    {
+      type = va_arg (args, int);
+      if (type == DBUS_TYPE_INVALID)
+        break;
+      ptr = va_arg (args, void *);
+      dbus_message_iter_append_basic (&iter_struct, type, ptr);
+    }
+  if (!dbus_message_iter_close_container (iter, &iter_struct))
+    {
+      va_end (args);
+      return FALSE;
+    }
+  va_end (args);
+  return TRUE;
+}
+
+dbus_bool_t
+spi_dbus_marshal_deviceEvent (DBusMessage *message, const Accessibility_DeviceEvent *e)
+{
+  DBusMessageIter iter;
+
+  if (!message)
+    return FALSE;
+  dbus_message_iter_init_append (message, &iter);
+  return spi_dbus_message_iter_append_struct (&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_UINT32, &e->hw_code, DBUS_TYPE_UINT32, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}
+
+dbus_bool_t
+spi_dbus_demarshal_deviceEvent (DBusMessage *message, Accessibility_DeviceEvent *e)
+{
+  DBusMessageIter iter;
+  dbus_uint16_t hw_code;
+  dbus_uint16_t modifiers;
+
+  dbus_message_iter_init (message, &iter);
+  if (spi_dbus_message_iter_get_struct (&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT32, &e->hw_code, DBUS_TYPE_INT32, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID))
+    return TRUE;
+  /* TODO: Perhaps remove the below code for 2.1 */
+  if (!spi_dbus_message_iter_get_struct (&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &hw_code, DBUS_TYPE_INT16, &modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID))
+    return FALSE;
+  e->hw_code = hw_code;
+  e->modifiers = modifiers;
+  return TRUE;
+}
similarity index 76%
rename from registryd/de-marshaller.h
rename to registryd/marshal-dbus.h
index 93eaa42..ddaf136 100644 (file)
@@ -29,9 +29,9 @@
 
 #include "de-types.h"
 
-dbus_bool_t spi_dbus_message_iter_get_struct(DBusMessageIter *iter, ...);
-dbus_bool_t spi_dbus_message_iter_append_struct(DBusMessageIter *iter, ...);
-dbus_bool_t spi_dbus_marshal_deviceEvent(DBusMessage *message, const Accessibility_DeviceEvent *e);
-dbus_bool_t spi_dbus_demarshal_deviceEvent(DBusMessage *message, Accessibility_DeviceEvent *e);
+dbus_bool_t spi_dbus_message_iter_get_struct (DBusMessageIter *iter, ...);
+dbus_bool_t spi_dbus_message_iter_append_struct (DBusMessageIter *iter, ...);
+dbus_bool_t spi_dbus_marshal_deviceEvent (DBusMessage *message, const Accessibility_DeviceEvent *e);
+dbus_bool_t spi_dbus_demarshal_deviceEvent (DBusMessage *message, Accessibility_DeviceEvent *e);
 
 #endif /* SPI_DE_MARSHALLER_H_ */
index 739509f..dfbbe5c 100644 (file)
@@ -1,12 +1,12 @@
 atspi_introspection_path = ''
 
 registryd_sources = [
-  'de-marshaller.c',
-  'registry-main.c',
-  'registry.c',
-  'introspection.c',
+  introspection_generated,
   'deviceeventcontroller.c',
+  'marshal-dbus.c',
   'reentrant-list.c',
+  'registry-main.c',
+  'registry.c',
 ]
 
 registryd_deps = [
@@ -16,18 +16,15 @@ registryd_deps = [
   dl_dep,
 ]
 
-x11_option = get_option('x11')
-if x11_option != 'no'
-  if x11_dep.found()
-    registryd_sources += [
-      'deviceeventcontroller-x11.c',
-      'display.c',
-      'event-source.c',
-      'ucs2keysym.c',
-    ]
+if x11_dep.found()
+  registryd_sources += [
+    'deviceeventcontroller-x11.c',
+    'display.c',
+    'event-source.c',
+    'ucs2keysym.c',
+  ]
 
-    registryd_deps += x11_deps 
-  endif
+  registryd_deps += x11_deps 
 endif
 
 executable('at-spi2-registryd', registryd_sources,
index a505222..b4e9ee8 100644 (file)
 #ifndef SPI_PATHS_H_
 #define SPI_PATHS_H_
 
-#define SPI_DBUS_NAME_PREFIX                     "org.a11y.atspi."
-#define SPI_DBUS_PATH_PREFIX                     "/org/a11y/atspi/"
-#define SPI_DBUS_INTERFACE_PREFIX                "org.a11y.atspi."
+#define SPI_DBUS_NAME_PREFIX "org.a11y.atspi."
+#define SPI_DBUS_PATH_PREFIX "/org/a11y/atspi/"
+#define SPI_DBUS_INTERFACE_PREFIX "org.a11y.atspi."
 
-#define SPI_DBUS_PATH_NULL                       SPI_DBUS_PATH_PREFIX "null"
-#define SPI_DBUS_PATH_ROOT                       SPI_DBUS_PATH_PREFIX "accessible/root"
+#define SPI_DBUS_PATH_NULL SPI_DBUS_PATH_PREFIX "null"
+#define SPI_DBUS_PATH_ROOT SPI_DBUS_PATH_PREFIX "accessible/root"
 
-#define SPI_DBUS_NAME_REGISTRY                   SPI_DBUS_NAME_PREFIX "Registry"
-#define SPI_DBUS_INTERFACE_REGISTRY              SPI_DBUS_INTERFACE_PREFIX "Registry"
-#define SPI_DBUS_PATH_REGISTRY                       SPI_DBUS_PATH_PREFIX "registry"
+#define SPI_DBUS_NAME_REGISTRY SPI_DBUS_NAME_PREFIX "Registry"
+#define SPI_DBUS_INTERFACE_REGISTRY SPI_DBUS_INTERFACE_PREFIX "Registry"
+#define SPI_DBUS_PATH_REGISTRY SPI_DBUS_PATH_PREFIX "registry"
 
-#define SPI_DBUS_PATH_DEC                        SPI_DBUS_PATH_PREFIX "registry/deviceeventcontroller"
-#define SPI_DBUS_INTERFACE_DEC                   SPI_DBUS_INTERFACE_PREFIX "DeviceEventController"
+#define SPI_DBUS_PATH_DEC SPI_DBUS_PATH_PREFIX "registry/deviceeventcontroller"
+#define SPI_DBUS_INTERFACE_DEC SPI_DBUS_INTERFACE_PREFIX "DeviceEventController"
 #define SPI_DBUS_INTERFACE_DEVICE_EVENT_LISTENER SPI_DBUS_INTERFACE_PREFIX "DeviceEventListener"
 
-#define SPI_DBUS_PATH_CACHE                       SPI_DBUS_PATH_PREFIX "cache"
-#define SPI_DBUS_INTERFACE_CACHE                 SPI_DBUS_INTERFACE_PREFIX "Cache"
+#define SPI_DBUS_PATH_CACHE SPI_DBUS_PATH_PREFIX "cache"
+#define SPI_DBUS_INTERFACE_CACHE SPI_DBUS_INTERFACE_PREFIX "Cache"
 
-#define SPI_DBUS_INTERFACE_ACCESSIBLE            SPI_DBUS_INTERFACE_PREFIX "Accessible"
-#define SPI_DBUS_INTERFACE_APPLICATION            SPI_DBUS_INTERFACE_PREFIX "Application"
-#define SPI_DBUS_INTERFACE_COMPONENT             SPI_DBUS_INTERFACE_PREFIX "Component"
-#define SPI_DBUS_INTERFACE_EVENT_KEYBOARD        SPI_DBUS_INTERFACE_PREFIX "Keyboard"
-#define SPI_DBUS_INTERFACE_EVENT_MOUSE           SPI_DBUS_INTERFACE_PREFIX "Event.Mouse"
-#define SPI_DBUS_INTERFACE_EVENT_OBJECT          SPI_DBUS_INTERFACE_PREFIX "Event.Object"
-#define SPI_DBUS_INTERFACE_SOCKET                SPI_DBUS_INTERFACE_PREFIX "Socket"
+#define SPI_DBUS_INTERFACE_ACCESSIBLE SPI_DBUS_INTERFACE_PREFIX "Accessible"
+#define SPI_DBUS_INTERFACE_APPLICATION SPI_DBUS_INTERFACE_PREFIX "Application"
+#define SPI_DBUS_INTERFACE_COMPONENT SPI_DBUS_INTERFACE_PREFIX "Component"
+#define SPI_DBUS_INTERFACE_EVENT_KEYBOARD SPI_DBUS_INTERFACE_PREFIX "Keyboard"
+#define SPI_DBUS_INTERFACE_EVENT_MOUSE SPI_DBUS_INTERFACE_PREFIX "Event.Mouse"
+#define SPI_DBUS_INTERFACE_EVENT_OBJECT SPI_DBUS_INTERFACE_PREFIX "Event.Object"
+#define SPI_DBUS_INTERFACE_SOCKET SPI_DBUS_INTERFACE_PREFIX "Socket"
 
 #endif /* SPI_PATHS_H_ */
index 2c08c42..b723c76 100644 (file)
 
 #include "reentrant-list.h"
 
-typedef struct {
-       GList **list;
-       GList  *iterator;
+typedef struct
+{
+  GList **list;
+  GList *iterator;
 } Iteration;
 
 static GSList *working_list = NULL; /* of Iteration */
@@ -39,12 +40,12 @@ static GSList *working_list = NULL; /* of Iteration */
  * element.
  */
 void
-spi_re_entrant_list_delete_link (GList * const *element_ptr)
+spi_re_entrant_list_delete_link (GList *const *element_ptr)
 {
-  GSList    *l;
-  GList     *next;
-  GList     *element;
-  gboolean   first_item;
+  GSList *l;
+  GList *next;
+  GList *element;
+  gboolean first_item;
   GList *dummy G_GNUC_UNUSED;
 
   g_return_if_fail (element_ptr != NULL);
@@ -59,47 +60,48 @@ spi_re_entrant_list_delete_link (GList * const *element_ptr)
 
   for (l = working_list; l; l = l->next)
     {
-       Iteration *i = l->data;
+      Iteration *i = l->data;
 
-       if (i->iterator == element)
-         {
-           i->iterator = next;
-         }
+      if (i->iterator == element)
+        {
+          i->iterator = next;
+        }
 
-       if (first_item && *(i->list) == element)
-         {
-           *(i->list) = next;
-         }
+      if (first_item && *(i->list) == element)
+        {
+          *(i->list) = next;
+        }
     }
 
   g_list_free_1 (element);
 }
 
 void
-spi_re_entrant_list_foreach (GList         **list,
-                            SpiReEntrantFn  func,
-                            gpointer        user_data)
+spi_re_entrant_list_foreach (GList **list,
+                             SpiReEntrantFn func,
+                             gpointer user_data)
 {
-       Iteration i;
+  Iteration i;
 
-       if (!list || !*list)
-         {
-            return;
-         }
+  if (!list || !*list)
+    {
+      return;
+    }
 
-       i.list = list;
-       i.iterator = *list;
+  i.list = list;
+  i.iterator = *list;
 
-       working_list = g_slist_prepend (working_list, &i);
+  working_list = g_slist_prepend (working_list, &i);
 
-       while (i.iterator) {
-               GList *l = i.iterator;
+  while (i.iterator)
+    {
+      GList *l = i.iterator;
 
-               func (&i.iterator, user_data);
+      func (&i.iterator, user_data);
 
-               if (i.iterator == l)
-                       i.iterator = i.iterator->next;
-       }
+      if (i.iterator == l)
+        i.iterator = i.iterator->next;
+    }
 
-       working_list = g_slist_remove (working_list, &i);
+  working_list = g_slist_remove (working_list, &i);
 }
index e124156..39f5527 100644 (file)
 
 G_BEGIN_DECLS
 
-typedef enum {
-       SPI_RE_ENTRANT_CONTINUE = 0,
-       SPI_RE_ENTRANT_TERMINATE
+typedef enum
+{
+  SPI_RE_ENTRANT_CONTINUE = 0,
+  SPI_RE_ENTRANT_TERMINATE
 } SpiReEntrantContinue;
 
-typedef SpiReEntrantContinue (*SpiReEntrantFn) (GList * const *list,
-                                               gpointer       user_data);
+typedef SpiReEntrantContinue (*SpiReEntrantFn) (GList *const *list,
+                                                gpointer user_data);
 
-void spi_re_entrant_list_delete_link (GList * const  *element_ptr);
-void spi_re_entrant_list_foreach     (GList         **list,
-                                     SpiReEntrantFn  func,
-                                     gpointer        user_data);
+void spi_re_entrant_list_delete_link (GList *const *element_ptr);
+void spi_re_entrant_list_foreach (GList **list,
+                                  SpiReEntrantFn func,
+                                  gpointer user_data);
 
 G_END_DECLS
 
index be01d2c..7619c86 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
-#include <stdlib.h>
 #include <config.h>
-#include <string.h>
-#include <glib.h>
+#include <dlfcn.h>
 #include <gio/gio.h>
+#include <glib.h>
 #include <stdio.h>
-#include <dlfcn.h>
+#include <stdlib.h>
+#include <string.h>
 
 #include <dbus/dbus.h>
 
+#include "atspi/atspi.h"
+#include "deviceeventcontroller.h"
 #include "paths.h"
 #include "registry.h"
-#include "deviceeventcontroller.h"
-#include "atspi/atspi.h"
 
 static GMainLoop *mainloop;
 static gchar *dbus_name = NULL;
 static gboolean use_gnome_session = FALSE;
 
-static GOptionEntry optentries[] =
-{
-  {"dbus-name", 0, 0, G_OPTION_ARG_STRING, &dbus_name, "Well-known name to register with D-Bus", NULL},
-  {"use-gnome-session", 0, 0, G_OPTION_ARG_NONE, &use_gnome_session, "Should register with gnome session manager", NULL},
-  {NULL}
+static GOptionEntry optentries[] = {
+  { "dbus-name", 0, 0, G_OPTION_ARG_STRING, &dbus_name, "Well-known name to register with D-Bus", NULL },
+  { "use-gnome-session", 0, 0, G_OPTION_ARG_NONE, &use_gnome_session, "Should register with gnome session manager", NULL },
+  { NULL }
 };
 
-static GDBusProxy      *sm_proxy = NULL;
-static char            *client_id = NULL;
-static GDBusProxy      *client_proxy = NULL;
+static GDBusProxy *sm_proxy = NULL;
+static char *client_id = NULL;
+static GDBusProxy *client_proxy = NULL;
 
-#define SM_DBUS_NAME      "org.gnome.SessionManager"
-#define SM_DBUS_PATH      "/org/gnome/SessionManager"
+#define SM_DBUS_NAME "org.gnome.SessionManager"
+#define SM_DBUS_PATH "/org/gnome/SessionManager"
 #define SM_DBUS_INTERFACE "org.gnome.SessionManager"
 
 #define SM_CLIENT_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate"
@@ -61,71 +60,77 @@ static gboolean register_client (void);
 
 static void
 on_session_signal (GDBusProxy *proxy,
-                   gchar      *sender_name,
-                   gchar      *signal_name,
-                   GVariant   *parameters,
-                   gpointer    user_data)
+                   gchar *sender_name,
+                   gchar *signal_name,
+                   GVariant *parameters,
+                   gpointer user_data)
 {
-        if (g_strcmp0 (signal_name, "SessionOver") == 0) {
-                g_main_loop_quit (mainloop);
-        } else if (g_strcmp0 (signal_name, "SessionRunning") == 0) {
-                if (!register_client ())
-                        g_warning ("Unable to register client with session manager");
-        }
+  if (g_strcmp0 (signal_name, "SessionOver") == 0)
+    {
+      g_main_loop_quit (mainloop);
+    }
+  else if (g_strcmp0 (signal_name, "SessionRunning") == 0)
+    {
+      if (!register_client ())
+        g_warning ("Unable to register client with session manager");
+    }
 }
 
 static gboolean
 session_manager_connect (void)
 {
-        GVariant *res;
-        gboolean is_running;
-
-        sm_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
-                                              SM_DBUS_NAME,
-                                              SM_DBUS_PATH,
-                                              SM_DBUS_INTERFACE, NULL, NULL);
-
-        res = g_dbus_proxy_call_sync (sm_proxy,
-                                 "IsSessionRunning", NULL,
-                                  0, 1000, NULL, NULL);
-
-        if (res) {
-                g_variant_get (res, "(b)", &is_running);
-                g_variant_unref (res);
-                if (is_running) {
-                        if (!register_client ())
-                                g_warning ("Unable to register client with session manager");
-                }
+  GVariant *res;
+  gboolean is_running;
+
+  sm_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
+                                            SM_DBUS_NAME,
+                                            SM_DBUS_PATH,
+                                            SM_DBUS_INTERFACE, NULL, NULL);
+
+  res = g_dbus_proxy_call_sync (sm_proxy,
+                                "IsSessionRunning", NULL,
+                                0, 1000, NULL, NULL);
+
+  if (res)
+    {
+      g_variant_get (res, "(b)", &is_running);
+      g_variant_unref (res);
+      if (is_running)
+        {
+          if (!register_client ())
+            g_warning ("Unable to register client with session manager");
         }
+    }
 
-        g_signal_connect (G_OBJECT (sm_proxy), "g-signal",
-                          G_CALLBACK (on_session_signal), NULL);
+  g_signal_connect (G_OBJECT (sm_proxy), "g-signal",
+                    G_CALLBACK (on_session_signal), NULL);
 
-        return (sm_proxy != NULL);
+  return (sm_proxy != NULL);
 }
 
 static gboolean
 end_session_response (gboolean is_okay, const gchar *reason)
 {
-        GVariant *ret;
-        GError *error = NULL;
+  GVariant *ret;
+  GError *error = NULL;
 
-        if (!reason)
-                reason = "";
+  if (!reason)
+    reason = "";
 
-        ret = g_dbus_proxy_call_sync (client_proxy, "EndSessionResponse",
-                                      g_variant_new ("(bs)", is_okay, reason),
-                                      0, 1000, NULL, &error);
+  ret = g_dbus_proxy_call_sync (client_proxy, "EndSessionResponse",
+                                g_variant_new ("(bs)", is_okay, reason),
+                                0, 1000, NULL, &error);
 
-        if (!ret) {
-                g_warning ("Failed to send session response %s", error->message);
-                g_error_free (error);
-                return FALSE;
-        }
-        else
-                g_variant_unref (ret);
+  if (!ret)
+    {
+      g_warning ("Failed to send session response %s", error->message);
+      g_error_free (error);
+      return FALSE;
+    }
+  else
+    g_variant_unref (ret);
 
-        return TRUE;
+  return TRUE;
 }
 
 static void
@@ -135,73 +140,78 @@ client_proxy_signal_cb (GDBusProxy *proxy,
                         GVariant *parameters,
                         gpointer user_data)
 {
-        if (g_strcmp0 (signal_name, "QueryEndSession") == 0) {
-                g_debug ("Got QueryEndSession signal");
-                end_session_response (TRUE, NULL);
-        } else if (g_strcmp0 (signal_name, "EndSession") == 0) {
-                g_debug ("Got EndSession signal");
-                end_session_response (TRUE, NULL);
-                g_main_loop_quit (mainloop);
-        } else if (g_strcmp0 (signal_name, "Stop") == 0) {
-                g_debug ("Got Stop signal");
-                g_main_loop_quit (mainloop);
-        }
+  if (g_strcmp0 (signal_name, "QueryEndSession") == 0)
+    {
+      g_debug ("Got QueryEndSession signal");
+      end_session_response (TRUE, NULL);
+    }
+  else if (g_strcmp0 (signal_name, "EndSession") == 0)
+    {
+      g_debug ("Got EndSession signal");
+      end_session_response (TRUE, NULL);
+      g_main_loop_quit (mainloop);
+    }
+  else if (g_strcmp0 (signal_name, "Stop") == 0)
+    {
+      g_debug ("Got Stop signal");
+      g_main_loop_quit (mainloop);
+    }
 }
 
 static gboolean
 register_client (void)
 {
-        GError     *error;
-        GVariant *res;
-        const char *startup_id;
-        const char *app_id;
-
-        if (client_proxy)
-                return TRUE;
-
-        startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
-        if (!startup_id)
-                startup_id = "";
-        app_id = "at-spi-registryd.desktop";
-
-        error = NULL;
-        res = g_dbus_proxy_call_sync (sm_proxy,
-                                 "RegisterClient",
-                                      g_variant_new ("(ss)", app_id,
-                                                     startup_id),
-                                      0, 1000, NULL, &error);
-        if (! res) {
-                const char *message = (error && error->message ? error->message
-                                       : "no error");
-                g_warning ("Failed to register client: %s", message);
-                if (error)
-                  g_error_free (error);
-                return FALSE;
-        }
-        g_variant_get (res, "(o)", &client_id);
-        g_variant_unref (res);
+  GError *error;
+  GVariant *res;
+  const char *startup_id;
+  const char *app_id;
+
+  if (client_proxy)
+    return TRUE;
+
+  startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+  if (!startup_id)
+    startup_id = "";
+  app_id = "at-spi-registryd.desktop";
+
+  error = NULL;
+  res = g_dbus_proxy_call_sync (sm_proxy,
+                                "RegisterClient",
+                                g_variant_new ("(ss)", app_id,
+                                               startup_id),
+                                0, 1000, NULL, &error);
+  if (!res)
+    {
+      const char *message = (error && error->message ? error->message
+                                                     : "no error");
+      g_warning ("Failed to register client: %s", message);
+      if (error)
+        g_error_free (error);
+      return FALSE;
+    }
+  g_variant_get (res, "(o)", &client_id);
+  g_variant_unref (res);
 
-        client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
-                                                  SM_DBUS_NAME,
-                                                  client_id,
-                                                  SM_CLIENT_DBUS_INTERFACE,
-                                                  NULL, NULL);
+  client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
+                                                SM_DBUS_NAME,
+                                                client_id,
+                                                SM_CLIENT_DBUS_INTERFACE,
+                                                NULL, NULL);
 
-        g_signal_connect (client_proxy, "g-signal",
-                          G_CALLBACK (client_proxy_signal_cb), NULL);
+  g_signal_connect (client_proxy, "g-signal",
+                    G_CALLBACK (client_proxy_signal_cb), NULL);
 
-        g_unsetenv ("DESKTOP_AUTOSTART_ID");
+  g_unsetenv ("DESKTOP_AUTOSTART_ID");
 
-        return TRUE;
+  return TRUE;
 }
 
 /*---------------------------------------------------------------------------*/
 
-
 /*---------------------------------------------------------------------------*/
 
 typedef GObject *(*gconf_client_get_default_t) ();
-typedef gboolean (*gconf_client_get_bool_t)(GObject *, const char *, void *);
+typedef gboolean (*gconf_client_get_bool_t) (GObject *, const char *, void *);
 
 int
 main (int argc, char **argv)
@@ -217,44 +227,44 @@ main (int argc, char **argv)
   int ret;
 
   /*Parse command options*/
-  opt = g_option_context_new(NULL);
-  g_option_context_add_main_entries(opt, optentries, NULL);
+  opt = g_option_context_new (NULL);
+  g_option_context_add_main_entries (opt, optentries, NULL);
 
-  if (!g_option_context_parse(opt, &argc, &argv, &err))
+  if (!g_option_context_parse (opt, &argc, &argv, &err))
     {
-      g_error("Option parsing failed: %s\n", err->message);
+      g_error ("Option parsing failed: %s\n", err->message);
       g_clear_error (&err);
     }
 
   if (dbus_name == NULL)
-      dbus_name = SPI_DBUS_NAME_REGISTRY;
+    dbus_name = SPI_DBUS_NAME_REGISTRY;
 
   bus = atspi_get_a11y_bus ();
   if (!bus)
-  {
-    return 0;
-  }
+    {
+      return 0;
+    }
 
   mainloop = g_main_loop_new (NULL, FALSE);
-  atspi_dbus_connection_setup_with_g_main(bus, NULL);
+  atspi_dbus_connection_setup_with_g_main (bus, NULL);
 
-  ret = dbus_bus_request_name(bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL);
+  ret = dbus_bus_request_name (bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, NULL);
   if (ret == DBUS_REQUEST_NAME_REPLY_EXISTS)
     {
-      exit (0);        /* most likely already running */
+      exit (0); /* most likely already running */
     }
   else
     {
       g_print ("SpiRegistry daemon is running with well-known name - %s\n", dbus_name);
     }
 
-  registry = spi_registry_new (bus);
-  dec = spi_registry_dec_new (registry, bus);
+  dec = spi_registry_dec_new (bus);
+  registry = spi_registry_new (bus, dec);
 
   if (use_gnome_session)
     {
       if (!session_manager_connect ())
-          g_warning ("Unable to connect to session manager");
+        g_warning ("Unable to connect to session manager");
     }
 
   g_main_loop_run (mainloop);
index e22fbcb..550b460 100644 (file)
  */
 
 #include <config.h>
-#include <string.h>
 #include <ctype.h>
+#include <string.h>
 
+#include "introspection.h"
 #include "paths.h"
 #include "registry.h"
-#include "introspection.h"
 
-typedef struct event_data event_data;
-struct event_data
+typedef struct
 {
-  gchar *bus_name;
+  gchar *listener_bus_name;
+  gchar *app_bus_name;
   gchar **data;
   GSList *properties;
-};
-
-static void
-children_added_listener (DBusConnection * bus,
-                         gint             index,
-                         const gchar    * name,
-                         const gchar    * path);
-
-static void
-children_removed_listener (DBusConnection * bus,
-                           gint             index,
-                           const gchar    * name,
-                           const gchar    * path);
+} EventData;
 
 /*---------------------------------------------------------------------------*/
 
-typedef struct _SpiReference
+typedef struct
 {
   gchar *name;
   gchar *path;
@@ -70,6 +58,12 @@ spi_reference_new (const gchar *name, const gchar *path)
   return ref;
 }
 
+static SpiReference *
+spi_reference_null (const char *bus_name)
+{
+  return spi_reference_new (bus_name, SPI_DBUS_PATH_NULL);
+}
+
 static void
 spi_reference_free (SpiReference *ref)
 {
@@ -80,12 +74,27 @@ spi_reference_free (SpiReference *ref)
 
 /*---------------------------------------------------------------------------*/
 
-G_DEFINE_TYPE(SpiRegistry, spi_registry, G_TYPE_OBJECT)
+G_DEFINE_TYPE (SpiRegistry, spi_registry, G_TYPE_OBJECT)
+
+static void
+spi_registry_finalize (GObject *object)
+{
+  SpiRegistry *registry = SPI_REGISTRY (object);
+
+  g_clear_pointer (&registry->bus_unique_name, g_free);
+
+  G_OBJECT_CLASS (spi_registry_parent_class)->finalize (object);
+}
 
 static void
 spi_registry_class_init (SpiRegistryClass *klass)
 {
+  GObjectClass *gobject_class;
+
   spi_registry_parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = spi_registry_finalize;
 }
 
 static void
@@ -96,38 +105,41 @@ spi_registry_init (SpiRegistry *registry)
 
 /*---------------------------------------------------------------------------*/
 
-static dbus_bool_t
-return_v_string (DBusMessageIter * iter, const gchar * str)
+static void
+return_v_string (DBusMessageIter *iter, const gchar *str)
 {
   DBusMessageIter variant;
 
   if (!dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "s",
-                                    &variant))
-    return FALSE;
+                                         &variant))
+    {
+      g_error ("Out of memory");
+    }
 
   dbus_message_iter_append_basic (&variant, DBUS_TYPE_STRING, &str);
   dbus_message_iter_close_container (iter, &variant);
-  return TRUE;
 }
 
-static dbus_bool_t
-append_reference (DBusMessageIter * iter, const char * name, const char * path)
+static void
+append_reference (DBusMessageIter *iter, SpiReference *ref)
 {
   DBusMessageIter iter_struct;
 
   if (!dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL,
-                                    &iter_struct))
-    return FALSE;
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &name);
-  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &path);
+                                         &iter_struct))
+    {
+      g_error ("Out of memory");
+    }
+
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &ref->name);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_OBJECT_PATH, &ref->path);
   dbus_message_iter_close_container (iter, &iter_struct);
-  return TRUE;
 }
 
 /*---------------------------------------------------------------------------*/
 
 static gboolean
-compare_reference (SpiReference *one, SpiReference *two)
+compare_reference (const SpiReference *one, const SpiReference *two)
 {
   if (g_strcmp0 (one->name, two->name) == 0 &&
       g_strcmp0 (one->path, two->path) == 0)
@@ -137,14 +149,11 @@ compare_reference (SpiReference *one, SpiReference *two)
 }
 
 static gboolean
-find_index_of_reference (GPtrArray *arr, const gchar *name, const gchar * path, guint *index)
+find_index_of_reference (GPtrArray *arr, const SpiReference *ref, guint *index)
 {
-  SpiReference *ref;
   gboolean found = FALSE;
   guint i = 0;
 
-  ref = spi_reference_new (name, path);
-
   for (i = 0; i < arr->len; i++)
     {
       if (compare_reference (ref, g_ptr_array_index (arr, i)))
@@ -154,51 +163,84 @@ find_index_of_reference (GPtrArray *arr, const gchar *name, const gchar * path,
         }
     }
 
-  spi_reference_free (ref);
-
   *index = i;
   return found;
 }
 
 static void
-add_application (SpiRegistry *reg, DBusConnection *bus, const gchar *name, const gchar *path)
+emit_children_changed (DBusConnection *bus,
+                       const char *operation,
+                       dbus_int32_t index,
+                       SpiReference *app)
 {
-  g_ptr_array_add (reg->apps, spi_reference_new (name, path));
-  children_added_listener (bus, reg->apps->len - 1, name, path);
+  DBusMessage *sig;
+  DBusMessageIter iter, iter_variant, iter_array;
+  dbus_int32_t unused = 0;
+
+  sig = dbus_message_new_signal (SPI_DBUS_PATH_ROOT,
+                                 SPI_DBUS_INTERFACE_EVENT_OBJECT,
+                                 "ChildrenChanged");
+
+  dbus_message_iter_init_append (sig, &iter);
+
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &operation);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &index);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &unused);
+
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "(so)",
+                                    &iter_variant);
+  append_reference (&iter_variant, app);
+  dbus_message_iter_close_container (&iter, &iter_variant);
+
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}",
+                                    &iter_array);
+  dbus_message_iter_close_container (&iter, &iter_array);
+
+  dbus_connection_send (bus, sig, NULL);
+  dbus_message_unref (sig);
+}
+
+static void
+add_application (SpiRegistry *registry, SpiReference *app_root)
+{
+  gint index;
+
+  g_ptr_array_add (registry->apps, app_root);
+  index = registry->apps->len - 1;
+
+  emit_children_changed (registry->bus, "add", index, app_root);
 }
 
 static void
-set_id (SpiRegistry *reg, DBusConnection *bus, const gchar *name, const gchar *path)
+call_set_id (SpiRegistry *registry, SpiReference *app, dbus_int32_t id)
 {
   DBusMessage *message;
   DBusMessageIter iter, iter_variant;
   const char *iface_application = "org.a11y.atspi.Application";
-  const char *id = "Id";
+  const char *id_str = "Id";
 
-  message = dbus_message_new_method_call (name, path,
+  message = dbus_message_new_method_call (app->name, app->path,
                                           DBUS_INTERFACE_PROPERTIES, "Set");
   if (!message)
     return;
   dbus_message_iter_init_append (message, &iter);
   dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &iface_application);
-  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &id);
+  dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &id_str);
   dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "i", &iter_variant);
-  dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_INT32, &reg->id);
-  /* TODO: This will cause problems if we cycle through 2^31 ids */
-  reg->id++;
+  dbus_message_iter_append_basic (&iter_variant, DBUS_TYPE_INT32, &id);
   dbus_message_iter_close_container (&iter, &iter_variant);
-  dbus_connection_send (bus, message, NULL);
+  dbus_connection_send (registry->bus, message, NULL);
   dbus_message_unref (message);
 }
 
 static void
-remove_application (SpiRegistry *reg, DBusConnection *bus, guint index)
+remove_application (SpiRegistry *registry, guint index)
 {
-  SpiReference *ref = g_ptr_array_index (reg->apps, index);
+  SpiReference *ref = g_ptr_array_index (registry->apps, index);
 
-  spi_remove_device_listeners (reg->dec, ref->name);
-  children_removed_listener (bus, index, ref->name, ref->path);
-  g_ptr_array_remove_index (reg->apps, index);
+  spi_remove_device_listeners (registry->dec, ref->name);
+  emit_children_changed (registry->bus, "remove", index, ref);
+  g_ptr_array_remove_index (registry->apps, index);
 }
 
 static gboolean
@@ -217,11 +259,11 @@ event_is_subtype (gchar **needle, gchar **haystack)
 static gboolean
 needs_mouse_poll (char **event)
 {
-  if (g_strcmp0 (event [0], "Mouse") != 0)
+  if (g_strcmp0 (event[0], "Mouse") != 0)
     return FALSE;
-  if (!event [1] || !event [1][0])
+  if (!event[1] || !event[1][0])
     return TRUE;
-  return (g_strcmp0 (event [1], "Abs") == 0);
+  return (g_strcmp0 (event[1], "Abs") == 0);
 }
 
 static void
@@ -240,13 +282,14 @@ remove_events (SpiRegistry *registry, const char *bus_name, const char *event)
 
   for (list = registry->events; list;)
     {
-      event_data *evdata = list->data;
+      EventData *evdata = list->data;
       list = list->next;
-      if (!g_strcmp0 (evdata->bus_name, bus_name) &&
+      if (!g_strcmp0 (evdata->listener_bus_name, bus_name) &&
           event_is_subtype (evdata->data, remove_data))
         {
           g_strfreev (evdata->data);
-          g_free (evdata->bus_name);
+          g_free (evdata->listener_bus_name);
+          g_free (evdata->app_bus_name);
           g_slist_free_full (evdata->properties, g_free);
           registry->events = g_list_remove (registry->events, evdata);
           g_free (evdata);
@@ -259,7 +302,7 @@ remove_events (SpiRegistry *registry, const char *bus_name, const char *event)
     }
 
   if (!mouse_found)
-    spi_device_event_controller_stop_poll_mouse ();
+    spi_device_event_controller_stop_poll_mouse (registry->dec);
 
   g_strfreev (remove_data);
 
@@ -273,10 +316,9 @@ remove_events (SpiRegistry *registry, const char *bus_name, const char *event)
 }
 
 static void
-handle_disconnection (DBusConnection *bus, DBusMessage *message, void *user_data)
+handle_disconnection (SpiRegistry *registry, DBusMessage *message)
 {
   char *name, *old, *new;
-  SpiRegistry *reg = SPI_REGISTRY (user_data);
 
   if (dbus_message_get_args (message, NULL,
                              DBUS_TYPE_STRING, &name,
@@ -288,17 +330,17 @@ handle_disconnection (DBusConnection *bus, DBusMessage *message, void *user_data
         {
           /* Remove all children with the application name the same as the disconnected application. */
           guint i;
-          for (i = 0; i < reg->apps->len; i++)
+          for (i = 0; i < registry->apps->len; i++)
             {
-              SpiReference *ref  = g_ptr_array_index (reg->apps, i);
+              SpiReference *ref = g_ptr_array_index (registry->apps, i);
               if (!g_strcmp0 (old, ref->name))
                 {
-                  remove_application (reg, bus, i);
+                  remove_application (registry, i);
                   i--;
                 }
-            } 
+            }
 
-          remove_events (reg, old, "");
+          remove_events (registry, old, "");
         }
     }
 }
@@ -341,96 +383,119 @@ ensure_proper_format (const char *name)
 static DBusHandlerResult
 signal_filter (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
+  SpiRegistry *reg = SPI_REGISTRY (user_data);
   guint res = DBUS_HANDLER_RESULT_HANDLED;
-  const gint   type    = dbus_message_get_type (message);
+
+  const gint type = dbus_message_get_type (message);
   const char *iface = dbus_message_get_interface (message);
   const char *member = dbus_message_get_member (message);
 
   if (type != DBUS_MESSAGE_TYPE_SIGNAL)
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-  if (!g_strcmp0(iface, DBUS_INTERFACE_DBUS) &&
-      !g_strcmp0(member, "NameOwnerChanged"))
-      handle_disconnection (bus, message, user_data);
+  if (!g_strcmp0 (iface, DBUS_INTERFACE_DBUS) &&
+      !g_strcmp0 (member, "NameOwnerChanged"))
+    handle_disconnection (reg, message);
   else
-      res = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    res = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
   return res;
 }
 
+typedef enum
+{
+  DEMARSHAL_STATUS_SUCCESS,
+  DEMARSHAL_STATUS_INVALID_SIGNATURE,
+  DEMARSHAL_STATUS_INVALID_VALUE,
+} DemarshalStatus;
+
 /* org.at_spi.Socket interface */
 /*---------------------------------------------------------------------------*/
 
-static DBusMessage*
-impl_Embed (DBusConnection *bus, DBusMessage *message, void *user_data)
+static DemarshalStatus
+demarshal_reference (DBusMessage *message, SpiReference **out_reference)
 {
-  SpiRegistry *reg = SPI_REGISTRY (user_data);
   DBusMessageIter iter, iter_struct;
   const gchar *app_name, *obj_path;
 
-  DBusMessage *reply = NULL;
-  DBusMessageIter reply_iter;
+  *out_reference = NULL;
 
   dbus_message_iter_init (message, &iter);
   dbus_message_iter_recurse (&iter, &iter_struct);
   if (!(dbus_message_iter_get_arg_type (&iter_struct) == DBUS_TYPE_STRING))
-       goto error;
+    return DEMARSHAL_STATUS_INVALID_SIGNATURE;
   dbus_message_iter_get_basic (&iter_struct, &app_name);
   if (!app_name)
     app_name = dbus_message_get_sender (message);
   if (!dbus_message_iter_next (&iter_struct))
-        goto error;
+    return DEMARSHAL_STATUS_INVALID_SIGNATURE;
   if (!(dbus_message_iter_get_arg_type (&iter_struct) == DBUS_TYPE_OBJECT_PATH))
-       goto error;
+    return DEMARSHAL_STATUS_INVALID_SIGNATURE;
   dbus_message_iter_get_basic (&iter_struct, &obj_path);
 
-  add_application(reg, bus, app_name, obj_path);
+  *out_reference = spi_reference_new (app_name, obj_path);
 
-  set_id (reg, bus, app_name, obj_path);
+  return DEMARSHAL_STATUS_SUCCESS;
+}
+
+static SpiReference *
+socket_embed (SpiRegistry *registry, SpiReference *app_root)
+{
+  add_application (registry, app_root);
+  call_set_id (registry, app_root, registry->id);
+  /* TODO: This will cause problems if we cycle through 2^31 ids */
+  registry->id++;
+  return spi_reference_new (registry->bus_unique_name, SPI_DBUS_PATH_ROOT);
+}
+
+static DBusMessage *
+impl_Embed (DBusMessage *message, SpiRegistry *registry)
+{
+  SpiReference *app_root = NULL;
+  SpiReference *result;
+
+  if (demarshal_reference (message, &app_root) != DEMARSHAL_STATUS_SUCCESS)
+    {
+      return dbus_message_new_error (message, DBUS_ERROR_FAILED, "Invalid arguments");
+    }
+
+  DBusMessage *reply = NULL;
+  DBusMessageIter reply_iter;
+
+  result = socket_embed (registry, app_root); /* takes ownership of the app_root */
 
   reply = dbus_message_new_method_return (message);
   dbus_message_iter_init_append (reply, &reply_iter);
-  append_reference (&reply_iter, 
-                    dbus_bus_get_unique_name (bus),
-                    SPI_DBUS_PATH_ROOT);
+  append_reference (&reply_iter, result);
+  spi_reference_free (result);
 
   return reply;
-error:
-  return dbus_message_new_error (message, DBUS_ERROR_FAILED, "Invalid arguments");
 }
 
-static DBusMessage*
-impl_Unembed (DBusConnection *bus, DBusMessage *message, void *user_data)
+static DBusMessage *
+impl_Unembed (DBusMessage *message, SpiRegistry *registry)
 {
-  SpiRegistry *reg = SPI_REGISTRY (user_data);
-  DBusMessageIter iter, iter_struct;
-  gchar *app_name, *obj_path;
+  SpiReference *app_reference;
   guint index;
 
-  dbus_message_iter_init (message, &iter);
-  dbus_message_iter_recurse (&iter, &iter_struct);
-  if (!(dbus_message_iter_get_arg_type (&iter_struct) == DBUS_TYPE_STRING))
-       goto error;
-  dbus_message_iter_get_basic (&iter_struct, &app_name);
-  if (!dbus_message_iter_next (&iter_struct))
-        goto error;
-  if (!(dbus_message_iter_get_arg_type (&iter_struct) == DBUS_TYPE_OBJECT_PATH))
-       goto error;
-  dbus_message_iter_get_basic (&iter_struct, &obj_path);
+  if (demarshal_reference (message, &app_reference) != DEMARSHAL_STATUS_SUCCESS)
+    {
+      return dbus_message_new_error (message, DBUS_ERROR_FAILED, "Invalid arguments");
+    }
+
+  if (find_index_of_reference (registry->apps, app_reference, &index))
+    remove_application (registry, index);
 
-  if (find_index_of_reference (reg->apps, app_name, obj_path, &index))
-      remove_application(reg, bus, index);
+  spi_reference_free (app_reference);
 
   return NULL;
-error:
-  return dbus_message_new_error (message, DBUS_ERROR_FAILED, "Invalid arguments");
 }
 
 /* org.at_spi.Component interface */
 /*---------------------------------------------------------------------------*/
 
 static DBusMessage *
-impl_Contains (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_Contains (DBusMessage *message, SpiRegistry *registry)
 {
   dbus_bool_t retval = FALSE;
   DBusMessage *reply;
@@ -442,23 +507,22 @@ impl_Contains (DBusConnection * bus, DBusMessage * message, void *user_data)
 }
 
 static DBusMessage *
-impl_GetAccessibleAtPoint (DBusConnection * bus, DBusMessage * message,
-                           void *user_data)
+impl_GetAccessibleAtPoint (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply = NULL;
   DBusMessageIter iter;
+  SpiReference *null_ref = spi_reference_null (registry->bus_unique_name);
 
   reply = dbus_message_new_method_return (message);
   dbus_message_iter_init_append (reply, &iter);
-  append_reference (&iter, 
-                    dbus_bus_get_unique_name (bus),
-                    SPI_DBUS_PATH_NULL);
+  append_reference (&iter, null_ref);
+  spi_reference_free (null_ref);
 
   return reply;
 }
 
 static DBusMessage *
-impl_GetExtents (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GetExtents (DBusMessage *message, SpiRegistry *registry)
 {
   dbus_int32_t x = 0, y = 0, width = 1024, height = 768;
   DBusMessage *reply;
@@ -468,17 +532,16 @@ impl_GetExtents (DBusConnection * bus, DBusMessage * message, void *user_data)
   dbus_message_iter_init_append (reply, &iter);
   dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL,
                                     &iter_struct);
-    dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &x);
-    dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &y);
-    dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &width);
-    dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &height);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &x);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &y);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &width);
+  dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &height);
   dbus_message_iter_close_container (&iter, &iter_struct);
   return reply;
 }
 
 static DBusMessage *
-impl_GetPosition (DBusConnection * bus, DBusMessage * message,
-                  void *user_data)
+impl_GetPosition (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   dbus_int32_t x = 0, y = 0;
@@ -490,7 +553,7 @@ impl_GetPosition (DBusConnection * bus, DBusMessage * message,
 }
 
 static DBusMessage *
-impl_GetSize (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GetSize (DBusMessage *message, SpiRegistry *registry)
 {
   /* TODO - Get the screen size */
   DBusMessage *reply;
@@ -505,7 +568,7 @@ impl_GetSize (DBusConnection * bus, DBusMessage * message, void *user_data)
 #define LAYER_WIDGET 3;
 
 static DBusMessage *
-impl_GetLayer (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GetLayer (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   dbus_uint32_t rv = LAYER_WIDGET;
@@ -517,8 +580,7 @@ impl_GetLayer (DBusConnection * bus, DBusMessage * message, void *user_data)
 }
 
 static DBusMessage *
-impl_GetMDIZOrder (DBusConnection * bus, DBusMessage * message,
-                   void *user_data)
+impl_GetMDIZOrder (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   dbus_int16_t rv = 0;
@@ -530,7 +592,7 @@ impl_GetMDIZOrder (DBusConnection * bus, DBusMessage * message,
 }
 
 static DBusMessage *
-impl_GrabFocus (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GrabFocus (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   dbus_bool_t retval = FALSE;
@@ -542,7 +604,7 @@ impl_GrabFocus (DBusConnection * bus, DBusMessage * message, void *user_data)
 }
 
 static DBusMessage *
-impl_GetAlpha (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GetAlpha (DBusMessage *message, SpiRegistry *registry)
 {
   double rv = 1.0;
   DBusMessage *reply;
@@ -556,40 +618,38 @@ impl_GetAlpha (DBusConnection * bus, DBusMessage * message, void *user_data)
 /* org.at_spi.Accessible interface */
 /*---------------------------------------------------------------------------*/
 
-static dbus_bool_t
-impl_get_Name (DBusMessageIter * iter, void *user_data)
+static void
+impl_get_Name (DBusMessageIter *iter, SpiRegistry *registry)
 {
   const gchar *name = "main";
-  return return_v_string (iter, name);
+  return_v_string (iter, name);
 }
 
-static dbus_bool_t
-impl_get_Description (DBusMessageIter * iter, void *user_data)
+static void
+impl_get_Description (DBusMessageIter *iter, SpiRegistry *registry)
 {
   const gchar *description = "";
-  return return_v_string (iter, description);
+  return_v_string (iter, description);
 }
 
 static dbus_bool_t
-impl_get_Parent (DBusMessageIter * iter, void *user_data)
+impl_get_Parent (DBusMessageIter *iter, SpiRegistry *registry)
 {
-  const gchar *name = "";
   DBusMessageIter iter_variant;
+  SpiReference *null_ref = spi_reference_null ("");
 
   dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, "(so)",
                                     &iter_variant);
-  append_reference (&iter_variant, 
-                    name,
-                    SPI_DBUS_PATH_NULL);
+  append_reference (&iter_variant, null_ref);
+  spi_reference_free (null_ref);
   dbus_message_iter_close_container (iter, &iter_variant);
   return TRUE;
 }
 
 static dbus_bool_t
-impl_get_ChildCount (DBusMessageIter * iter, void *user_data)
+impl_get_ChildCount (DBusMessageIter *iter, SpiRegistry *registry)
 {
-  SpiRegistry *reg = SPI_REGISTRY (user_data);
-  dbus_int32_t rv = reg->apps->len;
+  dbus_int32_t rv = registry->apps->len;
   dbus_bool_t result;
   DBusMessageIter iter_variant;
 
@@ -601,23 +661,21 @@ impl_get_ChildCount (DBusMessageIter * iter, void *user_data)
   return result;
 }
 
-static dbus_bool_t
-impl_get_ToolkitName (DBusMessageIter * iter, void *user_data)
+static void
+impl_get_ToolkitName (DBusMessageIter *iter, SpiRegistry *registry)
 {
-  return return_v_string (iter, "at-spi-registry");
+  return_v_string (iter, "at-spi-registry");
 }
 
-static dbus_bool_t
-impl_get_ToolkitVersion (DBusMessageIter * iter, void *user_data)
+static void
+impl_get_ToolkitVersion (DBusMessageIter *iter, SpiRegistry *registry)
 {
-  return return_v_string (iter, "2.0");
+  return_v_string (iter, "2.0");
 }
 
 static DBusMessage *
-impl_GetChildAtIndex (DBusConnection * bus,
-                      DBusMessage * message, void *user_data)
+impl_GetChildAtIndex (DBusMessage *message, SpiRegistry *registry)
 {
-  SpiRegistry *reg = SPI_REGISTRY (user_data);
   DBusMessage *reply;
   DBusMessageIter iter;
   DBusError error;
@@ -625,8 +683,7 @@ impl_GetChildAtIndex (DBusConnection * bus,
   dbus_int32_t i;
 
   dbus_error_init (&error);
-  if (!dbus_message_get_args 
-       (message, &error, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID))
+  if (!dbus_message_get_args (message, &error, DBUS_TYPE_INT32, &i, DBUS_TYPE_INVALID))
     {
       return dbus_message_new_error (message, DBUS_ERROR_FAILED, "Invalid arguments");
     }
@@ -634,42 +691,43 @@ impl_GetChildAtIndex (DBusConnection * bus,
   reply = dbus_message_new_method_return (message);
   dbus_message_iter_init_append (reply, &iter);
 
-  if (i < 0 || i >= reg->apps->len)
-    append_reference (&iter, SPI_DBUS_NAME_REGISTRY, SPI_DBUS_PATH_NULL);
+  if (i < 0 || i >= registry->apps->len)
+    {
+      SpiReference *null_ref = spi_reference_null (SPI_DBUS_NAME_REGISTRY);
+      append_reference (&iter, null_ref);
+      spi_reference_free (null_ref);
+    }
   else
     {
-      ref = g_ptr_array_index (reg->apps, i);
-      append_reference (&iter, ref->name, ref->path);
+      ref = g_ptr_array_index (registry->apps, i);
+      append_reference (&iter, ref);
     }
 
   return reply;
 }
 
 static DBusMessage *
-impl_GetChildren (DBusConnection * bus,
-                  DBusMessage * message, void *user_data)
+impl_GetChildren (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply = NULL;
   DBusMessageIter iter, iter_array;
-  SpiRegistry *reg = SPI_REGISTRY (user_data);
   int i;
 
   reply = dbus_message_new_method_return (message);
 
   dbus_message_iter_init_append (reply, &iter);
-  dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array);
-  for (i=0; i < reg->apps->len; i++)
+  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(so)", &iter_array);
+  for (i = 0; i < registry->apps->len; i++)
     {
-      SpiReference *current = g_ptr_array_index (reg->apps, i);
-      append_reference (&iter_array, current->name, current->path);
+      SpiReference *current = g_ptr_array_index (registry->apps, i);
+      append_reference (&iter_array, current);
     }
-  dbus_message_iter_close_container(&iter, &iter_array);
+  dbus_message_iter_close_container (&iter, &iter_array);
   return reply;
 }
 
 static DBusMessage *
-impl_GetIndexInParent (DBusConnection * bus,
-                       DBusMessage * message, void *user_data)
+impl_GetIndexInParent (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   dbus_uint32_t rv = 0;
@@ -680,8 +738,7 @@ impl_GetIndexInParent (DBusConnection * bus,
 }
 
 static DBusMessage *
-impl_GetRelationSet (DBusConnection * bus,
-                     DBusMessage * message, void *user_data)
+impl_GetRelationSet (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   DBusMessageIter iter, iter_array;
@@ -695,10 +752,10 @@ impl_GetRelationSet (DBusConnection * bus,
 }
 
 static DBusMessage *
-impl_GetRole (DBusConnection * bus, DBusMessage * message, void * user_data)
+impl_GetRole (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
-  dbus_uint32_t rv = 14;       /* TODO: Get DESKTOP_FRAME from somewhere */
+  dbus_uint32_t rv = 14; /* TODO: Get DESKTOP_FRAME from somewhere */
 
   reply = dbus_message_new_method_return (message);
   dbus_message_append_args (reply, DBUS_TYPE_UINT32, &rv, DBUS_TYPE_INVALID);
@@ -706,8 +763,7 @@ impl_GetRole (DBusConnection * bus, DBusMessage * message, void * user_data)
 }
 
 static DBusMessage *
-impl_GetRoleName (DBusConnection * bus,
-                  DBusMessage * message, void *user_data)
+impl_GetRoleName (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   const char *role_name = "desktop frame";
@@ -719,10 +775,9 @@ impl_GetRoleName (DBusConnection * bus,
 }
 
 static DBusMessage *
-impl_GetLocalizedRoleName (DBusConnection * bus,
-                           DBusMessage * message, void *user_data)
+impl_GetLocalizedRoleName (DBusMessage *message, SpiRegistry *registry)
 {
-  /* TODO - Localize this */
+  /* FIXME - Localize this */
   DBusMessage *reply;
   const char *role_name = "desktop frame";
 
@@ -733,12 +788,12 @@ impl_GetLocalizedRoleName (DBusConnection * bus,
 }
 
 static DBusMessage *
-impl_GetState (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GetState (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply = NULL;
   DBusMessageIter iter, iter_array;
 
-  dbus_uint32_t states[2] = {0, 0};
+  dbus_uint32_t states[2] = { 0, 0 };
   guint count;
 
   reply = dbus_message_new_method_return (message);
@@ -755,8 +810,7 @@ impl_GetState (DBusConnection * bus, DBusMessage * message, void *user_data)
 }
 
 static DBusMessage *
-impl_GetAttributes (DBusConnection * bus,
-                    DBusMessage * message, void *user_data)
+impl_GetAttributes (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply = NULL;
   DBusMessageIter iter, array;
@@ -770,45 +824,47 @@ impl_GetAttributes (DBusConnection * bus,
 }
 
 static DBusMessage *
-impl_GetApplication (DBusConnection * bus,
-                     DBusMessage * message, void *user_data)
+impl_GetApplication (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply = NULL;
   DBusMessageIter iter;
+  SpiReference *null_ref = spi_reference_null (registry->bus_unique_name);
 
   reply = dbus_message_new_method_return (message);
   dbus_message_iter_init_append (reply, &iter);
-  append_reference (&iter,
-                    dbus_bus_get_unique_name (bus),
-                    SPI_DBUS_PATH_NULL);
+  append_reference (&iter, null_ref);
+  spi_reference_free (null_ref);
 
   return reply;
 }
 
 static DBusMessage *
-impl_GetInterfaces (DBusConnection * bus,
-                    DBusMessage * message, void *user_data)
+impl_GetInterfaces (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   DBusMessageIter iter, iter_array;
 
   const char *acc = SPI_DBUS_INTERFACE_ACCESSIBLE;
+  const char *app = SPI_DBUS_INTERFACE_APPLICATION;
   const char *com = SPI_DBUS_INTERFACE_COMPONENT;
+  const char *sock = SPI_DBUS_INTERFACE_SOCKET;
 
   reply = dbus_message_new_method_return (message);
 
   dbus_message_iter_init_append (reply, &iter);
   dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "s",
                                     &iter_array);
-    dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &acc);
-    dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &com);
+  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &acc);
+  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &app);
+  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &com);
+  dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &sock);
   dbus_message_iter_close_container (&iter, &iter_array);
 
   return reply;
 }
 
 static DBusMessage *
-impl_GetItems (DBusConnection * bus, DBusMessage * message, void *user_data)
+impl_GetItems (DBusMessage *message, SpiRegistry *registry)
 {
   DBusMessage *reply;
   DBusMessageIter iter, iter_array;
@@ -827,12 +883,11 @@ impl_GetItems (DBusConnection * bus, DBusMessage * message, void *user_data)
  * a method call and signal for now.
  */
 static DBusMessage *
-impl_register_event (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_RegisterEvent (DBusMessage *message, SpiRegistry *registry)
 {
-  SpiRegistry *registry = SPI_REGISTRY (user_data);
   const char *orig_name;
   gchar *name;
-  event_data *evdata;
+  EventData *evdata;
   gchar **data;
   DBusMessage *signal;
   const char *sender = dbus_message_get_sender (message);
@@ -840,75 +895,88 @@ impl_register_event (DBusConnection *bus, DBusMessage *message, void *user_data)
   const char *signature = dbus_message_get_signature (message);
 
   if (strcmp (signature, "sas") != 0 &&
-      strcmp (signature, "s") != 0)
-  {
-    g_warning ("got RegisterEvent with invalid signature '%s'", signature);
-    return NULL;
-  }
+      strcmp (signature, "s") != 0 &&
+      strcmp (signature, "sass") != 0)
+    {
+      g_warning ("got RegisterEvent with invalid signature '%s'", signature);
+      return NULL;
+    }
 
   dbus_message_iter_init (message, &iter);
   dbus_message_iter_get_basic (&iter, &orig_name);
   dbus_message_iter_next (&iter);
   name = ensure_proper_format (orig_name);
 
-  evdata = g_new0 (event_data, 1);
+  evdata = g_new0 (EventData, 1);
   data = g_strsplit (name, ":", 3);
-  evdata->bus_name = g_strdup (sender);
+  evdata->listener_bus_name = g_strdup (sender);
   evdata->data = data;
 
   if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY)
-  {
-    dbus_message_iter_recurse (&iter, &iter_array);
-    while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
     {
-      const char *property;
-      dbus_message_iter_get_basic (&iter_array, &property);
-      evdata->properties = g_slist_append (evdata->properties,
-                                           g_strdup (property));
-      dbus_message_iter_next (&iter_array);
+      dbus_message_iter_recurse (&iter, &iter_array);
+      while (dbus_message_iter_get_arg_type (&iter_array) != DBUS_TYPE_INVALID)
+        {
+          const char *property;
+          dbus_message_iter_get_basic (&iter_array, &property);
+          evdata->properties = g_slist_append (evdata->properties,
+                                               g_strdup (property));
+          dbus_message_iter_next (&iter_array);
+        }
+      dbus_message_iter_next (&iter);
     }
-  }
+
+  if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING)
+    {
+      const char *app;
+      dbus_message_iter_get_basic (&iter, &app);
+      if (app[0])
+        evdata->app_bus_name = g_strdup (app);
+      dbus_message_iter_next (&iter);
+    }
+
   registry->events = g_list_append (registry->events, evdata);
 
   if (needs_mouse_poll (evdata->data))
     {
-      spi_device_event_controller_start_poll_mouse (registry);
+      spi_device_event_controller_start_poll_mouse (registry->dec);
     }
 
   signal = dbus_message_new_signal (SPI_DBUS_PATH_REGISTRY,
                                     SPI_DBUS_INTERFACE_REGISTRY,
                                     "EventListenerRegistered");
   if (signal)
-  {
-    GSList *ls = evdata->properties;
-    dbus_message_iter_init_append (signal, &iter);
-    dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &sender);
-    dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &name);
-    dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "s", &iter_array);
-    while (ls)
     {
-      dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &ls->data);
-      ls = g_slist_next (ls);
+      GSList *ls = evdata->properties;
+      if (evdata->app_bus_name)
+        dbus_message_set_destination (message, evdata->app_bus_name);
+      dbus_message_iter_init_append (signal, &iter);
+      dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &sender);
+      dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &name);
+      dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "s", &iter_array);
+      while (ls)
+        {
+          dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING, &ls->data);
+          ls = g_slist_next (ls);
+        }
+      dbus_message_iter_close_container (&iter, &iter_array);
+      dbus_connection_send (registry->bus, signal, NULL);
+      dbus_message_unref (signal);
     }
-    dbus_message_iter_close_container (&iter, &iter_array);
-    dbus_connection_send (bus, signal, NULL);
-    dbus_message_unref (signal);
-  }
 
   g_free (name);
   return dbus_message_new_method_return (message);
 }
 
 static DBusMessage *
-impl_deregister_event (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_DeregisterEvent (DBusMessage *message, SpiRegistry *registry)
 {
-  SpiRegistry *registry = SPI_REGISTRY (user_data);
   const char *orig_name;
   gchar *name;
   const char *sender = dbus_message_get_sender (message);
 
   if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &orig_name,
-    DBUS_TYPE_INVALID))
+                              DBUS_TYPE_INVALID))
     return NULL;
   name = ensure_proper_format (orig_name);
 
@@ -919,13 +987,13 @@ impl_deregister_event (DBusConnection *bus, DBusMessage *message, void *user_dat
 }
 
 static DBusMessage *
-impl_get_registered_events (DBusConnection *bus, DBusMessage *message, void *user_data)
+impl_GetRegisteredEvents (DBusMessage *message, SpiRegistry *registry)
 {
-  SpiRegistry *registry = SPI_REGISTRY (user_data);
-  event_data *evdata;
+  EventData *evdata;
   DBusMessage *reply;
   DBusMessageIter iter, iter_struct, iter_array;
   GList *list;
+  const char *sender = dbus_message_get_sender (message);
 
   reply = dbus_message_new_method_return (message);
   if (!reply)
@@ -937,11 +1005,14 @@ impl_get_registered_events (DBusConnection *bus, DBusMessage *message, void *use
     {
       gchar *str;
       evdata = list->data;
-      str = g_strconcat (evdata->data [0],
-                         ":", (evdata->data [1]? evdata->data [1]: ""),
-                         ":", (evdata->data [1] && evdata->data [2]? evdata->data [2]: ""), NULL);
+      if (evdata->app_bus_name && strcmp (evdata->app_bus_name, sender) != 0)
+        continue;
+
+      str = g_strconcat (evdata->data[0],
+                         ":", (evdata->data[1] ? evdata->data[1] : ""),
+                         ":", (evdata->data[1] && evdata->data[2] ? evdata->data[2] : ""), NULL);
       dbus_message_iter_open_container (&iter_array, DBUS_TYPE_STRUCT, NULL, &iter_struct);
-      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &evdata->bus_name);
+      dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &evdata->listener_bus_name);
       dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_STRING, &str);
       dbus_message_iter_close_container (&iter_array, &iter_struct);
       g_free (str);
@@ -952,35 +1023,38 @@ impl_get_registered_events (DBusConnection *bus, DBusMessage *message, void *use
 
 /*---------------------------------------------------------------------------*/
 
-static void 
-emit_Available (DBusConnection * bus)
+static void
+emit_Available (DBusConnection *bus)
 {
   DBusMessage *sig;
   DBusMessageIter iter;
-  
-  sig = dbus_message_new_signal(SPI_DBUS_PATH_ROOT, SPI_DBUS_INTERFACE_SOCKET, "Available");
+  SpiReference root_ref = {
+    SPI_DBUS_NAME_REGISTRY,
+    SPI_DBUS_PATH_ROOT,
+  };
 
-  dbus_message_iter_init_append(sig, &iter);
-  append_reference (&iter, SPI_DBUS_NAME_REGISTRY, SPI_DBUS_PATH_ROOT);
+  sig = dbus_message_new_signal (SPI_DBUS_PATH_ROOT, SPI_DBUS_INTERFACE_SOCKET, "Available");
 
-  dbus_connection_send(bus, sig, NULL);
-  dbus_message_unref(sig);
+  dbus_message_iter_init_append (sig, &iter);
+  append_reference (&iter, &root_ref);
+
+  dbus_connection_send (bus, sig, NULL);
+  dbus_message_unref (sig);
 }
 
 /*---------------------------------------------------------------------------*/
 
 static const char *introspection_header =
-"<?xml version=\"1.0\"?>\n";
+    "<?xml version=\"1.0\"?>\n";
 
 static const char *introspection_node_element =
-"<node name=\"%s\">\n";
+    "<node name=\"%s\">\n";
 
 static const char *introspection_footer =
-"</node>";
+    "</node>";
 
 static DBusMessage *
-impl_Introspect_root (DBusConnection * bus,
-                 DBusMessage * message, void *user_data)
+impl_Introspect_root (DBusMessage *message, SpiRegistry *registry)
 {
   GString *output;
   gchar *final;
@@ -989,26 +1063,26 @@ impl_Introspect_root (DBusConnection * bus,
 
   DBusMessage *reply;
 
-  output = g_string_new(introspection_header);
+  output = g_string_new (introspection_header);
 
-  g_string_append_printf(output, introspection_node_element, pathstr);
+  g_string_append_printf (output, introspection_node_element, pathstr);
 
   g_string_append (output, spi_org_a11y_atspi_Accessible);
   g_string_append (output, spi_org_a11y_atspi_Component);
+  g_string_append (output, spi_org_a11y_atspi_Socket);
 
-  g_string_append(output, introspection_footer);
-  final = g_string_free(output, FALSE);
+  g_string_append (output, introspection_footer);
+  final = g_string_free (output, FALSE);
 
   reply = dbus_message_new_method_return (message);
-  dbus_message_append_args(reply, DBUS_TYPE_STRING, &final, DBUS_TYPE_INVALID);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &final, DBUS_TYPE_INVALID);
 
-  g_free(final);
+  g_free (final);
   return reply;
 }
 
 static DBusMessage *
-impl_Introspect_registry (DBusConnection * bus,
-                 DBusMessage * message, void *user_data)
+impl_Introspect_registry (DBusMessage *message, SpiRegistry *registry)
 {
   GString *output;
   gchar *final;
@@ -1017,119 +1091,41 @@ impl_Introspect_registry (DBusConnection * bus,
 
   DBusMessage *reply;
 
-  output = g_string_new(introspection_header);
+  output = g_string_new (introspection_header);
 
-  g_string_append_printf(output, introspection_node_element, pathstr);
+  g_string_append_printf (output, introspection_node_element, pathstr);
 
   g_string_append (output, spi_org_a11y_atspi_Registry);
 
-  g_string_append(output, introspection_footer);
-  final = g_string_free(output, FALSE);
+  g_string_append (output, introspection_footer);
+  final = g_string_free (output, FALSE);
 
   reply = dbus_message_new_method_return (message);
-  dbus_message_append_args(reply, DBUS_TYPE_STRING, &final, DBUS_TYPE_INVALID);
+  dbus_message_append_args (reply, DBUS_TYPE_STRING, &final, DBUS_TYPE_INVALID);
 
-  g_free(final);
+  g_free (final);
   return reply;
 }
 
 /*---------------------------------------------------------------------------*/
 
-/*
- * Emits an AT-SPI event.
- * AT-SPI events names are split into three parts:
- * class:major:minor
- * This is mapped onto D-Bus events as:
- * D-Bus Interface:Signal Name:Detail argument
- *
- * Marshals a basic type into the 'any_data' attribute of
- * the AT-SPI event.
- */
-static void 
-emit_event (DBusConnection *bus,
-            const char *klass,
-            const char *major,
-            const char *minor,
-            dbus_int32_t detail1,
-            dbus_int32_t detail2,
-            const char *name,
-            const char *path)
-{
-  DBusMessage *sig;
-  DBusMessageIter iter, iter_variant, iter_array;
-  
-  sig = dbus_message_new_signal(SPI_DBUS_PATH_ROOT, klass, major);
-
-  dbus_message_iter_init_append(sig, &iter);
-
-  dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &minor);
-  dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail1);
-  dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail2);
-
-  dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "(so)",
-                                    &iter_variant);
-    append_reference (&iter_variant, name, path);
-  dbus_message_iter_close_container (&iter, &iter_variant);
-
-  dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}",
-                                    &iter_array);
-  dbus_message_iter_close_container (&iter, &iter_array);
-
-  dbus_connection_send(bus, sig, NULL);
-  dbus_message_unref(sig);
-}
-
-/*---------------------------------------------------------------------------*/
-
-/*
- * Children changed signal converter and forwarder.
- *
- * Klass (Interface) org.a11y.atspi.Event.Object
- * Major is the signal name.
- * Minor is 'add' or 'remove'
- * detail1 is the index.
- * detail2 is 0.
- * any_data is the child reference.
- */
-
-static void
-children_added_listener (DBusConnection * bus,
-                         gint             index,
-                         const gchar    * name,
-                         const gchar    * path)
-{
-  emit_event (bus, SPI_DBUS_INTERFACE_EVENT_OBJECT, "ChildrenChanged", "add", index, 0,
-              name, path);
-}
-
-static void
-children_removed_listener (DBusConnection * bus,
-                           gint             index,
-                           const gchar    * name,
-                           const gchar    * path)
-{
-  emit_event (bus, SPI_DBUS_INTERFACE_EVENT_OBJECT, "ChildrenChanged", "remove", index, 0,
-              name, path);
-}
-
-/*---------------------------------------------------------------------------*/
-
 static DBusHandlerResult
 handle_method_root (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
+  SpiRegistry *registry = SPI_REGISTRY (user_data);
   DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-  const gchar *iface   = dbus_message_get_interface (message);
-  const gchar *member  = dbus_message_get_member (message);
-  const gint   type    = dbus_message_get_type (message);
+  const gchar *iface = dbus_message_get_interface (message);
+  const gchar *member = dbus_message_get_member (message);
+  const gint type = dbus_message_get_type (message);
 
   DBusMessage *reply = NULL;
 
   /* Check for basic reasons not to handle */
-  if (type   != DBUS_MESSAGE_TYPE_METHOD_CALL ||
+  if (type != DBUS_MESSAGE_TYPE_METHOD_CALL ||
       member == NULL ||
-      iface  == NULL)
-      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+      iface == NULL)
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
   if (!strcmp (iface, "org.freedesktop.DBus.Properties"))
     {
@@ -1153,38 +1149,37 @@ handle_method_root (DBusConnection *bus, DBusMessage *message, void *user_data)
               reply = dbus_message_new_method_return (message);
               dbus_message_iter_init_append (reply, &iter);
 
-
               if (!strcmp (prop_iface, SPI_DBUS_INTERFACE_ACCESSIBLE))
                 {
-                  if      (!strcmp (prop_member, "Name"))
-                    impl_get_Name (&iter, user_data);
+                  if (!strcmp (prop_member, "Name"))
+                    impl_get_Name (&iter, registry);
                   else if (!strcmp (prop_member, "Description"))
-                    impl_get_Description (&iter, user_data);
+                    impl_get_Description (&iter, registry);
                   else if (!strcmp (prop_member, "Parent"))
-                    impl_get_Parent (&iter, user_data);
+                    impl_get_Parent (&iter, registry);
                   else if (!strcmp (prop_member, "ChildCount"))
-                    impl_get_ChildCount (&iter, user_data);
+                    impl_get_ChildCount (&iter, registry);
                   else
                     {
-                      dbus_message_unref (reply); 
+                      dbus_message_unref (reply);
                       reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Property unavailable");
                     }
                 }
               else if (!strcmp (prop_iface, SPI_DBUS_INTERFACE_APPLICATION))
                 {
                   if (!strcmp (prop_member, "ToolkitName"))
-                    impl_get_ToolkitName (&iter, user_data);
-                  else if (!strcmp (prop_member, "ToolkitVersion"))
-                    impl_get_ToolkitVersion (&iter, user_data);
+                    impl_get_ToolkitName (&iter, registry);
+                  else if (!strcmp (prop_member, "Version"))
+                    impl_get_ToolkitVersion (&iter, registry);
                   else
                     {
-                      dbus_message_unref (reply); 
+                      dbus_message_unref (reply);
                       reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Property unavailable");
                     }
                 }
               else
                 {
-                  dbus_message_unref (reply); 
+                  dbus_message_unref (reply);
                   reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Property unavailable");
                 }
             }
@@ -1203,75 +1198,75 @@ handle_method_root (DBusConnection *bus, DBusMessage *message, void *user_data)
   if (!strcmp (iface, SPI_DBUS_INTERFACE_ACCESSIBLE))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "GetChildAtIndex"))
-          reply = impl_GetChildAtIndex (bus, message, user_data);
+      if (!strcmp (member, "GetChildAtIndex"))
+        reply = impl_GetChildAtIndex (message, registry);
       else if (!strcmp (member, "GetChildren"))
-          reply = impl_GetChildren (bus, message, user_data);
+        reply = impl_GetChildren (message, registry);
       else if (!strcmp (member, "GetIndexInParent"))
-          reply = impl_GetIndexInParent (bus, message, user_data);
+        reply = impl_GetIndexInParent (message, registry);
       else if (!strcmp (member, "GetRelationSet"))
-          reply = impl_GetRelationSet (bus, message, user_data);
+        reply = impl_GetRelationSet (message, registry);
       else if (!strcmp (member, "GetRole"))
-          reply = impl_GetRole (bus, message, user_data);
+        reply = impl_GetRole (message, registry);
       else if (!strcmp (member, "GetRoleName"))
-          reply = impl_GetRoleName (bus, message, user_data);
+        reply = impl_GetRoleName (message, registry);
       else if (!strcmp (member, "GetLocalizedRoleName"))
-          reply = impl_GetLocalizedRoleName (bus, message, user_data);
+        reply = impl_GetLocalizedRoleName (message, registry);
       else if (!strcmp (member, "GetState"))
-          reply = impl_GetState (bus, message, user_data);
+        reply = impl_GetState (message, registry);
       else if (!strcmp (member, "GetAttributes"))
-          reply = impl_GetAttributes (bus, message, user_data);
+        reply = impl_GetAttributes (message, registry);
       else if (!strcmp (member, "GetApplication"))
-          reply = impl_GetApplication (bus, message, user_data);
+        reply = impl_GetApplication (message, registry);
       else if (!strcmp (member, "GetInterfaces"))
-          reply = impl_GetInterfaces (bus, message, user_data);
+        reply = impl_GetInterfaces (message, registry);
       else
-         result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (!strcmp (iface, SPI_DBUS_INTERFACE_COMPONENT))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "Contains"))
-          reply = impl_Contains (bus, message, user_data);
+      if (!strcmp (member, "Contains"))
+        reply = impl_Contains (message, registry);
       else if (!strcmp (member, "GetAccessibleAtPoint"))
-          reply = impl_GetAccessibleAtPoint (bus, message, user_data);
+        reply = impl_GetAccessibleAtPoint (message, registry);
       else if (!strcmp (member, "GetExtents"))
-          reply = impl_GetExtents (bus, message, user_data);
+        reply = impl_GetExtents (message, registry);
       else if (!strcmp (member, "GetPosition"))
-          reply = impl_GetPosition (bus, message, user_data);
+        reply = impl_GetPosition (message, registry);
       else if (!strcmp (member, "GetSize"))
-          reply = impl_GetSize (bus, message, user_data);
+        reply = impl_GetSize (message, registry);
       else if (!strcmp (member, "GetLayer"))
-          reply = impl_GetLayer (bus, message, user_data);
+        reply = impl_GetLayer (message, registry);
       else if (!strcmp (member, "GetMDIZOrder"))
-          reply = impl_GetMDIZOrder (bus, message, user_data);
+        reply = impl_GetMDIZOrder (message, registry);
       else if (!strcmp (member, "GrabFocus"))
-          reply = impl_GrabFocus (bus, message, user_data);
+        reply = impl_GrabFocus (message, registry);
       else if (!strcmp (member, "GetAlpha"))
-          reply = impl_GetAlpha (bus, message, user_data);
+        reply = impl_GetAlpha (message, registry);
       else
-         result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (!strcmp (iface, SPI_DBUS_INTERFACE_SOCKET))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "Embed"))
-          reply = impl_Embed (bus, message, user_data);
+      if (!strcmp (member, "Embed"))
+        reply = impl_Embed (message, registry);
       else if (!strcmp (member, "Unembed"))
-          reply = impl_Unembed (bus, message, user_data);
+        reply = impl_Unembed (message, registry);
       else
-          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (!strcmp (iface, "org.freedesktop.DBus.Introspectable"))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "Introspect"))
-          reply = impl_Introspect_root (bus, message, user_data);
+      if (!strcmp (member, "Introspect"))
+        reply = impl_Introspect_root (message, registry);
       else
-          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (result == DBUS_HANDLER_RESULT_HANDLED)
@@ -1290,34 +1285,35 @@ handle_method_root (DBusConnection *bus, DBusMessage *message, void *user_data)
       g_print ("Registry | Unhandled message : %s|%s\n", iface, member);
     }
 #endif
-  
+
   return result;
 }
 
 static DBusHandlerResult
 handle_method_cache (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
+  SpiRegistry *registry = SPI_REGISTRY (user_data);
   DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-  const gchar *iface   = dbus_message_get_interface (message);
-  const gchar *member  = dbus_message_get_member (message);
-  const gint   type    = dbus_message_get_type (message);
+  const gchar *iface = dbus_message_get_interface (message);
+  const gchar *member = dbus_message_get_member (message);
+  const gint type = dbus_message_get_type (message);
 
   DBusMessage *reply = NULL;
 
   /* Check for basic reasons not to handle */
-  if (type   != DBUS_MESSAGE_TYPE_METHOD_CALL ||
+  if (type != DBUS_MESSAGE_TYPE_METHOD_CALL ||
       member == NULL ||
-      iface  == NULL)
-      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+      iface == NULL)
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
   if (!strcmp (iface, SPI_DBUS_INTERFACE_CACHE))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "GetItems"))
-          reply = impl_GetItems (bus, message, user_data);
+      if (!strcmp (member, "GetItems"))
+        reply = impl_GetItems (message, registry);
       else
-         result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (result == DBUS_HANDLER_RESULT_HANDLED)
@@ -1336,40 +1332,41 @@ handle_method_cache (DBusConnection *bus, DBusMessage *message, void *user_data)
 static DBusHandlerResult
 handle_method_registry (DBusConnection *bus, DBusMessage *message, void *user_data)
 {
+  SpiRegistry *registry = SPI_REGISTRY (user_data);
   DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-  const gchar *iface   = dbus_message_get_interface (message);
-  const gchar *member  = dbus_message_get_member (message);
-  const gint   type    = dbus_message_get_type (message);
+  const gchar *iface = dbus_message_get_interface (message);
+  const gchar *member = dbus_message_get_member (message);
+  const gint type = dbus_message_get_type (message);
 
   DBusMessage *reply = NULL;
 
   /* Check for basic reasons not to handle */
-  if (type   != DBUS_MESSAGE_TYPE_METHOD_CALL ||
+  if (type != DBUS_MESSAGE_TYPE_METHOD_CALL ||
       member == NULL ||
-      iface  == NULL)
-      return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+      iface == NULL)
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
   if (!strcmp (iface, SPI_DBUS_INTERFACE_REGISTRY))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if (!strcmp(member, "RegisterEvent"))
-      reply = impl_register_event (bus, message, user_data);
-      else if (!strcmp(member, "DeregisterEvent"))
-        reply = impl_deregister_event (bus, message, user_data);
-      else if (!strcmp(member, "GetRegisteredEvents"))
-        reply = impl_get_registered_events (bus, message, user_data);
+      if (!strcmp (member, "RegisterEvent"))
+        reply = impl_RegisterEvent (message, registry);
+      else if (!strcmp (member, "DeregisterEvent"))
+        reply = impl_DeregisterEvent (message, registry);
+      else if (!strcmp (member, "GetRegisteredEvents"))
+        reply = impl_GetRegisteredEvents (message, registry);
       else
-          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (!strcmp (iface, "org.freedesktop.DBus.Introspectable"))
     {
       result = DBUS_HANDLER_RESULT_HANDLED;
-      if      (!strcmp (member, "Introspect"))
-          reply = impl_Introspect_registry (bus, message, user_data);
+      if (!strcmp (member, "Introspect"))
+        reply = impl_Introspect_registry (message, registry);
       else
-          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
   if (result == DBUS_HANDLER_RESULT_HANDLED)
@@ -1388,57 +1385,60 @@ handle_method_registry (DBusConnection *bus, DBusMessage *message, void *user_da
       g_print ("Registry | Unhandled message : %s|%s\n", iface, member);
     }
 #endif
-  
+
   return result;
 }
 
 /*---------------------------------------------------------------------------*/
 
-static DBusObjectPathVTable root_vtable =
-{
+static DBusObjectPathVTable root_vtable = {
   NULL,
   &handle_method_root,
   NULL, NULL, NULL, NULL
 };
 
-static DBusObjectPathVTable registry_vtable =
-{
+static DBusObjectPathVTable registry_vtable = {
   NULL,
   &handle_method_registry,
   NULL, NULL, NULL, NULL
 };
 
-static DBusObjectPathVTable cache_vtable =
-{
+static DBusObjectPathVTable cache_vtable = {
   NULL,
   &handle_method_cache,
   NULL, NULL, NULL, NULL
 };
 
 static gchar *app_sig_match_name_owner =
-       "type='signal', interface='org.freedesktop.DBus', member='NameOwnerChanged'";
+    "type='signal', interface='org.freedesktop.DBus', member='NameOwnerChanged'";
 
 SpiRegistry *
-spi_registry_new (DBusConnection *bus)
+spi_registry_new (DBusConnection *bus, SpiDEController *dec)
 {
-  SpiRegistry *reg = g_object_new (SPI_REGISTRY_TYPE, NULL);
+  SpiRegistry *registry = g_object_new (SPI_REGISTRY_TYPE, NULL);
+  const char *bus_unique_name;
+
+  bus_unique_name = dbus_bus_get_unique_name (bus);
+  g_assert (bus_unique_name != NULL);
 
-  reg->bus = bus;
+  registry->bus = bus;
+  registry->dec = g_object_ref (dec);
+  registry->bus_unique_name = g_strdup (bus_unique_name);
 
   dbus_bus_add_match (bus, app_sig_match_name_owner, NULL);
-  dbus_connection_add_filter (bus, signal_filter, reg, NULL);
+  dbus_connection_add_filter (bus, signal_filter, registry, NULL);
 
-  dbus_connection_register_object_path (bus, SPI_DBUS_PATH_ROOT, &root_vtable, reg);
+  dbus_connection_register_object_path (bus, SPI_DBUS_PATH_ROOT, &root_vtable, registry);
 
-  dbus_connection_register_object_path (bus, SPI_DBUS_PATH_CACHE, &cache_vtable, reg);
+  dbus_connection_register_object_path (bus, SPI_DBUS_PATH_CACHE, &cache_vtable, registry);
 
-  dbus_connection_register_object_path (bus, SPI_DBUS_PATH_REGISTRY, &registry_vtable, reg);
+  dbus_connection_register_object_path (bus, SPI_DBUS_PATH_REGISTRY, &registry_vtable, registry);
 
   emit_Available (bus);
 
-  reg->events = NULL;
+  registry->events = NULL;
 
-  return reg;
+  return registry;
 }
 
 /*END------------------------------------------------------------------------*/
index 19b1a8f..96569f2 100644 (file)
@@ -24,8 +24,8 @@
 #ifndef SPI_REGISTRY_H_
 #define SPI_REGISTRY_H_
 
-#include <glib.h>
 #include <glib-object.h>
+#include <glib.h>
 
 #include <dbus/dbus.h>
 
@@ -36,28 +36,31 @@ typedef struct _SpiRegistryClass SpiRegistryClass;
 
 G_BEGIN_DECLS
 
-#define SPI_REGISTRY_TYPE        (spi_registry_get_type ())
-#define SPI_REGISTRY(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_REGISTRY_TYPE, SpiRegistry))
-#define SPI_REGISTRY_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), SPI_REGISTRY_TYPE, SpiRegistryClass))
-#define SPI_IS_REGISTRY(o)       (G_TYPE_CHECK__INSTANCE_TYPE ((o), SPI_REGISTRY_TYPE))
+#define SPI_REGISTRY_TYPE (spi_registry_get_type ())
+#define SPI_REGISTRY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SPI_REGISTRY_TYPE, SpiRegistry))
+#define SPI_REGISTRY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SPI_REGISTRY_TYPE, SpiRegistryClass))
+#define SPI_IS_REGISTRY(o) (G_TYPE_CHECK__INSTANCE_TYPE ((o), SPI_REGISTRY_TYPE))
 #define SPI_IS_REGISTRY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SPI_REGISTRY_TYPE))
 
-struct _SpiRegistry {
-  GObject      parent;
+struct _SpiRegistry
+{
+  GObject parent;
   SpiDEController *dec;
-  GPtrArray   *apps;
+  GPtrArray *apps;
   dbus_int32_t id;
 
   DBusConnection *bus;
+  char *bus_unique_name;
   GList *events;
 };
 
-struct _SpiRegistryClass {
+struct _SpiRegistryClass
+{
   GObjectClass parent_class;
 };
 
-GType        spi_registry_get_type (void);
-SpiRegistry *spi_registry_new      (DBusConnection *bus);
+GType spi_registry_get_type (void);
+SpiRegistry *spi_registry_new (DBusConnection *bus, SpiDEController *dec);
 
 G_END_DECLS
 
diff --git a/registryd/testregistry.py b/registryd/testregistry.py
deleted file mode 100755 (executable)
index db85e74..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import dbus
-import dbus.service
-import gobject
-
-from dbus.mainloop.glib import DBusGMainLoop
-
-DBusGMainLoop(set_as_default=True)
-
-class IdleStateM (object):
-        def __init__(self, bus, loop):
-                self._bus = bus
-                self._loop = loop
-                self._func = self.setup
-
-        def idle_handler(self):
-                self._func = self._func()
-                if self._func == None:
-                        self._func = self.teardown
-                return True
-
-        def setup(self):
-                self.obj = self._bus.get_object("org.a11y.atspi.Registry",
-                                                "/org/a11y/atspi/accessible/root",
-                                                introspect=False)
-                self.itf = dbus.Interface(self.obj, dbus_interface="org.a11y.atspi.Accessible")
-                return self.register_apps
-
-        def register_apps(self):
-                #self.itf.registerApplication(":R456", ignore_reply=True)
-                #self.itf.registerApplication(":R123", ignore_reply=True)
-                return self.print_applications
-
-        def print_applications(self):
-                apps = self.itf.GetChildren()
-                print apps
-                return self.teardown
-
-        def teardown(self):
-                self._loop.quit()
-
-def main(argv):
-        bus = dbus.SessionBus()
-        obj = bus.get_object("org.a11y.Bus",
-                             "/org/a11y/bus",
-                             introspect=False)
-        itf = dbus.Interface(obj, dbus_interface="org.a11y.Bus")
-        address = itf.GetAddress()
-
-        bus = dbus.bus.BusConnection(str(address))
-        loop = gobject.MainLoop()
-        stateM = IdleStateM(bus, loop)
-        gobject.idle_add(stateM.idle_handler)
-        loop.run()
-
-if __name__=="__main__":
-        sys.exit(main(sys.argv))
index 29a92f3..bcc3e70 100644 (file)
  *
  */
 
+#include "deviceeventcontroller.h" /* for prototype */
 #include <X11/X.h>
-#include "deviceeventcontroller.h"     /* for prototype */
 
 /* DO NOT UPATE BY HAND!
  * This table can be regenerated from Xorg's keysymdef.h with the ucs2keysym.sh
  * script.  */
-struct codepair {
+struct codepair
+{
   unsigned short keysym;
   unsigned short ucs;
 } keysymtab[] = {
@@ -823,56 +824,62 @@ struct codepair {
   { 0x0ef5, 0x3186 }, /*          Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
   { 0x0ef6, 0x318d }, /*                Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
   { 0x0ef7, 0x318e }, /*               Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
- };
+};
 
-long ucs2keysym (long ucs)
+long
+ucs2keysym (long ucs)
 {
-    int min = 0;
-    int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
-    int mid;
-    
-    /* first check for Latin-1 characters (1:1 mapping) */
-    if ((ucs >= 0x0020 && ucs <= 0x007e) ||
-        (ucs >= 0x00a0 && ucs <= 0x00ff))
-        return ucs;
+  int min = 0;
+  int max = sizeof (keysymtab) / sizeof (struct codepair) - 1;
+  int mid;
+
+  /* first check for Latin-1 characters (1:1 mapping) */
+  if ((ucs >= 0x0020 && ucs <= 0x007e) ||
+      (ucs >= 0x00a0 && ucs <= 0x00ff))
+    return ucs;
 
-    /* binary search in table */
-    while (max >= min) {
-       mid = (min + max) / 2;
-       if (keysymtab[mid].ucs < ucs)
-           min = mid + 1;
-       else if (keysymtab[mid].ucs > ucs)
-           max = mid - 1;
-       else {
-           /* found it */
-           return keysymtab[mid].keysym;
-       }
+  /* binary search in table */
+  while (max >= min)
+    {
+      mid = (min + max) / 2;
+      if (keysymtab[mid].ucs < ucs)
+        min = mid + 1;
+      else if (keysymtab[mid].ucs > ucs)
+        max = mid - 1;
+      else
+        {
+          /* found it */
+          return keysymtab[mid].keysym;
+        }
     }
 
-    /* no matching keysym value found, return UCS2 with bit set */
-    return ucs | 0x01000000;
+  /* no matching keysym value found, return UCS2 with bit set */
+  return ucs | 0x01000000;
 }
 
-long keysym2ucs(long keysym)
+long
+keysym2ucs (long keysym)
 {
-    int i;
+  int i;
 
-    /* first check for Latin-1 characters (1:1 mapping) */
-    if ((keysym >= 0x0020 && keysym <= 0x007e) ||
-        (keysym >= 0x00a0 && keysym <= 0x00ff))
-        return (long) keysym;
+  /* first check for Latin-1 characters (1:1 mapping) */
+  if ((keysym >= 0x0020 && keysym <= 0x007e) ||
+      (keysym >= 0x00a0 && keysym <= 0x00ff))
+    return (long) keysym;
 
-    /* also check for directly encoded 24-bit UCS characters */
-    if ((keysym & 0xff000000) == 0x01000000)
-       return keysym & 0x00ffffff;
+  /* also check for directly encoded 24-bit UCS characters */
+  if ((keysym & 0xff000000) == 0x01000000)
+    return keysym & 0x00ffffff;
 
-    for (i = 0; i < sizeof(keysymtab) / sizeof(keysymtab[0]); i++) {
-       if (keysymtab[i].keysym == keysym) {
-           /* found it */
-           return keysymtab[i].ucs;
-       }
+  for (i = 0; i < sizeof (keysymtab) / sizeof (keysymtab[0]); i++)
+    {
+      if (keysymtab[i].keysym == keysym)
+        {
+          /* found it */
+          return keysymtab[i].ucs;
+        }
     }
 
-    /* no matching Unicode value found */
-    return -1;
+  /* no matching Unicode value found */
+  return -1;
 }
diff --git a/subprojects/gi-docgen.wrap b/subprojects/gi-docgen.wrap
new file mode 100644 (file)
index 0000000..333e77a
--- /dev/null
@@ -0,0 +1,6 @@
+[wrap-git]
+directory=gi-docgen
+url=https://gitlab.gnome.org/GNOME/gi-docgen.git
+push-url=git@gitlab.gnome.org:GNOME/gi-docgen.git
+revision=main
+depth=1
diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap
new file mode 100644 (file)
index 0000000..9e8b843
--- /dev/null
@@ -0,0 +1,6 @@
+[wrap-git]
+directory=glib
+url=https://gitlab.gnome.org/GNOME/glib.git
+push-url=git@gitlab.gnome.org:GNOME/glib.git
+revision=main
+depth=1
diff --git a/subprojects/libffi.wrap b/subprojects/libffi.wrap
new file mode 100644 (file)
index 0000000..00b29d6
--- /dev/null
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=libffi
+url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
+revision=meson
+depth=1
diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap
new file mode 100644 (file)
index 0000000..6225021
--- /dev/null
@@ -0,0 +1,5 @@
+[wrap-git]
+directory=proxy-libintl
+url=https://github.com/frida/proxy-libintl.git
+revision=0.1
+depth=1
diff --git a/subprojects/zlib.wrap b/subprojects/zlib.wrap
new file mode 100644 (file)
index 0000000..ff9ab66
--- /dev/null
@@ -0,0 +1,10 @@
+[wrap-file]
+directory = zlib-1.2.11
+
+source_url = https://zlib.net/fossils/zlib-1.2.11.tar.gz
+source_filename = zlib-1.2.11.tar.gz
+source_hash = c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1
+
+patch_url = https://github.com/mesonbuild/zlib/releases/download/1.2.11-3/zlib.zip
+patch_filename = zlib-1.2.11-3-wrap.zip
+patch_hash = f07dc491ab3d05daf00632a0591e2ae61b470615b5b73bcf9b3f061fff65cff0
diff --git a/tests/.gitignore b/tests/.gitignore
new file mode 100644 (file)
index 0000000..a4f894e
--- /dev/null
@@ -0,0 +1,2 @@
+/.deps
+/.libs
diff --git a/tests/at-spi2-atk/README b/tests/at-spi2-atk/README
new file mode 100644 (file)
index 0000000..3244f2a
--- /dev/null
@@ -0,0 +1,206 @@
+
+Testing AT-SPI requires both a test application and an AT client.
+
+Test applications are built from xml files using xml loader module,
+based on Dummy ATK implementation.
+
+Each test is built as a GTest object and packed into a single interface test suite.
+
+Test directory contains:
+
+ * atk_suite - Generates a test suite, the main executable of all test suite,
+               help is shown when run with '-h' parameter.
+
+ * atk-object-xml-loader - Generates dummy atk object from xml file.
+
+ * test-application - Starts an application with atk object generated by atk-object-xml-loader
+
+ * data/ - Folder which contains xml file from which dummy atk object is generated
+
+ * dummyatk/ - Folder which contains dummy atk implementation
+
+
+************************
+HOW TO CREATE NEW TESTS:
+
+1) Add atspi interface which will be tested to Atk_Test_Case in atk_suite.c and atk_suite.h,
+   then add proper test call in atk_suite_build function.
+2) Prepare xml file which describes tested root object and descendants.
+   If any new fields in xml file appear, atk-object-xml-loader should be modifed.
+3) Add test file named atk_test_TEST_NAME.c, where TEST_NAME is tested interface name:
+   a) Create function which runs tested application
+   b) Create get_root_obj function for tested interface
+   c) Create tested functions
+   d) Create function which calls all test functions, this function should be called in atk_suite.c file.
+
+*************************
+AVAILABLE TESTS:
+
+- Accessible:
+             -accessible_get_name
+             -accessible_get_description
+             -accessible_get_child_count
+             -accessible_get_parent
+             -accessible_get_child_at_index
+             -accessible_get_index_in_parent
+             -accessible_get_relation_set_1
+             -accessible_get_relation_set_2
+             -accessible_get_role
+             -accessible_get_role_name
+             -accessible_get_localized_role_name
+             -accessible_get_state_set
+             -accessible_get_attributes
+             -accessible_get_attributes_as_array
+             -accessible_get_toolkit_name
+             -accessible_get_toolkit_version
+             -accessible_get_atspi_version
+             -accessible_get_id
+             -accessible_get_application
+             -accessible_get_action_iface
+             -accessible_get_collection_iface
+             -accessible_get_component_iface
+             -accessible_get_document_iface
+             -accessible_get_editable_text_iface
+             -accessible_get_hypertext_iface
+             -accessible_get_image_iface
+             -accessible_get_selection_iface
+             -accessible_get_table_iface
+             -accessible_get_text_iface
+             -accessible_get_value_iface
+             -accessible_get_interfaces
+             -accessible_get_object_locale
+             -accessible_set_cache_mask
+             -accessible_clear_cache
+             -accessible_get_process_id
+- Action:
+             -get_action_interface
+             -action_get_action_description
+             -action_get_action_name
+             -action_get_n_actions
+             -action_get_key_binding
+             -action_get_localized_name
+             -action_do_action
+- Component:
+             -component_contains
+             -component_get_accessible_at_point
+             -component_get_extents
+             -component_get_layer
+             -component_get_mdi_z_order
+             -component_grab_focus
+             -component_get_alpha
+             -component_set_extents
+- Collection
+             -get_collection_iface
+             -get_matches
+             -get_matches_to
+             -get_matches_from
+- EditableText:
+             -get_editable_text_iface
+             -editable_text_set_attributes
+             -editable_text_insert_text
+             -editable_text_copy_text
+             -editable_text_cut_text
+             -editable_text_delete_text
+             -editable_text_paste_text
+- Image:
+             -get_image_iface
+             -image_get_image_size
+             -image_get_image_position
+             -image_get_image_extents
+             -image_get_image_locale
+- HyperLink
+             -hyperlink_get_n_anchors
+             -hyperlink_get_uri
+             -hyperlink_get_object
+             -hyperlink_get_index_range
+             -hyperlink_get_start_index
+             -hyperlink_get_end_index
+             -hyperlink_is_valid
+- HyperText
+             -hypertext_get_n_links
+             -hypertext_get_link
+             -hypertext_get_link_index
+- Relation
+             -relation_get_relation_type
+             -relation_get_n_targets
+             -relation_get_target
+- Selection
+             -selection_get_n_selected_children
+             -selection_get_selected_child
+             -selection_select_child
+             -selection_deselect_selected
+             -selection_deselect_child
+             -selection_is_child_selected
+             -selection_select_all
+             -selection_clear_selection
+- State Set
+             -state_set_new
+             -state_set_set_by_name
+             -state_set_add
+             -state_set_compare
+             -state_set_contains
+             -state_set_equals
+             -state_set_get_states
+             -state_set_is_empty
+             -state_set_remove
+- Table
+             -table_get_caption
+             -table_get_summary
+             -table_get_n_rows
+             -table_get_n_columns
+             -table_get_accessible_at
+             -table_get_index_at
+             -table_get_row_at_index
+             -table_get_column_at_index
+             -table_get_row_description
+             -table_get_column_description
+             -table_get_row_extent_at
+             -table_get_column_extent_at
+             -table_get_row_header
+             -table_get_column_header
+             -table_get_n_selected_rows
+             -table_get_selected_rows
+             -table_get_selected_columns
+             -table_get_n_selected_columns
+             -table_is_row_selected
+             -table_is_column_selected
+             -table_add_row_selection
+             -table_add_column_selection
+             -table_remove_row_selection
+             -table_remove_column_selection
+             -table_get_row_column_extents_at_index
+             -table_is_selected
+- Table Cell
+             -table_cell_get_column_span
+             -table_cell_get_column_header_cells
+             -table_cell_get_column_index
+             -table_cell_get_row_span
+             -table_cell_get_row_header_cells
+             -table_cell_get_row_column_span
+             -table_cell_get_table
+- Text:
+             -text_get_character_count
+             -text_get_text
+             -text_get_caret_offset
+             -text_get_text_attributes
+             -text_get_attribute_run
+             -text_get_get_text_attribute_value
+             -text_get_default_attributes
+             -text_set_caret_offset
+             -text_get_string_at_offset
+             -text_get_character_at_offset
+             -text_get_character_extents
+             -text_get_offset_at_point
+             -text_get_range_extents
+             -text_get_bounded_ranges
+             -text_get_n_selections
+             -text_get_selection
+             -text_add_selection
+             -text_remove_selection
+             -text_set_selection
+- Value
+             -value_get_minimum_value
+             -value_get_current_value
+             -value_get_maximum_value
+             -value_set_current_value
+             -value_get_minimum_increment
diff --git a/tests/at-spi2-atk/atk-object-xml-loader.c b/tests/at-spi2-atk/atk-object-xml-loader.c
new file mode 100644 (file)
index 0000000..ecd750f
--- /dev/null
@@ -0,0 +1,416 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <glib.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "my-atk.h"
+
+#define ACCESSIBLE_NODE ((const xmlChar *) "accessible")
+#define ACC_ACTION_NODE ((const xmlChar *) "accessible_action")
+#define ACC_COMPONENT_NODE ((const xmlChar *) "accessible_component")
+#define ACC_DOCUMENT_NODE ((const xmlChar *) "accessible_document")
+#define ACC_HYPERLINK_NODE ((const xmlChar *) "accessible_hyperlink")
+#define ACC_HYPERTEXT_NODE ((const xmlChar *) "accessible_hypertext")
+#define ACC_IMAGE_NODE ((const xmlChar *) "accessible_image")
+#define ACC_TABLE_NODE ((const xmlChar *) "accessible_table")
+#define ACC_TABLE_CELL_NODE ((const xmlChar *) "accessible_table_cell")
+#define ACC_EDIT_TEXT_NODE ((const xmlChar *) "accessible_editable_text")
+#define ACC_TEXT_NODE ((const xmlChar *) "accessible_text")
+#define ACC_SELECTION_NODE ((const xmlChar *) "accessible_selection")
+#define ACC_VALUE_NODE ((const xmlChar *) "accessible_value")
+#define ACTION_NODE ((const xmlChar *) "action")
+#define DOCUMENT_NODE ((const xmlChar *) "document")
+#define INTERFACE_NODE ((const xmlChar *) "interface")
+#define RELATION_NODE ((const xmlChar *) "relation")
+#define STATE_NODE ((const xmlChar *) "state")
+#define COMPONENT_NODE ((const xmlChar *) "component")
+#define HYPERLINK_NODE ((const xmlChar *) "hyperlink")
+#define HYPERTEXT_NODE ((const xmlChar *) "hypertext")
+#define IMAGE_NODE ((const xmlChar *) "image")
+#define TABLE_NODE ((const xmlChar *) "table")
+#define TABLE_CELL_NODE ((const xmlChar *) "table_cell")
+#define TEXT_NODE ((const xmlChar *) "text_node")
+#define VALUE_NODE ((const xmlChar *) "value_node")
+#define SELECT_NODE ((const xmlChar *) "select_node")
+
+#define NAME_ATTR ((const xmlChar *) "name")
+#define DESC_ATTR ((const xmlChar *) "description")
+#define ROLE_ATTR ((const xmlChar *) "role")
+#define HELP_TEXT_ATTR ((const xmlChar *) "help_text")
+#define MIN_ATTR ((const xmlChar *) "min")
+#define MAX_ATTR ((const xmlChar *) "max")
+#define CURRENT_ATTR ((const xmlChar *) "current")
+#define STEP_ATTR ((const xmlChar *) "step")
+#define COL_HEADER_ATTR ((const xmlChar *) "col_header")
+#define ROW_HEADER_ATTR ((const xmlChar *) "row_header")
+#define COL_DESC_ATTR ((const xmlChar *) "col_desc")
+#define ROW_DESC_ATTR ((const xmlChar *) "row_desc")
+#define SELECTED_ATTR ((const xmlChar *) "selected")
+#define SELECTED_COL_ATTR ((const xmlChar *) "selected_col")
+#define RELATION_TYPE_ATTR ((const xmlChar *) "relation_type")
+#define RELATION_TARGET_NAME_ATTR ((const xmlChar *) "target_name")
+#define STATE_TYPE_ATTR ((const xmlChar *) "state_enum")
+#define ACTION_NAME_ATTR ((const xmlChar *) "action_name")
+#define ACTION_DES_ATTR ((const xmlChar *) "action_description")
+#define ACTION_KEY_BIND_ATTR ((const xmlChar *) "key_binding")
+#define COMP_X_ATTR ((const xmlChar *) "x")
+#define COMP_Y_ATTR ((const xmlChar *) "y")
+#define COMP_WIDTH_ATTR ((const xmlChar *) "width")
+#define COMP_HEIGHT_ATTR ((const xmlChar *) "height")
+#define COMP_LAYER_ATTR ((const xmlChar *) "layer")
+#define COMP_ZORDER_ATTR ((const xmlChar *) "zorder")
+#define COMP_ALPHA_ATTR ((const xmlChar *) "alpha")
+#define IMAGE_DES_ATTR ((const xmlChar *) "image_description")
+#define IMAGE_LOCALE_ATTR ((const xmlChar *) "image_locale")
+#define TEXT_TEXT_ATTR ((const xmlChar *) "text")
+#define TEXT_BOLD_ATTR ((const xmlChar *) "bold_text")
+#define TEXT_UNDERLINE_ATTR ((const xmlChar *) "underline_text")
+#define TEXT_DUMMY_ATTR ((const xmlChar *) "dummy_text")
+#define START_ATTR ((const xmlChar *) "start")
+#define END_ATTR ((const xmlChar *) "end")
+#define LINK_ATTR ((const xmlChar *) "link")
+#define CELL_X_ATTR ((const xmlChar *) "cell_x")
+#define CELL_Y_ATTR ((const xmlChar *) "cell_y")
+#define ROW_SPAN_ATTR ((const xmlChar *) "row_span")
+#define COLUMN_SPAN_ATTR ((const xmlChar *) "column_span")
+#define SELECT_ATTR ((const xmlChar *) "selected")
+#define PAGE_ATTR ((const xmlChar *) "page_no")
+#define PAGE_NUM_ATTR ((const xmlChar *) "page_number")
+
+MyAtkObject *relation_target = NULL;
+
+static double
+atof_get_prop (xmlNode *node, const xmlChar *attr)
+{
+  double ret;
+  xmlChar *str = xmlGetProp (node, attr);
+  if (!str)
+    return 0;
+  ret = atof ((const char *) str);
+  xmlFree (str);
+
+  return ret;
+}
+
+static int
+atoi_get_prop (xmlNode *node, const xmlChar *attr)
+{
+  int ret;
+  xmlChar *str = xmlGetProp (node, attr);
+  if (!str)
+    return 0;
+  ret = atoi ((const char *) str);
+  xmlFree (str);
+
+  return ret;
+}
+
+static AtkAttribute *
+get_atk_attribute (xmlNode *node, const xmlChar *attr)
+{
+  xmlChar *str;
+  AtkAttribute *tmp = g_malloc (sizeof (AtkAttribute));
+
+  if (!tmp)
+    return NULL;
+
+  str = xmlGetProp (node, attr);
+  tmp->name = g_strdup ((const char *) attr);
+  tmp->value = g_strdup ((const char *) str);
+
+  xmlFree (str);
+  return tmp;
+}
+
+static gpointer
+create_atk_object_from_element (xmlNode *element)
+{
+  xmlNode *child_node;
+  xmlNode *child_node2;
+
+  gpointer obj;
+  gpointer child_obj = NULL;
+  AtkRelationSet *relation_set = NULL;
+  AtkObject *array[1];
+  AtkRelation *relation;
+  AtkStateSet *state_set = NULL;
+  AtkStateType state_type;
+
+  xmlChar *name;
+  xmlChar *description;
+  xmlChar *role;
+  xmlChar *help_text;
+  gint relation_type;
+  gint x_size, y_size;
+  gint width, height;
+  gint x_extent, y_extent, w_extent, h_extent;
+  name = xmlGetProp (element, NAME_ATTR);
+  description = xmlGetProp (element, DESC_ATTR);
+  role = xmlGetProp (element, ROLE_ATTR);
+  help_text = xmlGetProp (element, HELP_TEXT_ATTR);
+  GType type = MY_TYPE_ATK_OBJECT;
+  gint layer;
+  gint zorder;
+  gdouble alpha;
+
+  if (!xmlStrcmp (element->name, ACCESSIBLE_NODE))
+    type = MY_TYPE_ATK_OBJECT;
+
+  if (!xmlStrcmp (element->name, ACC_ACTION_NODE))
+    type = MY_TYPE_ATK_ACTION;
+
+  if (!xmlStrcmp (element->name, ACC_COMPONENT_NODE))
+    type = MY_TYPE_ATK_COMPONENT;
+
+  if (!xmlStrcmp (element->name, ACC_DOCUMENT_NODE))
+    type = MY_TYPE_ATK_DOCUMENT;
+
+  if (!xmlStrcmp (element->name, ACC_EDIT_TEXT_NODE))
+    type = MY_TYPE_ATK_EDITABLE_TEXT;
+
+  if (!xmlStrcmp (element->name, ACC_HYPERLINK_NODE))
+    type = MY_TYPE_ATK_HYPERTEXT;
+
+  if (!xmlStrcmp (element->name, ACC_HYPERTEXT_NODE))
+    type = MY_TYPE_ATK_HYPERTEXT;
+
+  if (!xmlStrcmp (element->name, ACC_IMAGE_NODE))
+    type = MY_TYPE_ATK_IMAGE;
+
+  if (!xmlStrcmp (element->name, ACC_SELECTION_NODE))
+    type = MY_TYPE_ATK_SELECTION;
+
+  if (!xmlStrcmp (element->name, ACC_TEXT_NODE))
+    type = MY_TYPE_ATK_TEXT;
+
+  if (!xmlStrcmp (element->name, ACC_TABLE_NODE))
+    type = MY_TYPE_ATK_TABLE;
+
+  if (!xmlStrcmp (element->name, ACC_TABLE_CELL_NODE))
+    type = MY_TYPE_ATK_TABLE_CELL;
+
+  if (!xmlStrcmp (element->name, ACC_VALUE_NODE))
+    type = MY_TYPE_ATK_VALUE;
+
+  obj = g_object_new (type,
+                      "accessible-name", name,
+                      "accessible-description", description,
+                      "accessible-role", atk_role_for_name ((const gchar *) role),
+                      "accessible-help-text", help_text,
+                      NULL);
+  xmlFree (name);
+  xmlFree (description);
+  xmlFree (role);
+
+  name = NULL;
+  description = NULL;
+  role = NULL;
+
+  child_node = element->xmlChildrenNode;
+  while (child_node != NULL)
+    {
+      if (!xmlStrcmp (child_node->name, ACCESSIBLE_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_ACTION_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_COMPONENT_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_DOCUMENT_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_EDIT_TEXT_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_HYPERLINK_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_HYPERTEXT_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_IMAGE_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_SELECTION_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_TABLE_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_TABLE_CELL_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_TEXT_NODE) ||
+          !xmlStrcmp (child_node->name, ACC_VALUE_NODE))
+        {
+          child_obj = create_atk_object_from_element (child_node);
+          my_atk_object_add_child (obj, child_obj);
+        }
+      child_node2 = child_node->xmlChildrenNode;
+      while (child_node2 != NULL)
+        {
+          if (!xmlStrcmp (child_node2->name, RELATION_NODE))
+            {
+              xmlChar *relation_target_name = xmlGetProp (child_node2, RELATION_TARGET_NAME_ATTR);
+              relation_type = atoi_get_prop (child_node2, RELATION_TYPE_ATTR);
+              relation_set = atk_object_ref_relation_set (ATK_OBJECT (child_obj));
+              array[0] = ATK_OBJECT (obj);
+              relation = atk_relation_new (array, 1, relation_type);
+              atk_relation_new (array, 1, relation_type);
+              atk_relation_set_add (relation_set, relation);
+              g_object_unref (relation);
+              g_object_unref (relation_set);
+              xmlFree (relation_target_name);
+            }
+          if (!xmlStrcmp (child_node2->name, STATE_NODE))
+            {
+              xmlChar *state_enum = xmlGetProp (child_node2, STATE_TYPE_ATTR);
+
+              state_set = atk_object_ref_state_set (ATK_OBJECT (child_obj));
+              state_type = atk_state_type_for_name ((const gchar *) state_enum);
+              atk_state_set_add_state (state_set, state_type);
+              g_object_unref (state_set);
+              xmlFree (state_enum);
+            }
+          if (!xmlStrcmp (child_node2->name, ACTION_NODE))
+            {
+              xmlChar *action_name = xmlGetProp (child_node2, ACTION_NAME_ATTR);
+              xmlChar *action_des = xmlGetProp (child_node2, ACTION_DES_ATTR);
+              xmlChar *action_key_bind = xmlGetProp (child_node2, ACTION_KEY_BIND_ATTR);
+
+              my_atk_action_add_action (child_obj, (const gchar *) action_name,
+                                        (const gchar *) action_des,
+                                        (const gchar *) action_key_bind);
+              xmlFree (action_key_bind);
+              xmlFree (action_des);
+              xmlFree (action_name);
+            }
+          if (!xmlStrcmp (child_node2->name, COMPONENT_NODE))
+            {
+              x_extent = atoi_get_prop (child_node2, COMP_X_ATTR);
+              y_extent = atoi_get_prop (child_node2, COMP_Y_ATTR);
+              w_extent = atoi_get_prop (child_node2, COMP_WIDTH_ATTR);
+              h_extent = atoi_get_prop (child_node2, COMP_HEIGHT_ATTR);
+              layer = atoi_get_prop (child_node2, COMP_LAYER_ATTR);
+              zorder = atoi_get_prop (child_node2, COMP_ZORDER_ATTR);
+              alpha = atof_get_prop (child_node2, COMP_ALPHA_ATTR);
+              atk_component_set_extents (ATK_COMPONENT (child_obj),
+                                         x_extent,
+                                         y_extent,
+                                         w_extent,
+                                         h_extent,
+                                         ATK_XY_SCREEN);
+              my_atk_component_set_layer (ATK_COMPONENT (child_obj), layer);
+              my_atk_component_set_mdi_zorder (ATK_COMPONENT (child_obj), zorder);
+              my_atk_component_set_alpha (ATK_COMPONENT (child_obj), alpha);
+            }
+          if (!xmlStrcmp (child_node2->name, DOCUMENT_NODE))
+            {
+              my_atk_set_document (ATK_DOCUMENT (child_obj),
+                                   atoi_get_prop (child_node2, PAGE_ATTR),
+                                   atoi_get_prop (child_node2, PAGE_NUM_ATTR));
+            }
+          if (!xmlStrcmp (child_node2->name, HYPERLINK_NODE))
+            {
+              xmlChar *text = xmlGetProp (child_node2, TEXT_TEXT_ATTR);
+
+              my_atk_set_hypertext (ATK_HYPERTEXT (child_obj), (const gchar *) text);
+              xmlFree (text);
+            }
+          if (!xmlStrcmp (child_node2->name, HYPERTEXT_NODE))
+            {
+              xmlChar *text = xmlGetProp (child_node2, TEXT_TEXT_ATTR);
+
+              my_atk_set_hypertext (ATK_HYPERTEXT (child_obj), (const gchar *) text);
+              xmlFree (text);
+            }
+          if (!xmlStrcmp (child_node2->name, IMAGE_NODE))
+            {
+              xmlChar *image_des = xmlGetProp (child_node2, IMAGE_DES_ATTR);
+              xmlChar *image_locale = xmlGetProp (child_node2, IMAGE_LOCALE_ATTR);
+              x_size = atoi_get_prop (child_node2, COMP_X_ATTR);
+              y_size = atoi_get_prop (child_node2, COMP_Y_ATTR);
+              width = atoi_get_prop (child_node2, COMP_WIDTH_ATTR);
+              height = atoi_get_prop (child_node2, COMP_HEIGHT_ATTR);
+
+              my_atk_set_image (ATK_IMAGE (child_obj),
+                                (const gchar *) image_des,
+                                x_size,
+                                y_size,
+                                width,
+                                height,
+                                (const gchar *) image_locale);
+              xmlFree (image_locale);
+              xmlFree (image_des);
+            }
+          if (!xmlStrcmp (child_node2->name, TEXT_NODE))
+            {
+              xmlChar *text = xmlGetProp (child_node2, TEXT_TEXT_ATTR);
+              AtkAttributeSet *attrSet = NULL;
+              AtkAttribute *a1 = get_atk_attribute (child_node2, TEXT_BOLD_ATTR);
+              AtkAttribute *a2 = get_atk_attribute (child_node2, TEXT_UNDERLINE_ATTR);
+              AtkAttribute *a3 = get_atk_attribute (child_node2, TEXT_DUMMY_ATTR);
+              attrSet = g_slist_append (NULL, a1);
+              attrSet = g_slist_append (attrSet, a2);
+              attrSet = g_slist_append (attrSet, a3);
+              my_atk_set_text (ATK_TEXT (child_obj),
+                               (const gchar *) text,
+                               atoi_get_prop (child_node2, COMP_X_ATTR),
+                               atoi_get_prop (child_node2, COMP_Y_ATTR),
+                               atoi_get_prop (child_node2, COMP_WIDTH_ATTR),
+                               atoi_get_prop (child_node2, COMP_HEIGHT_ATTR),
+                               attrSet);
+              xmlFree (text);
+            }
+          if (!xmlStrcmp (child_node2->name, TABLE_CELL_NODE))
+            {
+              my_atk_set_table_cell (ATK_TABLE_CELL (child_obj),
+                                     atoi_get_prop (child_node2, CELL_X_ATTR),
+                                     atoi_get_prop (child_node2, CELL_Y_ATTR),
+                                     atoi_get_prop (child_node2, ROW_SPAN_ATTR),
+                                     atoi_get_prop (child_node2, COLUMN_SPAN_ATTR));
+            }
+          if (!xmlStrcmp (child_node2->name, VALUE_NODE))
+            {
+              my_atk_set_value (ATK_VALUE (child_obj),
+                                atof_get_prop (child_node2, MIN_ATTR),
+                                atof_get_prop (child_node2, CURRENT_ATTR),
+                                atof_get_prop (child_node2, MAX_ATTR),
+                                atof_get_prop (child_node2, STEP_ATTR));
+            }
+          child_node2 = child_node2->next;
+        }
+      child_node = child_node->next;
+    }
+  return obj;
+}
+
+/*
+ * Reads the XML from filename and uses it
+ * to create a tree of MyAtkObjects.
+ *
+ * returns: The root object of the tree.
+ */
+MyAtkObject *
+atk_object_xml_parse (gchar *filename)
+{
+  xmlDoc *doc;
+  xmlNode *root_element;
+  MyAtkObject *new_atk_object = NULL;
+
+  doc = xmlReadFile (filename, NULL, 0);
+  g_assert (doc != NULL);
+
+  root_element = xmlDocGetRootElement (doc);
+
+  if (!root_element)
+    return NULL;
+
+  new_atk_object = create_atk_object_from_element (root_element);
+
+  xmlFreeDoc (doc);
+  return new_atk_object;
+}
diff --git a/tests/at-spi2-atk/atk-object-xml-loader.h b/tests/at-spi2-atk/atk-object-xml-loader.h
new file mode 100644 (file)
index 0000000..b6d04ca
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 ATK_OBJECT_XML_LOADER_H
+#define ATK_OBJECT_XML_LOADER_H
+
+#include "my-atk.h"
+#include <glib.h>
+
+MyAtkObject *atk_object_xml_parse (gchar *filename);
+
+#endif /*ATK_OBJECT_XML_LOADER_H*/
diff --git a/tests/at-spi2-atk/atk_suite.c b/tests/at-spi2-atk/atk_suite.c
new file mode 100644 (file)
index 0000000..271f451
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+static void
+atk_suite_build (void)
+{
+  atk_test_accessible ();
+  atk_test_action ();
+  atk_test_component ();
+  atk_test_collection ();
+  atk_test_document ();
+
+  atk_test_editable_text ();
+  atk_test_hyperlink ();
+  atk_test_hypertext ();
+  atk_test_image ();
+  atk_test_selection ();
+  atk_test_state_set ();
+  atk_test_table ();
+  atk_test_table_cell ();
+  atk_test_text ();
+  atk_test_value ();
+}
+
+int
+main (int argc, char **argv)
+{
+  int init_result;
+
+  g_test_init (&argc, &argv, NULL);
+
+  setlocale (LC_ALL, "");
+  init_result = atspi_init ();
+  if (init_result != 0)
+    {
+      g_error ("Could not initialize atspi, code %d", init_result);
+    }
+
+  fixture_listener_init ();
+
+  atk_suite_build ();
+
+  int result = g_test_run ();
+  g_assert_cmpint (result, ==, 0);
+
+  int leaked = atspi_exit ();
+  g_assert_cmpint (leaked, ==, 0);
+
+  return 0;
+}
diff --git a/tests/at-spi2-atk/atk_suite.h b/tests/at-spi2-atk/atk_suite.h
new file mode 100644 (file)
index 0000000..abcfce4
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _ATK_SUITE_H
+#define _ATK_SUITE_H
+
+#include <atspi/atspi.h>
+
+void atk_test_accessible (void);
+void atk_test_action (void);
+void atk_test_component (void);
+void atk_test_collection (void);
+void atk_test_document (void);
+void atk_test_editable_text (void);
+void atk_test_hyperlink (void);
+void atk_test_hypertext (void);
+void atk_test_image (void);
+void atk_test_selection (void);
+void atk_test_state_set (void);
+void atk_test_table (void);
+void atk_test_table_cell (void);
+void atk_test_text (void);
+void atk_test_value (void);
+
+#endif /* _ATK_SUITE_H */
diff --git a/tests/at-spi2-atk/atk_test_accessible.c b/tests/at-spi2-atk/atk_test_accessible.c
new file mode 100644 (file)
index 0000000..471b33b
--- /dev/null
@@ -0,0 +1,502 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#include <libintl.h>
+#define _(x) dgettext ("at-spi2-core", x)
+
+#define DATA_FILE TESTS_DATA_DIR "/test-accessible.xml"
+
+static void
+atk_test_accessible_get_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+}
+
+static void
+atk_test_accessible_get_description (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *str = atspi_accessible_get_description (obj, NULL);
+  g_assert_cmpstr (str, ==, "Root of the accessible tree");
+  g_free (str);
+}
+
+static void
+atk_test_accessible_get_child_count (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gint child_c = atspi_accessible_get_child_count (obj, NULL);
+  g_assert_cmpint (3, ==, child_c);
+}
+
+static void
+atk_test_accessible_get_parent (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiAccessible *parent = atspi_accessible_get_parent (child, NULL);
+  g_assert (parent == obj);
+  g_object_unref (parent);
+  g_object_unref (child);
+}
+
+static void
+atk_test_accessible_get_child_at_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  check_name (child, "obj2");
+  g_object_unref (child);
+}
+
+static void
+atk_test_accessible_get_index_in_parent (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 2, NULL);
+  int index = atspi_accessible_get_index_in_parent (child, NULL);
+  g_assert_cmpint (index, ==, 2);
+  g_object_unref (child);
+}
+
+static void
+atk_test_accessible_get_relation_set_1 (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child1 = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (child1, 0, NULL);
+  GArray *rel_set = atspi_accessible_get_relation_set (child, NULL);
+  g_assert_cmpint (rel_set->len, ==, 1);
+  g_object_unref (g_array_index (rel_set, AtspiRelation *, 0));
+  g_array_free (rel_set, TRUE);
+  g_object_unref (child);
+  g_object_unref (child1);
+}
+
+static void
+atk_test_accessible_get_relation_set_2 (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *obj2 = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAccessible *obj2_1 = atspi_accessible_get_child_at_index (obj2, 0, NULL);
+  GArray *rel_set = atspi_accessible_get_relation_set (obj2_1, NULL);
+  int i = 0;
+  for (i = 0; i < rel_set->len; i++)
+    {
+      AtspiRelation *a = g_array_index (rel_set, AtspiRelation *, i);
+      g_assert_cmpint (atspi_relation_get_relation_type (a), ==, ATSPI_RELATION_CONTROLLER_FOR);
+      g_assert_cmpint (atspi_relation_get_n_targets (a), ==, 1);
+      AtspiAccessible *target = atspi_relation_get_target (a, 0);
+      check_name (target, "obj2");
+      g_object_unref (target);
+      g_object_unref (a);
+    }
+  g_array_free (rel_set, TRUE);
+  g_object_unref (obj2_1);
+  g_object_unref (obj2);
+}
+
+static void
+atk_test_accessible_get_role (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiRole root_role = atspi_accessible_get_role (obj, NULL);
+  g_assert_cmpint (root_role, ==, ATSPI_ROLE_ACCELERATOR_LABEL);
+}
+
+static void
+atk_test_accessible_get_role_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *root_role_name = atspi_accessible_get_role_name (obj, NULL);
+  g_assert_cmpstr (root_role_name, ==, "accelerator label");
+  g_free (root_role_name);
+}
+
+static void
+atk_test_accessible_get_localized_role_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *root_role_name = atspi_accessible_get_localized_role_name (obj, NULL);
+  g_assert_cmpstr (root_role_name, ==, _ ("accelerator label"));
+  g_free (root_role_name);
+}
+
+static void
+atk_test_accessible_get_state_set (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = atspi_state_set_get_states (states);
+
+  AtspiStateType valid_states[] = {
+    ATSPI_STATE_MODAL,
+    ATSPI_STATE_MULTI_LINE,
+  };
+  g_assert_cmpint (states_arr->len, ==, 2);
+  int i = 0;
+  for (i = 0; i < states_arr->len; ++i)
+    {
+      g_assert_cmpint (valid_states[i], ==, g_array_index (states_arr, AtspiStateType, i));
+      g_assert (atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+      g_assert (atspi_state_set_contains (states, ATSPI_STATE_MULTI_LINE));
+    }
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_accessible_get_attributes (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  GHashTable *attr_hash_tab = atspi_accessible_get_attributes (obj, NULL);
+  GHashTableIter iter;
+  gpointer key, value;
+
+  g_hash_table_iter_init (&iter, attr_hash_tab);
+
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    {
+      const char *key_str = key;
+      const char *value_str = value;
+
+      if (strcmp (key_str, "atspi1") == 0)
+        {
+          g_assert_cmpstr (value_str, ==, "test1");
+        }
+      else if (strcmp (key_str, "atspi2") == 0)
+        {
+          g_assert_cmpstr (value_str, ==, "test2");
+        }
+      else
+        {
+          g_assert_not_reached ();
+        }
+    }
+  g_hash_table_unref (attr_hash_tab);
+}
+
+static void
+atk_test_accessible_get_attributes_as_array (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  GArray *attr_arr = atspi_accessible_get_attributes_as_array (obj, NULL);
+  int i;
+  g_assert_cmpint (attr_arr->len, ==, 2);
+  for (i = 0; i < attr_arr->len; ++i)
+    {
+      char *pair = g_array_index (attr_arr, gchar *, i);
+
+      g_assert (strcmp (pair, "atspi1:test1") == 0 || strcmp (pair, "atspi2:test2") == 0);
+      g_free (pair);
+    }
+  g_array_free (attr_arr, TRUE);
+}
+
+static void
+atk_test_accessible_get_toolkit_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *toolkit_name = atspi_accessible_get_toolkit_name (obj, NULL);
+
+  g_assert_cmpstr (toolkit_name, ==, "atspitesting-toolkit");
+  g_free (toolkit_name);
+}
+
+static void
+atk_test_accessible_get_toolkit_version (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *toolkit_ver = atspi_accessible_get_toolkit_version (obj, NULL);
+  /* should be empty string, because no value is setted */
+  g_assert_cmpstr (toolkit_ver, ==, "");
+  g_free (toolkit_ver);
+}
+
+static void
+atk_test_accessible_get_atspi_version (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *atspi_version = atspi_accessible_get_atspi_version (obj, NULL);
+  g_assert_cmpstr (atspi_version, ==, "2.1");
+  g_free (atspi_version);
+}
+
+static void
+atk_test_accessible_get_id (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gint app_id = atspi_accessible_get_id (obj, NULL);
+  g_assert_cmpint (app_id, !=, -1);
+}
+
+static void
+atk_test_accessible_get_application (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *app = atspi_accessible_get_application (obj, NULL);
+  g_assert (app != NULL);
+  g_object_unref (app);
+}
+
+static void
+atk_test_accessible_get_action_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAction *iface = atspi_accessible_get_action_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_collection_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiCollection *iface = atspi_accessible_get_collection_iface (obj);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+}
+
+static void
+atk_test_accessible_get_component_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiComponent *iface = atspi_accessible_get_component_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_document_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiDocument *iface = atspi_accessible_get_document_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_editable_text_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_hypertext_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiHypertext *iface = atspi_accessible_get_hypertext_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_image_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiImage *iface = atspi_accessible_get_image_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_selection_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_table_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiTable *iface = atspi_accessible_get_table_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_text_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiText *iface = atspi_accessible_get_text_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_value_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiValue *iface = atspi_accessible_get_value_iface (obj);
+  g_assert (iface == NULL);
+}
+
+static void
+atk_test_accessible_get_interfaces (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  gchar *valid_obj_ifaces[] = { "Accessible", "Collection" };
+
+  GArray *ifaces = atspi_accessible_get_interfaces (obj);
+  g_assert (ifaces->len == 2);
+  int i = 0;
+  for (i = 0; i < ifaces->len; ++i)
+    {
+      g_assert_cmpstr (valid_obj_ifaces[i], ==, g_array_index (ifaces, gchar *, i));
+      g_free (g_array_index (ifaces, gchar *, i));
+    }
+  g_array_free (ifaces, TRUE);
+}
+
+static void
+atk_test_accessible_get_object_locale (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  const gchar *obj_locale = atspi_accessible_get_object_locale (obj, NULL);
+  g_assert_cmpstr (obj_locale, ==, setlocale (LC_MESSAGES, NULL));
+}
+
+static void
+atk_test_accessible_set_cache_mask (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiCache cache_mask = ATSPI_CACHE_ROLE;
+  atspi_accessible_set_cache_mask (obj, cache_mask);
+  g_assert_cmpint (obj->parent.app->cache, ==, cache_mask);
+}
+
+static void
+atk_test_check_cache_cleared (AtspiAccessible *obj)
+{
+  g_assert_cmpint (obj->cached_properties, ==, ATSPI_CACHE_NONE);
+  GPtrArray *array = obj->children;
+  int i;
+  for (i = 0; i < array->len; i++)
+    atk_test_check_cache_cleared (g_ptr_array_index (array, i));
+}
+
+static void
+atk_test_accessible_clear_cache (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  atspi_accessible_clear_cache (obj);
+  atk_test_check_cache_cleared (obj);
+}
+
+static void
+atk_test_accessible_get_process_id (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  guint proc_id = atspi_accessible_get_process_id (obj, NULL);
+  g_assert_cmpint (proc_id, ==, fixture->child_pid);
+}
+
+static void
+atk_test_accessible_get_help_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child1 = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  gchar *str = atspi_accessible_get_help_text (child1, NULL);
+  g_assert_cmpstr (str, ==, "test dialog");
+  g_free (str);
+  g_object_unref (child1);
+}
+
+void
+atk_test_accessible (void)
+{
+  g_test_add ("/accessible/atk_test_accessible_get_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_name, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_description",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_description, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_child_count",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_child_count, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_parent",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_parent, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_child_at_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_child_at_index, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_index_in_parent",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_index_in_parent, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_relation_set_1",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_relation_set_1, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_relation_set_2",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_relation_set_2, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_role",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_role, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_role_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_role_name, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_localized_role_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_localized_role_name, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_state_set",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_state_set, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_attributes",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_attributes, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_attributes_as_array",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_attributes_as_array, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_toolkit_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_toolkit_name, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_toolkit_version",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_toolkit_version, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_atspi_version",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_atspi_version, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_id",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_id, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_application",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_application, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_action_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_action_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_collection_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_collection_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_component_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_component_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_document_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_document_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_editable_text_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_editable_text_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_hypertext_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_hypertext_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_image_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_image_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_selection_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_selection_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_table_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_table_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_text_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_text_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_value_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_value_iface, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_interfaces",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_interfaces, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_object_locale",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_object_locale, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_set_cache_mask",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_set_cache_mask, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_clear_cache",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_clear_cache, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_process_id",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_process_id, fixture_teardown);
+  g_test_add ("/accessible/atk_test_accessible_get_help_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_help_text, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_action.c b/tests/at-spi2-atk/atk_test_action.c
new file mode 100644 (file)
index 0000000..05f5e97
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-action.xml"
+
+static void
+atk_test_action_sample_get_interface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *iface = atspi_accessible_get_action_iface (child);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_action_get_action_description (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *action = atspi_accessible_get_action_iface (child);
+  gchar *str = atspi_action_get_action_description (action, 0, NULL);
+  g_assert_cmpstr (str, ==, "action1 description");
+  g_free (str);
+  g_object_unref (action);
+  g_object_unref (child);
+}
+
+static void
+atk_test_action_get_action_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *action = atspi_accessible_get_action_iface (child);
+  gchar *str = atspi_action_get_action_name (action, 0, NULL);
+  g_assert_cmpstr (str, ==, "action1");
+  g_free (str);
+  g_object_unref (action);
+  g_object_unref (child);
+}
+
+static void
+atk_test_action_get_n_actions (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *action = atspi_accessible_get_action_iface (child);
+  g_assert_cmpint (atspi_action_get_n_actions (action, NULL), ==, 2);
+  g_object_unref (action);
+  g_object_unref (child);
+}
+
+static void
+atk_test_action_get_key_binding (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *action = atspi_accessible_get_action_iface (child);
+  gchar *str = atspi_action_get_key_binding (action, 0, NULL);
+  g_assert_cmpstr (str, ==, "action1 key binding");
+  g_free (str);
+  g_object_unref (action);
+  g_object_unref (child);
+}
+
+static void
+atk_test_action_get_localized_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *action = atspi_accessible_get_action_iface (child);
+  gchar *str = atspi_action_get_localized_name (action, 0, NULL);
+  g_assert_cmpstr (str, ==, "action1");
+  g_free (str);
+  g_object_unref (action);
+  g_object_unref (child);
+}
+
+static void
+atk_test_action_do_action (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiAction *action = atspi_accessible_get_action_iface (child);
+  g_assert (action != NULL);
+  atspi_action_do_action (action, 0, NULL);
+  atspi_accessible_clear_cache (obj);
+  AtspiStateSet *s = atspi_accessible_get_state_set (child);
+  GArray *array = atspi_state_set_get_states (s);
+  g_assert_cmpint (array->len, ==, 1);
+  g_array_free (array, TRUE);
+  g_object_unref (s);
+  g_object_unref (action);
+  g_object_unref (child);
+}
+
+void
+atk_test_action (void)
+{
+  g_test_add ("/action/atk_test_action_sample_get_interface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_sample_get_interface, fixture_teardown);
+  g_test_add ("/action/atk_test_action_get_action_description",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_get_action_description, fixture_teardown);
+  g_test_add ("/action/atk_test_action_get_action_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_get_action_name, fixture_teardown);
+  g_test_add ("/action/atk_test_action_get_n_actions",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_get_n_actions, fixture_teardown);
+  g_test_add ("/action/atk_test_action_get_key_binding",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_get_key_binding, fixture_teardown);
+  g_test_add ("/action/atk_test_action_get_localized_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_get_localized_name, fixture_teardown);
+  g_test_add ("/action/atk_test_action_do_action",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_action_do_action, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_collection.c b/tests/at-spi2-atk/atk_test_collection.c
new file mode 100644 (file)
index 0000000..7ec31f2
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-collection.xml"
+
+static void
+atk_test_collection_get_collection_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiCollection *iface = atspi_accessible_get_collection_iface (obj);
+  g_assert (iface);
+  g_object_unref (iface);
+}
+
+static void
+check_and_unref (GArray *array, gint index, const char *expected_name)
+{
+  AtspiAccessible *accessible = g_array_index (array, AtspiAccessible *, index);
+  check_name (accessible, expected_name);
+  g_object_unref (accessible);
+}
+
+static void
+atk_test_collection_get_matches (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiCollection *iface = atspi_accessible_get_collection_iface (obj);
+  g_assert (iface);
+
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+
+  AtspiMatchRule *rule = NULL;
+  AtspiStateSet *ss = atspi_accessible_get_state_set (child);
+
+  rule = atspi_match_rule_new (ss,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               FALSE);
+  g_object_unref (ss);
+  GArray *ret = atspi_collection_get_matches (iface,
+                                              rule,
+                                              ATSPI_Collection_SORT_ORDER_CANONICAL,
+                                              0,
+                                              FALSE,
+                                              NULL);
+  g_assert_cmpint (2, ==, ret->len);
+
+  check_and_unref (ret, 0, "obj1");
+  check_and_unref (ret, 1, "obj3");
+  g_array_free (ret, TRUE);
+  g_object_unref (rule);
+  g_object_unref (child);
+  g_object_unref (iface);
+}
+
+static void
+atk_test_collection_get_matches_to (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiCollection *iface = atspi_accessible_get_collection_iface (obj);
+  g_assert (iface);
+
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiAccessible *child1 = atspi_accessible_get_child_at_index (obj, 1, NULL);
+
+  AtspiMatchRule *rule = NULL;
+  AtspiStateSet *ss = atspi_accessible_get_state_set (child);
+
+  rule = atspi_match_rule_new (ss,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               FALSE);
+  g_object_unref (ss);
+  GArray *ret = atspi_collection_get_matches_to (iface,
+                                                 child1,
+                                                 rule,
+                                                 ATSPI_Collection_SORT_ORDER_CANONICAL,
+                                                 ATSPI_Collection_TREE_INORDER,
+                                                 TRUE,
+                                                 0,
+                                                 FALSE,
+                                                 NULL);
+  g_assert_cmpint (1, ==, ret->len);
+  check_and_unref (ret, 0, "obj1");
+  g_array_free (ret, TRUE);
+  g_object_unref (rule);
+  g_object_unref (child1);
+  g_object_unref (child);
+  g_object_unref (iface);
+}
+
+static void
+atk_test_collection_get_matches_from (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiCollection *iface = atspi_accessible_get_collection_iface (obj);
+  GHashTable *attributes;
+  g_assert (iface);
+
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiAccessible *child1 = atspi_accessible_get_child_at_index (obj, 1, NULL);
+
+  AtspiMatchRule *rule = NULL;
+  AtspiStateSet *ss = atspi_accessible_get_state_set (child);
+
+  rule = atspi_match_rule_new (ss,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               FALSE);
+  GArray *ret = atspi_collection_get_matches_from (iface,
+                                                   child1,
+                                                   rule,
+                                                   ATSPI_Collection_SORT_ORDER_CANONICAL,
+                                                   ATSPI_Collection_TREE_INORDER,
+                                                   0,
+                                                   FALSE,
+                                                   NULL);
+  g_object_unref (ss);
+  g_assert_cmpint (3, ==, ret->len);
+  check_and_unref (ret, 0, "obj2/1");
+  check_and_unref (ret, 1, "obj3");
+  check_and_unref (ret, 2, "obj3");
+  g_array_free (ret, TRUE);
+  g_object_unref (rule);
+
+  attributes = g_hash_table_new (g_str_hash, g_str_equal);
+  g_hash_table_insert (attributes, "layout-guess", "true");
+  rule = atspi_match_rule_new (NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               attributes,
+                               ATSPI_Collection_MATCH_NONE,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               NULL,
+                               ATSPI_Collection_MATCH_ALL,
+                               FALSE);
+  ret = atspi_collection_get_matches_from (iface,
+                                           child1,
+                                           rule,
+                                           ATSPI_Collection_SORT_ORDER_CANONICAL,
+                                           ATSPI_Collection_TREE_INORDER,
+                                           0,
+                                           FALSE,
+                                           NULL);
+  g_hash_table_unref (attributes);
+  g_assert_cmpint (6, ==, ret->len);
+  g_array_free (ret, TRUE);
+  g_object_unref (rule);
+
+  g_object_unref (child1);
+  g_object_unref (child);
+  g_object_unref (iface);
+}
+
+void
+atk_test_collection (void)
+{
+  g_test_add ("/collection/atk_test_collection_get_collection_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_collection_get_collection_iface, fixture_teardown);
+  g_test_add ("/collection/atk_test_collection_get_matches",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_collection_get_matches, fixture_teardown);
+  g_test_add ("/collection/atk_test_collection_get_matches_to",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_collection_get_matches_to, fixture_teardown);
+  g_test_add ("/collection/atk_test_collection_get_matches_from",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_collection_get_matches_from, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_component.c b/tests/at-spi2-atk/atk_test_component.c
new file mode 100644 (file)
index 0000000..80261ae
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-component.xml"
+
+static void
+atk_test_component_sample (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_contains (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  gboolean ret = atspi_component_contains (iface, 400, 300, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert (ret != FALSE);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_get_accessible_at_point (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  AtspiAccessible *r = atspi_component_get_accessible_at_point (iface,
+                                                                400,
+                                                                300,
+                                                                ATSPI_COORD_TYPE_SCREEN,
+                                                                NULL);
+  g_assert (r != NULL);
+  g_object_unref (r);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_get_extents (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  AtspiRect *r = atspi_component_get_extents (iface, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert_cmpint (r->x, ==, 350);
+  g_assert_cmpint (r->y, ==, 200);
+  g_assert_cmpint (r->width, ==, 250);
+  g_assert_cmpint (r->height, ==, 250);
+  g_free (r);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_get_layer (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  AtspiComponentLayer layer = atspi_component_get_layer (iface, NULL);
+  g_assert_cmpint (layer, ==, ATSPI_LAYER_WIDGET);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_get_mdi_z_order (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  gshort ret = atspi_component_get_mdi_z_order (iface, NULL);
+  g_assert_cmpint (ret, ==, 2);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_grab_focus (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  gboolean ret = atspi_component_grab_focus (iface, NULL);
+  g_assert (ret != FALSE);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_get_alpha (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  gdouble ret = atspi_component_get_alpha (iface, NULL);
+  g_assert_cmpfloat (ret, ==, 2.5);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_component_set_extents (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiComponent *iface = atspi_accessible_get_component_iface (child);
+  g_assert (iface != NULL);
+
+  AtspiRect *r = atspi_component_get_extents (iface, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert_cmpint (r->x, ==, 350);
+  g_assert_cmpint (r->y, ==, 200);
+  g_assert_cmpint (r->width, ==, 250);
+  g_assert_cmpint (r->height, ==, 250);
+  g_free (r);
+
+  gboolean ret = atspi_component_set_extents (iface, 100, 100, 100, 100, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert (ret != FALSE);
+
+  r = atspi_component_get_extents (iface, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert_cmpint (r->x, ==, 100);
+  g_assert_cmpint (r->y, ==, 100);
+  g_assert_cmpint (r->width, ==, 100);
+  g_assert_cmpint (r->height, ==, 100);
+  g_free (r);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+void
+atk_test_component (void)
+{
+  g_test_add ("/component/atk_test_component_sample",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_sample, fixture_teardown);
+  g_test_add ("/component/atk_test_component_contains",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_contains, fixture_teardown);
+  g_test_add ("/component/atk_test_component_get_accessible_at_point",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_get_accessible_at_point, fixture_teardown);
+  g_test_add ("/component/atk_test_component_get_extents",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_get_extents, fixture_teardown);
+  g_test_add ("/component/atk_test_component_get_layer",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_get_layer, fixture_teardown);
+  g_test_add ("/component/atk_test_component_get_mdi_z_order",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_get_mdi_z_order, fixture_teardown);
+  g_test_add ("/component/atk_test_component_grab_focus",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_grab_focus, fixture_teardown);
+  g_test_add ("/component/atk_test_component_get_alpha",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_get_alpha, fixture_teardown);
+  g_test_add ("/component/atk_test_component_set_extents",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_component_set_extents, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_document.c b/tests/at-spi2-atk/atk_test_document.c
new file mode 100644 (file)
index 0000000..55492ae
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * AT-SPI - Assistive Service Provider Interface
+ * (Gnome AccessibiliTestAppFixture, DATA_FILE, fixture_setup://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-document.xml"
+
+static void
+atk_test_document_get_document_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiDocument *iface = atspi_accessible_get_document_iface (child);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_document_get_locale (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiDocument *iface = atspi_accessible_get_document_iface (child);
+  g_assert (iface != NULL);
+
+  gchar *str = atspi_document_get_locale (iface, NULL);
+  g_assert_cmpstr (str, ==, "document_locale");
+  g_free (str);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_document_get_attribute_value (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiDocument *iface = atspi_accessible_get_document_iface (child);
+  gchar *str;
+  g_assert (iface != NULL);
+
+  str = atspi_document_get_document_attribute_value (iface, "atspi1", NULL);
+  g_assert_cmpstr (str, ==, "test1");
+  g_free (str);
+  str = atspi_document_get_document_attribute_value (iface, "atspi2", NULL);
+  g_assert_cmpstr (str, ==, "test2");
+  g_free (str);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_document_get_attributes (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiDocument *iface = atspi_accessible_get_document_iface (child);
+  g_assert (iface != NULL);
+
+  GHashTable *attr = atspi_document_get_document_attributes (iface, NULL);
+  GHashTableIter iter;
+  gpointer key, value;
+  g_hash_table_iter_init (&iter, attr);
+
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    {
+      const char *key_str = key;
+      const char *value_str = value;
+
+      if (strcmp (key_str, "atspi1") == 0)
+        {
+          g_assert_cmpstr (value_str, ==, "test1");
+        }
+      else if (strcmp (key_str, "atspi2") == 0)
+        {
+          g_assert_cmpstr (value_str, ==, "test2");
+        }
+      else
+        {
+          g_assert_not_reached ();
+        }
+    }
+  g_hash_table_unref (attr);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_document_text_selections (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiDocument *iface = atspi_accessible_get_document_iface (child);
+  GArray *selections;
+  AtspiTextSelection selection;
+
+  g_assert (iface != NULL);
+
+  selections = atspi_document_get_text_selections (iface, NULL);
+  g_assert_true (selections);
+  g_assert_cmpint (selections->len, ==, 0);
+  g_array_free (selections, TRUE);
+
+  selections = g_array_new (FALSE, TRUE, sizeof (AtspiTextSelection));
+  selection.start_object = obj;
+  selection.start_offset = 0;
+  selection.end_object = obj;
+  selection.end_offset = 2;
+  selection.start_is_active = TRUE;
+  g_array_append_val (selections, selection);
+  selection.start_offset = 3;
+  selection.end_offset = 5;
+  selection.start_is_active = FALSE;
+  g_array_append_val (selections, selection);
+  atspi_document_set_text_selections (iface, selections, NULL);
+  g_array_free (selections, TRUE);
+
+  selections = atspi_document_get_text_selections (iface, NULL);
+  g_assert_true (selections);
+  g_assert_cmpint (selections->len, ==, 2);
+  selection = g_array_index (selections, AtspiTextSelection, 0);
+  g_assert_true (selection.start_object == obj);
+  g_assert_cmpint (selection.start_offset, ==, 0);
+  g_assert_cmpint (selection.end_offset, ==, 2);
+  g_assert_true (selection.start_is_active);
+  selection = g_array_index (selections, AtspiTextSelection, 1);
+  g_assert_true (selection.start_object == obj);
+  g_assert_cmpint (selection.start_offset, ==, 3);
+  g_assert_cmpint (selection.end_offset, ==, 5);
+  g_assert_false (selection.start_is_active);
+  g_array_free (selections, TRUE);
+
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+void
+atk_test_document (void)
+{
+  g_test_add ("/document/atk_test_document_get_document_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_document_get_document_iface, fixture_teardown);
+  g_test_add ("/document/atk_test_document_get_locale",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_document_get_locale, fixture_teardown);
+  g_test_add ("/document/atk_test_document_get_attribute_value",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_document_get_attribute_value, fixture_teardown);
+  g_test_add ("/document/atk_test_document_get_attributes",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_document_get_attributes, fixture_teardown);
+  g_test_add ("/document/atk_test_document_text_selections",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_document_text_selections, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_editable_text.c b/tests/at-spi2-atk/atk_test_editable_text.c
new file mode 100644 (file)
index 0000000..906e313
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-editable-text.xml"
+
+static void
+atk_test_editable_text_get_editable_text_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+#if 0
+/* Function is in docs but not implemented */
+static void
+atk_test_editable_text_set_attributes  (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert (atspi_editable_text_set_attributes (iface, "attribute", 1, 2, NULL));
+}
+#endif
+
+static void
+atk_test_editable_text_insert_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+  g_assert (atspi_editable_text_insert_text (iface, 0, "test_text", 9, NULL));
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_editable_text_copy_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+  g_assert (atspi_editable_text_copy_text (iface, 1, 2, NULL));
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_editable_text_cut_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+  g_assert (atspi_editable_text_cut_text (iface, 1, 2, NULL));
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_editable_text_delete_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert (atspi_editable_text_delete_text (iface, 1, 2, NULL));
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_editable_text_paste_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiEditableText *iface = atspi_accessible_get_editable_text_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert (atspi_editable_text_paste_text (iface, 2, NULL));
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+void
+atk_test_editable_text (void)
+{
+  g_test_add ("/editable_text/atk_test_editable_text_get_editable_text_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_get_editable_text_iface, fixture_teardown);
+#if 0
+  g_test_add ("/editable_text/atk_test_editable_text_set_attributes",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_set_attributes, fixture_teardown);
+#endif
+  g_test_add ("/editable_text/atk_test_editable_text_insert_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_insert_text, fixture_teardown);
+  g_test_add ("/editable_text/atk_test_editable_text_copy_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_copy_text, fixture_teardown);
+  g_test_add ("/editable_text/atk_test_editable_text_cut_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_cut_text, fixture_teardown);
+  g_test_add ("/editable_text/atk_test_editable_text_delete_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_delete_text, fixture_teardown);
+  g_test_add ("/editable_text/atk_test_editable_text_paste_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_editable_text_paste_text, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_hyperlink.c b/tests/at-spi2-atk/atk_test_hyperlink.c
new file mode 100644 (file)
index 0000000..6eeb63f
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-hypertext.xml"
+
+static void
+atk_test_hyperlink_get_n_anchors (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  gint n = atspi_hyperlink_get_n_anchors (obj, NULL);
+  g_assert_cmpint (n, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hyperlink_get_uri (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  gchar *str = atspi_hyperlink_get_uri (obj, 0, NULL);
+  g_assert (str);
+  g_assert_cmpstr (str, ==, "pinkbike.com");
+  g_free (str);
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hyperlink_get_object (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  AtspiAccessible *acc = atspi_hyperlink_get_object (obj, 0, NULL);
+  g_assert (acc);
+  AtspiText *at = atspi_accessible_get_text_iface (acc);
+  g_assert (at);
+  gchar *text = atspi_text_get_text (at, 0, 12, NULL);
+  g_assert_cmpstr (text, ==, "pinkbike.com");
+  g_free (text);
+  g_object_unref (at);
+  g_object_unref (acc);
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hyperlink_get_index_range (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  AtspiRange *range = atspi_hyperlink_get_index_range (obj, NULL);
+  g_assert (range);
+  /*
+    ATK do not define this function
+  */
+  g_assert_cmpint (range->start_offset, ==, -1);
+  g_assert_cmpint (range->end_offset, ==, -1);
+  g_free (range);
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hyperlink_get_start_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  gint n = atspi_hyperlink_get_start_index (obj, NULL);
+  g_assert_cmpint (n, ==, 69);
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hyperlink_get_end_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  gint n = atspi_hyperlink_get_end_index (obj, NULL);
+  g_assert_cmpint (n, ==, 81);
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hyperlink_is_valid (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj1 = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj1);
+  AtspiHyperlink *obj = atspi_hypertext_get_link (obj1, 1, NULL);
+  g_assert (obj);
+  g_assert (atspi_hyperlink_is_valid (obj, NULL));
+  g_object_unref (obj);
+  g_object_unref (obj1);
+  g_object_unref (child);
+}
+
+void
+atk_test_hyperlink (void)
+{
+  g_test_add ("/hyperlink/atk_test_hyperlink_get_n_anchors",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_get_n_anchors, fixture_teardown);
+  g_test_add ("/hyperlink/atk_test_hyperlink_get_uri",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_get_uri, fixture_teardown);
+  g_test_add ("/hyperlink/atk_test_hyperlink_get_object",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_get_object, fixture_teardown);
+  g_test_add ("/hyperlink/atk_test_hyperlink_get_index_range",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_get_index_range, fixture_teardown);
+  g_test_add ("/hyperlink/atk_test_hyperlink_get_start_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_get_start_index, fixture_teardown);
+  g_test_add ("/hyperlink/atk_test_hyperlink_get_end_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_get_end_index, fixture_teardown);
+  g_test_add ("/hyperlink/atk_test_hyperlink_is_valid",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hyperlink_is_valid, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_hypertext.c b/tests/at-spi2-atk/atk_test_hypertext.c
new file mode 100644 (file)
index 0000000..73a74ee
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-hypertext.xml"
+
+static void
+atk_test_hypertext_get_n_links (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj);
+  gint cnt = atspi_hypertext_get_n_links (obj, NULL);
+  g_assert_cmpint (cnt, ==, 2);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hypertext_get_link (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj);
+  AtspiHyperlink *link = atspi_hypertext_get_link (obj, 1, NULL);
+  g_assert (link);
+  gchar *str = atspi_hyperlink_get_uri (link, 0, NULL);
+  g_assert (str);
+  g_assert_cmpstr (str, ==, "pinkbike.com");
+
+  g_free (str);
+  g_object_unref (link);
+
+  link = atspi_hypertext_get_link (obj, 0, NULL);
+  str = atspi_hyperlink_get_uri (link, 0, NULL);
+  g_assert_cmpstr (str, ==, "dh-zone.com");
+
+  g_free (str);
+  g_object_unref (link);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_hypertext_get_link_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiHypertext *obj = atspi_accessible_get_hypertext_iface (child);
+  g_assert (obj);
+  gint cnt = atspi_hypertext_get_link_index (obj, 15, NULL);
+  g_assert_cmpint (cnt, ==, -1);
+  cnt = atspi_hypertext_get_link_index (obj, 55, NULL);
+  g_assert_cmpint (cnt, ==, 0);
+  cnt = atspi_hypertext_get_link_index (obj, 70, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+void
+atk_test_hypertext (void)
+{
+  g_test_add ("/hypertext/atk_test_hypertext_get_n_links",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hypertext_get_n_links, fixture_teardown);
+  g_test_add ("/hypertext/atk_test_hypertext_get_links",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hypertext_get_link, fixture_teardown);
+  g_test_add ("/hypertext/atk_test_hypertext_get_link_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_hypertext_get_link_index, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_image.c b/tests/at-spi2-atk/atk_test_image.c
new file mode 100644 (file)
index 0000000..e8d57d7
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-image.xml"
+
+static void
+atk_test_image_sample_get_interface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiImage *iface = atspi_accessible_get_image_iface (child);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_image_get_image_description (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiImage *image = atspi_accessible_get_image_iface (child);
+  gchar *desc = atspi_image_get_image_description (image, NULL);
+  g_assert (desc);
+  g_assert_cmpstr (desc, ==, "image description");
+  g_free (desc);
+  g_object_unref (image);
+  g_object_unref (child);
+}
+
+static void
+atk_test_image_get_image_size (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiImage *image = atspi_accessible_get_image_iface (child);
+  AtspiPoint *p = atspi_image_get_image_size (image, NULL);
+  g_assert (p);
+
+  g_assert_cmpint (p->x, ==, 100);
+  g_assert_cmpint (p->y, ==, 50);
+  g_free (p);
+  g_object_unref (image);
+  g_object_unref (child);
+}
+
+static void
+atk_test_image_get_image_position (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiImage *image = atspi_accessible_get_image_iface (child);
+  AtspiPoint *p = atspi_image_get_image_position (image, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert (p);
+  g_assert_cmpint (p->x, ==, 500);
+  g_assert_cmpint (p->y, ==, 50);
+  g_free (p);
+  g_object_unref (image);
+  g_object_unref (child);
+}
+
+static void
+atk_test_image_get_image_extents (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiImage *image = atspi_accessible_get_image_iface (child);
+  AtspiRect *r = atspi_image_get_image_extents (image, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert (r);
+
+  g_assert_cmpint (r->x, ==, 500);
+  g_assert_cmpint (r->y, ==, 50);
+  g_assert_cmpint (r->width, ==, 100);
+  g_assert_cmpint (r->height, ==, 50);
+
+  g_free (r);
+  g_object_unref (image);
+  g_object_unref (child);
+}
+
+static void
+atk_test_image_get_image_locale (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 1, NULL);
+  AtspiImage *image = atspi_accessible_get_image_iface (child);
+  gchar *locale = atspi_image_get_image_locale (image, NULL);
+
+  g_assert (locale);
+  g_assert_cmpstr (locale, ==, "image_locale");
+  g_free (locale);
+  g_object_unref (image);
+  g_object_unref (child);
+}
+
+void
+atk_test_image (void)
+{
+  g_test_add ("/image/atk_test_image_sample_get_interface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_image_sample_get_interface, fixture_teardown);
+  g_test_add ("/image/atk_test_image_get_image_description",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_image_get_image_description, fixture_teardown);
+  g_test_add ("/image/atk_test_image_get_image_size",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_image_get_image_size, fixture_teardown);
+  g_test_add ("/image/atk_test_image_get_image_position",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_image_get_image_position, fixture_teardown);
+  g_test_add ("/image/atk_test_image_get_image_extents",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_image_get_image_extents, fixture_teardown);
+  g_test_add ("/image/atk_test_image_get_image_locale",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_image_get_image_locale, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_selection.c b/tests/at-spi2-atk/atk_test_selection.c
new file mode 100644 (file)
index 0000000..3847b91
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-selection.xml"
+
+static void
+atk_test_selection_sample_get_interface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_get_n_selected_children (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 3);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_get_selected_child (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+  gchar *valid_names[] = { "obj2/1", "obj2/2", "obj3/1" };
+
+  AtspiAccessible *o = NULL;
+  int i = 0;
+  int selected_count = atspi_selection_get_n_selected_children (iface, NULL);
+  g_assert_cmpint (selected_count, ==, 3);
+  for (i = 0; i < selected_count; i++)
+    {
+      o = atspi_selection_get_selected_child (iface, i, NULL);
+      check_name (o, valid_names[i]);
+      g_object_unref (o);
+    }
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_select_child (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 3);
+
+  atspi_selection_select_child (iface, 2, NULL);
+  atspi_selection_select_child (iface, 3, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 5);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_deselect_selected (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 3);
+
+  atspi_selection_select_child (iface, 2, NULL);
+  atspi_selection_select_child (iface, 3, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 5);
+
+  atspi_selection_deselect_selected_child (iface, 2, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 4);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_deselect_child (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 3);
+
+  atspi_selection_select_child (iface, 2, NULL);
+  atspi_selection_select_child (iface, 3, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 5);
+
+  atspi_selection_deselect_child (iface, 2, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 4);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_is_child_selected (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert (atspi_selection_is_child_selected (iface, 0, NULL));
+  g_assert (atspi_selection_is_child_selected (iface, 1, NULL));
+  g_assert (atspi_selection_is_child_selected (iface, 4, NULL));
+  g_assert (!atspi_selection_is_child_selected (iface, 2, NULL));
+  g_assert (!atspi_selection_is_child_selected (iface, 3, NULL));
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_select_all (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 3);
+  atspi_selection_select_all (iface, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 5);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+static void
+atk_test_selection_clear_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  check_name (obj, "root_object");
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiSelection *iface = atspi_accessible_get_selection_iface (child);
+  g_assert (iface != NULL);
+
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 3);
+  atspi_selection_clear_selection (iface, NULL);
+  g_assert_cmpint (atspi_selection_get_n_selected_children (iface, NULL), ==, 0);
+  g_object_unref (iface);
+  g_object_unref (child);
+}
+
+void
+atk_test_selection (void)
+{
+  g_test_add ("/selection/atk_test_selection_sample_get_interface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_sample_get_interface, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_get_n_selected_children",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_get_n_selected_children, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_get_selected_child",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_get_selected_child, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_select_child",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_select_child, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_deselect_selected",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_deselect_selected, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_deselect_child",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_deselect_child, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_is_child_selected",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_is_child_selected, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_select_all",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_select_all, fixture_teardown);
+  g_test_add ("/selection/atk_test_selection_clear_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_selection_clear_selection, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_state_set.c b/tests/at-spi2-atk/atk_test_state_set.c
new file mode 100644 (file)
index 0000000..7d0cd7d
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-accessible.xml"
+
+static void
+atk_test_accessible_get_state_set (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = atspi_state_set_get_states (states);
+
+  AtspiStateType valid_states[] = {
+    ATSPI_STATE_MODAL,
+    ATSPI_STATE_MULTI_LINE,
+  };
+  g_assert_cmpint (states_arr->len, ==, 2);
+  int i = 0;
+  for (i = 0; i < states_arr->len; ++i)
+    {
+      g_assert_cmpint (valid_states[i], ==, g_array_index (states_arr, AtspiStateType, i));
+      g_assert (atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+      g_assert (atspi_state_set_contains (states, ATSPI_STATE_MULTI_LINE));
+    }
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_new (TestAppFixture *fixture, gconstpointer user_data)
+{
+  GArray *states_arr = g_array_new (FALSE, FALSE, sizeof (AtspiStateType));
+
+  AtspiStateType state = ATSPI_STATE_FOCUSABLE;
+  g_array_append_val (states_arr, state);
+  state = ATSPI_STATE_FOCUSED;
+  g_array_append_val (states_arr, state);
+
+  g_assert_cmpint (states_arr->len, ==, 2);
+
+  AtspiStateSet *ss = atspi_state_set_new (states_arr);
+
+  g_assert (atspi_state_set_contains (ss, ATSPI_STATE_FOCUSABLE));
+  g_assert (atspi_state_set_contains (ss, ATSPI_STATE_FOCUSED));
+  g_object_unref (ss);
+  g_array_free (states_arr, TRUE);
+}
+
+static void
+atk_test_state_set_set_by_name (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = atspi_state_set_get_states (states);
+
+  atspi_state_set_set_by_name (states, "modal", FALSE);
+  g_array_free (states_arr, TRUE);
+
+  states_arr = atspi_state_set_get_states (states);
+
+  g_assert_cmpint (states_arr->len, ==, 1);
+  g_assert (!atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_MULTI_LINE));
+
+  atspi_state_set_set_by_name (states, "modal", TRUE);
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_add (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+
+  g_assert (!atspi_state_set_contains (states, ATSPI_STATE_FOCUSABLE));
+
+  atspi_state_set_add (states, ATSPI_STATE_FOCUSABLE);
+
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_FOCUSABLE));
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_compare (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = g_array_new (FALSE, FALSE, sizeof (AtspiStateType));
+
+  gint state = 0;
+  state = 11; // ATSPI_STATE_FOCUSABLE
+  g_array_append_val (states_arr, state);
+  state = 12; // ATSPI_STATE_FOCUSED
+  g_array_append_val (states_arr, state);
+
+  g_assert_cmpint (states_arr->len, ==, 2);
+
+  AtspiStateSet *ss = atspi_state_set_new (states_arr);
+
+  AtspiStateSet *ret = atspi_state_set_compare (states, ss);
+
+  g_assert (atspi_state_set_contains (ret, ATSPI_STATE_MODAL));
+  g_assert (atspi_state_set_contains (ret, ATSPI_STATE_MULTI_LINE));
+  g_assert (atspi_state_set_contains (ret, ATSPI_STATE_FOCUSED));
+  g_assert (atspi_state_set_contains (ret, ATSPI_STATE_FOCUSABLE));
+  g_object_unref (ret);
+  g_object_unref (ss);
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_contains (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+
+  g_assert (!atspi_state_set_contains (states, ATSPI_STATE_FOCUSABLE));
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_equals (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = g_array_new (FALSE, FALSE, sizeof (AtspiStateType));
+
+  gint state = 0;
+  state = 16; // ATSPI_STATE_MODAL
+  g_array_append_val (states_arr, state);
+  state = 17; // ATSPI_STATE_MULTI_LINE
+  g_array_append_val (states_arr, state);
+
+  g_assert_cmpint (states_arr->len, ==, 2);
+
+  AtspiStateSet *ss = atspi_state_set_new (states_arr);
+
+  g_assert (atspi_state_set_equals (states, ss));
+  g_object_unref (ss);
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_get_states (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = atspi_state_set_get_states (states);
+
+  AtspiStateType valid_states[] = {
+    ATSPI_STATE_MODAL,
+    ATSPI_STATE_MULTI_LINE,
+  };
+  g_assert_cmpint (states_arr->len, ==, 2);
+  int i = 0;
+  for (i = 0; i < states_arr->len; ++i)
+    g_assert_cmpint (valid_states[i], ==, g_array_index (states_arr, AtspiStateType, i));
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_MULTI_LINE));
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_is_empty (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  AtspiStateSet *root_states = atspi_accessible_get_state_set (obj);
+
+  g_assert (!atspi_state_set_is_empty (states));
+  g_assert (atspi_state_set_is_empty (root_states));
+  g_object_unref (root_states);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+static void
+atk_test_state_set_remove (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *obj = fixture->root_obj;
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, 0, NULL);
+  AtspiStateSet *states = atspi_accessible_get_state_set (child);
+  GArray *states_arr = atspi_state_set_get_states (states);
+
+  g_assert_cmpint (states_arr->len, ==, 2);
+  atspi_state_set_remove (states, ATSPI_STATE_MODAL);
+  g_array_free (states_arr, TRUE);
+
+  states_arr = atspi_state_set_get_states (states);
+
+  g_assert_cmpint (states_arr->len, ==, 1);
+  g_assert (!atspi_state_set_contains (states, ATSPI_STATE_MODAL));
+  g_assert (atspi_state_set_contains (states, ATSPI_STATE_MULTI_LINE));
+  g_array_free (states_arr, TRUE);
+  g_object_unref (states);
+  g_object_unref (child);
+}
+
+void
+atk_test_state_set (void)
+{
+  g_test_add ("/state_set/atk_test_accessible_get_state_set",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_state_set, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_new",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_new, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_set_by_name",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_set_by_name, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_add",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_add, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_compare",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_compare, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_contains",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_contains, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_equals",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_equals, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_get_states",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_get_states, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_is_empty",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_is_empty, fixture_teardown);
+  g_test_add ("/state_set/atk_test_state_set_remove",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_state_set_remove, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_table.c b/tests/at-spi2-atk/atk_test_table.c
new file mode 100644 (file)
index 0000000..0df01df
--- /dev/null
@@ -0,0 +1,525 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-table.xml"
+
+static void
+atk_test_table_get_caption (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  AtspiAccessible *acc = atspi_table_get_caption (obj, NULL);
+  check_name (acc, "caption name");
+  g_object_unref (acc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_summary (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  AtspiAccessible *acc = atspi_table_get_summary (obj, NULL);
+  check_name (acc, "table summary name");
+  g_object_unref (acc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_n_columns (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gint cnt = atspi_table_get_n_columns (obj, NULL);
+  g_assert_cmpint (cnt, ==, 3);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_n_rows (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gint cnt = atspi_table_get_n_rows (obj, NULL);
+  g_assert_cmpint (cnt, ==, 4);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_accessible_at (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  AtspiAccessible *acc = atspi_table_get_accessible_at (obj, 0, 0, NULL);
+  g_assert (acc);
+  check_name (acc, "cell 0/0");
+  g_object_unref (acc);
+
+  acc = atspi_table_get_accessible_at (obj, 3, 2, NULL);
+  check_name (acc, "cell 2/3");
+  g_object_unref (acc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_index_at (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+
+  gint cnt = atspi_table_get_index_at (obj, 0, 0, NULL);
+  g_assert_cmpint (cnt, ==, 0);
+
+  cnt = atspi_table_get_index_at (obj, 1, 0, NULL);
+  g_assert_cmpint (cnt, ==, 3);
+
+  cnt = atspi_table_get_index_at (obj, 0, 1, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_row_at_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+
+  gint cnt = atspi_table_get_row_at_index (obj, 1, NULL);
+  g_assert_cmpint (cnt, ==, 0);
+
+  cnt = atspi_table_get_row_at_index (obj, 4, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+
+  cnt = atspi_table_get_row_at_index (obj, 6, NULL);
+  g_assert_cmpint (cnt, ==, 2);
+
+  cnt = atspi_table_get_row_at_index (obj, 11, NULL);
+  g_assert_cmpint (cnt, ==, 3);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_column_at_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+
+  gint cnt = atspi_table_get_column_at_index (obj, 6, NULL);
+  g_assert_cmpint (cnt, ==, 0);
+
+  cnt = atspi_table_get_column_at_index (obj, 1, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+
+  cnt = atspi_table_get_column_at_index (obj, 5, NULL);
+  g_assert_cmpint (cnt, ==, 2);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_row_description (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gchar *desc = atspi_table_get_row_description (obj, 0, NULL);
+  g_assert (desc);
+  g_assert_cmpstr (desc, ==, "first row");
+  g_free (desc);
+  desc = atspi_table_get_row_description (obj, 2, NULL);
+  g_assert (desc);
+  g_assert_cmpstr (desc, ==, "third row");
+  g_free (desc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_column_description (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gchar *desc = atspi_table_get_column_description (obj, 0, NULL);
+  g_assert (desc);
+  g_assert_cmpstr (desc, ==, "first column");
+  g_free (desc);
+  desc = atspi_table_get_column_description (obj, 2, NULL);
+  g_assert (desc);
+  g_assert_cmpstr (desc, ==, "third column");
+  g_free (desc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_row_extent_at (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gint cnt = atspi_table_get_row_extent_at (obj, 1, 1, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_column_extent_at (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gint cnt = atspi_table_get_column_extent_at (obj, 1, 1, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_row_header (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  AtspiAccessible *acc = atspi_table_get_row_header (obj, 0, NULL);
+  check_name (acc, "row 1 header");
+  g_object_unref (acc);
+  acc = atspi_table_get_row_header (obj, 3, NULL);
+  check_name (acc, "row 4 header");
+  g_object_unref (acc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_column_header (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  AtspiAccessible *acc = atspi_table_get_column_header (obj, 0, NULL);
+  check_name (acc, "column 1 header");
+  g_object_unref (acc);
+  acc = atspi_table_get_column_header (obj, 1, NULL);
+  check_name (acc, "column 2 header");
+  g_object_unref (acc);
+  acc = atspi_table_get_column_header (obj, 2, NULL);
+  check_name (acc, "column 3 header");
+  g_object_unref (acc);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_n_selected_rows (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gint cnt = atspi_table_get_n_selected_rows (obj, NULL);
+  g_assert_cmpint (cnt, ==, 2);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_selected_rows (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  GArray *array = atspi_table_get_selected_rows (obj, NULL);
+  g_assert (array);
+  g_assert_cmpint (array->len, ==, 2);
+  g_assert_cmpint (g_array_index (array, gint, 0), ==, 0);
+  g_assert_cmpint (g_array_index (array, gint, 1), ==, 2);
+  g_array_free (array, TRUE);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_selected_columns (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  GArray *array = atspi_table_get_selected_columns (obj, NULL);
+  g_assert (array);
+  g_assert_cmpint (array->len, ==, 1);
+  g_assert_cmpint (g_array_index (array, gint, 0), ==, 1);
+
+  g_array_free (array, TRUE);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_n_selected_columns (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert (obj);
+  gint cnt = atspi_table_get_n_selected_columns (obj, NULL);
+  g_assert_cmpint (cnt, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_is_row_selected (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert (obj);
+  g_assert_true (atspi_table_is_row_selected (obj, 0, NULL));
+  g_assert_false (atspi_table_is_row_selected (obj, 1, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_is_column_selected (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert_true (atspi_table_is_column_selected (obj, 1, NULL));
+  g_assert_false (atspi_table_is_column_selected (obj, 0, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_add_row_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert_false (atspi_table_is_row_selected (obj, 1, NULL));
+  g_assert_true (atspi_table_add_row_selection (obj, 1, NULL));
+  g_assert_true (atspi_table_is_row_selected (obj, 1, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_add_column_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert_false (atspi_table_is_column_selected (obj, 2, NULL));
+  g_assert_true (atspi_table_add_column_selection (obj, 2, NULL));
+  g_assert_true (atspi_table_is_column_selected (obj, 2, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_remove_row_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert_true (atspi_table_is_row_selected (obj, 2, NULL));
+  g_assert_true (atspi_table_remove_row_selection (obj, 2, NULL));
+  g_assert_false (atspi_table_is_row_selected (obj, 2, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_remove_column_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert_true (atspi_table_is_column_selected (obj, 1, NULL));
+  g_assert_true (atspi_table_remove_column_selection (obj, 1, NULL));
+  g_assert_false (atspi_table_is_column_selected (obj, 1, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_get_row_column_extents_at_index (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  gint row;
+  gint col;
+  gint row_ext;
+  gint col_ext;
+  gboolean is_selected;
+  g_assert_true (atspi_table_get_row_column_extents_at_index (obj, 0, &row, &col, &row_ext, &col_ext, &is_selected, NULL));
+
+  g_assert_cmpint (row, ==, 0);
+  g_assert_cmpint (col, ==, 0);
+  g_assert_cmpint (row_ext, ==, 2);
+  g_assert_cmpint (col_ext, ==, 1);
+  g_assert_false (is_selected);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_is_selected (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiTable *obj = atspi_accessible_get_table_iface (child);
+  g_assert_true (atspi_table_is_selected (obj, 0, 2, NULL));
+  g_assert_false (atspi_table_is_selected (obj, 1, 0, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+void
+atk_test_table (void)
+{
+  g_test_add ("/table/atk_test_table_get_caption",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_caption, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_summary",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_summary, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_n_columns",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_n_columns, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_n_rows",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_n_rows, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_accessible_at",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_accessible_at, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_index_at",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_index_at, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_row_at_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_row_at_index, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_column_at_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_column_at_index, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_row_description",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_row_description, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_column_description",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_column_description, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_row_extent_at",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_row_extent_at, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_column_extent_at",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_column_extent_at, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_row_header",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_row_header, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_column_header",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_column_header, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_n_selected_rows",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_n_selected_rows, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_selected_rows",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_selected_rows, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_selected_columns",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_selected_columns, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_n_selected_columns",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_n_selected_columns, fixture_teardown);
+  g_test_add ("/table/atk_test_table_is_row_selected",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_is_row_selected, fixture_teardown);
+  g_test_add ("/table/atk_test_table_is_column_selected",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_is_column_selected, fixture_teardown);
+  g_test_add ("/table/atk_test_table_add_row_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_add_row_selection, fixture_teardown);
+  g_test_add ("/table/atk_test_table_add_column_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_add_column_selection, fixture_teardown);
+  g_test_add ("/table/atk_test_table_remove_row_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_remove_row_selection, fixture_teardown);
+  g_test_add ("/table/atk_test_table_remove_column_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_remove_column_selection, fixture_teardown);
+  g_test_add ("/table/atk_test_table_get_row_column_extents_at_index",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_get_row_column_extents_at_index, fixture_teardown);
+  g_test_add ("/table/atk_test_table_is_selected",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_is_selected, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_table_cell.c b/tests/at-spi2-atk/atk_test_table_cell.c
new file mode 100644 (file)
index 0000000..f919818
--- /dev/null
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-table.xml"
+
+static void
+atk_test_accessible_get_table_cell (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 9, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_cell_get_column_span (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 10, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  g_assert_cmpint (3, ==, atspi_table_cell_get_column_span (obj, NULL));
+  g_object_unref (obj);
+  g_object_unref (cell);
+
+  cell = atspi_accessible_get_child_at_index (child, 11, NULL);
+  obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  g_assert_cmpint (1, ==, atspi_table_cell_get_column_span (obj, NULL));
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+
+/*
+static void
+atk_test_table_cell_get_column_header_cells (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 10, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  GPtrArray *ret = atspi_table_cell_get_column_header_cells (obj, NULL);
+  g_assert_cmpint (3, ==, ret->len);
+  g_array_free (ret, TRUE);
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+*/
+
+static void
+atk_test_table_cell_get_row_span (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 9, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  g_assert_cmpint (2, ==, atspi_table_cell_get_row_span (obj, NULL));
+  g_object_unref (obj);
+  g_object_unref (cell);
+
+  cell = atspi_accessible_get_child_at_index (child, 11, NULL);
+  obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  g_assert_cmpint (1, ==, atspi_table_cell_get_column_span (obj, NULL));
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+
+/*
+static void
+atk_test_table_cell_get_row_header_cells (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 10, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  GPtrArray *ret = atspi_table_cell_get_row_header_cells (obj, NULL);
+  g_assert_cmpint (4, ==, ret->len);
+  g_array_free (ret, TRUE);
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+*/
+
+static void
+atk_test_table_cell_get_row_column_span (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 9, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  gint row = 10;
+  gint column = 10;
+  gint row_span = 10;
+  gint column_span = 10;
+
+  atspi_table_cell_get_row_column_span (obj, &row, &column, &row_span, &column_span, NULL);
+
+  g_assert_cmpint (row, ==, 0);
+  g_assert_cmpint (column, ==, 0);
+  g_assert_cmpint (row_span, ==, 2);
+  g_assert_cmpint (column_span, ==, 1);
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_cell_get_position (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 9, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (cell);
+
+  gint row = 10;
+  gint column = 10;
+
+  atspi_table_cell_get_position (obj, &row, &column, NULL);
+
+  /* TODO: not a very good test for the app to return (-1, -1) */
+  g_assert_cmpint (row, ==, -1);
+  g_assert_cmpint (column, ==, -1);
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+
+static void
+atk_test_table_cell_get_table (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+
+  AtspiAccessible *cell = atspi_accessible_get_child_at_index (child, 9, NULL);
+  AtspiTableCell *obj = atspi_accessible_get_table_cell (cell);
+  g_assert (obj);
+
+  AtspiAccessible *tab = atspi_table_cell_get_table (obj, NULL);
+  g_assert (tab);
+  g_assert (child == tab);
+  g_object_unref (tab);
+  g_object_unref (obj);
+  g_object_unref (cell);
+  g_object_unref (child);
+}
+
+void
+atk_test_table_cell (void)
+{
+  g_test_add ("/table_cell/atk_test_accessible_get_table_cell",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_accessible_get_table_cell, fixture_teardown);
+  g_test_add ("/table_cell/atk_test_table_cell_get_column_span",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_column_span, fixture_teardown);
+  /*
+    g_test_add ("/table_cell/atk_test_table_cell_get_column_header_cells",
+                TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_column_header_cells, fixture_teardown);
+  */
+  g_test_add ("/table_cell/atk_test_table_cell_get_row_span",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_row_span, fixture_teardown);
+  /*
+    g_test_add ("/table_cell/atk_test_table_cell_get_row_header_cells",
+                TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_row_header_cells, fixture_teardown);
+  */
+  g_test_add ("/table_cell/atk_test_table_cell_get_row_column_span",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_row_column_span, fixture_teardown);
+  g_test_add ("/table_cell/atk_test_table_cell_get_position",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_position, fixture_teardown);
+  g_test_add ("/table_cell/atk_test_table_cell_get_table",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_table_cell_get_table, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_text.c b/tests/at-spi2-atk/atk_test_text.c
new file mode 100644 (file)
index 0000000..5e2dee4
--- /dev/null
@@ -0,0 +1,520 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-text.xml"
+
+static gboolean
+GHRunc_find (gpointer key, gpointer value, gpointer user_data)
+{
+  if (!g_strcmp0 (key, user_data))
+    {
+      return TRUE;
+    }
+  return FALSE;
+}
+
+static void
+atk_test_text_get_character_count (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint count = atspi_text_get_character_count (obj, NULL);
+  g_assert_cmpint (count, ==, 16);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gchar *text = atspi_text_get_text (obj, 9, 14, NULL);
+  g_assert_cmpstr (text, ==, "works");
+  g_free (text);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_caret_offset (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint pos = atspi_text_get_caret_offset (obj, NULL);
+  g_assert_cmpint (pos, ==, -1);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_set_caret_offset (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  g_assert_true (atspi_text_set_caret_offset (obj, 5, NULL));
+  g_assert_false (atspi_text_set_caret_offset (obj, -1, NULL));
+  gint pos = atspi_text_get_caret_offset (obj, NULL);
+  g_assert_cmpint (pos, ==, 5);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+static void
+atk_test_text_get_character_at_offset (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  guint chr = atspi_text_get_character_at_offset (obj, 5, NULL);
+  g_assert_cmpint (chr, ==, 32);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_character_extents (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  AtspiRect *rec = atspi_text_get_character_extents (obj, 6, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert_cmpint (rec->x, ==, 100);
+  g_assert_cmpint (rec->y, ==, 33);
+  g_assert_cmpint (rec->width, ==, 110);
+  g_assert_cmpint (rec->height, ==, 30);
+
+  g_free (rec);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_range_extents (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  AtspiRect *rec = atspi_text_get_range_extents (obj, 0, 1, ATSPI_COORD_TYPE_SCREEN, NULL);
+
+  g_assert_cmpint (rec->x, ==, 100);
+  g_assert_cmpint (rec->y, ==, 33);
+  g_assert_cmpint (rec->width, ==, 110);
+  g_assert_cmpint (rec->height, ==, 30);
+
+  g_free (rec);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_add_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_n_selections (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint n = atspi_text_get_n_selections (obj, NULL);
+  g_assert_cmpint (n, ==, 0);
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  n = atspi_text_get_n_selections (obj, NULL);
+  g_assert_cmpint (n, ==, 3);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  g_assert_true (atspi_text_add_selection (obj, 14, 15, NULL));
+
+  AtspiRange *range = atspi_text_get_selection (obj, 0, NULL);
+  g_assert (range);
+  g_assert_cmpint (range->start_offset, ==, 9);
+  g_assert_cmpint (range->end_offset, ==, 14);
+  g_free (range);
+
+  range = atspi_text_get_selection (obj, 1, NULL);
+  g_assert (range);
+  g_assert_cmpint (range->start_offset, ==, 14);
+  g_assert_cmpint (range->end_offset, ==, 15);
+  g_free (range);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_set_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  g_assert_true (atspi_text_add_selection (obj, 14, 15, NULL));
+  g_assert_true (atspi_text_set_selection (obj, 0, 1, 2, NULL));
+  g_assert_true (atspi_text_set_selection (obj, 1, 3, 4, NULL));
+
+  AtspiRange *range = atspi_text_get_selection (obj, 0, NULL);
+  g_assert (range);
+  g_assert_cmpint (range->start_offset, ==, 1);
+  g_assert_cmpint (range->end_offset, ==, 2);
+  g_free (range);
+
+  range = atspi_text_get_selection (obj, 1, NULL);
+  g_assert (range);
+  g_assert_cmpint (range->start_offset, ==, 3);
+  g_assert_cmpint (range->end_offset, ==, 4);
+  g_free (range);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_remove_selection (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint n = atspi_text_get_n_selections (obj, NULL);
+  g_assert_cmpint (n, ==, 0);
+
+  g_assert_true (atspi_text_add_selection (obj, 9, 14, NULL));
+  g_assert_true (atspi_text_add_selection (obj, 14, 15, NULL));
+  n = atspi_text_get_n_selections (obj, NULL);
+  g_assert_cmpint (n, ==, 2);
+
+  g_assert_true (atspi_text_remove_selection (obj, 1, NULL));
+  n = atspi_text_get_n_selections (obj, NULL);
+  g_assert_cmpint (n, ==, 1);
+
+  g_assert_true (atspi_text_remove_selection (obj, 0, NULL));
+  n = atspi_text_get_n_selections (obj, NULL);
+  g_assert_cmpint (n, ==, 0);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_offset_at_point (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint n = atspi_text_get_offset_at_point (obj, 0, 0, ATSPI_COORD_TYPE_SCREEN, NULL);
+  g_assert_cmpint (n, ==, 5);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_text_attribute_value (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  GError *err = NULL;
+  gchar *str = atspi_text_get_text_attribute_value (obj, 0, "text_test_attr1", &err);
+  if (err)
+    g_print ("error msg:%s\n", err->message);
+  g_assert (str);
+  g_assert_cmpstr (str, ==, "on");
+  g_free (str);
+
+  str = atspi_text_get_text_attribute_value (obj, 0, "text_test_attr2", NULL);
+  g_assert (str);
+  g_assert_cmpstr (str, ==, "off");
+  g_free (str);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_attribute_run (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint start_offset = 0;
+  gint end_offset = 0;
+  GHashTable *tab = atspi_text_get_attribute_run (obj, 0, FALSE, &start_offset, &end_offset, NULL);
+
+  g_assert (tab);
+
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "text_test_attr1"), ==, "on");
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "text_test_attr2"), ==, "off");
+  g_assert_cmpint (start_offset, ==, 5);
+  g_assert_cmpint (end_offset, ==, 10);
+  g_hash_table_destroy (tab);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_default_attributes (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  GHashTable *tab = atspi_text_get_default_attributes (obj, NULL);
+  g_assert (tab);
+
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "bold_text"), ==, "on");
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "underline_text"), ==, "off");
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "dummy_text"), ==, "");
+  g_hash_table_destroy (tab);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_text_attributes (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  gint start_offset = 0;
+  gint end_offset = 0;
+  GHashTable *tab = atspi_text_get_text_attributes (obj, 0, &start_offset, &end_offset, NULL);
+
+  g_assert (tab);
+
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "text_test_attr1"), ==, "on");
+  g_assert_cmpstr ((const char *) g_hash_table_find (tab, GHRunc_find, "text_test_attr2"), ==, "off");
+  g_assert_cmpint (start_offset, ==, 5);
+  g_assert_cmpint (end_offset, ==, 10);
+  g_hash_table_destroy (tab);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_string_at_offset_s1 (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  AtspiTextRange *range = atspi_text_get_string_at_offset (obj, 0, ATSPI_TEXT_GRANULARITY_CHAR, NULL);
+
+  g_assert_cmpint (range->start_offset, ==, 0);
+  g_assert_cmpint (range->end_offset, ==, 1);
+  g_assert_cmpstr (range->content, ==, "t");
+
+  g_boxed_free (ATSPI_TYPE_TEXT_RANGE, range);
+
+  range = atspi_text_get_string_at_offset (obj, 5, ATSPI_TEXT_GRANULARITY_WORD, NULL);
+
+  g_assert_cmpint (range->start_offset, ==, 6);
+  g_assert_cmpint (range->end_offset, ==, 7);
+  g_assert_cmpstr (range->content, ==, "it");
+
+  g_boxed_free (ATSPI_TYPE_TEXT_RANGE, range);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_string_at_offset_s2 (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 1, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  AtspiTextRange *range = atspi_text_get_string_at_offset (obj, 20, ATSPI_TEXT_GRANULARITY_SENTENCE, NULL);
+
+  g_assert_cmpint (range->start_offset, ==, 18);
+  g_assert_cmpint (range->end_offset, ==, 34);
+  g_assert_cmpstr (range->content, ==, "Second sentence.");
+
+  g_boxed_free (ATSPI_TYPE_TEXT_RANGE, range);
+
+  range = atspi_text_get_string_at_offset (obj, 21, ATSPI_TEXT_GRANULARITY_LINE, NULL);
+
+  g_assert_cmpint (range->start_offset, ==, 18);
+  g_assert_cmpint (range->end_offset, ==, 34);
+  g_assert_cmpstr (range->content, ==, "Second sentence.");
+
+  g_boxed_free (ATSPI_TYPE_TEXT_RANGE, range);
+
+  range = atspi_text_get_string_at_offset (obj, 0, ATSPI_TEXT_GRANULARITY_PARAGRAPH, NULL);
+
+  g_assert_cmpint (range->start_offset, ==, 0);
+  g_assert_cmpint (range->end_offset, ==, 0);
+  g_assert_cmpstr (range->content, ==, "");
+
+  g_boxed_free (ATSPI_TYPE_TEXT_RANGE, range);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_text_get_bounded_ranges (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiText *obj = atspi_accessible_get_text_iface (child);
+
+  GArray *array = atspi_text_get_bounded_ranges (obj, 15, 21, 100, 50, ATSPI_COORD_TYPE_SCREEN, ATSPI_TEXT_CLIP_MAX, ATSPI_TEXT_CLIP_MIN, NULL);
+  g_assert (array);
+
+  AtspiTextRange *range = &g_array_index (array, AtspiTextRange, 0);
+  g_assert_cmpint (g_array_get_element_size (array), ==, sizeof (AtspiTextRange));
+  g_assert_cmpint (range->start_offset, ==, 0);
+  g_assert_cmpint (range->end_offset, ==, 5);
+  g_assert_cmpstr (range->content, ==, "text0");
+  g_free (range->content);
+
+  range = &g_array_index (array, AtspiTextRange, 1);
+  g_assert_cmpint (g_array_get_element_size (array), ==, sizeof (AtspiTextRange));
+  g_assert_cmpint (range->start_offset, ==, 6);
+  g_assert_cmpint (range->end_offset, ==, 10);
+  g_assert_cmpstr (range->content, ==, "it w");
+  g_free (range->content);
+
+  g_array_free (array, TRUE);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+void
+atk_test_text (void)
+{
+  g_test_add ("/text/atk_test_text_get_character_count",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_character_count, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_text, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_caret_offset",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_caret_offset, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_text_attributes",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_text_attributes, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_attribute_run",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_attribute_run, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_text_attribute_value",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_text_attribute_value, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_default_attributes",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_default_attributes, fixture_teardown);
+  g_test_add ("/text/atk_test_text_set_caret_offset",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_set_caret_offset, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_string_at_offset_s1",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_string_at_offset_s1, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_string_at_offset_s2",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_string_at_offset_s2, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_character_at_offset",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_character_at_offset, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_character_extents",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_character_extents, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_offset_at_point",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_offset_at_point, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_range_extents",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_range_extents, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_bounded_ranges",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_bounded_ranges, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_n_selections",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_n_selections, fixture_teardown);
+  g_test_add ("/text/atk_test_text_get_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_get_selection, fixture_teardown);
+  g_test_add ("/text/atk_test_text_add_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_add_selection, fixture_teardown);
+  g_test_add ("/text/atk_test_text_remove_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_remove_selection, fixture_teardown);
+  g_test_add ("/text/atk_test_text_set_selection",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_text_set_selection, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/atk_test_util.c b/tests/at-spi2-atk/atk_test_util.c
new file mode 100644 (file)
index 0000000..0630b4a
--- /dev/null
@@ -0,0 +1,255 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_test_util.h"
+#include <signal.h>
+
+static AtspiEventListener *fixture_listener = NULL;
+static TestAppFixture *current_fixture = NULL;
+
+static pid_t
+run_app (const char *file_name, const char *name_to_claim)
+{
+  pid_t child_pid = fork ();
+  if (child_pid == 0)
+    {
+      execlp (TESTS_BUILD_DIR "/app-test",
+              TESTS_BUILD_DIR "/app-test",
+              "--test-data-file",
+              file_name,
+              "--atspi-dbus-name",
+              name_to_claim,
+              NULL);
+      _exit (EXIT_SUCCESS);
+    }
+
+  return child_pid;
+}
+
+static AtspiAccessible *
+try_get_root_obj (AtspiAccessible *obj)
+{
+  GError *error = NULL;
+  gchar *name;
+  int i;
+
+  gint child_count = atspi_accessible_get_child_count (obj, &error);
+  if (child_count < 0)
+    {
+      if (error)
+        {
+          g_print ("  get_child_count: %s\n", error->message);
+          g_error_free (error);
+        }
+      else
+        {
+          g_print ("  get_child_count=%d with no error\n", child_count);
+        }
+      return NULL;
+    }
+  else if (child_count < 1)
+    {
+      g_print ("  child_count == %d, bailing out\n", child_count);
+      return NULL;
+    }
+
+  for (i = child_count - 1; i >= 0; i--)
+    {
+      AtspiAccessible *child = atspi_accessible_get_child_at_index (obj, i, &error);
+      if (!child)
+        {
+          if (error)
+            {
+              g_print ("  getting child_at_index: %s\n", error->message);
+              g_error_free (error);
+              error = NULL;
+            }
+          else
+            {
+              g_print ("  getting child_at_index returned NULL child with no error\n");
+            }
+          continue;
+        }
+      if ((name = atspi_accessible_get_name (child, &error)) != NULL)
+        {
+          if (!strcmp (name, "root_object"))
+            {
+              g_free (name);
+              return child;
+            }
+          g_print ("  name=%s\n", name);
+          g_free (name);
+          if (error)
+            {
+              g_error_free (error);
+              error = NULL;
+            }
+        }
+      else
+        {
+          if (error)
+            {
+              g_print ("try_get_root_obj getting child name: %s\n", error->message);
+              g_error_free (error);
+              error = NULL;
+            }
+          else
+            {
+              g_print ("  get_name returned NULL name with no error\n");
+            }
+        }
+      g_object_unref (child);
+    }
+
+  return NULL;
+}
+
+/* Callback from AtspiEventListener.  We monitor children-changed on the root, so we can know
+ * when the helper test-application has launched and registered.
+ */
+static void
+listener_event_cb (AtspiEvent *event, void *user_data)
+{
+  TestAppFixture *fixture = current_fixture;
+
+  if (atspi_accessible_get_role (event->source, NULL) == ATSPI_ROLE_DESKTOP_FRAME && strstr (event->type, "add"))
+    {
+      AtspiAccessible *obj = atspi_get_desktop (0);
+
+      fixture->root_obj = try_get_root_obj (obj);
+      g_object_unref (obj);
+
+      if (fixture->root_obj)
+        {
+          fixture->state = FIXTURE_STATE_CHILD_ACQUIRED;
+          atspi_event_quit ();
+        }
+    }
+  g_boxed_free (ATSPI_TYPE_EVENT, event);
+}
+
+/* Sets up the atspi event listener for the test-application helpers.
+ *
+ * We get notified when the test-application registers its root object by listening
+ * to the children-changed signal.
+ */
+void
+fixture_listener_init (void)
+{
+  GError *error = NULL;
+
+  fixture_listener = atspi_event_listener_new (listener_event_cb, NULL, NULL);
+  if (!atspi_event_listener_register (fixture_listener, "object:children-changed", &error))
+    {
+      g_error ("Could not register event listener for children-changed: %s\n", error->message);
+    }
+}
+
+void
+fixture_listener_destroy (void)
+{
+  GError *error = NULL;
+
+  if (!atspi_event_listener_deregister (fixture_listener, "object:children-changed", &error))
+    {
+      g_error ("Could not deregister event listener: %s", error->message);
+    }
+
+  g_object_unref (fixture_listener);
+  fixture_listener = NULL;
+}
+
+static gboolean
+wait_for_test_app_timeout_cb (gpointer user_data)
+{
+  TestAppFixture *fixture = user_data;
+
+  fixture->test_app_timed_out = TRUE;
+  fixture->wait_for_test_app_timeout = 0;
+  atspi_event_quit ();
+
+  return FALSE;
+}
+
+/* Each of the helper programs with the test fixtures claims a different DBus name,
+ * to make them non-ambiguous when they get restarted all the time.  This is the serial
+ * number that gets appended to each name.
+ */
+static guint fixture_serial = 0;
+
+void
+fixture_setup (TestAppFixture *fixture, gconstpointer user_data)
+{
+  const char *file_name = user_data;
+
+  fixture->state = FIXTURE_STATE_WAITING_FOR_CHILD;
+  fixture->name_to_claim = g_strdup_printf ("org.a11y.Atspi2Atk.TestApplication_%u", fixture_serial);
+  fixture_serial += 1;
+
+  fixture->child_pid = run_app (file_name, fixture->name_to_claim);
+
+  fixture->test_app_timed_out = FALSE;
+  fixture->wait_for_test_app_timeout = g_timeout_add (500, wait_for_test_app_timeout_cb, fixture); /* 500 msec */
+
+  current_fixture = fixture;
+  putenv ("ATSPI_IN_TESTS=1");
+  atspi_event_main ();
+
+  if (fixture->wait_for_test_app_timeout)
+    g_source_remove (fixture->wait_for_test_app_timeout);
+  fixture->wait_for_test_app_timeout = 0;
+
+  if (fixture->test_app_timed_out)
+    {
+      g_print ("test app timed out before registering its root object");
+      g_test_fail ();
+    }
+}
+
+void
+fixture_teardown (TestAppFixture *fixture, gconstpointer user_data)
+{
+  current_fixture = NULL;
+
+  kill (fixture->child_pid, SIGTERM);
+  fixture->child_pid = -1;
+
+  if (fixture->root_obj)
+    {
+      g_object_unref (fixture->root_obj);
+      fixture->root_obj = NULL;
+    }
+
+  g_free (fixture->name_to_claim);
+  fixture->name_to_claim = NULL;
+}
+
+void
+check_name (AtspiAccessible *accessible, const char *expected_name)
+{
+  gchar *obj_name;
+
+  g_assert (accessible);
+  obj_name = atspi_accessible_get_name (accessible, NULL);
+  g_assert_cmpstr (expected_name, ==, obj_name);
+  g_free (obj_name);
+}
diff --git a/tests/at-spi2-atk/atk_test_util.h b/tests/at-spi2-atk/atk_test_util.h
new file mode 100644 (file)
index 0000000..f5ab715
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 _ATK_TEST_UTIL_H
+#define _ATK_TEST_UTIL_H
+
+#include "atk_suite.h"
+#include <glib.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+typedef enum
+{
+  FIXTURE_STATE_WAITING_FOR_CHILD,
+  FIXTURE_STATE_CHILD_ACQUIRED,
+} FixtureState;
+
+typedef struct
+{
+  FixtureState state;
+
+  char *name_to_claim;
+
+  guint wait_for_test_app_timeout;
+  gboolean test_app_timed_out;
+  pid_t child_pid;
+
+  AtspiAccessible *root_obj;
+} TestAppFixture;
+
+extern pid_t child_pid;
+
+void fixture_listener_init (void);
+void fixture_listener_destroy (void);
+void fixture_setup (TestAppFixture *fixture, gconstpointer user_data);
+void fixture_teardown (TestAppFixture *fixture, gconstpointer user_data);
+
+void check_name (AtspiAccessible *accessible, const char *expected_name);
+#endif /* _ATK_TEST_UTIL_H */
diff --git a/tests/at-spi2-atk/atk_test_value.c b/tests/at-spi2-atk/atk_test_value.c
new file mode 100644 (file)
index 0000000..9f9cad2
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 "atk_suite.h"
+#include "atk_test_util.h"
+
+#define DATA_FILE TESTS_DATA_DIR "/test-value.xml"
+
+static void
+atk_test_value_get_value_iface (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  g_assert (obj);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_value_get_minimum_value (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  gdouble val = atspi_value_get_minimum_value (obj, NULL);
+  g_assert_cmpfloat (val, ==, 1.25);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_value_get_current_value (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  gdouble val = atspi_value_get_current_value (obj, NULL);
+  g_assert_cmpfloat (val, ==, 2.25);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_value_get_maximum_value (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  gdouble val = atspi_value_get_maximum_value (obj, NULL);
+  g_assert_cmpfloat (val, ==, 3.25);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_value_set_current_value (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  g_assert (atspi_value_set_current_value (obj, 2.5, NULL));
+  gdouble val = atspi_value_get_current_value (obj, NULL);
+  g_assert_cmpfloat (val, ==, 2.5);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_value_get_minimum_increment (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  gdouble val = atspi_value_get_minimum_increment (obj, NULL);
+  g_assert_cmpfloat (val, ==, 0.25);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+static void
+atk_test_value_get_text (TestAppFixture *fixture, gconstpointer user_data)
+{
+  AtspiAccessible *_obj = fixture->root_obj;
+  g_assert (_obj);
+  AtspiAccessible *child = atspi_accessible_get_child_at_index (_obj, 0, NULL);
+  g_assert (child);
+  AtspiValue *obj = atspi_accessible_get_value_iface (child);
+  gchar *text = atspi_value_get_text (obj, NULL);
+  g_assert_cmpstr (text, ==, "2.250000");
+  g_free (text);
+  g_object_unref (obj);
+  g_object_unref (child);
+}
+
+void
+atk_test_value (void)
+{
+  g_test_add ("/value/atk_test_value_get_value_iface",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_get_value_iface, fixture_teardown);
+  g_test_add ("/value/atk_test_value_get_minimum_value",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_get_minimum_value, fixture_teardown);
+  g_test_add ("/value/atk_test_value_get_current_value",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_get_current_value, fixture_teardown);
+  g_test_add ("/value/atk_test_value_get_maximum_value",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_get_maximum_value, fixture_teardown);
+  g_test_add ("/value/atk_test_value_set_current_value",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_set_current_value, fixture_teardown);
+  g_test_add ("/value/atk_test_value_get_minimum_increment",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_get_minimum_increment, fixture_teardown);
+  g_test_add ("/value/atk_test_value_get_text",
+              TestAppFixture, DATA_FILE, fixture_setup, atk_test_value_get_text, fixture_teardown);
+}
diff --git a/tests/at-spi2-atk/data/test-accessible.xml b/tests/at-spi2-atk/data/test-accessible.xml
new file mode 100644 (file)
index 0000000..470a11d
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible description="first child" name="obj1" role="alert" help_text="test dialog">
+               <state state_enum="modal"/>
+               <state state_enum="multi-line"/>
+       </accessible>
+       <accessible description="second child" name="obj2" role="animation">
+               <accessible description="first prechild" name="obj2/1" role="arrow">
+                       <relation relation_type="2" target_name="obj2"/>
+               </accessible>
+               <accessible description="second prechild" name="obj2/2" role="canvas"/>
+       </accessible>
+       <accessible description="third child" name="obj3" role="check box">
+               <accessible description="first prechild" name="obj3/1" role="check menu item"/>
+       </accessible>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-action.xml b/tests/at-spi2-atk/data/test-action.xml
new file mode 100644 (file)
index 0000000..41ddf00
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible description="first child" name="obj1" role="alert"/>
+       <accessible_action description="second child" name="obj2" role="application">
+               <action action_name="action1" action_description="action1 description" key_binding="action1 key binding"/>
+               <action action_name="action2" action_description="action2 description" key_binding="action2 key binding"/>
+       </accessible_action>
+       <accessible_action description="third child" name="obj3" role="push button">
+               <action action_name="action1" action_description="action1 description" key_binding="action1 key binding"/>
+       </accessible_action>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-collection.xml b/tests/at-spi2-atk/data/test-collection.xml
new file mode 100644 (file)
index 0000000..7086ede
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible description="first child" name="obj1" role="alert">
+               <state state_enum="modal"/>
+               <state state_enum="multi-line"/>
+       </accessible>
+       <accessible description="second child" name="obj2" role="animation">
+               <accessible description="first prechild" name="obj2/1" role="arrow">
+                       <relation relation_type="2" target_name="obj2"/>
+                       <state state_enum="modal"/>
+                       <state state_enum="multi-line"/>
+               </accessible>
+               <accessible description="second prechild" name="obj2/2" role="canvas"/>
+       </accessible>
+       <accessible description="third child" name="obj3" role="check box">
+               <state state_enum="modal"/>
+               <state state_enum="multi-line"/>
+               <accessible description="first prechild" name="obj3/1" role="check menu item"/>
+       </accessible>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-component.xml b/tests/at-spi2-atk/data/test-component.xml
new file mode 100644 (file)
index 0000000..80929b0
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_component description="second child" name="obj2" role="application">
+               <component x="350" y="200" width="0" height="0" layer="2" zorder="1" alpha="1.5"/>
+       </accessible_component>
+       <accessible_component description="third child" name="obj3" role="push button">
+               <component x="250" y="250" width="350" height="200" layer="3" zorder="2" alpha="2.5"/>
+               <accessible_component description="third child a" name="aobj3" role="push button">
+                       <component x="250" y="250" width="350" height="200" layer="4" zorder="3" alpha="3.5"/>
+               </accessible_component>
+       </accessible_component>
+       <accessible description="second child" name="obj2" role="application" />
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-document.xml b/tests/at-spi2-atk/data/test-document.xml
new file mode 100644 (file)
index 0000000..7363a62
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+      <accessible description="first child" name="test" role="alert"/>
+      <accessible_document description="image child" name="my_document" role="text">
+         <document page_numer="7" page_no="2"/>
+      </accessible_document>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-editable-text.xml b/tests/at-spi2-atk/data/test-editable-text.xml
new file mode 100644 (file)
index 0000000..ae8084c
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_editable_text description="first child" name="obj0" role="entry">
+               <text_edit_node text="test text"/>
+       </accessible_editable_text>
+       <accessible_editable_text description="second child" name="obj1" role="entry">
+               <text_edit_node text="second test text"/>
+       </accessible_editable_text>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-hypertext.xml b/tests/at-spi2-atk/data/test-hypertext.xml
new file mode 100644 (file)
index 0000000..1b6be6d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_hypertext description="first child" name="obj0" role="alert">
+               <hypertext text="This is article about know downhill portals href='dh-zone.com' href='pinkbike.com'" />
+       </accessible_hypertext>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-image.xml b/tests/at-spi2-atk/data/test-image.xml
new file mode 100644 (file)
index 0000000..b678ac2
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+      <accessible description="first child" name="obj1" role="alert"/>
+      <accessible_image description="image child" name="obj0" role="image">
+         <image image_description="image description" width="100" height="50" x="500" y="50" image_extents="png" image_locale="image_locale"/>
+      </accessible_image>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-selection.xml b/tests/at-spi2-atk/data/test-selection.xml
new file mode 100644 (file)
index 0000000..2fc1733
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_selection description="first child" name="obj1" role="alert">
+               <accessible description="first prechild" name="obj2/1" role="arrow">
+                       <state state_enum="selected"/>
+               </accessible>
+               <accessible description="second prechild" name="obj2/2" role="canvas" selected="1">
+                       <state state_enum="selected"/>
+               </accessible>
+               <accessible description="first prechild" name="obj2/1" role="arrow"/>
+               <accessible description="second prechild" name="obj2/2" role="canvas"/>
+               <accessible description="first prechild" name="obj3/1" role="check menu item">
+                       <state state_enum="selected"/>
+               </accessible>
+       </accessible_selection>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-table.xml b/tests/at-spi2-atk/data/test-table.xml
new file mode 100644 (file)
index 0000000..9d6cb50
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_table description="first_child" name="obj0" role="table">
+               <accessible description="table caption" name="caption name" role="caption"/>
+               <accessible description="table summary" name="table summary name" role="heading"/>
+               <accessible description="first column" name="col1" role="table column header">
+                       <accessible description="first column header" name="column 1 header" role="header"/>
+               </accessible>
+               <accessible description="second column" name="col2" role="table column header">
+                       <state state_enum="selected"/>
+                       <accessible description="second column header" name="column 2 header" role="header"/>
+               </accessible>
+               <accessible description="third column" name="col3" role="table column header">
+                       <accessible description="thrid column header" name="column 3 header" role="header"/>
+               </accessible>
+               <accessible description="first row" name="row1" role="table row header">
+                       <state state_enum="selected"/>
+                       <accessible description="first row header" name="row 1 header" role="header"/>
+               </accessible>
+               <accessible description="second row" name="row2" role="table row header">
+                       <accessible description="second row header" name="row 2 header" role="header"/>
+               </accessible>
+               <accessible description="third row" name="row3" role="table row header">
+                       <state state_enum="selected"/>
+                       <accessible description="third row header" name="row 3 header" role="header"/>
+               </accessible>
+               <accessible description="fourth row" name="row4" role="table row header">
+                       <accessible description="fourth row header" name="row 4 header" role="header"/>
+               </accessible>
+               <accessible_table_cell description="table cell 1" name="cell 0/0" role="table cell">
+                       <table_cell cell_x="0" cell_y="0" row_span="2"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 5" name="cell 1/0" role="table cell">
+                       <table_cell cell_x="1" cell_y="0" column_span="3"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 9" name="cell 2/0" role="table cell">
+                       <state state_enum="selected"/>
+                       <table_cell cell_x="2" cell_y="0"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 2" name="cell 0/1" role="table cell">
+                       <table_cell cell_x="0" cell_y="1"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 6" name="cell 1/1" role="table cell">
+                       <table_cell cell_x="1" cell_y="1"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 10" name="cell 2/1" role="table cell">
+                       <table_cell cell_x="2" cell_y="1"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 3" name="cell 0/2" role="table cell">
+                       <table_cell cell_x="0" cell_y="2"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 7" name="cell 1/2" role="table cell">
+                       <table_cell cell_x="1" cell_y="2"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 11" name="cell 2/2" role="table cell">
+                       <table_cell cell_x="2" cell_y="2"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 4" name="cell 0/3" role="table cell">
+                       <table_cell cell_x="0" cell_y="3"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 8" name="cell 1/3" role="table cell">
+                       <table_cell cell_x="1" cell_y="3"/>
+               </accessible_table_cell>
+               <accessible_table_cell description="table cell 12" name="cell 2/3" role="table cell">
+                       <table_cell cell_x="2" cell_y="3"/>
+               </accessible_table_cell>
+       </accessible_table>
+</accessible>
+
+
diff --git a/tests/at-spi2-atk/data/test-text.xml b/tests/at-spi2-atk/data/test-text.xml
new file mode 100644 (file)
index 0000000..ab72522
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_text description="first child" name="obj0" role="text">
+               <text_node text="text0 it works!." x="100" y="33" width="110" height="30" bold_text="on" underline_text="off"/>
+       </accessible_text>
+       <accessible_text description="second child" name="obj1" role="text">
+               <text_node text="First sentence./n Second sentence." x="66" y="44" width="550" height="40" bold_text="off" underline_text="off"/>
+       </accessible_text>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test-value.xml b/tests/at-spi2-atk/data/test-value.xml
new file mode 100644 (file)
index 0000000..1f5ae6c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible_value description="first child" name="obj0" role="alert">
+               <value_node min="1.25" current="2.25" max="3.25" step="0.25"/>
+       </accessible_value>
+</accessible>
diff --git a/tests/at-spi2-atk/data/test.xml b/tests/at-spi2-atk/data/test.xml
new file mode 100644 (file)
index 0000000..26728dd
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<accessible description="Root of the accessible tree" name="root_object" role="accelerator label">
+       <accessible description="first child" name="obj1" role="alert">
+               <state state_enum="modal"/>
+               <state state_enum="multi-line"/>
+       </accessible>
+       <accessible description="second child" name="obj2" role="animation">
+               <accessible description="first prechild" name="obj2/1" role="arrow">
+                       <relation relation_type="2" target_name="obj2"/>
+               </accessible>
+               <accessible description="second prechild" name="obj2/2" role="canvas"/>
+       </accessible>
+       <accessible description="third child" name="obj3" role="check box">
+               <accessible description="first prechild" name="obj3/1" role="check menu item"/>
+       </accessible>
+</accessible>
diff --git a/tests/at-spi2-atk/dummyatk/meson.build b/tests/at-spi2-atk/dummyatk/meson.build
new file mode 100644 (file)
index 0000000..fc5cc4d
--- /dev/null
@@ -0,0 +1,23 @@
+dummyatk_sources = [
+  'my-atk-action.c',
+  'my-atk-component.c',
+  'my-atk-document.c',
+  'my-atk-editable-text.c',
+  'my-atk-hyperlink.c',
+  'my-atk-hypertext.c',
+  'my-atk-image.c',
+  'my-atk-text.c',
+  'my-atk-object.c',
+  'my-atk-table.c',
+  'my-atk-table-cell.c',
+  'my-atk-selection.c',
+  'my-atk-value.c',
+]
+
+dummyatk = static_library('dummyatk', dummyatk_sources,
+                          include_directories: root_inc,
+                          dependencies: [ glib_dep, gobject_dep, libatk_dep ])
+
+dummyatk_dep = declare_dependency(link_with: dummyatk,
+                                  dependencies: [ glib_dep, gobject_dep, libatk_dep ],
+                                  include_directories: include_directories('.'))
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-action.c b/tests/at-spi2-atk/dummyatk/my-atk-action.c
new file mode 100644 (file)
index 0000000..40a0abf
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-action.h"
+#include "my-atk-object.h"
+
+typedef struct _MyAtkActionInfo MyAtkActionInfo;
+
+struct _MyAtkActionInfo
+{
+  gchar *name;
+  gchar *description;
+  gchar *keybinding;
+
+  MyAtkActionFunc do_action_func;
+};
+
+static void atk_action_interface_init (AtkActionIface *iface);
+
+struct _MyAtkActionPrivate
+{
+  GQueue *action_queue;
+  guint action_idle_handler;
+  GList *action_list;
+  GList *children;
+};
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkAction,
+                         my_atk_action,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION,
+                                                atk_action_interface_init)
+                             G_ADD_PRIVATE (MyAtkAction));
+
+static void
+my_atk_action_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_action_init (MyAtkAction *action_obj)
+{
+  MyAtkActionPrivate *priv = my_atk_action_get_instance_private (action_obj);
+  action_obj->priv = priv;
+  priv->action_queue = NULL;
+  priv->action_idle_handler = 0;
+  priv->action_list = NULL;
+  priv->children = NULL;
+}
+
+static void
+my_atk_action_finalize (GObject *object)
+{
+}
+
+static void
+my_atk_action_class_init (MyAtkActionClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_action_finalize;
+
+  atk_class->initialize = my_atk_action_initialize;
+}
+
+static MyAtkActionInfo *
+_my_atk_action_get_action_info (MyAtkAction *action, gint i)
+{
+  MyAtkActionPrivate *priv = NULL;
+  MyAtkActionInfo *node_data = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), NULL);
+
+  priv = action->priv;
+
+  if (priv->action_list == NULL)
+    return NULL;
+
+  node_data = g_list_nth_data (priv->action_list, i);
+
+  g_return_val_if_fail (node_data, NULL);
+
+  return node_data;
+}
+
+static const gchar *
+my_atk_action_description_get (AtkAction *action, gint i)
+{
+  MyAtkAction *my_action = NULL;
+  MyAtkActionInfo *info = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), NULL);
+  my_action = MY_ATK_ACTION (action);
+
+  info = _my_atk_action_get_action_info (my_action, i);
+
+  if (info == NULL)
+    return NULL;
+
+  return strdup (info->description);
+}
+
+static gboolean
+my_atk_action_description_set (AtkAction *action, gint i, const char *des)
+{
+  MyAtkAction *my_action = NULL;
+  MyAtkActionInfo *info = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), FALSE);
+  my_action = MY_ATK_ACTION (action);
+
+  info = _my_atk_action_get_action_info (my_action, i);
+
+  if (info == NULL)
+    return FALSE;
+
+  g_free (info->description);
+  info->description = g_strdup (des);
+
+  return TRUE;
+}
+
+static const gchar *
+my_atk_action_name_get (AtkAction *action, gint i)
+{
+  MyAtkAction *my_action = NULL;
+  MyAtkActionInfo *info = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), NULL);
+  my_action = MY_ATK_ACTION (action);
+
+  info = _my_atk_action_get_action_info (my_action, i);
+
+  if (info == NULL)
+    return NULL;
+
+  return strdup (info->name);
+}
+
+static const gchar *
+my_atk_action_localized_name_get (AtkAction *action, gint i)
+{
+  MyAtkAction *my_action = NULL;
+  MyAtkActionInfo *info = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), NULL);
+  my_action = MY_ATK_ACTION (action);
+
+  info = _my_atk_action_get_action_info (my_action, i);
+
+  if (info == NULL)
+    return NULL;
+
+  return strdup (info->name);
+}
+
+static gint
+my_atk_action_get_n_actions (AtkAction *action)
+{
+  MyAtkAction *action_obj = NULL;
+  MyAtkActionPrivate *priv = NULL;
+
+  action_obj = MY_ATK_ACTION (action);
+  priv = action_obj->priv;
+
+  return g_list_length (priv->action_list);
+}
+
+static const gchar *
+my_atk_action_get_keybinding (AtkAction *action, gint i)
+{
+  MyAtkAction *my_action = NULL;
+  MyAtkActionInfo *info = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), NULL);
+  my_action = MY_ATK_ACTION (action);
+
+  info = _my_atk_action_get_action_info (my_action, i);
+
+  if (info == NULL)
+    return NULL;
+
+  return strdup (info->keybinding);
+}
+
+void
+perform_action (AtkObject *obj)
+{
+  AtkStateSet *state_set1 = atk_object_ref_state_set (obj);
+  atk_state_set_add_state (state_set1, ATK_STATE_ACTIVE);
+}
+
+static gboolean
+my_atk_action_do_action (AtkAction *action, gint i)
+{
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), FALSE);
+
+  perform_action (ATK_OBJECT (action));
+
+  return FALSE;
+}
+
+guint
+my_atk_action_add_action (MyAtkAction *action,
+                          const gchar *action_name,
+                          const gchar *action_description,
+                          const gchar *action_keybinding)
+{
+  MyAtkActionInfo *info = NULL;
+  MyAtkActionPrivate *priv = NULL;
+
+  g_return_val_if_fail (MY_IS_ATK_ACTION (action), -1);
+
+  priv = action->priv;
+
+  info = g_slice_new (MyAtkActionInfo);
+  info->name = g_strdup (action_name);
+  info->description = g_strdup (action_description);
+  info->keybinding = g_strdup (action_keybinding);
+
+  priv->action_list = g_list_append (priv->action_list, info);
+
+  return g_list_length (priv->action_list);
+}
+
+static void
+atk_action_interface_init (AtkActionIface *iface)
+{
+  g_return_if_fail (iface);
+
+  iface->do_action = my_atk_action_do_action;
+
+  iface->get_n_actions = my_atk_action_get_n_actions;
+  iface->get_description = my_atk_action_description_get;
+  iface->get_keybinding = my_atk_action_get_keybinding;
+  iface->get_name = my_atk_action_name_get;
+  iface->set_description = my_atk_action_description_set;
+  iface->get_localized_name = my_atk_action_localized_name_get;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-action.h b/tests/at-spi2-atk/dummyatk/my-atk-action.h
new file mode 100644 (file)
index 0000000..9ffdd01
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_ACTION_H
+#define MY_ATK_ACTION_H
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+
+#define MY_TYPE_ATK_ACTION (my_atk_action_get_type ())
+#define MY_ATK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_ACTION, MyAtkAction))
+#define MY_ATK_ACTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_ACTION, MyAtkActionClass))
+#define MY_IS_ATK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_ACTION))
+#define MY_IS_ATK_ACTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_ACTION))
+#define MY_ATK_ACTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_ACTION, MyAtkActionClass))
+
+typedef struct _MyAtkAction MyAtkAction;
+typedef struct _MyAtkActionPrivate MyAtkActionPrivate;
+typedef struct _MyAtkActionClass MyAtkActionClass;
+
+typedef void (*MyAtkActionFunc) (MyAtkAction *action);
+
+struct _MyAtkAction
+{
+  MyAtkObject parent;
+  MyAtkActionPrivate *priv;
+  gint last_performed_action; // this field is changed when action is performed
+};
+
+struct _MyAtkActionClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_action_get_type (void);
+
+guint my_atk_action_add_action (MyAtkAction *action,
+                                const gchar *action_name,
+                                const gchar *action_description,
+                                const gchar *action_keybinding);
+
+#endif /*MY_ATK_ACTION_H*/
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-component.c b/tests/at-spi2-atk/dummyatk/my-atk-component.c
new file mode 100644 (file)
index 0000000..0628369
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-object.h"
+
+#include "my-atk-component.h"
+
+typedef struct _MyAtkComponentInfo MyAtkComponentInfo;
+
+static void atk_component_interface_init (AtkComponentIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkComponent,
+                         my_atk_component,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT,
+                                                atk_component_interface_init));
+
+void
+my_atk_component_set_layer (AtkComponent *component,
+                            AtkLayer layer)
+{
+  g_return_if_fail (MY_IS_ATK_COMPONENT (component));
+
+  MyAtkComponent *self = MY_ATK_COMPONENT (component);
+  self->layer = layer;
+}
+
+void
+my_atk_component_set_mdi_zorder (AtkComponent *component,
+                                 gint mdi_zorder)
+{
+  g_return_if_fail (MY_IS_ATK_COMPONENT (component));
+
+  MyAtkComponent *self = MY_ATK_COMPONENT (component);
+  self->zorder = mdi_zorder;
+}
+
+void
+my_atk_component_set_alpha (AtkComponent *component,
+                            gdouble alpha)
+{
+
+  g_return_if_fail (MY_IS_ATK_COMPONENT (component));
+
+  MyAtkComponent *self = MY_ATK_COMPONENT (component);
+  self->alpha = alpha;
+}
+
+static void
+my_atk_component_get_extents (AtkComponent *component,
+                              gint *width,
+                              gint *height,
+                              gint *x,
+                              gint *y,
+                              AtkCoordType coord_type)
+{
+  g_return_if_fail (MY_IS_ATK_COMPONENT (component));
+
+  MyAtkComponent *self = MY_ATK_COMPONENT (component);
+  *width = self->extent.width;
+  *height = self->extent.height;
+  *x = self->extent.x;
+  *y = self->extent.y;
+}
+
+static gboolean
+my_atk_component_set_extents (AtkComponent *component,
+                              gint x,
+                              gint y,
+                              gint width,
+                              gint height,
+                              AtkCoordType coord_type)
+{
+  g_return_val_if_fail (MY_IS_ATK_COMPONENT (component), FALSE);
+
+  MyAtkComponent *self = MY_ATK_COMPONENT (component);
+
+  if (self->extent_may_change)
+    {
+      self->extent.width = width;
+      self->extent.height = height;
+      self->extent.x = x;
+      self->extent.y = y;
+      return TRUE;
+    }
+  return FALSE;
+}
+
+static gboolean
+my_atk_component_contains (AtkComponent *component,
+                           gint c_x,
+                           gint c_y,
+                           AtkCoordType coord_type)
+{
+  g_return_val_if_fail (MY_IS_ATK_COMPONENT (component), FALSE);
+
+  gint x, y, w, h;
+  my_atk_component_get_extents (component, &x, &y, &w, &h, coord_type);
+
+  if ((c_x >= x) && (c_y >= y) && (c_x < x + w) && (c_y < y + h))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+static AtkObject *
+my_atk_component_ref_accessible_at_point (AtkComponent *component,
+                                          gint x,
+                                          gint y,
+                                          AtkCoordType coord_type)
+{
+  g_return_val_if_fail (MY_IS_ATK_COMPONENT (component), NULL);
+
+  gint count, i;
+  count = atk_object_get_n_accessible_children (ATK_OBJECT (component));
+
+  for (i = 0; i < count; i++)
+    {
+      AtkObject *obj;
+      obj = atk_object_ref_accessible_child (ATK_OBJECT (component), i);
+
+      if (obj != NULL)
+        {
+          if (atk_component_contains (ATK_COMPONENT (obj), x, y, coord_type))
+            return obj;
+          else
+            g_object_unref (obj);
+        }
+    }
+  return NULL;
+}
+
+static gboolean
+my_atk_component_grab_focus (AtkComponent *component)
+{
+  return TRUE;
+}
+
+static AtkLayer
+my_atk_component_get_layer (AtkComponent *component)
+{
+  g_return_val_if_fail (MY_IS_ATK_COMPONENT (component), -1);
+
+  return MY_ATK_COMPONENT (component)->layer;
+}
+
+static gint
+my_atk_component_get_mdi_zorder (AtkComponent *component)
+{
+  g_return_val_if_fail (MY_IS_ATK_COMPONENT (component), -1);
+
+  return MY_ATK_COMPONENT (component)->zorder;
+}
+
+static gdouble
+my_atk_component_get_alpha (AtkComponent *component)
+{
+  g_return_val_if_fail (MY_IS_ATK_COMPONENT (component), -1);
+
+  return MY_ATK_COMPONENT (component)->alpha;
+}
+
+static void
+atk_component_interface_init (AtkComponentIface *iface)
+{
+  g_return_if_fail (iface);
+
+  iface->add_focus_handler = NULL;
+  iface->contains = my_atk_component_contains;
+  iface->ref_accessible_at_point = my_atk_component_ref_accessible_at_point;
+  iface->get_extents = my_atk_component_get_extents;
+  iface->get_position = NULL;
+  iface->get_size = NULL;
+  iface->grab_focus = my_atk_component_grab_focus;
+  iface->remove_focus_handler = NULL;
+  iface->set_extents = my_atk_component_set_extents;
+  iface->set_position = NULL;
+  iface->set_size = NULL;
+  iface->get_layer = my_atk_component_get_layer;
+  iface->get_mdi_zorder = my_atk_component_get_mdi_zorder;
+  iface->bounds_changed = NULL;
+  iface->get_alpha = my_atk_component_get_alpha;
+}
+
+static void
+my_atk_component_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_component_finalize (GObject *object)
+{
+}
+
+static void
+my_atk_component_init (MyAtkComponent *obj)
+{
+  obj->extent.x = 0;
+  obj->extent.y = 0;
+  obj->extent.width = 0;
+  obj->extent.height = 0;
+  obj->extent_may_change = TRUE;
+  obj->layer = ATK_LAYER_BACKGROUND;
+  obj->zorder = -1;
+  obj->alpha = 1.0;
+}
+
+static void
+my_atk_component_class_init (MyAtkComponentClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_component_finalize;
+
+  atk_class->initialize = my_atk_component_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-component.h b/tests/at-spi2-atk/dummyatk/my-atk-component.h
new file mode 100644 (file)
index 0000000..722d1f5
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_COMPONENT_H
+#define MY_ATK_COMPONENT_H
+
+#include <atk/atk.h>
+
+#define MY_TYPE_ATK_COMPONENT (my_atk_component_get_type ())
+#define MY_ATK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_COMPONENT, MyAtkComponent))
+#define MY_ATK_COMPONENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_COMPONENT, MyAtkComponentClass))
+#define MY_IS_ATK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_COMPONENT))
+#define MY_IS_ATK_COMPONENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_COMPONENT))
+#define MY_ATK_COMPONENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_COMPONENT, MyAtkComponentClass))
+
+typedef struct _MyAtkComponent MyAtkComponent;
+typedef struct _MyAtkComponentClass MyAtkComponentClass;
+
+typedef void (*MyAtkComponentFunc) (MyAtkComponent *component);
+
+struct _MyAtkComponent
+{
+  MyAtkObject parent;
+  AtkRectangle extent;
+  gboolean extent_may_change;
+  gboolean is_manage_descendants;
+  AtkLayer layer;
+  gint zorder;
+  gdouble alpha;
+};
+
+struct _MyAtkComponentClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_component_get_type ();
+
+void my_atk_component_set_layer (AtkComponent *component, AtkLayer layer);
+void my_atk_component_set_mdi_zorder (AtkComponent *component, gint mdi_zorder);
+void my_atk_component_set_alpha (AtkComponent *component, gdouble alpha);
+
+#endif /*MY_ATK_COMPONENT_H*/
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-document.c b/tests/at-spi2-atk/dummyatk/my-atk-document.c
new file mode 100644 (file)
index 0000000..8582985
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib-object.h>
+
+#include "my-atk-document.h"
+#include "my-atk-object.h"
+
+static void atk_document_interface_init (AtkDocumentIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkDocument,
+                         my_atk_document,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_DOCUMENT,
+                                                atk_document_interface_init));
+
+void
+my_atk_set_document (AtkDocument *obj, gint page, gint page_num)
+{
+  g_return_if_fail (MY_IS_ATK_DOCUMENT (obj));
+  MyAtkDocument *self = MY_ATK_DOCUMENT (obj);
+
+  self->pages = page;
+  self->current_page = page_num;
+
+  AtkAttribute *attr1, *attr2;
+  attr1 = g_malloc (sizeof (AtkAttribute));
+  attr1->name = g_strdup ("atspi1");
+  attr1->value = g_strdup ("test1");
+
+  attr2 = g_malloc (sizeof (AtkAttribute));
+  attr2->name = g_strdup ("atspi2");
+  attr2->value = g_strdup ("test2");
+
+  self->attributes = g_slist_append (NULL, attr1);
+  self->attributes = g_slist_append (self->attributes, attr2);
+}
+
+static void
+my_atk_document_init (MyAtkDocument *obj)
+{
+  obj->disposed = FALSE;
+  obj->locale = NULL;
+  obj->document_type = NULL;
+  obj->pages = 0;
+  obj->current_page = 0;
+}
+
+AtkAttributeSet *
+my_atk_document_get_document_attributes (AtkDocument *document)
+{
+  MyAtkDocument *self = MY_ATK_DOCUMENT (document);
+
+  return self->attributes;
+}
+
+const gchar *
+my_atk_document_get_document_attribute_value (AtkDocument *document, const gchar *value)
+{
+  AtkAttributeSet *attr = my_atk_document_get_document_attributes (document);
+  GSList *cur_attr = (GSList *) attr;
+  AtkAttribute *at;
+
+  while (cur_attr)
+    {
+      at = (AtkAttribute *) cur_attr->data;
+      if (!g_strcmp0 (at->name, value))
+        {
+          return at->value;
+        }
+      cur_attr = cur_attr->next;
+    }
+  return NULL;
+}
+
+gboolean
+my_atk_document_set_document_attribute (AtkDocument *document, const gchar *attribute_name, const gchar *attribute_value)
+{
+  return FALSE;
+}
+
+gint
+my_atk_document_get_current_page_number (AtkDocument *document)
+{
+  return 0;
+}
+
+gint
+my_atk_document_get_page_count (AtkDocument *document)
+{
+  return 0;
+}
+
+const gchar *
+my_atk_document_get_document_locale (AtkDocument *document)
+{
+
+  return g_strdup ("document_locale");
+}
+
+static GArray *
+my_atk_document_get_text_selections (AtkDocument *document)
+{
+  g_return_val_if_fail (MY_IS_ATK_DOCUMENT (document), NULL);
+  MyAtkDocument *self = MY_ATK_DOCUMENT (document);
+
+  return self->text_selections;
+}
+
+static gboolean
+my_atk_document_set_text_selections (AtkDocument *document, GArray *selections)
+{
+  g_return_val_if_fail (MY_IS_ATK_DOCUMENT (document), FALSE);
+  MyAtkDocument *self = MY_ATK_DOCUMENT (document);
+
+  if (self->text_selections)
+    g_array_free (self->text_selections, TRUE);
+  self->text_selections = g_array_copy (selections);
+  return TRUE;
+}
+
+static void
+atk_document_interface_init (AtkDocumentIface *iface)
+{
+  if (!iface)
+    return;
+
+  iface->get_document_locale = my_atk_document_get_document_locale;
+  iface->get_document_attributes = my_atk_document_get_document_attributes;
+  iface->get_document_attribute_value = my_atk_document_get_document_attribute_value;
+  iface->set_document_attribute = my_atk_document_set_document_attribute;
+  iface->get_current_page_number = my_atk_document_get_current_page_number;
+  iface->get_page_count = my_atk_document_get_page_count;
+  iface->get_text_selections = my_atk_document_get_text_selections;
+  iface->set_text_selections = my_atk_document_set_text_selections;
+}
+
+static void
+my_atk_document_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_document_finalize (GObject *object)
+{
+}
+
+static void
+my_atk_document_class_init (MyAtkDocumentClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_document_finalize;
+
+  atk_class->initialize = my_atk_document_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-document.h b/tests/at-spi2-atk/dummyatk/my-atk-document.h
new file mode 100644 (file)
index 0000000..03ce40f
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_DOCUMENT_H
+#define MY_ATK_DOCUMENT_H
+
+#include "my-atk-object.h"
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#define MY_TYPE_ATK_DOCUMENT (my_atk_document_get_type ())
+#define MY_ATK_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_DOCUMENT, MyAtkDocument))
+#define MY_ATK_DOCUMENT_CLASS(vdocument) (G_TYPE_CHECK_CLASS_CAST ((vdocument), MY_TYPE_ATK_DOCUMENT, MyAtkDocumentClass))
+#define MY_IS_ATK_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_DOCUMENT))
+#define MY_IS_ATK_DOCUMENT_CLASS(vdocument) (G_TYPE_CHECK_CLASS_TYPE ((vdocument), MY_TYPE_ATK_DOCUMENT))
+#define MY_ATK_DOCUMENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_DOCUMENT, MyAtkDocumentClass))
+
+// default string values
+#define DEF_LOCALE_TEXT "en-US"
+#define DEF_TYPE_TEXT "default type"
+
+typedef struct _MyAtkDocument MyAtkDocument;
+typedef struct _MyAtkDocumentClass MyAtkDocumentClass;
+
+struct _MyAtkDocument
+{
+  MyAtkObject parent;
+  gboolean disposed;
+  gchar *locale;
+  gchar *document_type;
+  gint pages;
+  gint current_page;
+  AtkAttributeSet *attributes;
+  GArray *text_selections;
+};
+
+struct _MyAtkDocumentClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_document_get_type (void);
+
+void my_atk_set_document (AtkDocument *obj, gint page, gint page_num);
+
+#endif /*MY_ATK_DOCUMENT_H*/
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-editable-text.c b/tests/at-spi2-atk/dummyatk/my-atk-editable-text.c
new file mode 100644 (file)
index 0000000..b013a3e
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib-object.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-editable-text.h"
+#include "my-atk-object.h"
+
+typedef struct _MyAtkEditableTextInfo MyAtkEditableTextInfo;
+
+static void atk_editable_text_interface_init (AtkEditableTextIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkEditableText,
+                         my_atk_editable_text,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT,
+                                                atk_editable_text_interface_init));
+
+guint
+my_atk_set_editable_text (AtkEditableText *editable_text, const gchar *text)
+{
+  g_return_val_if_fail (MY_IS_ATK_EDITABLE_TEXT (editable_text), -1);
+
+  return 0;
+}
+
+static void
+my_atk_editable_text_init (MyAtkEditableText *obj)
+{
+  obj->text = NULL;
+}
+
+static gboolean
+my_atk_set_editable_text_set_run_attributes (AtkEditableText *text,
+                                             AtkAttributeSet *attrib_set,
+                                             gint start_offset,
+                                             gint end_offset)
+{
+  return FALSE;
+}
+
+static void
+my_atk_set_editable_text_set_text_contents (AtkEditableText *text,
+                                            const gchar *string)
+{
+}
+
+static void
+my_atk_set_editable_text_insert_text (AtkEditableText *text,
+                                      const gchar *string,
+                                      gint length,
+                                      gint *position)
+{
+}
+
+static void
+my_atk_set_editable_text_copy_text (AtkEditableText *text,
+                                    gint start_pos,
+                                    gint end_pos)
+{
+}
+
+static void
+my_atk_set_editable_text_cut_text (AtkEditableText *text,
+                                   gint start_pos,
+                                   gint end_pos)
+{
+}
+
+static void
+my_atk_set_editable_text_delete_text (AtkEditableText *text,
+                                      gint start_pos,
+                                      gint end_pos)
+{
+}
+
+static void
+my_atk_set_editable_text_paste_text (AtkEditableText *text,
+                                     gint position)
+{
+}
+
+static void
+atk_editable_text_interface_init (AtkEditableTextIface *iface)
+{
+  if (!iface)
+    return;
+  iface->set_run_attributes = my_atk_set_editable_text_set_run_attributes;
+  iface->set_text_contents = my_atk_set_editable_text_set_text_contents;
+  iface->insert_text = my_atk_set_editable_text_insert_text;
+  iface->copy_text = my_atk_set_editable_text_copy_text;
+  iface->cut_text = my_atk_set_editable_text_cut_text;
+  iface->delete_text = my_atk_set_editable_text_delete_text;
+  iface->paste_text = my_atk_set_editable_text_paste_text;
+}
+
+static void
+my_atk_editable_text_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_editable_text_finalize (GObject *object)
+{
+}
+
+static void
+my_atk_editable_text_class_init (MyAtkEditableTextClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_editable_text_finalize;
+
+  atk_class->initialize = my_atk_editable_text_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-editable-text.h b/tests/at-spi2-atk/dummyatk/my-atk-editable-text.h
new file mode 100644 (file)
index 0000000..853a531
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_EDITABLE_TEXT_H_
+#define MY_ATK_EDITABLE_TEXT_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+
+#define MY_TYPE_ATK_EDITABLE_TEXT (my_atk_editable_text_get_type ())
+#define MY_ATK_EDITABLE_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_EDITABLE_TEXT, MyAtkEditableText))
+#define MY_ATK_EDITABLE_TEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_EDITABLE_TEXT, MyAtkEditableTextClass))
+#define MY_IS_ATK_EDITABLE_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_EDITABLE_TEXT))
+#define MY_IS_ATK_EDITABLE_TEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_EDITABLE_TEXT))
+#define MY_ATK_EDITABLE_TEXT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_EDITABLE_TEXT, MyAtkEditableTextClass))
+
+typedef struct _MyAtkEditableText MyAtkEditableText;
+typedef struct _MyAtkEditableTextClass MyAtkEditableTextClass;
+
+typedef void (*MyAtkEditableTextFunc) (MyAtkEditableText *editable_text);
+
+struct _MyAtkEditableText
+{
+  MyAtkObject parent;
+  gchar *text;
+};
+
+struct _MyAtkEditableTextClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_editable_text_get_type (void);
+
+guint my_atk_set_editable_text (AtkEditableText *editable_text, const gchar *text);
+
+#endif /* MY_ATK_EDITABLE_TEXT_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-hyperlink.c b/tests/at-spi2-atk/dummyatk/my-atk-hyperlink.c
new file mode 100644 (file)
index 0000000..0e7b6ac
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-hyperlink.h"
+#include "my-atk-object.h"
+#include "my-atk-text.h"
+
+typedef struct _MyAtkHyperlinkInfo MyAtkHyperlinkInfo;
+
+G_DEFINE_TYPE (MyAtkHyperlink, my_atk_hyperlink, ATK_TYPE_HYPERLINK)
+
+gint
+my_atk_set_hyperlink (AtkHyperlink *obj, const gchar *uri, gint start, gint end)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
+
+  self->uri = g_strdup (uri);
+  self->start = start;
+  self->end = end;
+  self->state = FALSE;
+  self->selected = FALSE;
+
+  return 0;
+}
+
+MyAtkHyperlink *
+new_MyAtkHyperlink (void)
+{
+  return g_object_new (MY_TYPE_ATK_HYPERLINK, NULL);
+}
+
+static gchar *
+my_atk_hyperlink_get_uri (AtkHyperlink *obj, gint i)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), NULL);
+
+  return self->uri;
+}
+
+static AtkObject *
+my_atk_hyperlink_get_object (AtkHyperlink *obj, gint i)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  MyAtkText *text;
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), NULL);
+
+  text = my_atk_text_new ();
+  my_atk_set_text (ATK_TEXT (text),
+                   self->uri,
+                   10,
+                   50,
+                   self->end - self->start,
+                   15,
+                   NULL);
+
+  return ATK_OBJECT (text);
+}
+
+static gint
+my_atk_hyperlink_get_end_index (AtkHyperlink *obj)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
+
+  return self->end;
+}
+
+static gint
+my_atk_hyperlink_get_start_index (AtkHyperlink *obj)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
+
+  return self->start;
+}
+
+static gboolean
+my_atk_hyperlink_is_valid (AtkHyperlink *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), FALSE);
+
+  return TRUE;
+}
+
+static gint
+my_atk_hyperlink_get_n_anchors (AtkHyperlink *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
+
+  return 1;
+}
+
+static guint
+my_atk_hyperlink_link_state (AtkHyperlink *obj)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), -1);
+
+  return self->state;
+}
+
+static gboolean
+my_atk_hyperlink_is_selected_link (AtkHyperlink *obj)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERLINK (obj), FALSE);
+
+  return self->selected;
+}
+
+static void
+my_atk_hyperlink_link_activated (AtkHyperlink *obj)
+{
+  MyAtkHyperlink *self = MY_ATK_HYPERLINK (obj);
+  g_return_if_fail (MY_IS_ATK_HYPERLINK (obj));
+
+  self->selected = !self->selected;
+}
+
+static void
+my_atk_hyperlink_init (MyAtkHyperlink *self)
+{
+  self->uri = NULL;
+  self->start = -1;
+  self->end = -1;
+  self->state = FALSE;
+  self->selected = FALSE;
+}
+
+static void
+my_atk_hyperlink_set_property (GObject *obj,
+                               guint id,
+                               const GValue *value,
+                               GParamSpec *spec)
+{
+  switch (id)
+    {
+    case 1:
+      break;
+    case 2:
+      break;
+    case 3:
+      break;
+    default:
+      // G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
+      break;
+    }
+}
+
+static void
+my_atk_hyperlink_get_property (GObject *obj,
+                               guint id,
+                               GValue *value,
+                               GParamSpec *pspec)
+{
+}
+
+static void
+my_atk_hyperlink_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_hyperlink_class_init (MyAtkHyperlinkClass *my_class)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+  AtkHyperlinkClass *iface = ATK_HYPERLINK_CLASS (my_class);
+  const gchar *inst_tab[] = { "accessible-name", "accessible-description", "accessible-role", NULL };
+
+  gobject_class->finalize = my_atk_hyperlink_class_finalize;
+  gobject_class->set_property = my_atk_hyperlink_set_property;
+  gobject_class->get_property = my_atk_hyperlink_get_property;
+
+  gint i;
+  for (i = 0; inst_tab[i] != NULL; i++)
+    g_object_class_install_property (gobject_class,
+                                     i + 1,
+                                     g_param_spec_string (inst_tab[i],
+                                                          inst_tab[i],
+                                                          inst_tab[i],
+                                                          NULL,
+                                                          G_PARAM_READWRITE));
+
+  iface->get_uri = my_atk_hyperlink_get_uri;
+  iface->get_object = my_atk_hyperlink_get_object;
+  iface->get_end_index = my_atk_hyperlink_get_end_index;
+  iface->get_start_index = my_atk_hyperlink_get_start_index;
+  iface->is_valid = my_atk_hyperlink_is_valid;
+  iface->get_n_anchors = my_atk_hyperlink_get_n_anchors;
+  iface->link_state = my_atk_hyperlink_link_state;
+  iface->is_selected_link = my_atk_hyperlink_is_selected_link;
+  iface->link_activated = my_atk_hyperlink_link_activated;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-hyperlink.h b/tests/at-spi2-atk/dummyatk/my-atk-hyperlink.h
new file mode 100644 (file)
index 0000000..9886b58
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_HYPERLINK_H_
+#define MY_ATK_HYPERLINK_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+
+#define MY_TYPE_ATK_HYPERLINK (my_atk_hyperlink_get_type ())
+#define MY_ATK_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_HYPERLINK, MyAtkHyperlink))
+#define MY_ATK_HYPERLINK_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_HYPERLINK, MyAtkHyperlinkClass))
+#define MY_IS_ATK_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_HYPERLINK))
+#define MY_IS_ATK_HYPERLINK_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_HYPERLINK))
+#define MY_ATK_HYPERLINK_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_HYPERLINK, MyAtkHyperlinkClass))
+
+typedef struct _MyAtkHyperlink MyAtkHyperlink;
+typedef struct _MyAtkHyperlinkClass MyAtkHyperlinkClass;
+
+struct _MyAtkHyperlink
+{
+  MyAtkObject parent;
+  gchar *uri;
+  gint start;
+  gint end;
+  gboolean state;
+  gboolean selected;
+};
+
+struct _MyAtkHyperlinkClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_hyperlink_get_type (void);
+
+MyAtkHyperlink *new_MyAtkHyperlink (void);
+
+gint my_atk_set_hyperlink (AtkHyperlink *obj, const gchar *uri, gint start, gint end);
+
+#endif /* MY_ATK_HYPERLINK_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-hypertext.c b/tests/at-spi2-atk/dummyatk/my-atk-hypertext.c
new file mode 100644 (file)
index 0000000..11b6545
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-hyperlink.h"
+#include "my-atk-hypertext.h"
+#include "my-atk-object.h"
+
+typedef struct _MyAtkHypertextInfo MyAtkHypertextInfo;
+
+static void atk_hypertext_interface_init (AtkHypertextIface *iface);
+static void GDestroyNotifyGOBJptrArray (gpointer data);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkHypertext,
+                         my_atk_hypertext,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERTEXT,
+                                                atk_hypertext_interface_init));
+
+gint
+my_atk_set_hypertext (AtkHypertext *obj, const gchar *text)
+{
+  MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+  MyAtkHyperlink *link;
+  gchar *ptr;
+  const gchar *fstr = "href=";
+  gint len = strlen (fstr);
+  gint text_len = strlen (text);
+  gint index = 0;
+  gint start_offset;
+  g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), -1);
+
+  if (text_len < len)
+    return -1;
+
+  while (text)
+    {
+      ptr = g_strstr_len (text + index, text_len - index, fstr);
+      index = ptr - text + len;
+      if (ptr)
+        {
+          if (text_len < index || index < len)
+            break;
+          if (text[index] == '\'')
+            {
+              start_offset = index + 1;
+              while (++index < text_len && text[index] != '\'')
+                ;
+              if (text[index] != '\'')
+                break;
+              link = new_MyAtkHyperlink ();
+              my_atk_set_hyperlink (ATK_HYPERLINK (link),
+                                    g_strndup (text + start_offset, index - start_offset),
+                                    start_offset,
+                                    index);
+              g_ptr_array_add (self->array, link);
+            }
+        }
+      else
+        break;
+    }
+
+  return self->array->len > 0 ? 0 : -1;
+}
+
+static gint
+my_atk_hypertext_get_n_links (AtkHypertext *obj)
+{
+  MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+  g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), -1);
+  return self->array->len;
+}
+
+static AtkHyperlink *
+my_atk_hypertext_get_link (AtkHypertext *obj, gint link_index)
+{
+  MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+  AtkHyperlink *link = NULL;
+  g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), NULL);
+  if (0 <= link_index && link_index < self->array->len)
+    link = g_ptr_array_index (self->array, link_index);
+  return link;
+}
+
+static gint
+my_atk_hypertext_get_link_index (AtkHypertext *obj, gint char_index)
+{
+  MyAtkHypertext *self = MY_ATK_HYPERTEXT (obj);
+  gint i;
+  MyAtkHyperlink *link;
+  g_return_val_if_fail (MY_IS_ATK_HYPERTEXT (obj), -1);
+
+  for (i = 0; i < self->array->len; i++)
+    {
+      link = g_ptr_array_index (self->array, i);
+      if (link->start <= char_index && char_index <= link->end)
+        return i;
+    }
+  return -1;
+}
+
+static void
+my_atk_hypertext_link_selected (AtkHypertext *obj, gint link_index)
+{
+  g_return_if_fail (MY_IS_ATK_HYPERTEXT (obj));
+}
+
+static void
+GDestroyNotifyGOBJptrArray (gpointer data)
+{
+  g_object_unref (data);
+}
+
+static void
+atk_hypertext_interface_init (AtkHypertextIface *iface)
+{
+  if (!iface)
+    return;
+  iface->get_n_links = my_atk_hypertext_get_n_links;
+  iface->get_link = my_atk_hypertext_get_link;
+  iface->get_link_index = my_atk_hypertext_get_link_index;
+  iface->link_selected = my_atk_hypertext_link_selected;
+}
+
+static void
+my_atk_hypertext_init (MyAtkHypertext *self)
+{
+  self->array = g_ptr_array_new_full (2, GDestroyNotifyGOBJptrArray);
+}
+
+static void
+my_atk_hypertext_class_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_hypertext_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_hypertext_class_init (MyAtkHypertextClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_hypertext_class_finalize;
+
+  atk_class->initialize = my_atk_hypertext_class_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-hypertext.h b/tests/at-spi2-atk/dummyatk/my-atk-hypertext.h
new file mode 100644 (file)
index 0000000..e71d861
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_HYPERTEXT_H_
+#define MY_ATK_HYPERTEXT_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+#define MY_TYPE_ATK_HYPERTEXT (my_atk_hypertext_get_type ())
+#define MY_ATK_HYPERTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_HYPERTEXT, MyAtkHypertext))
+#define MY_ATK_HYPERTEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_HYPERTEXT, MyAtkHypertextClass))
+#define MY_IS_ATK_HYPERTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_HYPERTEXT))
+#define MY_IS_ATK_HYPERTEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_HYPERTEXT))
+#define MY_ATK_HYPERTEXT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_HYPERTEXT, MyAtkHypertextClass))
+
+typedef struct _MyAtkHypertext MyAtkHypertext;
+typedef struct _MyAtkHypertextClass MyAtkHypertextClass;
+
+struct _MyAtkHypertext
+{
+  MyAtkObject parent;
+  GPtrArray *array;
+};
+
+struct _MyAtkHypertextClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_hypertext_get_type (void);
+
+gint my_atk_set_hypertext (AtkHypertext *obj, const gchar *text);
+
+#endif /* MY_ATK_HYPERTEXT_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-image.c b/tests/at-spi2-atk/dummyatk/my-atk-image.c
new file mode 100644 (file)
index 0000000..1a54c1d
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-image.h"
+#include "my-atk-object.h"
+
+typedef struct _MyAtkImageInfo MyAtkImageInfo;
+
+static void atk_image_interface_init (AtkImageIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkImage,
+                         my_atk_image,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE,
+                                                atk_image_interface_init));
+
+guint
+my_atk_set_image (AtkImage *image,
+                  const gchar *desc,
+                  const gint x,
+                  const gint y,
+                  const gint width,
+                  const gint height,
+                  const gchar *locale)
+{
+  g_return_val_if_fail (MY_IS_ATK_IMAGE (image), FALSE);
+
+  MyAtkImage *self = MY_ATK_IMAGE (image);
+
+  self->description = g_strdup (desc);
+  self->x = x;
+  self->y = y;
+  self->width = width;
+  self->height = height;
+  self->locale = g_strdup (locale);
+
+  return 0;
+}
+
+static void
+my_atk_image_init (MyAtkImage *obj)
+{
+  MyAtkImage *self = MY_ATK_IMAGE (obj);
+  self->description = NULL;
+  self->x = -1;
+  self->y = -1;
+  self->width = -1;
+  self->height = -1;
+  self->locale = NULL;
+}
+
+void
+my_atk_image_get_image_position (AtkImage *obj, gint *x, gint *y, AtkCoordType coord_type)
+{
+  g_return_if_fail (MY_IS_ATK_IMAGE (obj));
+
+  MyAtkImage *self = MY_ATK_IMAGE (obj);
+  *x = self->x;
+  *y = self->y;
+}
+
+const gchar *
+my_atk_image_get_image_description (AtkImage *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_IMAGE (obj), NULL);
+
+  MyAtkImage *self = MY_ATK_IMAGE (obj);
+
+  return g_strdup (self->description);
+}
+
+void
+my_atk_image_get_image_size (AtkImage *obj, gint *width, gint *height)
+{
+  g_return_if_fail (MY_IS_ATK_IMAGE (obj));
+
+  MyAtkImage *self = MY_ATK_IMAGE (obj);
+  *width = self->width;
+  *height = self->height;
+}
+
+gboolean
+my_atk_image_set_image_description (AtkImage *obj, const gchar *desc)
+{
+  g_return_val_if_fail (MY_IS_ATK_IMAGE (obj), FALSE);
+
+  MyAtkImage *self = MY_ATK_IMAGE (obj);
+
+  g_free (self->description);
+  self->description = g_strdup (desc);
+
+  return TRUE;
+}
+
+const gchar *
+my_atk_image_get_image_locale (AtkImage *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_IMAGE (obj), NULL);
+
+  MyAtkImage *self = MY_ATK_IMAGE (obj);
+
+  return self->locale;
+}
+
+static void
+atk_image_interface_init (AtkImageIface *iface)
+{
+  if (!iface)
+    return;
+  iface->get_image_position = my_atk_image_get_image_position;
+  iface->set_image_description = my_atk_image_set_image_description;
+  iface->get_image_description = my_atk_image_get_image_description;
+  iface->get_image_size = my_atk_image_get_image_size;
+  iface->get_image_locale = my_atk_image_get_image_locale;
+}
+
+static void
+my_atk_image_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_image_finalize (GObject *object)
+{
+}
+
+static void
+my_atk_image_class_init (MyAtkImageClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_image_finalize;
+
+  atk_class->initialize = my_atk_image_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-image.h b/tests/at-spi2-atk/dummyatk/my-atk-image.h
new file mode 100644 (file)
index 0000000..38b4049
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_IMAGE_H_
+#define MY_ATK_IMAGE_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+
+#define MY_TYPE_ATK_IMAGE (my_atk_image_get_type ())
+#define MY_ATK_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_IMAGE, MyAtkImage))
+#define MY_ATK_IMAGE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_IMAGE, MyAtkImageClass))
+#define MY_IS_ATK_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_IMAGE))
+#define MY_IS_ATK_IMAGE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_IMAGE))
+#define MY_ATK_IMAGE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_IMAGE, MyAtkImageClass))
+
+typedef struct _MyAtkImage MyAtkImage;
+typedef struct _MyAtkImageClass MyAtkImageClass;
+
+typedef void (*MyAtkImageFunc) (MyAtkImage *image);
+
+struct _MyAtkImage
+{
+  MyAtkObject parent;
+  gchar *description;
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+  gchar *locale;
+};
+
+struct _MyAtkImageClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_image_get_type (void);
+
+guint my_atk_set_image (AtkImage *image,
+                        const gchar *desc,
+                        const gint x,
+                        const gint y,
+                        const gint width,
+                        const gint height,
+                        const gchar *locale);
+
+#endif /* MY_ATK_IMAGE_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-object.c b/tests/at-spi2-atk/dummyatk/my-atk-object.c
new file mode 100644 (file)
index 0000000..72bfc30
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <stdio.h>
+
+#include "my-atk-object.h"
+
+GType my_atk_object_get_type (void);
+
+G_DEFINE_TYPE (MyAtkObject,
+               my_atk_object,
+               ATK_TYPE_OBJECT);
+
+void
+my_atk_object_add_child (MyAtkObject *parent,
+                         MyAtkObject *child)
+{
+  g_ptr_array_add (parent->children, child);
+  g_object_ref_sink (child);
+
+  atk_object_set_parent (ATK_OBJECT (child), ATK_OBJECT (parent));
+
+  g_signal_emit_by_name (parent, "children-changed::add",
+                         parent->children->len - 1,
+                         child);
+}
+
+void
+my_atk_object_remove_child (MyAtkObject *parent,
+                            MyAtkObject *child)
+{
+  gint i;
+  for (i = parent->children->len - 1; i >= 0; i--)
+    {
+      if (g_ptr_array_index (parent->children, i) == child)
+        break;
+    }
+  g_return_if_fail (i < 0);
+  g_ptr_array_remove_index (parent->children, i);
+  g_signal_emit_by_name (parent, "children-changed::remove", i, child);
+}
+
+static void
+my_atk_object_set_parent (AtkObject *accessible, AtkObject *parent)
+{
+  MyAtkObject *self = MY_ATK_OBJECT (accessible);
+  AtkObject *parent_old = atk_object_get_parent (accessible);
+
+  if (parent_old == parent)
+    return;
+
+  AtkObjectClass *klass = ATK_OBJECT_CLASS (my_atk_object_parent_class);
+  klass->set_parent (accessible, parent);
+
+  if (parent_old != NULL)
+    my_atk_object_remove_child (MY_ATK_OBJECT (parent_old), self);
+}
+
+static gint
+my_atk_object_get_n_children (AtkObject *accessible)
+{
+  MyAtkObject *self = MY_ATK_OBJECT (accessible);
+  return self->children->len;
+}
+
+static AtkObject *
+my_atk_object_ref_child (AtkObject *accessible, gint i)
+{
+  MyAtkObject *self = MY_ATK_OBJECT (accessible);
+
+  g_return_val_if_fail (i >= 0 || i <= self->children->len, NULL);
+
+  AtkObject *child = ATK_OBJECT (g_ptr_array_index (self->children, i));
+
+  return (child == NULL) ? NULL : g_object_ref (child);
+}
+
+static gint
+my_atk_object_get_index_in_parent (AtkObject *accessible)
+{
+  AtkObject *parent = atk_object_get_parent (accessible);
+  if (parent == NULL)
+    return -1; /*root object so no parent*/
+
+  MyAtkObject *parent_my = MY_ATK_OBJECT (parent);
+
+  int i = parent_my->children->len;
+  for (; i >= 0; i--)
+    {
+      if (g_ptr_array_index (parent_my->children, i) == accessible)
+        break;
+    }
+
+  g_return_val_if_fail (i >= 0, -1);
+
+  return i;
+}
+
+static AtkRelationSet *
+my_atk_object_ref_relation_set (AtkObject *accessible)
+{
+  MyAtkObject *obj = MY_ATK_OBJECT (accessible);
+  if (obj->relation_set == NULL)
+    obj->relation_set = atk_relation_set_new ();
+  return g_object_ref (ATK_RELATION_SET (obj->relation_set));
+}
+
+static AtkStateSet *
+my_atk_object_ref_state_set (AtkObject *accessible)
+{
+  MyAtkObject *obj = MY_ATK_OBJECT (accessible);
+  if (obj->state_set == NULL)
+    obj->state_set = atk_state_set_new ();
+  return g_object_ref (ATK_STATE_SET (obj->state_set));
+}
+
+static AtkAttributeSet *
+my_atk_object_get_attributes (AtkObject *accessible)
+{
+  AtkAttributeSet *attributes = NULL;
+  AtkAttribute *attr;
+
+  attr = g_new0 (AtkAttribute, 1);
+  attr->name = g_strdup ("atspi1");
+  attr->value = g_strdup ("test1");
+  attributes = g_slist_prepend (attributes, attr);
+
+  attr = g_new0 (AtkAttribute, 1);
+  attr->name = g_strdup ("atspi2");
+  attr->value = g_strdup ("test2");
+  attributes = g_slist_prepend (attributes, attr);
+
+  return attributes;
+}
+
+static void
+my_atk_object_init (MyAtkObject *self)
+{
+  self->children = g_ptr_array_new_full (10, g_object_unref);
+}
+
+static void
+my_atk_object_class_init (MyAtkObjectClass *my_class)
+{
+  AtkObjectClass *object_class = ATK_OBJECT_CLASS (my_class);
+
+  object_class->set_parent = my_atk_object_set_parent;
+  object_class->get_n_children = my_atk_object_get_n_children;
+  object_class->ref_child = my_atk_object_ref_child;
+  object_class->get_index_in_parent = my_atk_object_get_index_in_parent;
+  object_class->ref_state_set = my_atk_object_ref_state_set;
+  object_class->get_attributes = my_atk_object_get_attributes;
+  object_class->ref_relation_set = my_atk_object_ref_relation_set;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-object.h b/tests/at-spi2-atk/dummyatk/my-atk-object.h
new file mode 100644 (file)
index 0000000..0213bcc
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_OBJECT_H
+#define MY_ATK_OBJECT_H
+
+#include <atk/atk.h>
+
+#define MY_TYPE_ATK_OBJECT (my_atk_object_get_type ())
+#define MY_ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_OBJECT, MyAtkObject))
+#define MY_ATK_OBJECT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_OBJECT, MyAtkObjectClass))
+#define MY_IS_ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_OBJECT))
+#define MY_IS_ATK_OBJECT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_OBJECT))
+#define MY_ATK_OBJECT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_OBJECT, MyAtkObjectClass))
+
+typedef struct _MyAtkObject MyAtkObject;
+typedef struct _MyAtkObjectClass MyAtkObjectClass;
+
+struct _MyAtkObject
+{
+  AtkObject parent;
+  AtkStateSet *state_set;
+  AtkRelationSet *relation_set;
+  GPtrArray *children;
+  gint id;
+  gboolean selected;
+};
+
+struct _MyAtkObjectClass
+{
+  AtkObjectClass parent;
+};
+
+GType my_atk_object_get_type ();
+
+void my_atk_object_add_child (MyAtkObject *parent,
+                              MyAtkObject *child);
+
+void my_atk_object_remove_child (MyAtkObject *parent,
+                                 MyAtkObject *child);
+
+#endif /*MY_ATK_OBJECT_H*/
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-selection.c b/tests/at-spi2-atk/dummyatk/my-atk-selection.c
new file mode 100644 (file)
index 0000000..0564a3e
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-object.h"
+#include "my-atk-selection.h"
+
+static void atk_selection_interface_init (AtkSelectionIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkSelection,
+                         my_atk_selection,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION,
+                                                atk_selection_interface_init));
+
+static void
+my_atk_selection_init (MyAtkSelection *obj)
+{
+}
+
+static gboolean
+my_atk_selection_add_selection (AtkSelection *selection, gint i)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  if (!self)
+    return FALSE;
+
+  AtkObject *child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+  AtkStateSet *ss = atk_object_ref_state_set (child);
+  atk_state_set_add_state (ss, ATK_STATE_SELECTED);
+  return atk_state_set_contains_state (ss, ATK_STATE_SELECTED);
+}
+
+static gboolean
+my_atk_selection_clear_selection (AtkSelection *selection)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  if (!self)
+    return FALSE;
+  AtkObject *child = NULL;
+  AtkStateSet *states = NULL;
+  int i;
+  int childs = atk_object_get_n_accessible_children (ATK_OBJECT (selection));
+
+  for (i = 0; i < childs; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+      states = atk_object_ref_state_set (child);
+      atk_state_set_remove_state (states, ATK_STATE_SELECTED);
+    }
+  return TRUE;
+}
+
+static AtkObject *
+my_atk_selection_ref_selection (AtkSelection *selection, gint no)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  if (!self)
+    return FALSE;
+  AtkObject *child = NULL;
+  AtkStateSet *states = NULL;
+  GArray *array = g_array_new (FALSE, FALSE, sizeof (AtkObject *));
+  int i;
+  int childs = atk_object_get_n_accessible_children (ATK_OBJECT (selection));
+
+  for (i = 0; i < childs; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+      states = atk_object_ref_state_set (child);
+      if (atk_state_set_contains_state (states, ATK_STATE_SELECTED))
+        g_array_append_val (array, child);
+    }
+
+  return g_array_index (array, AtkObject *, no);
+}
+
+static gint
+my_atk_selection_get_selection_count (AtkSelection *selection)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  if (!self)
+    return FALSE;
+  AtkObject *child = NULL;
+  AtkStateSet *states = NULL;
+  int i, ret = 0;
+  int childs = atk_object_get_n_accessible_children (ATK_OBJECT (selection));
+
+  for (i = 0; i < childs; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+      states = atk_object_ref_state_set (child);
+      if (atk_state_set_contains_state (states, ATK_STATE_SELECTED))
+        ret++;
+    }
+  return ret;
+}
+
+static gboolean
+my_atk_selection_is_child_selected (AtkSelection *selection, gint i)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  if (!self)
+    return FALSE;
+  AtkObject *child = NULL;
+  AtkStateSet *states = NULL;
+  child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+  states = atk_object_ref_state_set (child);
+  if (atk_state_set_contains_state (states, ATK_STATE_SELECTED))
+    return TRUE;
+  return FALSE;
+}
+
+static gboolean
+my_atk_selection_remove_selection (AtkSelection *selection, gint no)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  AtkObject *child = NULL;
+  AtkStateSet *states = NULL;
+  GArray *array = NULL;
+  AtkObject *o = NULL;
+  int i;
+  int childs;
+  gboolean ret = FALSE;
+
+  if (!self)
+    return FALSE;
+  array = g_array_new (FALSE, FALSE, sizeof (AtkObject *));
+  childs = atk_object_get_n_accessible_children (ATK_OBJECT (selection));
+
+  for (i = 0; i < childs; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+      states = atk_object_ref_state_set (child);
+      if (atk_state_set_contains_state (states, ATK_STATE_SELECTED))
+        g_array_append_val (array, child);
+    }
+  g_object_unref (states);
+
+  o = g_array_index (array, AtkObject *, no);
+  states = atk_object_ref_state_set (o);
+  atk_state_set_remove_state (states, ATK_STATE_SELECTED);
+
+  ret = !atk_state_set_contains_state (states, ATK_STATE_SELECTED);
+  g_object_unref (states);
+  g_object_unref (o);
+  g_object_unref (self);
+  g_array_free (array, TRUE);
+
+  return ret;
+}
+
+static gboolean
+my_atk_selection_select_all_selection (AtkSelection *selection)
+{
+  MyAtkSelection *self = MY_ATK_SELECTION (selection);
+  AtkObject *child = NULL;
+  AtkStateSet *states = NULL;
+  int i;
+  int childs;
+
+  if (!self)
+    return FALSE;
+  childs = atk_object_get_n_accessible_children (ATK_OBJECT (selection));
+
+  for (i = 0; i < childs; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (selection), i);
+      states = atk_object_ref_state_set (child);
+      atk_state_set_add_state (states, ATK_STATE_SELECTED);
+      g_object_unref (states);
+      g_object_unref (child);
+    }
+
+  g_object_unref (self);
+  return TRUE;
+}
+
+static void
+atk_selection_interface_init (AtkSelectionIface *iface)
+{
+  if (!iface)
+    return;
+
+  iface->add_selection = my_atk_selection_add_selection;
+  iface->clear_selection = my_atk_selection_clear_selection;
+  iface->ref_selection = my_atk_selection_ref_selection;
+  iface->get_selection_count = my_atk_selection_get_selection_count;
+  iface->is_child_selected = my_atk_selection_is_child_selected;
+  iface->remove_selection = my_atk_selection_remove_selection;
+  iface->select_all_selection = my_atk_selection_select_all_selection;
+}
+
+static void
+my_atk_selection_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_selection_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_selection_class_init (MyAtkSelectionClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_selection_finalize;
+
+  atk_class->initialize = my_atk_selection_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-selection.h b/tests/at-spi2-atk/dummyatk/my-atk-selection.h
new file mode 100644 (file)
index 0000000..8f85b32
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_SELECTION_H
+#define MY_ATK_SELECTION_H
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+
+#define MY_TYPE_ATK_SELECTION (my_atk_selection_get_type ())
+#define MY_ATK_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_SELECTION, MyAtkSelection))
+#define MY_ATK_SELECTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_SELECTION, MyAtkSelectionClass))
+#define MY_IS_ATK_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_SELECTION))
+#define MY_IS_ATK_SELECTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_SELECTION))
+#define MY_ATK_SELECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_SELECTION, MyAtkSelectionClass))
+
+/* Number of child objects for the MyAtkSelection instance */
+#define TEST_SELECTION_NCHILDREN 10
+
+typedef struct _MyAtkSelection MyAtkSelection;
+typedef struct _MyAtkSelectionClass MyAtkSelectionClass;
+
+struct _MyAtkSelection
+{
+  MyAtkObject parent;
+  //    gboolean disposed;
+  //  gboolean multisel_supported;
+  //  MyAtkObject* child[TEST_SELECTION_NCHILDREN];
+  // gboolean is_selected[TEST_SELECTION_NCHILDREN];
+};
+
+struct _MyAtkSelectionClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_selection_get_type (void);
+
+guint my_atk_selection_set (MyAtkSelection *selection);
+#endif /*MY_ATK_SELECTION_H*/
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-table-cell.c b/tests/at-spi2-atk/dummyatk/my-atk-table-cell.c
new file mode 100644 (file)
index 0000000..7efeb51
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib.h>
+#include <string.h>
+
+#include "my-atk-object.h"
+#include "my-atk-table-cell.h"
+#include "my-atk-table.h"
+
+typedef struct _MyAtkTableCellInfo MyAtkTableCellInfo;
+
+static void atk_tablecell_interface_init (AtkTableCellIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkTableCell,
+                         my_atk_tablecell,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE_CELL,
+                                                atk_tablecell_interface_init));
+
+gboolean
+my_atk_set_table_cell (AtkTableCell *cell, gint x, gint y, gint row_span, gint column_span)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (cell), FALSE);
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (cell);
+
+  self->x = x;
+  self->y = y;
+  self->row_span = row_span;
+  self->column_span = column_span;
+
+  /* Default value for span is 1, so that condition is needed */
+  if (row_span == 0)
+    self->row_span = 1;
+  if (column_span == 0)
+    self->column_span = 1;
+
+  return TRUE;
+}
+gboolean
+my_atk_set_tablecell (MyAtkTableCell *self, gpointer value, const gchar *row_desc, MyAtkObject *parent_table, gboolean selected, gint *xy)
+{
+  self->value = value;
+  self->row_desc = g_strdup (row_desc);
+  self->parent_table = parent_table;
+  self->selected = selected;
+
+  memcpy (self->xy, xy, sizeof (self->xy));
+  return TRUE;
+}
+
+static gint
+my_atk_tablecell_get_column_span (AtkTableCell *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), -1);
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (obj);
+  return self->column_span;
+}
+
+static gboolean
+my_atk_tablecell_get_row_column_span (AtkTableCell *obj, gint *row, gint *col, gint *row_span, gint *col_span)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), FALSE);
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (obj);
+  *col = self->x;
+  *row = self->y;
+  *row_span = self->row_span;
+  *col_span = self->column_span;
+  return TRUE;
+}
+
+static GPtrArray *
+my_atk_tablecell_get_column_header_cells (AtkTableCell *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), FALSE);
+  MyAtkTable *tab = MY_ATK_TABLE (atk_object_get_parent (ATK_OBJECT (obj)));
+
+  gint i, all_child;
+  all_child = MY_ATK_OBJECT (tab)->children->len;
+  AtkObject *child = NULL;
+  GPtrArray *ret = g_ptr_array_new_full (atk_table_get_n_columns ATK_TABLE (tab), g_object_unref);
+
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (tab), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        {
+          g_ptr_array_add (ret, child);
+        }
+    }
+
+  return ret;
+}
+
+static AtkObject *
+my_atk_tablecell_get_table (AtkTableCell *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), NULL);
+
+  return atk_object_get_parent (ATK_OBJECT (obj));
+}
+
+static gint
+my_atk_tablecell_get_row_span (AtkTableCell *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), -1);
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (obj);
+  return self->row_span;
+}
+
+static gboolean
+my_atk_tablecell_get_position (AtkTableCell *obj, gint *row, gint *column)
+{
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), FALSE);
+
+  *row = self->xy[0];
+  *column = self->xy[1];
+
+  return TRUE;
+}
+
+static GPtrArray *
+my_atk_tablecell_get_row_header_cells (AtkTableCell *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TABLE_CELL (obj), FALSE);
+  MyAtkTable *tab = MY_ATK_TABLE (atk_object_get_parent (ATK_OBJECT (obj)));
+
+  gint i, all_child;
+  all_child = MY_ATK_OBJECT (tab)->children->len;
+  AtkObject *child = NULL;
+  GPtrArray *ret = g_ptr_array_new_full (atk_table_get_n_columns ATK_TABLE (tab), g_object_unref);
+
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (tab), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        {
+          g_ptr_array_add (ret, child);
+        }
+    }
+
+  return ret;
+}
+
+static void
+atk_tablecell_interface_init (AtkTableCellIface *iface)
+{
+  if (!iface)
+    return;
+  iface->get_column_span = my_atk_tablecell_get_column_span;
+  iface->get_column_header_cells = my_atk_tablecell_get_column_header_cells;
+  iface->get_position = my_atk_tablecell_get_position;
+  iface->get_row_span = my_atk_tablecell_get_row_span;
+  iface->get_row_header_cells = my_atk_tablecell_get_row_header_cells;
+  iface->get_row_column_span = my_atk_tablecell_get_row_column_span;
+  iface->get_table = my_atk_tablecell_get_table;
+}
+
+static void
+my_atk_tablecell_init (MyAtkTableCell *self)
+{
+  self->value = NULL;
+  self->parent_table = NULL;
+  self->row_desc = NULL;
+  self->selected = FALSE;
+  memset (self->xy, -1, sizeof (self->xy));
+  self->column_span = 1;
+  self->row_span = 1;
+  self->x = -1;
+  self->y = -1;
+  self->column_index = -1;
+}
+
+static void
+my_atk_tablecell_class_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_tablecell_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_tablecell_class_init (MyAtkTableCellClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_tablecell_class_finalize;
+
+  atk_class->initialize = my_atk_tablecell_class_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-table-cell.h b/tests/at-spi2-atk/dummyatk/my-atk-table-cell.h
new file mode 100644 (file)
index 0000000..3d98137
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_TABLE_CELL_H_
+#define MY_ATK_TABLE_CELL_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+#define MY_TYPE_ATK_TABLE_CELL (my_atk_tablecell_get_type ())
+#define MY_ATK_TABLE_CELL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_TABLE_CELL, MyAtkTableCell))
+#define MY_ATK_TABLE_CELL_CLASS (vtablecell) (G_TYPE_CHECK_CLASS_CAST ((vtablecell), MY_TYPE_ATK_TABLE_CELL, MyAtkTableCellClass))
+#define MY_IS_ATK_TABLE_CELL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_TABLE_CELL))
+#define MY_IS_ATK_TABLE_CELL_CLASS (vtablecell) (G_TYPE_CHECK_CLASS_TYPE ((vtablecell), MY_TYPE_ATK_TABLE_CELL))
+#define MY_ATK_TABLE_CELL_GET_CLASS (inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_TABLE_CELL, MyAtkTableCellClass))
+
+typedef struct _MyAtkTableCell MyAtkTableCell;
+typedef struct _MyAtkTableCellClass MyAtkTableCellClass;
+
+struct _MyAtkTableCell
+{
+  MyAtkObject parent;
+  MyAtkObject *parent_table;
+  gpointer value;
+  gint x;
+  gint y;
+  gint column_span;
+  gint row_span;
+  gint column_index;
+  gboolean selected;
+  gchar *row_desc;
+  gint xy[2];
+};
+
+struct _MyAtkTableCellClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_tablecell_get_type (void);
+
+gboolean my_atk_set_table_cell (AtkTableCell *self, gint x, gint y, gint row, gint column);
+gboolean my_atk_set_tablecell (MyAtkTableCell *self, gpointer value, const gchar *row_desc, MyAtkObject *parent_table, gboolean selected, gint *xy);
+
+#endif /* MY_ATK_TABLE_CELL_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-table.c b/tests/at-spi2-atk/dummyatk/my-atk-table.c
new file mode 100644 (file)
index 0000000..85f1672
--- /dev/null
@@ -0,0 +1,723 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib.h>
+#include <string.h>
+
+#include "my-atk-object.h"
+#include "my-atk-table-cell.h"
+#include "my-atk-table.h"
+
+typedef struct _MyAtkTableInfo MyAtkTableInfo;
+
+static void GDestroyNotifyGPTRARRAYptrArray (gpointer data);
+static void atk_table_interface_init (AtkTableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkTable,
+                         my_atk_table,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE,
+                                                atk_table_interface_init));
+
+static gint
+my_atk_table_get_index_at (AtkTable *obj, gint row, gint column)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint i, all_child, index_first_cell = -1;
+  gint ret = -1;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+
+  MyAtkTableCell *cell = NULL;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_CELL)
+        {
+          if (index_first_cell == -1)
+            {
+              index_first_cell = i;
+            }
+          cell = MY_ATK_TABLE_CELL (child);
+          if (cell->x == column && cell->y == row)
+            {
+              ret = i - index_first_cell;
+            }
+        }
+    }
+  return ret;
+}
+
+static gint
+my_atk_table_get_column_at_index (AtkTable *obj, gint index)
+{
+  MyAtkTable *table = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint columns = -1;
+  gint rows = -1;
+  gint i, j;
+
+  columns = atk_table_get_n_columns (ATK_TABLE (table));
+  rows = atk_table_get_n_rows (ATK_TABLE (table));
+
+  for (i = 0; i < rows; i++)
+    {
+      for (j = 0; j < columns; j++)
+        {
+          if (index == my_atk_table_get_index_at (obj, i, j))
+            return j;
+        }
+    }
+  return -1;
+}
+
+static gint
+my_atk_table_get_row_at_index (AtkTable *obj, gint index)
+{
+  MyAtkTable *table = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint columns = -1;
+  gint rows = -1;
+  gint i, j;
+
+  columns = atk_table_get_n_columns (ATK_TABLE (table));
+  rows = atk_table_get_n_rows (ATK_TABLE (table));
+
+  for (i = 0; i < rows; i++)
+    {
+      for (j = 0; j < columns; j++)
+        {
+          if (index == my_atk_table_get_index_at (obj, i, j))
+            return i;
+        }
+    }
+
+  return -1;
+}
+
+static gint
+my_atk_table_get_n_columns (AtkTable *obj)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint i, all_child, ret = 0;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        ret++;
+    }
+  return ret;
+}
+
+static gint
+my_atk_table_get_n_rows (AtkTable *obj)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint i, all_child, ret = 0;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        ret++;
+    }
+  return ret;
+}
+
+static AtkObject *
+my_atk_table_get_caption (AtkTable *obj)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  AtkObject *caption = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_CAPTION)
+        caption = child;
+    }
+  return caption ? caption : NULL;
+}
+
+static AtkObject *
+my_atk_table_ref_at (AtkTable *obj, gint row, gint column)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  AtkObject *ret = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+
+  MyAtkTableCell *cell = NULL;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_CELL)
+        {
+          cell = MY_ATK_TABLE_CELL (child);
+          if (cell->x == column && cell->y == row)
+            ret = ATK_OBJECT (cell);
+        }
+    }
+  return ret ? ret : NULL;
+}
+
+static const gchar *
+my_atk_table_get_row_description (AtkTable *obj, gint index)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  GPtrArray *ret = g_ptr_array_new_full (my_atk_table_get_n_rows (obj),
+                                         g_object_unref);
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        g_ptr_array_add (ret, child);
+    }
+  child = g_ptr_array_index (ret, index);
+
+  return g_strdup (atk_object_get_description (child));
+}
+
+static const gchar *
+my_atk_table_get_column_description (AtkTable *obj, gint index)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  GPtrArray *ret = g_ptr_array_new_full (my_atk_table_get_n_columns (obj), g_object_unref);
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        g_ptr_array_add (ret, child);
+    }
+  child = g_ptr_array_index (ret, index);
+
+  return g_strdup (atk_object_get_description (child));
+}
+
+static gint
+my_atk_table_test_table_get_row_extent_at (AtkTable *obj, gint row, gint col)
+{
+  AtkObject *cell = my_atk_table_ref_at (obj, row, col);
+
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (cell);
+
+  return self->row_span;
+}
+
+static gint
+my_atk_table_test_table_get_column_extent_at (AtkTable *obj, gint row, gint col)
+{
+  AtkObject *cell = my_atk_table_ref_at (obj, row, col);
+
+  MyAtkTableCell *self = MY_ATK_TABLE_CELL (cell);
+
+  return self->column_span;
+}
+
+static AtkObject *
+my_atk_table_get_row_header (AtkTable *obj, gint row)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  GPtrArray *ret = g_ptr_array_new_full (my_atk_table_get_n_rows (obj), g_object_unref);
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+  AtkObject *c = NULL;
+
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        g_ptr_array_add (ret, child);
+    }
+  c = ATK_OBJECT (g_ptr_array_index (ret, row));
+
+  return atk_object_ref_accessible_child (c, 0);
+}
+
+static AtkObject *
+my_atk_table_get_column_header (AtkTable *obj, gint col)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  GPtrArray *ret = g_ptr_array_new_full (my_atk_table_get_n_rows (obj), g_object_unref);
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+  AtkObject *c = NULL;
+
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        g_ptr_array_add (ret, child);
+    }
+  c = g_ptr_array_index (ret, col);
+
+  return atk_object_ref_accessible_child (c, 0);
+}
+
+gint
+my_atk_table_get_selected_rows (AtkTable *obj, gint **selected)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint i, all_child, row = 0, ret = 0;
+  AtkObject *child = NULL;
+  AtkStateSet *ss = NULL;
+
+  GArray *array = g_array_new (FALSE, FALSE, sizeof (gint));
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        {
+          ss = atk_object_ref_state_set (child);
+          if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+            {
+              ret++;
+              g_array_append_val (array, row);
+            }
+          row++;
+        }
+    }
+  if (selected)
+    *selected = (gint *) g_array_free (array, FALSE);
+  return ret;
+}
+
+gint
+my_atk_table_get_selected_columns (AtkTable *obj, gint **selected)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), -1);
+  gint i, all_child, column = 0, ret = 0;
+  AtkObject *child = NULL;
+  AtkStateSet *ss = NULL;
+
+  GArray *array = g_array_new (FALSE, FALSE, sizeof (gint));
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        {
+          ss = atk_object_ref_state_set (child);
+          if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+            {
+              ret++;
+              g_array_append_val (array, column);
+            }
+          column++;
+        }
+    }
+  if (selected)
+    *selected = (gint *) g_array_free (array, FALSE);
+  return ret;
+}
+
+static gboolean
+my_atk_table_is_row_selected (AtkTable *obj, gint row)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), FALSE);
+  gint i, all_child;
+  AtkObject *child = NULL;
+  AtkObject *c = NULL;
+  AtkStateSet *ss = NULL;
+  GPtrArray *ret = g_ptr_array_new_full (my_atk_table_get_n_rows (obj), g_object_unref);
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        g_ptr_array_add (ret, child);
+    }
+  c = g_ptr_array_index (ret, row);
+  ss = atk_object_ref_state_set (c);
+  if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+    return TRUE;
+  return FALSE;
+}
+
+static gboolean
+my_atk_table_is_column_selected (AtkTable *obj, gint col)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), FALSE);
+  gint i, all_child;
+  AtkObject *child = NULL;
+  AtkObject *c = NULL;
+  AtkStateSet *ss = NULL;
+  GPtrArray *ret = g_ptr_array_new_full (my_atk_table_get_n_columns (obj), g_object_unref);
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        g_ptr_array_add (ret, child);
+    }
+  c = g_ptr_array_index (ret, col);
+  ss = atk_object_ref_state_set (c);
+  if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+    return TRUE;
+  return FALSE;
+}
+
+static gboolean
+my_atk_table_is_selected (AtkTable *obj, gint row, gint col)
+{
+  AtkObject *cell = atk_table_ref_at (obj, row, col);
+  AtkStateSet *ss = atk_object_ref_state_set (cell);
+  gboolean ret = FALSE;
+
+  if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+    ret = TRUE;
+  return ret;
+}
+
+static gboolean
+my_atk_table_add_column_selection (AtkTable *obj, gint col)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), FALSE);
+  gint i, all_child, counter = 0;
+  AtkObject *child = NULL;
+  AtkStateSet *ss = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        {
+          if (col == counter)
+            {
+              ss = atk_object_ref_state_set (child);
+              if (!atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+                {
+                  atk_state_set_add_state (ss, ATK_STATE_SELECTED);
+                  return TRUE;
+                }
+            }
+          counter++;
+        }
+    }
+  return FALSE;
+}
+
+static gboolean
+my_atk_table_add_row_selection (AtkTable *obj, gint row)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), FALSE);
+  gint i, all_child, counter = 0;
+  AtkObject *child = NULL;
+  AtkStateSet *ss = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        {
+          if (row == counter)
+            {
+              ss = atk_object_ref_state_set (child);
+              if (!atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+                {
+                  atk_state_set_add_state (ss, ATK_STATE_SELECTED);
+                  return TRUE;
+                }
+            }
+          counter++;
+        }
+    }
+  return FALSE;
+}
+
+static gboolean
+my_atk_table_remove_column_selection (AtkTable *obj, gint col)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), FALSE);
+  gint i, all_child, counter = 0;
+  AtkObject *child = NULL;
+  AtkStateSet *ss = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_COLUMN_HEADER)
+        {
+          if (col == counter)
+            {
+              ss = atk_object_ref_state_set (child);
+              if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+                {
+                  atk_state_set_remove_state (ss, ATK_STATE_SELECTED);
+                  return TRUE;
+                }
+            }
+          counter++;
+        }
+    }
+  return FALSE;
+}
+
+static gboolean
+my_atk_table_remove_row_selection (AtkTable *obj, gint row)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), FALSE);
+  gint i, all_child, counter = 0;
+  AtkObject *child = NULL;
+  AtkStateSet *ss = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_TABLE_ROW_HEADER)
+        {
+          if (row == counter)
+            {
+              ss = atk_object_ref_state_set (child);
+              if (atk_state_set_contains_state (ss, ATK_STATE_SELECTED))
+                {
+                  atk_state_set_remove_state (ss, ATK_STATE_SELECTED);
+                  return TRUE;
+                }
+            }
+          counter++;
+        }
+    }
+  return FALSE;
+}
+
+static AtkObject *
+my_atk_table_get_summary (AtkTable *obj)
+{
+  MyAtkTable *self = MY_ATK_TABLE (obj);
+  g_return_val_if_fail (MY_IS_ATK_TABLE (obj), NULL);
+  gint i, all_child;
+  AtkObject *summary = NULL;
+
+  all_child = MY_ATK_OBJECT (self)->children->len;
+  AtkObject *child = NULL;
+  for (i = 0; i < all_child; i++)
+    {
+      child = atk_object_ref_accessible_child (ATK_OBJECT (obj), i);
+      if (atk_object_get_role (child) == ATK_ROLE_HEADING)
+        summary = child;
+    }
+  return summary ? summary : NULL;
+}
+
+static void
+my_atk_table_set_column_header (AtkTable *obj, gint column, AtkObject *header)
+{
+}
+
+static void
+my_atk_table_set_column_description (AtkTable *obj, gint column, const gchar *desc)
+{
+}
+
+static void
+my_atk_table_set_caption (AtkTable *obj, AtkObject *caption)
+{
+}
+
+static void
+my_atk_table_set_row_description (AtkTable *obj, gint row, const gchar *desc)
+{
+}
+
+static void
+my_atk_table_set_row_header (AtkTable *obj, gint column, AtkObject *header)
+{
+}
+
+static void
+my_atk_table_set_summary (AtkTable *table, AtkObject *accessible)
+{
+}
+
+static void
+my_atk_table_row_inserted (AtkTable *table, gint row, gint num_inserted)
+{
+}
+
+static void
+my_atk_table_column_inserted (AtkTable *table, gint column, gint num_inserted)
+{
+}
+
+static void
+my_atk_table_row_deleted (AtkTable *table, gint row, gint num_deleted)
+{
+}
+
+static void
+my_atk_table_column_deleted (AtkTable *table, gint column, gint num_deleted)
+{
+}
+
+static void
+my_atk_table_row_reordered (AtkTable *table)
+{
+}
+
+static void
+my_atk_table_column_reordered (AtkTable *table)
+{
+}
+
+static void
+my_atk_table_model_changed (AtkTable *table)
+{
+}
+
+static void
+atk_table_interface_init (AtkTableIface *iface)
+{
+
+  if (!iface)
+    return;
+
+  iface->ref_at = my_atk_table_ref_at;
+
+  /* DEPRICATED BUT NOT IN ATSPI */
+  iface->get_index_at = my_atk_table_get_index_at;
+  iface->get_column_at_index = my_atk_table_get_column_at_index;
+  iface->get_row_at_index = my_atk_table_get_row_at_index;
+  /* DEPRICATED */
+
+  iface->get_n_columns = my_atk_table_get_n_columns;
+  iface->get_n_rows = my_atk_table_get_n_rows;
+  iface->get_column_extent_at = my_atk_table_test_table_get_column_extent_at;
+  iface->get_row_extent_at = my_atk_table_test_table_get_row_extent_at;
+  iface->get_caption = my_atk_table_get_caption;
+  iface->get_column_description = my_atk_table_get_column_description;
+  iface->get_column_header = my_atk_table_get_column_header;
+  iface->get_row_description = my_atk_table_get_row_description;
+  iface->get_row_header = my_atk_table_get_row_header;
+  iface->get_summary = my_atk_table_get_summary;
+  iface->set_caption = my_atk_table_set_caption;
+  iface->set_column_description = my_atk_table_set_column_description;
+  iface->set_column_header = my_atk_table_set_column_header;
+  iface->set_row_description = my_atk_table_set_row_description;
+  iface->set_row_header = my_atk_table_set_row_header;
+  iface->set_summary = my_atk_table_set_summary;
+  iface->get_selected_columns = my_atk_table_get_selected_columns;
+  iface->get_selected_rows = my_atk_table_get_selected_rows;
+  iface->is_column_selected = my_atk_table_is_column_selected;
+  iface->is_row_selected = my_atk_table_is_row_selected;
+  iface->is_selected = my_atk_table_is_selected;
+  iface->add_row_selection = my_atk_table_add_row_selection;
+  iface->remove_row_selection = my_atk_table_remove_row_selection;
+  iface->add_column_selection = my_atk_table_add_column_selection;
+  iface->remove_column_selection = my_atk_table_remove_column_selection;
+  iface->row_inserted = my_atk_table_row_inserted;
+  iface->column_inserted = my_atk_table_column_inserted;
+  iface->row_deleted = my_atk_table_row_deleted;
+  iface->column_deleted = my_atk_table_column_deleted;
+  iface->row_reordered = my_atk_table_row_reordered;
+  iface->column_reordered = my_atk_table_column_reordered;
+  iface->model_changed = my_atk_table_model_changed;
+}
+
+static void
+my_atk_table_init (MyAtkTable *self)
+{
+  self->parent_table = NULL;
+  self->table = g_ptr_array_new_with_free_func (GDestroyNotifyGPTRARRAYptrArray);
+  self->row_header = g_ptr_array_new_with_free_func (GDestroyNotifyGPTRARRAYptrArray);
+  self->column_headers = g_ptr_array_new_with_free_func (GDestroyNotifyGPTRARRAYptrArray);
+  self->selected = FALSE;
+  self->col_desc = NULL;
+}
+
+static void
+GDestroyNotifyGPTRARRAYptrArray (gpointer data)
+{
+  g_ptr_array_free (data, TRUE);
+}
+
+static void
+my_atk_table_class_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_table_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_table_class_init (MyAtkTableClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_table_class_finalize;
+
+  atk_class->initialize = my_atk_table_class_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-table.h b/tests/at-spi2-atk/dummyatk/my-atk-table.h
new file mode 100644 (file)
index 0000000..caed390
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_TABLE_H_
+#define MY_ATK_TABLE_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+#define MY_TYPE_ATK_TABLE (my_atk_table_get_type ())
+#define MY_ATK_TABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_TABLE, MyAtkTable))
+#define MY_ATK_TABLE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_TABLE, MyAtkTableClass))
+#define MY_IS_ATK_TABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_TABLE))
+#define MY_IS_ATK_TABLE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_TABLE))
+#define MY_ATK_TABLE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_TABLE, MyAtkTableClass))
+
+typedef struct _MyAtkTable MyAtkTable;
+typedef struct _MyAtkTableClass MyAtkTableClass;
+
+struct _MyAtkTable
+{
+  MyAtkObject parent;
+  MyAtkTable *parent_table;
+  GPtrArray *table;
+  GPtrArray *column_headers;
+  GPtrArray *row_headers;
+  GPtrArray *row_header;
+  gchar *col_desc;
+  gboolean selected;
+};
+
+struct _MyAtkTableClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_table_get_type (void);
+
+guint my_atk_set_table (AtkTable *obj,
+                        gchar *col_header,
+                        gchar *row_header,
+                        gchar *col_desc,
+                        gchar *row_desc,
+                        gchar *value,
+                        gboolean selected,
+                        gboolean selected_col);
+
+AtkObject *
+test_get_cell_from_table (AtkTable *obj, gint row);
+
+#endif /* MY_ATK_TABLE_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-text.c b/tests/at-spi2-atk/dummyatk/my-atk-text.c
new file mode 100644 (file)
index 0000000..5185c99
--- /dev/null
@@ -0,0 +1,463 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-object.h"
+#include "my-atk-text.h"
+
+typedef struct _MyAtkTextInfo MyAtkTextInfo;
+
+static void atk_text_interface_init (AtkTextIface *iface);
+
+typedef struct _MyAtkTextSelection MyAtkTextSelection;
+
+struct _MyAtkTextSelection
+{
+  gint start;
+  gint end;
+};
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkText,
+                         my_atk_text,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT,
+                                                atk_text_interface_init));
+
+guint
+my_atk_set_text (AtkText *obj,
+                 const gchar *text,
+                 const gint x,
+                 const gint y,
+                 const gint width,
+                 const gint height,
+                 AtkAttributeSet *attrSet)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), -1);
+
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  self->text = g_strdup (text);
+  self->x = x;
+  self->y = y;
+  self->width = width;
+  self->height = height;
+  self->attributes = g_slist_copy (attrSet);
+
+  return 0;
+}
+
+MyAtkText *
+my_atk_text_new (void)
+{
+  return g_object_new (MY_TYPE_ATK_TEXT, NULL);
+}
+
+static gchar *
+my_atk_text_get_text (AtkText *obj, gint start_offset, gint end_offset)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), NULL);
+  gchar *str = MY_ATK_TEXT (obj)->text;
+
+  if ((end_offset < start_offset) || start_offset < 0 || !str)
+    return NULL;
+  if (strlen (str) < end_offset)
+    return NULL;
+
+  return g_strndup (str + start_offset, end_offset - start_offset);
+}
+
+static gint
+my_atk_text_get_character_count (AtkText *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), -1);
+  gchar *str = MY_ATK_TEXT (obj)->text;
+  if (!str)
+    return 0;
+  return (gint) strlen (str);
+}
+
+static int
+my_atk_text_get_caret_offset (AtkText *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), -1);
+  return MY_ATK_TEXT (obj)->caret_offset;
+}
+
+static gboolean
+my_atk_text_set_caret_offset (AtkText *obj, gint offset)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), FALSE);
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  if (offset < 0 && strlen (self->text) <= offset)
+    return FALSE;
+  self->caret_offset = offset;
+  return TRUE;
+}
+
+static gunichar
+my_atk_text_get_character_at_offset (AtkText *obj, gint offset)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), 255);
+  return MY_ATK_TEXT (obj)->text[offset];
+}
+
+static void
+my_atk_text_get_character_extents (AtkText *obj, gint offset, gint *x, gint *y, gint *width, gint *height, AtkCoordType coords)
+{
+  g_return_if_fail (MY_IS_ATK_TEXT (obj));
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  *x = self->x;
+  *y = self->y;
+  *width = self->width;
+  *height = self->height;
+}
+
+static void
+my_atk_text_get_range_extents (AtkText *obj, gint start_offset, gint stop_offset, AtkCoordType coords, AtkTextRectangle *rect)
+{
+  g_return_if_fail (MY_IS_ATK_TEXT (obj));
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  rect->x = self->x;
+  rect->y = self->y;
+  rect->width = self->width;
+  rect->height = self->height;
+}
+
+static gint
+my_atk_text_get_n_selections (AtkText *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), -1);
+  return g_list_length (MY_ATK_TEXT (obj)->selection);
+}
+
+static gboolean
+my_atk_text_add_selection (AtkText *obj, gint start_offset, gint end_offset)
+{
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), FALSE);
+
+  MyAtkTextSelection *node = g_malloc (sizeof (MyAtkTextSelection));
+
+  node->start = start_offset;
+  node->end = end_offset;
+
+  self->selection = g_list_append (self->selection, node);
+
+  return TRUE;
+}
+
+static gchar *
+my_atk_text_get_selection (AtkText *obj, gint selection_num, gint *start_offset, gint *end_offset)
+{
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  gchar *str = NULL;
+  GList *it;
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), NULL);
+
+  if (selection_num < 0)
+    return NULL;
+
+  it = g_list_nth (self->selection, selection_num);
+  if (!it)
+    return NULL;
+
+  str = my_atk_text_get_text (obj, ((MyAtkTextSelection *) it->data)->start, ((MyAtkTextSelection *) it->data)->end);
+  if (!str)
+    return NULL;
+  *start_offset = ((MyAtkTextSelection *) it->data)->start;
+  *end_offset = ((MyAtkTextSelection *) it->data)->end;
+
+  return str;
+}
+
+static gboolean
+my_atk_text_set_selection (AtkText *obj, gint selection_num, gint start_offset, gint end_offset)
+{
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), FALSE);
+
+  GList *it;
+
+  if (selection_num < 0)
+    return FALSE;
+
+  it = g_list_nth (self->selection, selection_num);
+  if (!it)
+    return FALSE;
+
+  ((MyAtkTextSelection *) it->data)->start = start_offset;
+  ((MyAtkTextSelection *) it->data)->end = end_offset;
+
+  return TRUE;
+}
+
+static gboolean
+my_atk_text_remove_selection (AtkText *obj, gint selection_num)
+{
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  GList *it;
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), FALSE);
+
+  if (selection_num < 0)
+    return FALSE;
+
+  it = g_list_nth (self->selection, selection_num);
+  if (!it)
+    return FALSE;
+
+  self->selection = g_list_delete_link (self->selection, it);
+  return TRUE;
+}
+
+static gint
+my_atk_text_get_offset_at_point (AtkText *obj, gint x, gint y, AtkCoordType coords)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), -1);
+  return 5;
+}
+
+static AtkAttributeSet *
+my_atk_text_get_default_attributes (AtkText *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), NULL);
+  return MY_ATK_TEXT (obj)->attributes;
+}
+
+static AtkAttributeSet *
+my_atk_text_get_run_attributes (AtkText *obj, gint offset, gint *start_offset, gint *end_offset)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), NULL);
+  AtkAttributeSet *attributes;
+  AtkAttribute *attr;
+
+  attr = g_malloc (sizeof (AtkAttribute));
+  attr->name = g_strdup ("text_test_attr1");
+  attr->value = g_strdup ("on");
+  attributes = g_slist_append (NULL, attr);
+
+  attr = g_malloc (sizeof (AtkAttribute));
+  attr->name = g_strdup ("text_test_attr2");
+  attr->value = g_strdup ("off");
+  attributes = g_slist_append (attributes, attr);
+
+  *start_offset = 5;
+  *end_offset = 10;
+
+  return attributes;
+}
+
+static void
+setSentenceStartEnd (MyAtkText *self, gint *_offset, gint *start_offset, gint *end_offset, const gchar *fstr)
+{
+  gchar *p_str_begin = NULL;
+  gchar *p_str_end = NULL;
+  const gint length = strlen (self->text);
+  gint offset = *_offset;
+  gint star_correction = 1;
+  /*
+   * In case if offset is in the middle of the word rewind to 1 character before.
+   */
+  for (; g_ascii_isalpha (self->text[offset]) && 0 < offset; offset--)
+    ;
+  /*
+   * if [char]  rewind to word after by passing none alpha
+   * else  try to find last [string] in range [0,offset]
+   *   if  found then correct position
+   *   else not found so this is first sentence find first word
+   */
+  if (self->text[offset] == fstr[0])
+    {
+      for (; !g_ascii_isalpha (self->text[offset]) && offset < length; offset++)
+        ;
+      p_str_begin = self->text + offset;
+    }
+  else
+    {
+      p_str_begin = g_strrstr_len (self->text, offset, fstr);
+      if (p_str_begin)
+        {
+          for (; !g_ascii_isalpha (self->text[offset]) && length < offset; offset++)
+            ;
+        }
+      else
+        {
+          for (offset = 0; !g_ascii_isalpha (self->text[offset]) && length < offset; offset++)
+            ;
+          star_correction = 0;
+        }
+      p_str_begin = self->text + offset;
+    }
+  /*
+   * try find ending
+   * if not found set ending at text end.
+   * */
+  p_str_end = g_strstr_len (self->text + offset, length - offset, fstr);
+  if (!p_str_end)
+    {
+      p_str_end = self->text + (length - 1);
+    }
+  if (p_str_begin && p_str_end)
+    {
+      *start_offset = p_str_begin - self->text + star_correction;
+      *end_offset = p_str_end - self->text + 1;
+      *_offset = offset;
+    }
+}
+
+static gchar *
+my_atk_text_get_string_at_offset (AtkText *obj, gint offset, AtkTextGranularity granularity, gint *start_offset, gint *end_offset)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), NULL);
+  MyAtkText *self = MY_ATK_TEXT (obj);
+  gint cnt;
+  gint length;
+  gint myoffset = 0;
+  *start_offset = -1;
+  *end_offset = -1;
+
+  switch (granularity)
+    {
+    case ATK_TEXT_GRANULARITY_CHAR:
+      *start_offset = offset;
+      *end_offset = *start_offset + 1;
+      break;
+    case ATK_TEXT_GRANULARITY_WORD:
+      length = strlen (self->text);
+      for (; !g_ascii_isalpha (self->text[offset]) && offset < length; offset++)
+        ;
+      for (cnt = offset; cnt < length; cnt++)
+        {
+          if (!g_ascii_isalpha (self->text[cnt]))
+            {
+              *start_offset = offset;
+              *end_offset = cnt - 1;
+              myoffset = 1;
+              break;
+            }
+        }
+      for (cnt = offset; 0 < cnt; cnt--)
+        {
+          if (!g_ascii_isalpha (self->text[cnt]))
+            {
+              *start_offset = cnt + 1;
+              break;
+            }
+        }
+      break;
+    case ATK_TEXT_GRANULARITY_SENTENCE:
+      setSentenceStartEnd (self, &offset, start_offset, end_offset, ".");
+      break;
+    case ATK_TEXT_GRANULARITY_LINE:
+      setSentenceStartEnd (self, &offset, start_offset, end_offset, "/n");
+      break;
+    case ATK_TEXT_GRANULARITY_PARAGRAPH:
+      /* Not implemented */
+      *start_offset = 0;
+      *end_offset = 0;
+      break;
+    default:
+      break;
+    }
+  return my_atk_text_get_text (obj, *start_offset, *end_offset + myoffset);
+}
+
+AtkTextRange **
+my_atk_get_bounded_ranges (AtkText *obj, AtkTextRectangle *rect, AtkCoordType ctype, AtkTextClipType xclip, AtkTextClipType yclip)
+{
+  g_return_val_if_fail (MY_IS_ATK_TEXT (obj), NULL);
+  AtkTextRange **range = g_new (AtkTextRange *, 3);
+
+  *range = g_new (AtkTextRange, 1);
+  (*range)->start_offset = 0;
+  (*range)->end_offset = 5;
+  (*range)->content = my_atk_text_get_text (obj, (*range)->start_offset, (*range)->end_offset);
+
+  *(range + 1) = g_new (AtkTextRange, 1);
+  (*(range + 1))->start_offset = 6;
+  (*(range + 1))->end_offset = 10;
+  (*(range + 1))->content = my_atk_text_get_text (obj, (*(range + 1))->start_offset, (*(range + 1))->end_offset);
+
+  *(range + 2) = NULL;
+
+  return range;
+}
+
+static void
+atk_text_interface_init (AtkTextIface *iface)
+{
+  if (!iface)
+    return;
+
+  iface->get_text = my_atk_text_get_text;
+  iface->get_character_count = my_atk_text_get_character_count;
+  iface->get_caret_offset = my_atk_text_get_caret_offset;
+  iface->set_caret_offset = my_atk_text_set_caret_offset;
+  iface->get_character_at_offset = my_atk_text_get_character_at_offset;
+  iface->get_character_extents = my_atk_text_get_character_extents;
+  iface->get_range_extents = my_atk_text_get_range_extents;
+  iface->get_n_selections = my_atk_text_get_n_selections;
+  iface->add_selection = my_atk_text_add_selection;
+  iface->get_selection = my_atk_text_get_selection;
+  iface->set_selection = my_atk_text_set_selection;
+  iface->remove_selection = my_atk_text_remove_selection;
+  iface->get_offset_at_point = my_atk_text_get_offset_at_point;
+  iface->get_default_attributes = my_atk_text_get_default_attributes;
+  iface->get_string_at_offset = my_atk_text_get_string_at_offset;
+  iface->get_bounded_ranges = my_atk_get_bounded_ranges;
+  iface->get_run_attributes = my_atk_text_get_run_attributes;
+}
+
+static void
+my_atk_text_init (MyAtkText *self)
+{
+  self->text = NULL;
+  self->caret_offset = -1;
+  self->x = -1;
+  self->y = -1;
+  self->width = -1;
+  self->height = -1;
+  self->selection = NULL;
+  self->attributes = NULL;
+}
+
+static void
+my_atk_text_class_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_text_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_text_class_init (MyAtkTextClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_text_class_finalize;
+  atk_class->initialize = my_atk_text_class_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-text.h b/tests/at-spi2-atk/dummyatk/my-atk-text.h
new file mode 100644 (file)
index 0000000..2a70cb1
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_TEXT_H_
+#define MY_ATK_TEXT_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+#define MY_TYPE_ATK_TEXT (my_atk_text_get_type ())
+#define MY_ATK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_TEXT, MyAtkText))
+#define MY_ATK_TEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_TEXT, MyAtkTextClass))
+#define MY_IS_ATK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_TEXT))
+#define MY_IS_ATK_TEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_TEXT))
+#define MY_ATK_TEXT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_TEXT, MyAtkTextClass))
+
+typedef struct _MyAtkText MyAtkText;
+typedef struct _MyAtkTextClass MyAtkTextClass;
+
+typedef void (*MyAtkTextFunc) (MyAtkText *obj);
+
+struct _MyAtkText
+{
+  MyAtkObject parent;
+  gchar *text;
+  gint caret_offset;
+  gint x;
+  gint y;
+  gint width;
+  gint height;
+  GList *selection;
+  AtkAttributeSet *attributes;
+};
+
+struct _MyAtkTextClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_text_get_type (void);
+
+guint my_atk_set_text (AtkText *obj,
+                       const gchar *text,
+                       const gint x,
+                       const gint y,
+                       const gint width,
+                       const gint height,
+                       AtkAttributeSet *attrSet);
+
+MyAtkText *my_atk_text_new (void);
+
+#endif /* MY_ATK_TEXT_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-value.c b/tests/at-spi2-atk/dummyatk/my-atk-value.c
new file mode 100644 (file)
index 0000000..acd48be
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 <atk/atk.h>
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "my-atk-object.h"
+#include "my-atk-value.h"
+
+typedef struct _MyAtkValueInfo MyAtkValueInfo;
+
+static void atk_value_interface_init (AtkValueIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MyAtkValue,
+                         my_atk_value,
+                         MY_TYPE_ATK_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE,
+                                                atk_value_interface_init));
+
+guint
+my_atk_set_value (AtkValue *obj, gdouble min, gdouble cur, gdouble max, gdouble step)
+{
+  MyAtkValue *self = MY_ATK_VALUE (obj);
+  g_return_val_if_fail (MY_IS_ATK_VALUE (obj), -1);
+
+  self->min = min;
+  self->cur = cur;
+  self->max = max;
+  self->step = step;
+
+  return 0;
+}
+
+static void
+my_atk_value_get_value_and_text (AtkValue *obj, gdouble *value, gchar **text)
+{
+  MyAtkValue *self = MY_ATK_VALUE (obj);
+  g_return_if_fail (MY_IS_ATK_VALUE (obj));
+
+  *value = self->cur;
+  *text = g_strdup_printf ("%f", self->cur);
+}
+
+static AtkRange *
+my_atk_value_get_range (AtkValue *obj)
+{
+  MyAtkValue *self = MY_ATK_VALUE (obj);
+  g_return_val_if_fail (MY_IS_ATK_VALUE (obj), NULL);
+
+  return atk_range_new (self->min, self->max, NULL);
+}
+
+static gdouble
+my_atk_value_get_increment (AtkValue *obj)
+{
+  MyAtkValue *self = MY_ATK_VALUE (obj);
+  g_return_val_if_fail (MY_IS_ATK_VALUE (obj), 0);
+  return self->step;
+}
+
+static GSList *
+my_atk_value_get_sub_ranges (AtkValue *obj)
+{
+  g_return_val_if_fail (MY_IS_ATK_VALUE (obj), NULL);
+
+  return NULL;
+}
+
+static void
+my_atk_value_set_value (AtkValue *obj, const gdouble val)
+{
+  MyAtkValue *self = MY_ATK_VALUE (obj);
+  g_return_if_fail (MY_IS_ATK_VALUE (obj));
+
+  if (self->min < val && val < self->max)
+    self->cur = val;
+  return;
+}
+
+static void
+atk_value_interface_init (AtkValueIface *iface)
+{
+  if (!iface)
+    return;
+  iface->get_value_and_text = my_atk_value_get_value_and_text;
+  iface->get_range = my_atk_value_get_range;
+  iface->get_increment = my_atk_value_get_increment;
+  iface->get_sub_ranges = my_atk_value_get_sub_ranges;
+  iface->set_value = my_atk_value_set_value;
+}
+
+static void
+my_atk_value_init (MyAtkValue *self)
+{
+  self->min = 0;
+  self->cur = 0;
+  self->max = 0;
+  self->step = 0;
+}
+
+static void
+my_atk_value_class_initialize (AtkObject *obj, gpointer data)
+{
+}
+
+static void
+my_atk_value_class_finalize (GObject *obj)
+{
+}
+
+static void
+my_atk_value_class_init (MyAtkValueClass *my_class)
+{
+  AtkObjectClass *atk_class = ATK_OBJECT_CLASS (my_class);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (my_class);
+
+  gobject_class->finalize = my_atk_value_class_finalize;
+
+  atk_class->initialize = my_atk_value_class_initialize;
+}
diff --git a/tests/at-spi2-atk/dummyatk/my-atk-value.h b/tests/at-spi2-atk/dummyatk/my-atk-value.h
new file mode 100644 (file)
index 0000000..9cdc6d2
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2008 Codethink Ltd.
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_VALUE_H_
+#define MY_ATK_VALUE_H_
+
+#include <atk/atk.h>
+#include <glib-object.h>
+#include <glib.h>
+
+#include "my-atk-object.h"
+#define MY_TYPE_ATK_VALUE (my_atk_value_get_type ())
+#define MY_ATK_VALUE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_VALUE, MyAtkValue))
+#define MY_ATK_VALUE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_VALUE, MyAtkValueClass))
+#define MY_IS_ATK_VALUE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_VALUE))
+#define MY_IS_ATK_VALUE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_VALUE))
+#define MY_ATK_VALUE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_VALUE, MyAtkValueClass))
+
+typedef struct _MyAtkValue MyAtkValue;
+typedef struct _MyAtkValueClass MyAtkValueClass;
+
+struct _MyAtkValue
+{
+  MyAtkObject parent;
+  gdouble min;
+  gdouble cur;
+  gdouble max;
+  gdouble step;
+};
+
+struct _MyAtkValueClass
+{
+  MyAtkObjectClass parent;
+};
+
+GType my_atk_value_get_type (void);
+
+guint my_atk_set_value (AtkValue *obj, gdouble min, gdouble cur, gdouble max, gdouble step);
+
+#endif /* MY_ATK_VALUE_H_ */
diff --git a/tests/at-spi2-atk/dummyatk/my-atk.h b/tests/at-spi2-atk/dummyatk/my-atk.h
new file mode 100644 (file)
index 0000000..af2d839
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * 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 MY_ATK_H
+#define MY_ATK_H
+
+#include "my-atk-action.h"
+#include "my-atk-component.h"
+#include "my-atk-document.h"
+#include "my-atk-editable-text.h"
+#include "my-atk-hyperlink.h"
+#include "my-atk-hypertext.h"
+#include "my-atk-image.h"
+#include "my-atk-object.h"
+#include "my-atk-selection.h"
+#include "my-atk-table-cell.h"
+#include "my-atk-table.h"
+#include "my-atk-text.h"
+#include "my-atk-value.h"
+
+#endif /*MY_ATK_H*/
diff --git a/tests/at-spi2-atk/meson.build b/tests/at-spi2-atk/meson.build
new file mode 100644 (file)
index 0000000..4caf5d9
--- /dev/null
@@ -0,0 +1,82 @@
+subdir('dummyatk')
+
+xmlloader = static_library('xmlloader', [ 'atk-object-xml-loader.c' ],
+                           dependencies: [ glib_dep, gobject_dep, libxml_dep, libatk_dep, dummyatk_dep ],
+                           include_directories: [ root_inc, include_directories('.') ])
+xmlloader_dep = declare_dependency(link_with: xmlloader)
+
+testutils = static_library('testutils', [ 'atk_test_util.c' ],
+                           dependencies: [ glib_dep, atspi_dep ],
+                           include_directories: [ root_inc, include_directories('.') ],
+                           c_args: ['-DTESTS_BUILD_DIR="@0@"'.format(meson.current_build_dir()) ] )
+testutils_dep = declare_dependency(link_with: testutils)
+
+# tests:
+#  - name
+#  - sources
+#  - dependencies
+tests = [
+  [
+    'atk-test', [
+      'atk_suite.c',
+      'atk_test_accessible.c',
+      'atk_test_action.c',
+      'atk_test_component.c',
+      'atk_test_collection.c',
+      'atk_test_document.c',
+      'atk_test_editable_text.c',
+      'atk_test_hyperlink.c',
+      'atk_test_hypertext.c',
+      'atk_test_image.c',
+      'atk_test_selection.c',
+      'atk_test_state_set.c',
+      'atk_test_table.c',
+      'atk_test_table_cell.c',
+      'atk_test_text.c',
+      'atk_test_value.c',
+    ],
+    [
+      glib_dep,
+      atspi_dep,
+      xmlloader_dep,
+      testutils_dep,
+      dummyatk_dep,
+    ]
+  ],
+
+  [
+    'app-test',
+    [
+      'test-application.c',
+    ],
+    [
+      glib_dep,
+      libatk_dep,
+      xmlloader_dep,
+      testutils_dep,
+      dummyatk_dep,
+      libatk_bridge_dep,
+    ]
+  ],
+]
+
+foreach t: tests
+  test_name = t[0]
+  test_sources = t[1]
+  test_deps = t[2]
+
+  test_bin = executable(test_name, test_sources,
+                        dependencies: test_deps,
+                        include_directories: root_inc,
+                        c_args: [
+                          '-DTESTS_BUILD_DIR="@0@"'.format(meson.current_build_dir()),
+                          '-DTESTS_SRC_DIR="@0@"'.format(meson.current_source_dir()),
+                          '-DTESTS_DATA_DIR="@0@"'.format(join_paths(meson.current_source_dir(), 'data')),
+                        ])
+
+  if test_name == 'atk-test'
+    atk_test_bin = test_bin
+  endif
+endforeach
+
+test('atk-test', atk_test_bin, timeout: 300)
diff --git a/tests/at-spi2-atk/test-application.c b/tests/at-spi2-atk/test-application.c
new file mode 100644 (file)
index 0000000..6bde203
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * AT-SPI - Assistive Technology Service Provider Interface
+ * (Gnome Accessibility Project; https://wiki.gnome.org/Accessibility)
+ *
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/*
+ * Testing AT-SPI requires both a test application and AT client.
+ * Test applications are built using the Dummy ATK implementation: MyAtk.
+ * This file contains the entry point for all test applications.
+ * The test will provide its own implementation of atk_get_root,
+ * and as such provide all the application state for the test.
+ */
+
+#include "atk-object-xml-loader.h"
+#include "my-atk.h"
+#include <atk-bridge.h>
+#include <atk/atk.h>
+#include <glib-unix.h>
+#include <glib.h>
+#include <locale.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static AtkObject *root_accessible;
+
+static GMainLoop *mainloop;
+
+static gchar *tdata_path = NULL;
+
+void
+test_init (gchar *path)
+{
+  gchar *td;
+
+  if (path == NULL)
+    {
+      g_print ("No test data file provided\n");
+      exit (EXIT_FAILURE);
+    }
+  tdata_path = path;
+
+  td = g_build_path (G_DIR_SEPARATOR_S, tdata_path, NULL, NULL);
+  root_accessible = ATK_OBJECT (atk_object_xml_parse (td));
+  g_free (td);
+}
+
+AtkObject *
+test_get_root (void)
+{
+  return root_accessible;
+}
+
+static AtkObject *
+get_root (void)
+{
+  return test_get_root ();
+}
+
+const gchar *
+get_toolkit_name (void)
+{
+  return strdup ("atspitesting-toolkit");
+}
+
+static void
+setup_atk_util (void)
+{
+  AtkUtilClass *klass;
+
+  klass = g_type_class_ref (ATK_TYPE_UTIL);
+  klass->get_root = get_root;
+  klass->get_toolkit_name = get_toolkit_name;
+  g_type_class_unref (klass);
+}
+
+static GOptionEntry optentries[] = {
+  { "test-data-file", 0, 0, G_OPTION_ARG_STRING, &tdata_path, "Path to file of test data", NULL },
+  { NULL }
+};
+
+static gboolean
+sigterm_received_cb (gpointer user_data)
+{
+  GMainLoop *mainloop = user_data;
+  g_print ("test application received SIGTERM\n");
+  g_main_loop_quit (mainloop);
+  return G_SOURCE_REMOVE;
+}
+
+int
+main (int argc, char *argv[])
+{
+  GOptionContext *opt;
+  GError *err = NULL;
+  opt = g_option_context_new (NULL);
+  g_option_context_add_main_entries (opt, optentries, NULL);
+  g_option_context_set_ignore_unknown_options (opt, TRUE);
+
+  if (!g_option_context_parse (opt, &argc, &argv, &err))
+    g_error ("Option parsing failed: %s\n", err->message);
+
+  setlocale (LC_ALL, "");
+  setup_atk_util ();
+  test_init (tdata_path);
+
+  atk_bridge_adaptor_init (&argc, &argv);
+
+  mainloop = g_main_loop_new (NULL, FALSE);
+  g_unix_signal_add (SIGTERM, sigterm_received_cb, mainloop);
+  g_main_loop_run (mainloop);
+
+  g_print ("test application exited main loop; terminating after cleanup\n");
+
+  atk_bridge_adaptor_cleanup ();
+
+  g_print ("test application %d exiting!\n", getpid ());
+  return 0;
+}
diff --git a/tests/atk/README b/tests/atk/README
new file mode 100644 (file)
index 0000000..f31dbb2
--- /dev/null
@@ -0,0 +1,12 @@
+teststateset
+============
+This module tests the interfaces in atk/atkstateset.h
+
+testrelation
+============
+This module tests the interfaces in atk/atkrelation.h
+
+testrole
+========
+This module tests the methods related with roles and role names,
+defined at atk/atkobject.h
\ No newline at end of file
diff --git a/tests/atk/meson.build b/tests/atk/meson.build
new file mode 100644 (file)
index 0000000..7c1f3ab
--- /dev/null
@@ -0,0 +1,25 @@
+tests = [
+  'testdocument',
+  'testrole',
+  'testrelation',
+  'teststateset',
+  'testvalue',
+]
+
+foreach test_name: tests
+  test_src = test_name + '.c'
+  test_bin = executable(test_name, test_src,
+    dependencies: libatk_dep,
+    include_directories: root_inc,
+    c_args: common_cflags + [
+      '-DG_DISABLE_DEPRECATED',
+    ],
+  )
+
+  test(test_name, test_bin,
+    env: [
+      'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()),
+      'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()),
+    ],
+  )
+endforeach
diff --git a/tests/atk/testatk_vc.mak b/tests/atk/testatk_vc.mak
new file mode 100644 (file)
index 0000000..17e2a7a
--- /dev/null
@@ -0,0 +1,59 @@
+!include ..\build\detectenv-msvc.mak
+
+LD_CFLAGS = /link
+EXEEXT = .exe
+GLIB_LIBS = gobject-2.0.lib gmodule-2.0.lib glib-2.0.lib
+
+ATK_API_VERSION = 1.0
+
+BUILD_PATH = ..\build\win32\vs$(VSVER)\$(CFG)\$(PLAT)\bin
+LDFLAGS_PATH = /libpath:$(BUILD_PATH) /libpath:..\..\vs$(VSVER)\$(PLAT)\lib
+
+TEST_ATK_LIBS = atk-$(ATK_API_VERSION).lib $(GLIB_LIBS)
+
+LDFLAGS =      \
+       $(LDFLAGS_PATH) \
+       $(LDFLAGS_ARCH)
+
+CFLAGS =       \
+       $(CFLAGS_ADD) /DG_DISABLE_DEPRECATED /I..       \
+       /I..\..\vs$(VSVER)\$(PLAT)\include\glib-2.0     \
+       /I..\..\vs$(VSVER)\$(PLAT)\lib\glib-2.0\include \
+       /I..\..\vs$(VSVER)\$(PLAT)\include\glib-2.0
+
+EMPTY_ITEM =
+
+test_programs = \
+       testdocument$(EXEEXT)   \
+       testrole$(EXEEXT)       \
+       testrelation$(EXEEXT)   \
+       teststateset$(EXEEXT)   \
+       testvalue$(EXEEXT)      \
+       $(EMPTY_ITEM)
+
+!if "$(VALID_CFGSET)" == "FALSE"
+all:
+       !@-echo You need to run "nmake -f testatk_vc.mak CFG=release" or
+       !@-echo "nmake -f testatk_vc.mak CFG=debug" to use this Makefile to
+       !@-echo build the test programs.
+
+clean:
+       @-del /q/f *$(EXEEXT).manifest
+       @-del /q/f *$(EXEEXT)
+       @-del /q/f *.idb
+       @-del /q/f *.obj
+       @-del /q/f *.pdb
+!else
+all: $(test_programs)
+
+.c$(EXEEXT):
+       $(CC) $(CFLAGS) $< $(LD_CFLAGS) $(LDFLAGS) $(TEST_ATK_LIBS) /Fe$@
+       @-if exist $@.manifest mt /nologo /manifest $@.manifest /outputresource:$@;1
+
+clean:
+       @-del /q/f *$(EXEEXT).manifest
+       @-del /q/f *$(EXEEXT)
+       @-del /q/f *.idb
+       @-del /q/f *.obj
+       @-del /q/f *.pdb
+!endif
diff --git a/tests/atk/testdocument.c b/tests/atk/testdocument.c
new file mode 100644 (file)
index 0000000..17fd1a3
--- /dev/null
@@ -0,0 +1,131 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ * Copyright 2013 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <atk/atk.h>
+
+#define EXPECTED_NUMBER 5
+
+#define TEST_TYPE_DOCUMENT (test_document_get_type ())
+#define TEST_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_DOCUMENT, TestDocument))
+#define TEST_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_DOCUMENT, TestDocumentClass))
+#define TEST_IS_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_DOCUMENT))
+#define TEST_IS_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_DOCUMENT))
+#define TEST_DOCUMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_DOCUMENT, TestDocumentClass))
+
+typedef struct _TestDocument TestDocument;
+typedef struct _TestDocumentClass TestDocumentClass;
+
+struct _TestDocument
+{
+  AtkObject parent;
+  GMainLoop *loop;
+  gint number_emissions;
+};
+
+struct _TestDocumentClass
+{
+  AtkObjectClass parent_class;
+};
+
+GType test_document_get_type (void) G_GNUC_CONST;
+static void test_document_interface_init (AtkDocumentIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (TestDocument,
+                         test_document,
+                         ATK_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_DOCUMENT,
+                                                test_document_interface_init));
+
+static void
+test_document_class_init (TestDocumentClass *klass)
+{
+}
+
+static void
+test_document_init (TestDocument *document)
+{
+}
+
+static void
+test_document_interface_init (AtkDocumentIface *iface)
+{
+}
+
+static void
+document_page_changed_cb (AtkDocument *document,
+                          gint page_number,
+                          gpointer data)
+{
+  TestDocument *test_document = TEST_DOCUMENT (document);
+
+  g_print ("Page-changed callback, page_number = %i\n", page_number);
+  test_document->number_emissions++;
+}
+
+static gboolean
+document_emit_page_changed (gpointer data)
+{
+  TestDocument *test_document = TEST_DOCUMENT (data);
+  static gint next_page = 1;
+
+  g_print ("Moving to next page. Emitting page-change, page_number = %i\n",
+           next_page);
+  g_signal_emit_by_name (test_document, "page-changed", next_page++, NULL);
+
+  if (next_page > EXPECTED_NUMBER)
+    {
+      g_main_loop_quit (test_document->loop);
+      return G_SOURCE_REMOVE;
+    }
+  else
+    return G_SOURCE_CONTINUE;
+}
+
+static void
+test_page_changed (void)
+{
+  TestDocument *my_document;
+
+  my_document = TEST_DOCUMENT (g_object_new (TEST_TYPE_DOCUMENT, NULL));
+
+  g_signal_connect (my_document, "page-changed",
+                    G_CALLBACK (document_page_changed_cb),
+                    NULL);
+
+  g_idle_add (document_emit_page_changed, my_document);
+
+  my_document->loop = g_main_loop_new (NULL, FALSE);
+
+  g_main_loop_run (my_document->loop);
+
+  g_assert_cmpint (my_document->number_emissions, ==, EXPECTED_NUMBER);
+  g_main_loop_unref (my_document->loop);
+  g_object_unref (my_document);
+}
+
+int
+main (gint argc,
+      char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
+  g_test_add_func ("/atk/document/page_changed", test_page_changed);
+
+  return g_test_run ();
+}
diff --git a/tests/atk/testrelation.c b/tests/atk/testrelation.c
new file mode 100644 (file)
index 0000000..c95b0e3
--- /dev/null
@@ -0,0 +1,122 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <atk/atk.h>
+
+#include <string.h>
+
+static void
+test_relation (void)
+{
+  AtkRelationType type1, type2;
+  const gchar *name;
+  AtkObject *obj;
+  gboolean ret_value;
+  AtkRelationSet *set;
+  AtkRelation *relation;
+  gint n_relations;
+  GPtrArray *array;
+
+  name = atk_relation_type_get_name (ATK_RELATION_LABEL_FOR);
+  g_assert_cmpstr (name, ==, "label-for");
+
+  name = atk_relation_type_get_name (ATK_RELATION_NODE_CHILD_OF);
+  g_assert_cmpstr (name, ==, "node-child-of");
+
+  name = atk_relation_type_get_name (ATK_RELATION_EMBEDS);
+  g_assert_cmpstr (name, ==, "embeds");
+
+  type1 = atk_relation_type_for_name ("embedded-by");
+  g_assert_cmpint (type1, ==, ATK_RELATION_EMBEDDED_BY);
+
+  type1 = atk_relation_type_for_name ("controlled-by");
+  g_assert_cmpint (type1, ==, ATK_RELATION_CONTROLLED_BY);
+
+  type1 = atk_relation_type_register ("test-state");
+  name = atk_relation_type_get_name (type1);
+  g_assert_cmpstr (name, ==, "test-state");
+  type2 = atk_relation_type_for_name ("test-state");
+  g_assert_cmpint (type1, ==, type2);
+  type2 = atk_relation_type_for_name ("TEST_STATE");
+  g_assert_cmpint (type2, ==, 0);
+  /*
+   * Check that a non-existent type returns NULL
+   */
+  g_assert_null (atk_relation_type_get_name (ATK_RELATION_LAST_DEFINED + 2));
+
+  obj = g_object_new (ATK_TYPE_OBJECT, NULL);
+  ret_value = atk_object_add_relationship (obj, ATK_RELATION_LABEL_FOR, obj);
+  g_assert_cmpint (ret_value, !=, 0);
+  set = atk_object_ref_relation_set (obj);
+  g_assert_nonnull (set);
+  n_relations = atk_relation_set_get_n_relations (set);
+  g_assert_cmpint (n_relations, ==, 1);
+  relation = atk_relation_set_get_relation (set, 0);
+  g_assert_nonnull (relation);
+  type1 = atk_relation_get_relation_type (relation);
+  g_assert_cmpint (type1, ==, ATK_RELATION_LABEL_FOR);
+  array = atk_relation_get_target (relation);
+  g_assert (obj == g_ptr_array_index (array, 0));
+  g_object_unref (set);
+  g_assert_true (atk_object_remove_relationship (obj, ATK_RELATION_LABEL_FOR, obj));
+  set = atk_object_ref_relation_set (obj);
+  g_assert_nonnull (set);
+  n_relations = atk_relation_set_get_n_relations (set);
+  g_assert_cmpint (n_relations, ==, 0);
+  g_object_unref (set);
+  g_object_unref (obj);
+}
+
+static void
+test_text_attr (void)
+{
+  AtkTextAttribute attr1, attr2;
+  const gchar *name;
+
+  name = atk_text_attribute_get_name (ATK_TEXT_ATTR_PIXELS_INSIDE_WRAP);
+  g_assert_cmpstr (name, ==, "pixels-inside-wrap");
+
+  name = atk_text_attribute_get_name (ATK_TEXT_ATTR_BG_STIPPLE);
+  g_assert_cmpstr (name, ==, "bg-stipple");
+
+  attr1 = atk_text_attribute_for_name ("left-margin");
+  g_assert_cmpint (attr1, ==, ATK_TEXT_ATTR_LEFT_MARGIN);
+
+  attr1 = atk_text_attribute_register ("test-attribute");
+  name = atk_text_attribute_get_name (attr1);
+  g_assert_cmpstr (name, ==, "test-attribute");
+  attr2 = atk_text_attribute_for_name ("test-attribute");
+  g_assert_cmpint (attr1, ==, attr2);
+  g_assert_cmpint (atk_text_attribute_for_name ("TEST_ATTR"), ==, 0);
+  /*
+   * Check that a non-existent attribute returns NULL
+   */
+  g_assert_null (atk_text_attribute_get_name (ATK_TEXT_ATTR_LAST_DEFINED + 2));
+}
+
+int
+main (gint argc,
+      char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
+  g_test_add_func ("/atk/relation/relation", test_relation);
+  g_test_add_func ("/atk/relation/text_attr", test_text_attr);
+
+  return g_test_run ();
+}
diff --git a/tests/atk/testrole.c b/tests/atk/testrole.c
new file mode 100644 (file)
index 0000000..80f3fd4
--- /dev/null
@@ -0,0 +1,55 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright (C) 2013 Igalia, S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <atk/atk.h>
+#include <string.h>
+
+static void
+test_role (void)
+{
+  AtkRole role1, role2;
+  const gchar *name;
+
+  name = atk_role_get_name (ATK_ROLE_PAGE_TAB);
+  g_assert_cmpstr (name, ==, "page tab");
+
+  name = atk_role_get_name (ATK_ROLE_LAYERED_PANE);
+  g_assert_cmpstr (name, ==, "layered pane");
+
+  role1 = atk_role_for_name ("list item");
+  g_assert_cmpint (role1, ==, ATK_ROLE_LIST_ITEM);
+
+  role2 = atk_role_for_name ("TEST_ROLE");
+  g_assert_cmpint (role2, ==, ATK_ROLE_INVALID);
+  /*
+   * Check that a non-existent role returns NULL
+   */
+  g_assert_null (atk_role_get_name (ATK_ROLE_LAST_DEFINED + 2));
+}
+
+int
+main (gint argc,
+      char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
+  g_test_add_func ("/atk/role/roles", test_role);
+
+  return g_test_run ();
+}
diff --git a/tests/atk/teststateset.c b/tests/atk/teststateset.c
new file mode 100644 (file)
index 0000000..86f3b9e
--- /dev/null
@@ -0,0 +1,129 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <atk/atk.h>
+
+#include <string.h>
+
+static void test_state_set (void);
+static void test_state (void);
+
+static void
+test_state_set (void)
+{
+  AtkStateSet *state_set1, *state_set2, *state_set3;
+  AtkStateType state_array[3];
+
+  state_set1 = atk_state_set_new ();
+
+  g_assert_true (atk_state_set_is_empty (state_set1));
+
+  g_assert_true (atk_state_set_add_state (state_set1, ATK_STATE_ACTIVE));
+
+  g_assert_false (atk_state_set_is_empty (state_set1));
+
+  g_assert_false (atk_state_set_add_state (state_set1, ATK_STATE_ACTIVE));
+
+  state_array[0] = ATK_STATE_ACTIVE;
+  state_array[1] = ATK_STATE_VISIBLE;
+  state_array[2] = ATK_STATE_BUSY;
+  atk_state_set_add_states (state_set1, state_array, 3);
+
+  g_assert_true (atk_state_set_contains_state (state_set1, ATK_STATE_ACTIVE));
+  g_assert_true (atk_state_set_contains_state (state_set1, ATK_STATE_VISIBLE));
+  g_assert_true (atk_state_set_contains_state (state_set1, ATK_STATE_BUSY));
+  g_assert_false (atk_state_set_contains_state (state_set1, ATK_STATE_VERTICAL));
+
+  atk_state_set_remove_state (state_set1, ATK_STATE_BUSY);
+  g_assert_false (atk_state_set_contains_state (state_set1, ATK_STATE_BUSY));
+  g_assert_true (atk_state_set_contains_state (state_set1, ATK_STATE_VISIBLE));
+  g_assert_false (atk_state_set_contains_states (state_set1, state_array, 3));
+  g_assert_true (atk_state_set_contains_states (state_set1, state_array, 2));
+
+  state_array[0] = ATK_STATE_SINGLE_LINE;
+  state_array[1] = ATK_STATE_VISIBLE;
+  state_array[2] = ATK_STATE_VERTICAL;
+
+  state_set2 = atk_state_set_new ();
+  atk_state_set_add_states (state_set2, state_array, 3);
+
+  state_set3 = atk_state_set_and_sets (state_set1, state_set2);
+  g_assert_true (atk_state_set_contains_state (state_set3, ATK_STATE_VISIBLE));
+  g_assert_false (atk_state_set_contains_state (state_set3, ATK_STATE_BUSY));
+  g_object_unref (state_set3);
+
+  atk_state_set_remove_state (state_set1, ATK_STATE_VISIBLE);
+  state_set3 = atk_state_set_and_sets (state_set1, state_set2);
+  g_assert_null (state_set3);
+
+  state_set3 = atk_state_set_or_sets (state_set1, state_set2);
+  g_assert_true (atk_state_set_contains_state (state_set3, ATK_STATE_VISIBLE));
+  g_assert_false (atk_state_set_contains_state (state_set3, ATK_STATE_INVALID));
+  g_object_unref (state_set3);
+
+  g_assert_true (atk_state_set_add_state (state_set1, ATK_STATE_VISIBLE));
+  state_set3 = atk_state_set_xor_sets (state_set1, state_set2);
+  g_assert_false (atk_state_set_contains_state (state_set3, ATK_STATE_VISIBLE));
+  g_assert_true (atk_state_set_contains_state (state_set3, ATK_STATE_ACTIVE));
+
+  atk_state_set_clear_states (state_set1);
+  g_assert_false (atk_state_set_contains_state (state_set1, ATK_STATE_ACTIVE));
+
+  g_object_unref (state_set1);
+  g_object_unref (state_set2);
+  g_object_unref (state_set3);
+}
+
+static void
+test_state (void)
+{
+  AtkStateType type1, type2;
+  const gchar *name;
+
+  name = atk_state_type_get_name (ATK_STATE_VISIBLE);
+  g_assert_cmpstr (name, ==, "visible");
+
+  name = atk_state_type_get_name (ATK_STATE_MODAL);
+  g_assert_cmpstr (name, ==, "modal");
+
+  g_assert_cmpint (atk_state_type_for_name ("focused"), ==, ATK_STATE_FOCUSED);
+
+  type1 = atk_state_type_register ("test-state");
+  name = atk_state_type_get_name (type1);
+  g_assert_cmpstr (name, ==, "test-state");
+  type2 = atk_state_type_for_name ("test-state");
+  g_assert_cmpint (type1, ==, type2);
+  g_assert_cmpint (atk_state_type_for_name ("TEST_STATE"), ==, 0);
+
+  /*
+   * Check that a non-existent type returns NULL
+   */
+  g_assert_null (atk_state_type_get_name (ATK_STATE_LAST_DEFINED + 2));
+}
+
+int
+main (gint argc,
+      char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
+  g_test_add_func ("/atk/state/state_set", test_state_set);
+  g_test_add_func ("/atk/state/state", test_state);
+
+  return g_test_run ();
+}
diff --git a/tests/atk/testvalue.c b/tests/atk/testvalue.c
new file mode 100644 (file)
index 0000000..5990aea
--- /dev/null
@@ -0,0 +1,287 @@
+/* ATK -  Accessibility Toolkit
+ * Copyright 2001 Sun Microsystems Inc.
+ * Copyright 2014 Igalia S.L.
+ *
+ * Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <atk/atk.h>
+
+/**
+ * TestValue:
+ *
+ * this example serves as a unit test for AtkValue
+ *  and also as an example of how to implement #AtkValue on a given
+ *  GObject.
+ *
+ *  This test will represent a volume slider, smart enough to have
+ *  classify the values on the global range [0,1] with the
+ *  descriptions "low", "medium", "high" and "very high".  As the
+ *  clasification is fixed, it also expose all the four possible
+ *  subranges. To fill the description name it will use some of the
+ *  already defined #AtkValueType.
+ *
+ *  This will implement all the methods of #AtkValue, but note that
+ *  this is not mandatory on all the cases. In several cases it is not
+ *  needed to implement the subranges methods. See #AtkValue
+ *  documentation for further information.
+ *
+ */
+
+#define EXPECTED_NUMBER 7
+
+#define LOWER_LIMIT 0
+#define LOW_THRESHOLD 0.2
+#define NORMAL_THRESHOLD 0.4
+#define HIGH_THRESHOLD 0.8
+#define RISKY_THRESHOLD 1.0
+#define UPPER_LIMIT 1.0
+#define INCREMENT 0.15
+
+gboolean test_success = TRUE;
+GObject *my_value;
+
+#define TEST_TYPE_VALUE (test_value_get_type ())
+#define TEST_VALUE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_VALUE, TestValue))
+#define TEST_VALUE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TEST_TYPE_VALUE, TestValueClass))
+#define TEST_IS_VALUE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_VALUE))
+#define TEST_IS_VALUE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_VALUE))
+#define TEST_VALUE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_VALUE, TestValueClass))
+
+typedef struct _TestValue TestValue;
+typedef struct _TestValueClass TestValueClass;
+
+struct _TestValue
+{
+  AtkObject parent;
+
+  GMainLoop *loop;
+  gint number_emissions;
+
+  gdouble value;
+};
+
+struct _TestValueClass
+{
+  AtkObjectClass parent_class;
+};
+
+GType test_value_get_type (void) G_GNUC_CONST;
+static void test_value_interface_init (AtkValueIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (TestValue,
+                         test_value,
+                         ATK_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE,
+                                                test_value_interface_init));
+
+static void
+test_value_class_init (TestValueClass *klass)
+{
+}
+
+static void
+test_value_init (TestValue *value)
+{
+}
+
+static const gchar *
+get_description (gdouble value)
+{
+  const gchar *description = NULL;
+
+  if (value < LOW_THRESHOLD)
+    description = atk_value_type_get_localized_name (ATK_VALUE_LOW);
+  else if (value < NORMAL_THRESHOLD)
+    description = atk_value_type_get_localized_name (ATK_VALUE_MEDIUM);
+  else if (value < HIGH_THRESHOLD)
+    description = atk_value_type_get_localized_name (ATK_VALUE_HIGH);
+  else
+    description = atk_value_type_get_localized_name (ATK_VALUE_VERY_HIGH);
+
+  return description;
+}
+
+static void
+test_value_get_value_and_text (AtkValue *value,
+                               gdouble *current_value,
+                               gchar **description)
+{
+  TestValue *self;
+
+  g_return_if_fail (TEST_IS_VALUE (value));
+
+  self = TEST_VALUE (value);
+
+  if (current_value != NULL)
+    *current_value = self->value;
+
+  if (description != NULL)
+    *description = g_strdup (get_description (self->value));
+}
+
+AtkRange *
+test_value_get_range (AtkValue *value)
+{
+  AtkRange *result;
+
+  g_return_val_if_fail (TEST_IS_VALUE (value), NULL);
+
+  result = atk_range_new (LOWER_LIMIT,
+                          UPPER_LIMIT,
+                          NULL);
+
+  return result;
+}
+
+gdouble
+test_value_get_increment (AtkValue *value)
+{
+  g_return_val_if_fail (TEST_IS_VALUE (value), 0.0);
+
+  return INCREMENT;
+}
+
+GSList *
+test_value_get_sub_ranges (AtkValue *value)
+{
+  GSList *result = NULL;
+  AtkRange *range = NULL;
+
+  g_return_val_if_fail (TEST_IS_VALUE (value), NULL);
+
+  /* low */
+  range = atk_range_new (LOWER_LIMIT, LOW_THRESHOLD,
+                         get_description (LOWER_LIMIT));
+
+  result = g_slist_append (result, range);
+
+  /* normal */
+  range = atk_range_new (LOW_THRESHOLD, NORMAL_THRESHOLD,
+                         get_description (LOW_THRESHOLD));
+  result = g_slist_append (result, range);
+
+  /* high */
+  range = atk_range_new (NORMAL_THRESHOLD, HIGH_THRESHOLD,
+                         get_description (NORMAL_THRESHOLD));
+  result = g_slist_append (result, range);
+
+  /* very high */
+  range = atk_range_new (HIGH_THRESHOLD, UPPER_LIMIT,
+                         get_description (HIGH_THRESHOLD));
+  result = g_slist_append (result, range);
+
+  return result;
+}
+
+void
+test_value_set_value (AtkValue *value,
+                      double new_value)
+{
+  TestValue *self;
+
+  g_return_if_fail (TEST_IS_VALUE (value));
+
+  self = TEST_VALUE (value);
+
+  if (new_value < LOWER_LIMIT)
+    new_value = LOWER_LIMIT;
+
+  if (new_value > UPPER_LIMIT)
+    new_value = UPPER_LIMIT;
+
+  if (new_value != self->value)
+    {
+      gchar *description = g_strdup (get_description (new_value));
+      self->value = new_value;
+      g_signal_emit_by_name (value, "value-changed", new_value, description, NULL);
+      g_free (description);
+    }
+}
+
+static void
+test_value_interface_init (AtkValueIface *iface)
+{
+  iface->get_value_and_text = test_value_get_value_and_text;
+  iface->get_range = test_value_get_range;
+  iface->get_increment = test_value_get_increment;
+  iface->get_sub_ranges = test_value_get_sub_ranges;
+  iface->set_value = test_value_set_value;
+}
+
+static void
+value_page_changed_cb (AtkValue *value,
+                       gdouble new_value,
+                       gchar *new_description,
+                       gpointer data)
+{
+  TestValue *test_value = TEST_VALUE (value);
+
+  g_print ("value-changed callback=(%f,%s)\n", new_value, new_description);
+  test_value->number_emissions++;
+}
+
+/**
+ * This call simulates a user interacting with the slider.
+ *
+ */
+static gboolean
+do_value_changed (gpointer data)
+{
+  TestValue *test_value = TEST_VALUE (data);
+
+  atk_value_set_value (ATK_VALUE (test_value),
+                       test_value->value + INCREMENT);
+
+  if (test_value->number_emissions == EXPECTED_NUMBER)
+    {
+      g_main_loop_quit (test_value->loop);
+      return G_SOURCE_REMOVE;
+    }
+  else
+    return G_SOURCE_CONTINUE;
+}
+
+static void
+test_page_changed (void)
+{
+  TestValue *my_value = TEST_VALUE (g_object_new (TEST_TYPE_VALUE, NULL));
+
+  g_signal_connect (my_value, "value-changed",
+                    G_CALLBACK (value_page_changed_cb),
+                    NULL);
+
+  g_idle_add (do_value_changed, my_value);
+
+  my_value->loop = g_main_loop_new (NULL, FALSE);
+
+  g_main_loop_run (my_value->loop);
+
+  g_assert_cmpint (my_value->number_emissions, ==, EXPECTED_NUMBER);
+  g_main_loop_unref (my_value->loop);
+  g_object_unref (my_value);
+}
+
+int
+main (gint argc,
+      char *argv[])
+{
+  g_test_init (&argc, &argv, NULL);
+  g_test_add_func ("/atk/value/page_changed", test_page_changed);
+
+  return g_test_run ();
+}
similarity index 65%
rename from test/memory.c
rename to tests/atspi/memory.c
index 54f0652..e553330 100644 (file)
@@ -1,8 +1,8 @@
 #include "atspi/atspi.h"
 #include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
 #include <string.h>
+#include <unistd.h>
 
 pid_t child_pid;
 AtspiEventListener *listener;
@@ -27,12 +27,12 @@ basic (AtspiAccessible *obj)
   printf ("ok, getting children\n");
   count = atspi_accessible_get_child_count (obj, &error);
   for (i = 0; i < count; i++)
-  {
-    accessible = atspi_accessible_get_child_at_index (obj, i, &error);
-    printf ("ok %d\n", i);
-    if (accessible)
-      g_object_unref (accessible);
-  }
+    {
+      accessible = atspi_accessible_get_child_at_index (obj, i, &error);
+      printf ("ok %d\n", i);
+      if (accessible)
+        g_object_unref (accessible);
+    }
   printf ("ok\n");
 }
 
@@ -55,29 +55,29 @@ void
 on_event (AtspiEvent *event, void *data)
 {
   if (atspi_accessible_get_role (event->source, NULL) == ATSPI_ROLE_DESKTOP_FRAME)
-  {
-    printf ("memory: event: %s\n", event->type);
-    if (strstr (event->type, "add"))
-    {
-      AtspiAccessible *desktop = atspi_get_desktop (0);
-      guint id;
-      basic (desktop);
-      g_object_unref (desktop);
-      id = g_timeout_add (3000, kill_child, NULL);
-      g_source_set_name_by_id (id, "[at-spi2-core] kill_child");
-    }
-    else
     {
-      guint id;
-      id = g_idle_add (end, NULL);
-      g_source_set_name_by_id (id, "[at-spi2-core] end");
+      printf ("memory: event: %s\n", event->type);
+      if (strstr (event->type, "add"))
+        {
+          AtspiAccessible *desktop = atspi_get_desktop (0);
+          guint id;
+          basic (desktop);
+          g_object_unref (desktop);
+          id = g_timeout_add (3000, kill_child, NULL);
+          g_source_set_name_by_id (id, "[at-spi2-core] kill_child");
+        }
+      else
+        {
+          guint id;
+          id = g_idle_add (end, NULL);
+          g_source_set_name_by_id (id, "[at-spi2-core] end");
+        }
     }
-  }
   g_boxed_free (ATSPI_TYPE_EVENT, event);
 }
 
 int
-main()
+main ()
 {
   atspi_init ();
 
@@ -86,7 +86,7 @@ main()
   child_pid = fork ();
   if (child_pid == 0)
     {
-      g_assert_no_errno (execlp ("test/test-application", "test/test-application", NULL));
+      g_assert_no_errno (execlp ("tests/atspi/test-application", "tests/atspi/test-application", NULL));
     }
   else if (child_pid == -1)
     {
similarity index 84%
rename from test/meson.build
rename to tests/atspi/meson.build
index cd3db66..f563d07 100644 (file)
@@ -10,4 +10,9 @@ memory = executable('memory',
                     dependencies: [ atspi_dep ],
                    )
 
-test('memory', memory, depends: testapp)
+test(
+  'memory',
+  memory,
+  depends: testapp,
+  is_parallel: false,
+)
similarity index 89%
rename from test/test-application.c
rename to tests/atspi/test-application.c
index 621d1de..ec847de 100644 (file)
  * registry and then waiting to get killed by some external force.
  */
 
-#include <stdio.h>
-#include <glib.h>
-#include <dbus/dbus.h>
 #include <atspi/atspi.h>
+#include <dbus/dbus.h>
+#include <glib.h>
+#include <stdio.h>
 
 static GMainLoop *mainloop;
 
@@ -44,13 +44,12 @@ register_app ()
   const gchar *name;
   gchar *path;
 
-
   /* Set up D-Bus connection and register bus name */
   dbus_error_init (&error);
   connection = atspi_get_a11y_bus ();
   if (!connection)
     {
-      printf("Couldn't get a11y bus!\n");
+      printf ("Couldn't get a11y bus!\n");
       return -1;
     }
 
@@ -73,10 +72,10 @@ register_app ()
 
   g_free (path);
 
-  reply = dbus_connection_send_with_reply_and_block(connection, message, -1, &error);
+  reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error);
   if (!reply)
     {
-      printf("Did not get a reply from the registry.\n");
+      printf ("Did not get a reply from the registry.\n");
       dbus_message_unref (message);
       dbus_error_free (&error);
       return -1;
@@ -88,13 +87,15 @@ register_app ()
   return 0;
 }
 
-int main (int argc, char *argv[])
+int
+main (int argc, char *argv[])
 {
   int ret = register_app ();
-  if (ret) {
-    printf("Failed to send dbus signals. Aborting.\n");
-    return ret;
-  }
+  if (ret)
+    {
+      printf ("Failed to send dbus signals. Aborting.\n");
+      return ret;
+    }
 
   // This keeps the test-application runnig indefinitely, i.e.
   // until killed by an external signal.
diff --git a/tests/dbusmock/mock-gnome-session.py b/tests/dbusmock/mock-gnome-session.py
new file mode 100644 (file)
index 0000000..2b450bb
--- /dev/null
@@ -0,0 +1,79 @@
+'''gnome-session mock template
+
+This module implements mock versions of a few of the DBus interfaces from
+org.gnome.SessionManager and org.gnome.SessionManager.ClientPrivate.  They are used by
+at-spi2-core's test suite, to simulate communication with a gnome-session manager.
+'''
+
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; either version 3 of the License, or (at your option) any
+# later version.  See http://www.gnu.org/copyleft/lgpl.html for the full text
+# of the license.
+
+__author__ = 'Federico Mena Quintero'
+__copyright__ = '(c) 2022 Federico Mena Quintero'
+
+import dbus
+
+from dbusmock import MOCK_IFACE
+import dbusmock
+
+SYSTEM_BUS = False
+BUS_NAME = 'org.gnome.SessionManager'
+MAIN_OBJ = '/org/gnome/SessionManager'
+MAIN_IFACE = 'org.gnome.SessionManager'
+CLIENT_PRIVATE_IFACE = 'org.gnome.SessionManager.ClientPrivate'
+
+def load(mock, parameters):
+    mock.is_running = False
+    mock.client_serial_number = 0
+
+# FIXME: at-spi2-registryd uses these, but are not implemented here yet:
+#   org.gnome.SessionManager iface, SessionOver method
+#   org.gnome.SessionManager.ClientPrivate iface, QueryEndSession signal
+#   org.gnome.SessionManager.ClientPrivate iface, Stop signala
+
+
+# org.gnome.SessionManager interface, IsSessionRunning method
+@dbus.service.method(MAIN_IFACE, in_signature='', out_signature='b')
+def IsSessionRunning(self):
+    return self.is_running
+
+# org.gnome.SessionManager interface, RegisterClient method
+@dbus.service.method(MAIN_IFACE, in_signature='ss', out_signature='o')
+def RegisterClient(self, app_id, client_startup_id):
+    client_name = f"client_{self.client_serial_number}"
+    self.client_serial_number += 1
+
+    path = '/org/gnome/SessionManager/MockClientPrivate/' + client_name
+    self.AddObject(path, CLIENT_PRIVATE_IFACE, {},
+                   [
+                       ('EndSessionResponse', 'bs', '', ''),
+                   ])
+    return path
+
+# org.gnome.SessionManager interface, Logout method
+@dbus.service.method(MAIN_IFACE, in_signature='u', out_signature='')
+def Logout(self, logout_type):
+    # only Normal logout is supported in this mock
+    assert logout_type == 0
+
+    for path in dbusmock.get_objects():
+        if 'MockClientPrivate/' in path:
+            obj = dbusmock.get_object(path)
+            obj.EmitSignal(CLIENT_PRIVATE_IFACE, 'EndSession', 'u', [ 0 ])
+            obj.EmitSignal(CLIENT_PRIVATE_IFACE, 'Stop', '', [])
+
+# org.freedesktop.DBus.Mock interface, SetSessionRunning method
+#
+# at-spi2-registryd needs to know the difference between the session
+# being in the "running" state or not, so this method is a way to be able to change that from
+# the test code.
+#
+# This will change the internal state and emit the SessionRunning signal
+# on the main interface, since at-spi2-registryd handles that signal.
+@dbus.service.method(MOCK_IFACE, in_signature='b', out_signature='')
+def SetSessionRunning(self, is_running):
+    self.is_running = is_running
+    self.EmitSignal(MAIN_IFACE, "SessionRunning", "", ())
diff --git a/tests/dbusmock/mock_accessible_app.py b/tests/dbusmock/mock_accessible_app.py
new file mode 100644 (file)
index 0000000..1185686
--- /dev/null
@@ -0,0 +1,75 @@
+import dbus
+import dbus.service
+
+PROPERTIES_IFACE = 'org.freedesktop.DBus.Properties'
+ACCESSIBLE_IFACE = 'org.a11y.atspi.Accessible'
+APPLICATION_IFACE = 'org.a11y.atspi.Application'
+SOCKET_IFACE = 'org.a11y.atspi.Socket'
+
+ROOT_PATH = '/org/a11y/atspi/accessible/root'
+
+def accessible_get_property(prop_name):
+    if prop_name == 'Name':
+        pass # s
+    elif prop_name == 'Description':
+        pass # s
+    elif prop_name == 'Parent':
+        pass # (so)
+    elif prop_name == 'ChildCount':
+        pass # i
+    elif prop_name == 'Locale':
+        pass # s
+    elif prop_name == 'AccessibleId':
+        pass # s
+    else:
+        raise ValueError(f'unknown property name {prop_name}')
+
+def application_get_property(prop_name):
+    return None
+
+@dbus.service.method(PROPERTIES_IFACE, in_signature='ss', out_signature='v')
+def Get(self, iface_name, prop_name):
+    if iface_name == ACCESSIBLE_IFACE:
+        return accessible_get_property(prop_name)
+    elif iface_name == PROPERTY_IFACE:
+        return application_get_property(prop_name)
+
+@dbus.service.method(PROPERTIES_IFACE, in_signature='ssv', out_signature='')
+def Set(self, iface_name, prop_name, value):
+    if iface_name == APPLICATION_IFACE:
+        pass # FIXME
+
+def get_accesssibility_bus_address():
+    bus = dbus.SessionBus()
+    bus_launcher = bus.get_object('org.a11y.Bus', '/org/a11y/bus')
+    return str(bus_launcher.GetAddress(dbus_interface='org.a11y.Bus'))
+
+def get_registry_root(a11y_bus):
+    return a11y_bus.get_object('org.a11y.atspi.Registry', ROOT_PATH)
+
+class MyObject(dbus.service.Object):
+    def __init__(self, a11y_bus, path):
+        dbus.service.Object.__init__(self, a11y_bus, path)
+
+if __name__ == '__main__':
+    from dbus.mainloop.glib import DBusGMainLoop
+    from gi.repository import GLib
+
+    DBusGMainLoop(set_as_default=True)
+    main_loop = GLib.MainLoop()
+
+    a11y_address = get_accesssibility_bus_address()
+    a11y_bus = dbus.bus.BusConnection(a11y_address)
+
+    registry = get_registry_root(a11y_bus)
+    assert registry is not None
+
+    my_unique_name = a11y_bus.get_unique_name()
+    my_root = MyObject(a11y_bus, ROOT_PATH)
+    
+    (registry_bus_name, registry_root_path) = registry.Embed((my_unique_name, my_root), dbus_interface=SOCKET_IFACE)
+
+    print("registry bus name:", registry_bus_name)
+    print("registry_root_path:", registry_root_path)
+
+    # main_loop.run()
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644 (file)
index 0000000..36a654a
--- /dev/null
@@ -0,0 +1,3 @@
+subdir('atspi')
+subdir('atk')
+subdir('at-spi2-atk')
diff --git a/tests/registryd/__init__.py b/tests/registryd/__init__.py
new file mode 100644 (file)
index 0000000..d18f92c
--- /dev/null
@@ -0,0 +1 @@
+dummy = "hello"
diff --git a/tests/registryd/conftest.py b/tests/registryd/conftest.py
new file mode 100644 (file)
index 0000000..6bb7d3c
--- /dev/null
@@ -0,0 +1,88 @@
+# This file contains common test fixtures for registryd's tests.
+# Using pytest's terminology for a test's steps:
+#
+# 1. Arrange: create a test fixture; this usually involves a running registry and an accessible app stub.
+#
+# 2. Act: manipulate the app or the registry.
+#
+# 3. Assert: ensure that the thing being manipulated is in the expected state.
+#
+# 4. Cleanup: Terminate the registry and the app.  It is important that the registry exits cleanly,
+#    so it can write out its code coverage information.
+#
+# This module exports the following fixtures:
+#
+# * main_loop - a GLib.MainLoop integrated with the DBusGMainLoop.
+#
+# * session_manager - A mock gnome-session to control the lifetime of daemons.  In
+#   reality, the fixture assumes that there is a gnome-session mock running (see
+#   ci/run-registryd-tests.sh) and just tells that mock to Logout at fixture teardown
+#   time, so that all daemons that monitor the session's lifetime will exit at teardown.
+#
+# * registry - A dbus.proxies.ProxyObject for the registry's root object.  This automatically
+#   depends on a session_manager fixture to control its lifetime.
+
+import pytest
+import dbus
+
+@pytest.fixture
+def main_loop():
+    from dbus.mainloop.glib import DBusGMainLoop
+    from gi.repository import GLib
+
+    DBusGMainLoop(set_as_default=True)
+    loop = GLib.MainLoop()
+    return loop
+
+def get_accesssibility_bus_address():
+    bus = dbus.SessionBus()
+    bus_launcher = bus.get_object('org.a11y.Bus', '/org/a11y/bus')
+    return str(bus_launcher.GetAddress(dbus_interface='org.a11y.Bus'))
+
+@pytest.fixture
+def session_manager():
+    # This assumes that pytest is running in this environment:
+    #
+    # * A session dbus daemon is running
+    #
+    # * There is a gnome-session mock running
+    #
+    # See the ci/run-registryd-tests.sh script to see how that environment is set up.
+
+    import time
+
+    bus = dbus.SessionBus()
+    mock_session = bus.get_object('org.gnome.SessionManager', '/org/gnome/SessionManager')
+
+    mock_session.SetSessionRunning(True, dbus_interface='org.freedesktop.DBus.Mock')
+
+    yield mock_session
+
+    # Tell all session clients to terminate
+    mock_session.Logout(0, dbus_interface='org.gnome.SessionManager')
+
+    # Wait a bit for the a11y bus launcher to really die
+    proxy = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
+    while True:
+        names = proxy.ListNames(dbus_interface='org.freedesktop.DBus')
+        if 'org.a11y.Bus' in names:
+            time.sleep(1)
+        else:
+            break
+
+    # Reset mock session back to its starting state
+    mock_session.Reset(dbus_interface='org.freedesktop.DBus.Mock')
+
+@pytest.fixture
+def registry_root(main_loop, session_manager):
+    a11y_address = get_accesssibility_bus_address()
+    a11y_bus = dbus.bus.BusConnection(a11y_address)
+
+    return a11y_bus.get_object('org.a11y.atspi.Registry', '/org/a11y/atspi/accessible/root')
+
+@pytest.fixture
+def registry_registry(main_loop, session_manager):
+    a11y_address = get_accesssibility_bus_address()
+    a11y_bus = dbus.bus.BusConnection(a11y_address)
+
+    return a11y_bus.get_object('org.a11y.atspi.Registry', '/org/a11y/atspi/registry')
diff --git a/tests/registryd/test_introspection.py b/tests/registryd/test_introspection.py
new file mode 100644 (file)
index 0000000..8cd7052
--- /dev/null
@@ -0,0 +1,38 @@
+import pytest
+import dbus
+import xml.etree.ElementTree as ElementTree
+
+INTROSPECTABLE_IFACE = 'org.freedesktop.DBus.Introspectable'
+
+# obj: a dbus proxy object to introspect
+# expected_ifaces: sequence of interface names as strings
+def check_object_supports_interfaces(obj, expected_ifaces):
+    xml_str = str(obj.Introspect(dbus_interface=INTROSPECTABLE_IFACE))
+    root = ElementTree.fromstring(xml_str)
+    assert root.tag == 'node'
+
+    interface_elements = root.findall('./interface')
+    iface_names = map(lambda e: e.attrib['name'], interface_elements)
+    iface_names = list(iface_names)
+    iface_names.sort()
+
+    expected_ifaces.sort()
+
+    assert iface_names == expected_ifaces
+
+# Test that the root object at /org/a11y/atspi/accessible/root advertises the correct interfaces
+def test_introspect_root(registry_root, session_manager):
+    check_object_supports_interfaces(
+        registry_root,
+        ['org.a11y.atspi.Accessible',
+         'org.a11y.atspi.Component',
+         'org.a11y.atspi.Socket',
+         ]
+    )
+
+# Test that the registry object at /org/a11y/atspi/registry advertises the correct interfaces
+def test_introspect_registry(registry_registry, session_manager):
+    check_object_supports_interfaces(
+        registry_registry,
+        ['org.a11y.atspi.Registry']
+    )
diff --git a/tests/registryd/test_root.py b/tests/registryd/test_root.py
new file mode 100644 (file)
index 0000000..d4eff51
--- /dev/null
@@ -0,0 +1,7 @@
+import pytest
+import dbus
+
+from utils import check_unknown_property_yields_error
+
+def test_root_property_on_invalid_interface(registry_root, session_manager):
+    check_unknown_property_yields_error(registry_root, 'this.is.not.a.supported.interface')
diff --git a/tests/registryd/test_root_accessible.py b/tests/registryd/test_root_accessible.py
new file mode 100644 (file)
index 0000000..930ecd1
--- /dev/null
@@ -0,0 +1,74 @@
+# Pytest will pick up this module automatically when running just "pytest".
+#
+# Each test_*() function gets passed test fixtures, which are defined
+# in conftest.py.  So, a function "def test_foo(bar)" will get a bar()
+# fixture created for it.
+
+import pytest
+import dbus
+
+from utils import get_property, check_unknown_property_yields_error
+
+ACCESSIBLE_IFACE = 'org.a11y.atspi.Accessible'
+
+ATSPI_ROLE_DESKTOP_FRAME = 14 # see atspi-constants.h
+
+def test_accessible_iface_properties(registry_root, session_manager):
+    values = [
+        ('Name',        'main'),
+        ('Description', ''),
+        ('Parent',      ('', '/org/a11y/atspi/null')),
+        ('ChildCount',  0),
+    ]
+
+    for prop_name, expected in values:
+        assert get_property(registry_root, ACCESSIBLE_IFACE, prop_name) == expected
+
+def test_unknown_property_yields_error(registry_root, session_manager):
+    check_unknown_property_yields_error(registry_root, ACCESSIBLE_IFACE)
+
+def test_get_child_at_index_for_empty_registry(registry_root, session_manager):
+    # FIXME: Shouldn't this return an error, rather than a null reference?
+    (name, path) = registry_root.GetChildAtIndex(0, dbus_interface=ACCESSIBLE_IFACE)
+    assert path == '/org/a11y/atspi/null'
+
+def test_get_children_for_empty_registry(registry_root, session_manager):
+    assert len(registry_root.GetChildren(dbus_interface=ACCESSIBLE_IFACE)) == 0
+
+def test_root_get_index_in_parent(registry_root, session_manager):
+    # The registry root is always index 0
+    assert registry_root.GetIndexInParent(dbus_interface=ACCESSIBLE_IFACE) == 0
+
+def test_root_get_relation_set(registry_root, session_manager):
+    # The registry root has an empty relation set
+    assert len(registry_root.GetRelationSet(dbus_interface=ACCESSIBLE_IFACE)) == 0
+
+def test_root_get_role(registry_root, session_manager):
+    # Hardcoded to ATSPI_ROLE_DESKTOP_FRAME
+    assert registry_root.GetRole(dbus_interface=ACCESSIBLE_IFACE) == ATSPI_ROLE_DESKTOP_FRAME
+
+def test_root_get_role_name(registry_root, session_manager):
+    assert registry_root.GetRoleName(dbus_interface=ACCESSIBLE_IFACE) == "desktop frame"
+
+def test_root_get_localized_role_name(registry_root, session_manager):
+    # FIXME: see the corresponding FIXME in registry.c, to actually localize this
+    assert registry_root.GetLocalizedRoleName(dbus_interface=ACCESSIBLE_IFACE) == "desktop frame"
+
+def test_root_get_state(registry_root, session_manager):
+    assert registry_root.GetState(dbus_interface=ACCESSIBLE_IFACE) == [0, 0]
+
+def test_root_get_attributes(registry_root, session_manager):
+    assert len(registry_root.GetAttributes(dbus_interface=ACCESSIBLE_IFACE)) == 0
+
+def test_root_get_application(registry_root, session_manager):
+    (name, path) = registry_root.GetApplication(dbus_interface=ACCESSIBLE_IFACE)
+    assert path == '/org/a11y/atspi/null'
+    
+def test_root_get_interfaces(registry_root, session_manager):
+    ifaces = registry_root.GetInterfaces(dbus_interface=ACCESSIBLE_IFACE)
+    assert ifaces.signature == 's'
+    assert 'org.a11y.atspi.Accessible' in ifaces
+    assert 'org.a11y.atspi.Application' in ifaces
+    assert 'org.a11y.atspi.Component' in ifaces
+    assert 'org.a11y.atspi.Socket' in ifaces
+
diff --git a/tests/registryd/test_root_application.py b/tests/registryd/test_root_application.py
new file mode 100644 (file)
index 0000000..8816718
--- /dev/null
@@ -0,0 +1,24 @@
+# Pytest will pick up this module automatically when running just "pytest".
+#
+# Each test_*() function gets passed test fixtures, which are defined
+# in conftest.py.  So, a function "def test_foo(bar)" will get a bar()
+# fixture created for it.
+
+import pytest
+import dbus
+
+from utils import get_property, check_unknown_property_yields_error
+
+APPLICATION_IFACE = 'org.a11y.atspi.Application'
+
+def test_application_iface_properties(registry_root, session_manager):
+    values = [
+        ('ToolkitName',  'at-spi-registry'),
+        ('Version',      '2.0'),
+    ]
+
+    for prop_name, expected in values:
+        assert get_property(registry_root, APPLICATION_IFACE, prop_name) == expected
+
+def test_unknown_property_yields_error(registry_root, session_manager):
+    check_unknown_property_yields_error(registry_root, APPLICATION_IFACE)
diff --git a/tests/registryd/test_root_component.py b/tests/registryd/test_root_component.py
new file mode 100644 (file)
index 0000000..c249d23
--- /dev/null
@@ -0,0 +1,35 @@
+import pytest
+import dbus
+
+COMPONENT_IFACE = 'org.a11y.atspi.Component'
+
+COORD_TYPE_WINDOW = 1
+LAYER_WIDGET = 3
+
+def test_contains(registry_root, session_manager):
+    assert registry_root.Contains(0, 0, COORD_TYPE_WINDOW, dbus_interface=COMPONENT_IFACE) == False
+
+def test_get_accessible_at_point(registry_root, session_manager):
+    (name, path) = registry_root.GetAccessibleAtPoint(0, 0, COORD_TYPE_WINDOW, dbus_interface=COMPONENT_IFACE)
+    assert path == '/org/a11y/atspi/null'
+
+def test_get_extents(registry_root, session_manager):
+    assert registry_root.GetExtents(COORD_TYPE_WINDOW, dbus_interface=COMPONENT_IFACE) == (0, 0, 1024, 768)
+
+def test_get_position(registry_root, session_manager):
+    assert registry_root.GetPosition(COORD_TYPE_WINDOW, dbus_interface=COMPONENT_IFACE) == (0, 0)
+
+def test_get_size(registry_root, session_manager):
+    assert registry_root.GetSize(dbus_interface=COMPONENT_IFACE) == (1024, 768)
+
+def test_get_layer(registry_root, session_manager):
+    assert registry_root.GetLayer(dbus_interface=COMPONENT_IFACE) == LAYER_WIDGET
+
+def test_get_mdi_z_order(registry_root, session_manager):
+    assert registry_root.GetMDIZOrder(dbus_interface=COMPONENT_IFACE) == 0
+
+def test_grab_focus(registry_root, session_manager):
+    assert registry_root.GrabFocus(dbus_interface=COMPONENT_IFACE) == False
+
+def test_get_alpha(registry_root, session_manager):
+    assert registry_root.GetAlpha(dbus_interface=COMPONENT_IFACE) == 1.0
diff --git a/tests/registryd/utils.py b/tests/registryd/utils.py
new file mode 100644 (file)
index 0000000..612633d
--- /dev/null
@@ -0,0 +1,11 @@
+import pytest
+import dbus
+
+PROPERTIES_IFACE = 'org.freedesktop.DBus.Properties'
+
+def get_property(proxy, iface_name, prop_name):
+    return proxy.Get(iface_name, prop_name, dbus_interface=PROPERTIES_IFACE)
+
+def check_unknown_property_yields_error(obj, iface):
+    with pytest.raises(dbus.exceptions.DBusException):
+        get_property(obj, iface, 'NonexistentProperty')
diff --git a/xml/Accessibility.xml b/xml/Accessibility.xml
deleted file mode 100644 (file)
index a454aeb..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<spec xmlns:xi="http://www.w3.org/2001/XInclude">
-  <xi:include href="Accessible.xml" parse="xml"/>
-  <xi:include href="Action.xml" parse="xml"/>
-  <xi:include href="Application.xml" parse="xml"/>
-  <xi:include href="Collection.xml" parse="xml"/>
-  <xi:include href="Component.xml" parse="xml"/>
-  <xi:include href="Document.xml" parse="xml"/>
-  <xi:include href="Hypertext.xml" parse="xml"/>
-  <xi:include href="Hyperlink.xml" parse="xml"/>
-  <xi:include href="Image.xml" parse="xml"/>
-  <xi:include href="Selection.xml" parse="xml"/>
-  <xi:include href="Table.xml" parse="xml"/>
-  <xi:include href="TableCell.xml" parse="xml"/>
-  <xi:include href="Text.xml" parse="xml"/>
-  <xi:include href="EditableText.xml" parse="xml"/>
-  <xi:include href="Cache.xml" parse="xml"/>
-  <xi:include href="Value.xml" parse="xml"/>
-  <xi:include href="Registry.xml" parse="xml"/>
-  <xi:include href="DeviceEventController.xml" parse="xml"/>
-  <xi:include href="DeviceEventListener.xml" parse="xml"/>
-</spec>
index b081bfd..e2ec090 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Accessible">
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+  <!--
+      org.a11y.atspi.Accessible:
+      @short_description: Base interface which is implemented by all accessible objects.
+  -->
+  <interface name="org.a11y.atspi.Accessible">
 
-  <property name="Name" type="s" access="read"/>
+    <!--
+        Name: Human-readable, localized, short name for the object.
 
-  <property name="Description" type="s" access="read"/>
+        Normally you need to set this for objects which do not have a labelled-by
+        relation.  Consider a widget to select RGB colors by setting three sliders.  The
+        names for the sliders would be "Red", "Green", "Blue", respectively, or
+        translations to application's locale.  The names would be unnecessary if each
+        slider had a labelled-by relation to corresponding labels visible in the user
+        interface.
 
-  <property name="Parent" type="(so)" access="read">
-    <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
-  </property>
+        In general, something is missing from your application if an object that can be
+        interacted with has no Name or a labelled-by relation.
+    -->
+    <property name="Name" type="s" access="read"/>
 
-  <property name="ChildCount" type="i" access="read"/>
+    <!--
+        Description: Human-readable, localized description of the object in more detail.
 
-  <property name="Locale" type="s" access="read"/>
+        While the Name property is meant to be a short string that screen readers say
+        during normal navigation, the Description property is for when the user asks for
+        more detail.
+    -->
+    <property name="Description" type="s" access="read"/>
 
-  <property name="AccessibleId" type="s" access="read"/>
+    <!--
+        Parent: Accessible parent object of the current object.
 
-  <method name="GetChildAtIndex">
-    <arg direction="in" name="index" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
+        The (so) is a string for the application name, and an object path.
 
-  <method name="GetChildren">
-    <arg direction="out" type="a(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReferenceArray"/>
-  </method>
+        Null parent: If the object has no parent (e.g. the application's root object is
+        being queried), return "" for the application name name and "/org/a11y/atspi/null"
+        for the object path.
 
-  <method name="GetIndexInParent">
-    <arg direction="out" type="i"/>
-  </method>
+        Root object: An application must have a single root object, called
+        "/org/a11y/atspi/accessible/root".  All other objects should have that one as
+        their highest-level ancestor.
+    -->
+    <property name="Parent" type="(so)" access="read">
+      <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
+    </property>
 
-  <method name="GetRelationSet">
-    <arg direction="out" type="a(ua(so))"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRelationArray"/>
-  </method>
+    <!--
+        ChildCount: number of accessible children for this object.
+    -->
+    <property name="ChildCount" type="i" access="read"/>
 
-  <method name="GetRole">
-    <arg direction="out" type="u"/>
-  </method>
+    <!--
+        Locale: Unix locale for the current object.
 
-  <method name="GetRoleName">
-    <arg direction="out" type="s"/>
-  </method>
+        For an application, this may be the locale for the language that the application
+        shows in its user interface.
 
-  <method name="GetLocalizedRoleName">
-    <arg direction="out" type="s"/>
-  </method>
+        For a document being shown in an application, or a paragraph within a document,
+        the locale may refer to that object exclusively.  For example, an application may
+        be showing itself in English ("en"), but it may be used to display a document in
+        Spanish ("es").  In the latter case, a screen reader will want to know that it
+        should switch to Spanish while reading the document.
+    -->
+    <property name="Locale" type="s" access="read"/>
 
-  <method name="GetState">
-    <arg direction="out" type="au"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiIntList"/>
-  </method>
+    <!--
+        AccessibleId: application-specific identifier for the current object.
 
-  <method name="GetAttributes">
-    <arg direction="out" type="a{ss}"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
-  </method>
+        You can use this to give a special id to an object to use in tests, for example,
+        "my_widget".  Note that there is no way to directly find an object by its id; your
+        test program may have to recursively get the children to find a specific id.  This
+        is because accessible objects can be created dynamically, and they do not always
+        correspond to a static view of an application's data.
+    -->
+    <property name="AccessibleId" type="s" access="read"/>
 
-  <method name="GetApplication">
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
+    <!--
+        HelpText: help text for the current object.
+    -->
+    <property name="HelpText" type="s" access="read"/>
 
-  <method name="GetInterfaces">
-    <arg direction="out" type="as"/>
-  </method>
+    <!--
+        GetChildAtIndex:
+        @index: 0-based index of the child to query.
 
-</interface>
+        Queries the Nth accessible child of the current object.  It is expected that this
+        will correspond to the order that the GetChildren method would return.
+
+        Returns: The (so) is a string for the application name, and an object path.
+
+        Notes: implementations vary in their behavior when the index is out of range.
+        GTK4 returns an error, while atk-adaptor returns the null object path
+        "/org/a11y/atspi/null".  To keep the type system gods happy, you should probably
+        return a DBus error in that case.
+    -->
+    <method name="GetChildAtIndex">
+      <arg direction="in" name="index" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <!--
+        GetChildren:
+
+        Returns a list of the object's accessible children.
+
+        Each array element (so) is a string for the application name, and an object path.
+    -->
+    <method name="GetChildren">
+      <arg direction="out" type="a(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReferenceArray"/>
+    </method>
+
+    <!--
+        GetIndexInParent:
+
+        Returns the 0-based index at which the object would be returned by calling
+        GetChildren on its parent, or -1 if the object has no containing
+        parent or on exception.
+    -->
+    <method name="GetIndexInParent">
+      <arg direction="out" type="i"/>
+    </method>
+
+    <!--
+        GetRelationSet:
+
+        Returns a set of relationships between the current object and others.  Each
+        element in the outermost array contains a number that indicates the relation type
+        (see below), and an array of references to accessible objects to which that
+        relationship applies.  Each element in the inner array is a (so) with a string for
+        the application name, and an object path.
+
+        Each relationship between objects (possibly one-to-many or many-to-one) allows
+        better semantic identification of how objects are associated with one another.
+        For instance, the ATSPI_RELATION_LABELLED_BY relationship may be used to identify
+        labelling information that should accompany the accessible name property when
+        presenting an object's content or identity to the end user.  Similarly,
+        ATSPI_RELATION_CONTROLLER_FOR can be used to further specify the context in which
+        a valuator is useful, and/or the other UI components which are directly effected
+        by user interactions with the valuator. Common examples include association of
+        scrollbars with the viewport or panel which they control.
+
+        Relation types - these are the enum values from AtspiRelationType in atspi-constants.h:
+
+        0 - ATSPI_RELATION_NULL: Not a meaningful relationship; clients should not
+            normally encounter this value.
+
+        1 - ATSPI_RELATION_LABEL_FOR: Object is a label for one or more other objects.
+
+        2 - ATSPI_RELATION_LABELLED_BY: Object is labelled by one or more other
+            objects.
+
+        3 - ATSPI_RELATION_CONTROLLER_FOR: Object is an interactive object which
+            modifies the state, onscreen location, or other attributes of one or more
+            target objects.
+
+        4 - ATSPI_RELATION_CONTROLLED_BY: Object state, position, etc. is
+            modified/controlled by user interaction with one or more other objects.
+            For instance a viewport or scroll pane may be ATSPI_RELATION_CONTROLLED_BY
+            scrollbars.
+
+        5 - ATSPI_RELATION_MEMBER_OF: Object has a grouping relationship (e.g. 'same
+            group as') to one or more other objects.
+
+        6 - ATSPI_RELATION_TOOLTIP_FOR: Object is a tooltip associated with another
+            object.
+
+        7 - ATSPI_RELATION_NODE_CHILD_OF: Object is a child of the target.
+
+        8 - ATSPI_RELATION_NODE_PARENT_OF: Object is a parent of the target.
+
+        9 - ATSPI_RELATION_EXTENDED: Used to indicate that a relationship exists, but
+           its type is not specified in the enumeration.
+
+        10 - ATSPI_RELATION_FLOWS_TO: Object renders content which flows logically to
+             another object. For instance, text in a paragraph may flow to another
+             object which is not the 'next sibling' in the accessibility hierarchy.
+
+        11 - ATSPI_RELATION_FLOWS_FROM: Reciprocal of ATSPI_RELATION_FLOWS_TO.
+
+        12 - ATSPI_RELATION_SUBWINDOW_OF: Object is visually and semantically considered
+             a subwindow of another object, even though it is not the object's child.
+             Useful when dealing with embedded applications and other cases where the
+             widget hierarchy does not map cleanly to the onscreen presentation.
+
+        13 - ATSPI_RELATION_EMBEDS: Similar to ATSPI_RELATION_SUBWINDOW_OF, but
+             specifically used for cross-process embedding.
+
+        14 - ATSPI_RELATION_EMBEDDED_BY: Reciprocal of ATSPI_RELATION_EMBEDS. Used to
+             denote content rendered by embedded renderers that live in a separate process
+             space from the embedding context.
+
+        15 - ATSPI_RELATION_POPUP_FOR: Denotes that the object is a transient window or
+             frame associated with another onscreen object. Similar to ATSPI_TOOLTIP_FOR,
+             but more general. Useful for windows which are technically toplevels
+             but which, for one or more reasons, do not explicitly cause their
+             associated window to lose 'window focus'. Creation of an ATSPI_ROLE_WINDOW
+             object with the ATSPI_RELATION_POPUP_FOR relation usually requires
+             some presentation action on the part of assistive technology clients,
+             even though the previous toplevel ATSPI_ROLE_FRAME object may still be
+             the active window.
+
+        16 - ATSPI_RELATION_PARENT_WINDOW_OF: This is the reciprocal relation to
+             ATSPI_RELATION_POPUP_FOR.
+
+        17 - ATSPI_RELATION_DESCRIPTION_FOR: Reciprocal of ATSPI_RELATION_DESCRIBED_BY.
+             Indicates that this object provides descriptive information about the target
+             object(s). See also ATSPI_RELATION_DETAILS_FOR and ATSPI_RELATION_ERROR_FOR.
+
+        18 - ATSPI_RELATION_DESCRIBED_BY: Reciprocal of ATSPI_RELATION_DESCRIPTION_FOR.
+             Indicates that one or more target objects provide descriptive information
+             about this object. This relation type is most appropriate for information
+             that is not essential as its presentation may be user-configurable and/or
+             limited to an on-demand mechanism such as an assistive technology command.
+             For brief, essential information such as can be found in a widget's on-screen
+             label, use ATSPI_RELATION_LABELLED_BY. For an on-screen error message, use
+             ATSPI_RELATION_ERROR_MESSAGE. For lengthy extended descriptive information
+             contained in an on-screen object, consider using ATSPI_RELATION_DETAILS as
+             assistive technologies may provide a means for the user to navigate to
+             objects containing detailed descriptions so that their content can be more
+             closely reviewed.
+
+        19 - ATSPI_RELATION_DETAILS: Reciprocal of ATSPI_RELATION_DETAILS_FOR. Indicates
+             that this object has a detailed or extended description, the contents of
+             which can be found in the target object(s). This relation type is most
+             appropriate for information that is sufficiently lengthy as to make
+             navigation to the container of that information desirable. For less verbose
+             information suitable for announcement only, see ATSPI_RELATION_DESCRIBED_BY.
+             If the detailed information describes an error condition,
+             ATSPI_RELATION_ERROR_FOR should be used instead.  Since 2.26.
+
+        20 - ATSPI_RELATION_DETAILS_FOR: Reciprocal of ATSPI_RELATION_DETAILS. Indicates
+             that this object provides a detailed or extended description about the target
+             object(s). See also ATSPI_RELATION_DESCRIPTION_FOR and ATSPI_RELATION_ERROR_FOR.
+             Since 2.26.
+
+        21 - ATSPI_RELATION_ERROR_MESSAGE: Reciprocal of ATSPI_RELATION_ERROR_FOR.
+             Indicates that this object has one or more errors, the nature of which is
+             described in the contents of the target object(s). Objects that have this
+             relation type should also contain ATSPI_STATE_INVALID_ENTRY when their
+             GetState method is called.  Since: 2.26.
+
+        22 - ATSPI_RELATION_ERROR_FOR: Reciprocal of ATSPI_RELATION_ERROR_MESSAGE.
+             Indicates that this object contains an error message describing an invalid
+             condition in the target object(s). Since: 2.26.
+    -->
+    <method name="GetRelationSet">
+      <arg direction="out" type="a(ua(so))"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRelationArray"/>
+    </method>
+
+    <!--
+        GetRole:
+
+        Gets the accessible role that the current object represents.  Roles make it
+        possible for various UI toolkits to expose their controls to assistive
+        technologies (ATs) with a standard interface, regardless of toolkit.  For example,
+        a widget that acts like a conventional push button (appears unpressed; presses
+        when acted upon; invokes a certain action when pressed) can expose an
+        ATSPI_ROLE_PUSH_BUTTON role.
+
+        Role values - these are the enum values from AtspiRole in atspi-constants.h:
+
+        0 - ATSPI_ROLE_INVALID: A role indicating an error condition, such as
+            uninitialized Role data.
+
+        1 - ATSPI_ROLE_ACCELERATOR_LABEL: Object is a label indicating the keyboard
+            accelerators for the parent.
+
+        2 - ATSPI_ROLE_ALERT: Object is used to alert the user about something.
+
+        3 - ATSPI_ROLE_ANIMATION: Object contains a dynamic or moving image of some
+            kind.
+
+        4 - ATSPI_ROLE_ARROW: Object is a 2D directional indicator.
+
+        5 - ATSPI_ROLE_CALENDAR: Object contains one or more dates, usually arranged
+            into a 2D list.
+
+        6 - ATSPI_ROLE_CANVAS: Object that can be drawn into and is used to trap
+            events.
+
+        7 - ATSPI_ROLE_CHECK_BOX: A choice that can be checked or unchecked and
+            provides a separate indicator for the current state.
+
+        8 - ATSPI_ROLE_CHECK_MENU_ITEM: A menu item that behaves like a check box. See
+            ATSPI_ROLE_CHECK_BOX.
+
+        9 - ATSPI_ROLE_COLOR_CHOOSER: A specialized dialog that lets the user choose a
+            color.
+
+        10 - ATSPI_ROLE_COLUMN_HEADER: The header for a column of data.
+
+        11 - ATSPI_ROLE_COMBO_BOX: A list of choices the user can select from.
+
+        12 - ATSPI_ROLE_DATE_EDITOR: An object which allows entry of a date.
+
+        13 - ATSPI_ROLE_DESKTOP_ICON: An inconified internal frame within a DESKTOP_PANE.
+
+        14 - ATSPI_ROLE_DESKTOP_FRAME: A pane that supports internal frames and
+             iconified versions of those internal frames.
+
+        15 - ATSPI_ROLE_DIAL: An object that allows a value to be changed via rotating a
+             visual element, or which displays a value via such a rotating element.
+
+        16 - ATSPI_ROLE_DIALOG: A top level window with title bar and a border.
+
+        17 - ATSPI_ROLE_DIRECTORY_PANE: A pane that allows the user to navigate through
+             and select the contents of a directory.
+
+        18 - ATSPI_ROLE_DRAWING_AREA: An object used for drawing custom user interface
+             elements.
+
+        19 - ATSPI_ROLE_FILE_CHOOSER: A specialized dialog that displays the files in
+             the directory and lets the user select a file, browse a different
+             directory, or specify a filename.
+
+        20 - ATSPI_ROLE_FILLER: A object that fills up space in a user interface.
+
+        21 - ATSPI_ROLE_FOCUS_TRAVERSABLE: Don't use, reserved for future use.
+
+        22 - ATSPI_ROLE_FONT_CHOOSER: Allows selection of a display font.
+
+        23 - ATSPI_ROLE_FRAME: A top level window with a title bar, border, menubar,
+             etc.
+
+        24 - ATSPI_ROLE_GLASS_PANE: A pane that is guaranteed to be painted on top of
+             all panes beneath it.
+
+        25 - ATSPI_ROLE_HTML_CONTAINER: A document container for HTML, whose children
+             represent the document content.
+
+        26 - ATSPI_ROLE_ICON: A small fixed size picture, typically used to decorate
+             components.
+
+        27 - ATSPI_ROLE_IMAGE: An image, typically static.
+
+        28 - ATSPI_ROLE_INTERNAL_FRAME: A frame-like object that is clipped by a desktop
+             pane.
+
+        29 - ATSPI_ROLE_LABEL: An object used to present an icon or short string in an
+             interface.
+
+        30 - ATSPI_ROLE_LAYERED_PANE: A specialized pane that allows its children to be
+             drawn in layers, providing a form of stacking order.
+
+        31 - ATSPI_ROLE_LIST: An object that presents a list of objects to the user and
+             allows the user to select one or more of them.
+
+        32 - ATSPI_ROLE_LIST_ITEM: An object that represents an element of a list.
+
+        33 - ATSPI_ROLE_MENU: An object usually found inside a menu bar that contains a
+             list of actions the user can choose from.
+
+        34 - ATSPI_ROLE_MENU_BAR: An object usually drawn at the top of the primary
+             dialog box of an application that contains a list of menus the user can
+             choose from.
+
+        35 - ATSPI_ROLE_MENU_ITEM: An object usually contained in a menu that presents
+             an action the user can choose.
+
+        36 - ATSPI_ROLE_OPTION_PANE: A specialized pane whose primary use is inside a
+             dialog.
+
+        37 - ATSPI_ROLE_PAGE_TAB: An object that is a child of a page tab list.
+
+        38 - ATSPI_ROLE_PAGE_TAB_LIST: An object that presents a series of panels (or
+             page tabs), one at a time,through some mechanism provided by the
+             object.
+
+        39 - ATSPI_ROLE_PANEL: A generic container that is often used to group objects.
+
+        40 - ATSPI_ROLE_PASSWORD_TEXT: A text object uses for passwords, or other places
+             where the text content is not shown visibly to the user.
+
+        41 - ATSPI_ROLE_POPUP_MENU: A temporary window that is usually used to offer the
+             user a list of choices, and then hides when the user selects one of those
+             choices.
+
+        42 - ATSPI_ROLE_PROGRESS_BAR: An object used to indicate how much of a task has
+             been completed.
+
+        43 - ATSPI_ROLE_PUSH_BUTTON: An object the user can manipulate to tell the
+             application to do something.
+
+        44 - ATSPI_ROLE_RADIO_BUTTON: A specialized check box that will cause other
+             radio buttons in the same group to become unchecked when this one is
+             checked.
+
+        45 - ATSPI_ROLE_RADIO_MENU_ITEM: Object is both a menu item and a "radio button".
+             See ATSPI_ROLE_RADIO_BUTTON.
+
+        46 - ATSPI_ROLE_ROOT_PANE: A specialized pane that has a glass pane and a
+             layered pane as its children.
+
+        47 - ATSPI_ROLE_ROW_HEADER: The header for a row of data.
+
+        48 - ATSPI_ROLE_SCROLL_BAR: An object usually used to allow a user to
+             incrementally view a large amount of data by moving the bounds of a
+             viewport along a one-dimensional axis.
+
+        49 - ATSPI_ROLE_SCROLL_PANE: An object that allows a user to incrementally view
+             a large amount of information. Scroll pane objects are usually
+             accompanied by ATSPI_ROLE_SCROLL_BAR controllers, on which the
+             ATSPI_RELATION_CONTROLLER_FOR and ATSPI_RELATION_CONTROLLED_BY
+             reciprocal relations are set. See the GetRelationSet method.
+
+        50 - ATSPI_ROLE_SEPARATOR: An object usually contained in a menu to provide a
+             visible and logical separation of the contents in a menu.
+
+        51 - ATSPI_ROLE_SLIDER: An object that allows the user to select from a bounded range.
+             Unlike ATSPI_ROLE_SCROLL_BAR, ATSPI_ROLE_SLIDER objects need not control
+             'viewport'-like objects.
+
+        52 - ATSPI_ROLE_SPIN_BUTTON: An object which allows one of a set of choices to
+             be selected, and which displays the current choice.
+
+        53 - ATSPI_ROLE_SPLIT_PANE: A specialized panel that presents two other panels
+             at the same time.
+
+        54 - ATSPI_ROLE_STATUS_BAR: Object displays non-quantitative status information
+             (c.f. ATSPI_ROLE_PROGRESS_BAR)
+
+        55 - ATSPI_ROLE_TABLE: An object used to represent information in terms of rows
+             and columns.
+
+        56 - ATSPI_ROLE_TABLE_CELL: A 'cell' or discrete child within a Table. Note:
+             Table cells need not have ATSPI_ROLE_TABLE_CELL, other
+             role values are valid as well.
+
+        57 - ATSPI_ROLE_TABLE_COLUMN_HEADER: An object which labels a particular column
+             in a Table interface interface.
+
+        58 - ATSPI_ROLE_TABLE_ROW_HEADER: An object which labels a particular row in a
+             Table interface. Table rows and columns may also be labelled via the
+             ATSPI_RELATION_LABEL_FOR/ATSPI_RELATION_LABELLED_BY relationships; see
+             the GetRelationSet method.
+
+        59 - ATSPI_ROLE_TEAROFF_MENU_ITEM: Object allows menu to be removed from menubar
+             and shown in its own window.
+
+        60 - ATSPI_ROLE_TERMINAL: An object that emulates a terminal.
+
+        61 - ATSPI_ROLE_TEXT: An interactive widget that supports multiple lines of text
+             and optionally accepts user input, but whose purpose is not to solicit user
+             input. Thus ATSPI_ROLE_TEXT is appropriate for the text view in a plain text
+             editor but inappropriate for an input field in a dialog box or web form. For
+             widgets whose purpose is to solicit input from the user, see ATSPI_ROLE_ENTRY
+             and ATSPI_ROLE_PASSWORD_TEXT. For generic objects which display a brief amount
+             of textual information, see ATSPI_ROLE_STATIC.
+
+        62 - ATSPI_ROLE_TOGGLE_BUTTON: A specialized push button that can be checked or
+             unchecked, but does not procide a separate indicator for the current
+             state.
+
+        63 - ATSPI_ROLE_TOOL_BAR: A bar or palette usually composed of push buttons or
+             toggle buttons.
+
+        64 - ATSPI_ROLE_TOOL_TIP: An object that provides information about another
+             object.
+
+        65 - ATSPI_ROLE_TREE: An object used to repsent hierarchical information to the
+             user.
+
+        66 - ATSPI_ROLE_TREE_TABLE: An object that presents both tabular and
+             hierarchical info to the user.
+
+        67 - ATSPI_ROLE_UNKNOWN: The object contains some accessible information,
+             but its role is not known.
+
+        68 - ATSPI_ROLE_VIEWPORT: An object usually used in a scroll pane, or to
+             otherwise clip a larger object or content renderer to a specific
+             onscreen viewport.
+
+        69 - ATSPI_ROLE_WINDOW: A top level window with no title or border.
+
+        70 - ATSPI_ROLE_EXTENDED: means that the role for this item is known, but not
+             included in the core enumeration. Deprecated since 2.24.
+
+        71 - ATSPI_ROLE_HEADER: An object that serves as a document header.
+
+        72 - ATSPI_ROLE_FOOTER: An object that serves as a document footer.
+
+        73 - ATSPI_ROLE_PARAGRAPH: An object which is contains a single paragraph of
+             text content. See also ATSPI_ROLE_TEXT.
+
+        74 - ATSPI_ROLE_RULER: An object which describes margins and tab stops, etc.
+             for text objects which it controls (should have
+             ATSPI_RELATION_CONTROLLER_FOR relation to such).
+
+        75 - ATSPI_ROLE_APPLICATION: An object corresponding to the toplevel accessible
+             of an application, which may contain ATSPI_ROLE_FRAME objects or other
+             accessible objects. Children of objects with the ATSPI_ROLE_DESKTOP_FRAME role
+             are generally ATSPI_ROLE_APPLICATION objects.
+
+        76 - ATSPI_ROLE_AUTOCOMPLETE: The object is a dialog or list containing items
+             for insertion into an entry widget, for instance a list of words for
+             completion of a text entry.
+
+        77 - ATSPI_ROLE_EDITBAR: The object is an editable text object in a toolbar.
+
+        78 - ATSPI_ROLE_EMBEDDED: The object is an embedded component container.  This
+             role is a "grouping" hint that the contained objects share a context
+             which is different from the container in which this accessible is
+             embedded. In particular, it is used for some kinds of document embedding,
+             and for embedding of out-of-process component, "panel applets", etc.
+
+        79 - ATSPI_ROLE_ENTRY: The object is a component whose textual content may be
+             entered or modified by the user, provided ATSPI_STATE_EDITABLE is present.
+             A readonly ATSPI_ROLE_ENTRY object (i.e. where ATSPI_STATE_EDITABLE is
+             not present) implies a read-only 'text field' in a form, as opposed to a
+             title, label, or caption.
+
+        80 - ATSPI_ROLE_CHART: The object is a graphical depiction of quantitative data.
+             It may contain multiple subelements whose attributes and/or description
+             may be queried to obtain both the  quantitative data and information about
+             how the data is being presented. The ATSPI_LABELLED_BY relation is
+             particularly important in interpreting objects of this type, as is the
+             accessible description property. See ATSPI_ROLE_CAPTION.
+
+        81 - ATSPI_ROLE_CAPTION: The object contains descriptive information, usually
+             textual, about another user interface element such as a table, chart, or
+             image.
+
+        82 - ATSPI_ROLE_DOCUMENT_FRAME: The object is a visual frame or container which
+             contains a view of document content.  Document frames may occur within
+             another Document instance, in which case the second document may be
+             said to be embedded in the containing instance.  HTML frames are often
+             ATSPI_ROLE_DOCUMENT_FRAME:  Either this object, or a singleton descendant,
+             should implement the org.a11y.atspi.Document interface.
+
+        83 - ATSPI_ROLE_HEADING: The object serves as a heading for content which
+             follows it in a document. The 'heading level' of the heading, if
+             availabe,  may be obtained by       querying the object's attributes.
+
+        84 - ATSPI_ROLE_PAGE: The object is a containing instance which encapsulates a
+             page of information. ATSPI_ROLE_PAGE is used in documents and content which
+             support a paginated navigation model.
+
+        85 - ATSPI_ROLE_SECTION: The object is a containing instance of document content
+             which constitutes a particular 'logical' section of the document.  The
+             type of content within a section, and the nature of the section division
+             itself, may be obtained by querying the object's attributes.  Sections
+             may be nested.
+
+        86 - ATSPI_ROLE_REDUNDANT_OBJECT: The object is redundant with another object in
+             the hierarchy, and is exposed for purely technical reasons.  Objects of
+             this role should be ignored by clients, if they are encountered at all.
+
+        87 - ATSPI_ROLE_FORM: The object is a containing instance of document content
+             which has within it components with which the user can interact in order
+             to input information; i.e. the object is a container for pushbuttons,
+             comboboxes, text input fields, and other 'GUI' components. ATSPI_ROLE_FORM
+             should not, in general, be used for toplevel GUI containers or dialogs,
+             but should be reserved for 'GUI' containers which occur within document
+             content, for instance within Web documents, presentations, or text
+             documents.  Unlike other GUI containers and dialogs which occur inside
+             application instances, ATSPI_ROLE_FORM containers' components are
+             associated with the current document, rather than the current foreground
+             application or viewer instance.
+
+        88 - ATSPI_ROLE_LINK: The object is a hypertext anchor, i.e. a "link" in a
+             hypertext document.  Such objects are distinct from 'inline' content
+             which may also use the Hypertext/Hyperlink interfaces to indicate
+             the range/location within a text object where an inline or embedded object
+             lies.
+
+        89 - ATSPI_ROLE_INPUT_METHOD_WINDOW: The object is a window or similar viewport
+             which is used to allow composition or input of a 'complex character',
+             in other words it is an "input method window".
+
+        90 - ATSPI_ROLE_TABLE_ROW: A row in a table.
+
+        91 - ATSPI_ROLE_TREE_ITEM: An object that represents an element of a tree.
+
+        92 - ATSPI_ROLE_DOCUMENT_SPREADSHEET: A document frame which contains a
+             spreadsheet.
+
+        93 - ATSPI_ROLE_DOCUMENT_PRESENTATION: A document frame which contains a
+             presentation or slide content.
+
+        94 - ATSPI_ROLE_DOCUMENT_TEXT: A document frame which contains textual content,
+             such as found in a word processing application.
+
+        95 - ATSPI_ROLE_DOCUMENT_WEB: A document frame which contains HTML or other
+             markup suitable for display in a web browser.
+
+        96 - ATSPI_ROLE_DOCUMENT_EMAIL: A document frame which contains email content
+             to be displayed or composed either in plain text or HTML.
+
+        97 - ATSPI_ROLE_COMMENT: An object found within a document and designed to
+             present a comment, note, or other annotation. In some cases, this object
+             might not be visible until activated.
+
+        98 - ATSPI_ROLE_LIST_BOX: A non-collapsible list of choices the user can select from.
+
+        99 - ATSPI_ROLE_GROUPING: A group of related widgets. This group typically has a label.
+
+        100 - ATSPI_ROLE_IMAGE_MAP: An image map object. Usually a graphic with multiple
+              hotspots, where each hotspot can be activated resulting in the loading of
+              another document or section of a document.
+
+        101 - ATSPI_ROLE_NOTIFICATION: A transitory object designed to present a
+              message to the user, typically at the desktop level rather than inside a
+              particular application.
+
+        102 - ATSPI_ROLE_INFO_BAR: An object designed to present a message to the user
+              within an existing window.
+
+        103 - ATSPI_ROLE_LEVEL_BAR: A bar that serves as a level indicator to, for
+              instance, show the strength of a password or the state of a battery. Since: 2.8
+
+        104 - ATSPI_ROLE_TITLE_BAR: A bar that serves as the title of a window or a
+              dialog. Since: 2.12
+
+        105 - ATSPI_ROLE_BLOCK_QUOTE: An object which contains a text section
+              that is quoted from another source.  Since: 2.12
+
+        106 - ATSPI_ROLE_AUDIO: An object which represents an audio
+              element. Since: 2.12
+
+        107 - ATSPI_ROLE_VIDEO: An object which represents a video
+              element. Since: 2.12
+
+        108 - ATSPI_ROLE_DEFINITION: A definition of a term or concept. Since: 2.12
+
+        109 - ATSPI_ROLE_ARTICLE: A section of a page that consists of a
+              composition that forms an independent part of a document, page, or
+              site. Examples: A blog entry, a news story, a forum post. Since: 2.12
+
+        110 - ATSPI_ROLE_LANDMARK: A region of a web page intended as a
+              navigational landmark. This is designed to allow Assistive
+              Technologies to provide quick navigation among key regions within a
+              document. Since: 2.12
+
+        111 - ATSPI_ROLE_LOG: A text widget or container holding log content, such
+              as chat history and error logs. In this role there is a
+              relationship between the arrival of new items in the log and the
+              reading order. The log contains a meaningful sequence and new
+              information is added only to the end of the log, not at arbitrary
+              points. Since: 2.12
+
+        112 - ATSPI_ROLE_MARQUEE: A container where non-essential information
+              changes frequently. Common usages of marquee include stock tickers
+              and ad banners. The primary difference between a marquee and a log
+              is that logs usually have a meaningful order or sequence of
+              important content changes. Since: 2.12
+
+        113 - ATSPI_ROLE_MATH: A text widget or container that holds a mathematical
+              expression. Since: 2.12
+
+        114 - ATSPI_ROLE_RATING: A widget whose purpose is to display a rating,
+              such as the number of stars associated with a song in a media
+              player. Objects of this role should also implement
+              the Value interface. Since: 2.12
+
+        115 - ATSPI_ROLE_TIMER: An object containing a numerical counter which
+              indicates an amount of elapsed time from a start point, or the time
+              remaining until an end point. Since: 2.12
+
+        116 - ATSPI_ROLE_STATIC: A generic non-container object whose purpose is to display
+              a brief amount of information to the user and whose role is known by the
+              implementor but lacks semantic value for the user. Examples in which
+              ATSPI_ROLE_STATIC is appropriate include the message displayed in a message
+              box and an image used as an alternative means to display text.
+              ATSPI_ROLE_STATIC should not be applied to widgets which are traditionally
+              interactive, objects which display a significant amount of content, or any
+              object which has an accessible relation pointing to another object. The
+              displayed information, as a general rule, should be exposed through the
+              accessible name of the object. For labels which describe another widget, see
+              ATSPI_ROLE_LABEL. For text views, see ATSPI_ROLE_TEXT. For generic
+              containers, see ATSPI_ROLE_PANEL. For objects whose role is not known by the
+              implementor, see ATSPI_ROLE_UNKNOWN. Since: 2.16.
+
+        117 - ATSPI_ROLE_MATH_FRACTION: An object that represents a mathematical fraction. Since: 2.16.
+
+        118 - ATSPI_ROLE_MATH_ROOT: An object that represents a mathematical expression
+              displayed with a radical. Since: 2.16.
+
+        119 - ATSPI_ROLE_SUBSCRIPT: An object that contains text that is displayed as a
+              subscript. Since: 2.16.
+
+        120 - ATSPI_ROLE_SUPERSCRIPT: An object that contains text that is displayed as a
+              superscript. Since: 2.16.
+
+        121 - ATSPI_ROLE_DESCRIPTION_LIST: An object that represents a list of term-value
+              groups. A term-value group represents an individual description and consist
+              of one or more names (ATSPI_ROLE_DESCRIPTION_TERM) followed by one or more
+              values (ATSPI_ROLE_DESCRIPTION_VALUE). For each list, there should not be
+              more than one group with the same term name. Since: 2.26.
+
+        122 - ATSPI_ROLE_DESCRIPTION_TERM: An object that represents a term or phrase
+              with a corresponding definition. Since: 2.26.
+
+        123 - ATSPI_ROLE_DESCRIPTION_VALUE: An object that represents the description,
+              definition, or value of a term. Since: 2.26.
+
+        124 - ATSPI_ROLE_FOOTNOTE: An object that contains the text of a footnote. Since: 2.26.
+
+        125 - ATSPI_ROLE_CONTENT_DELETION: Content previously deleted or proposed to be
+              deleted, e.g. in revision history or a content view providing suggestions
+              from reviewers. Since: 2.34.
+
+        126 - ATSPI_ROLE_CONTENT_INSERTION: Content previously inserted or proposed to be
+              inserted, e.g. in revision history or a content view providing suggestions
+              from reviewers. Since: 2.34.
+
+        127 - ATSPI_ROLE_MARK: A run of content that is marked or highlighted, such as for
+              reference purposes, or to call it out as having a special purpose. If the
+              marked content has an associated section in the document elaborating on the
+              reason for the mark, then an ATSPI_RELATION_DETAILS relation should be used on the mark
+              to point to that associated section. In addition, the reciprocal relation
+              ATSPI_RELATION_DETAILS_FOR should be used on the associated content section
+              to point back to the mark. See the GetRelationSet method. Since: 2.36.
+
+        128 - ATSPI_ROLE_SUGGESTION: A container for content that is called out as a
+              proposed change from the current version of the document, such as by a reviewer of
+              the content. An object with this role should include children with
+              ATSPI_ROLE_CONTENT_DELETION and/or ATSPI_ROLE_CONTENT_INSERTION, in any order, to
+              indicate what the actual change is. Since: 2.36
+
+        129 - ATSPI_ROLE_PUSH_BUTTON_MENU: A specialized push button to open a menu. Since: 2.46
+    -->
+    <method name="GetRole">
+      <arg direction="out" type="u"/>
+    </method>
+
+    <!--
+        GetRoleName:
+
+        Gets a UTF-8 string corresponding to the name of the role played by an object.
+        This method will return useful values for roles that fall outside the
+        enumeration used in the GetRole method. Implementing this method is
+        optional, and it may be removed in a future version of the API.
+        Libatspi will only call id in the event of an unknown role.
+    -->
+    <method name="GetRoleName">
+      <arg direction="out" type="s"/>
+    </method>
+
+    <!--
+        GetLocalizedRoleName:
+
+        Gets a UTF-8 string corresponding to the name of the role played by an object, translated
+        to the current locale.
+        This method will return useful values for roles that fall outside the
+        enumeration used in the GetRole method. Implementing this method is
+        optional, and it may be removed in a future version of the API.
+        Libatspi will only call id in the event of an unknown role.
+    -->
+    <method name="GetLocalizedRoleName">
+      <arg direction="out" type="s"/>
+    </method>
+
+    <!--
+        GetState:
+
+        Gets the set of states currently held by an object.
+
+        Elements in the array are enumeration values from AtspiStateType in atspi-constants.h:
+
+        0 - ATSPI_STATE_INVALID: Indicates an invalid state - probably an error
+            condition.
+
+        1 - ATSPI_STATE_ACTIVE: Indicates a window is currently the active window, or
+            an object is the active subelement within a container or table. ATSPI_STATE_ACTIVE
+            should not be used for objects which have ATSPI_STATE_FOCUSABLE or
+            ATSPI_STATE_SELECTABLE: Those objects should use
+            ATSPI_STATE_FOCUSED and ATSPI_STATE_SELECTED respectively.
+            ATSPI_STATE_ACTIVE is a means to indicate that an object which is not
+            focusable and not selectable is the currently-active item within its
+            parent container.
+
+        2 - ATSPI_STATE_ARMED: Indicates that the object is armed.
+
+        3 - ATSPI_STATE_BUSY: Indicates the current object is busy, i.e. onscreen
+            representation is in the process of changing, or the object is
+            temporarily unavailable for interaction due to activity already in progress.
+
+        4 - ATSPI_STATE_CHECKED: Indicates this object is currently checked.
+
+        5 - ATSPI_STATE_COLLAPSED: Indicates this object is collapsed.
+
+        6 - ATSPI_STATE_DEFUNCT: Indicates that this object no longer has a valid
+            backing widget (for instance, if its peer object has been destroyed).
+
+        7 - ATSPI_STATE_EDITABLE: Indicates the user can change the contents of this
+            object.
+
+        8 - ATSPI_STATE_ENABLED: Indicates that this object is enabled, i.e. that it
+            currently reflects some application state. Objects that are "greyed out"
+            may lack this state, and may lack the ATSPI_STATE_SENSITIVE if direct
+            user interaction cannot cause them to acquire ATSPI_STATE_ENABLED.
+            See ATSPI_STATE_SENSITIVE.
+
+        9 - ATSPI_STATE_EXPANDABLE: Indicates this object allows progressive
+            disclosure of its children.
+
+        10 - ATSPI_STATE_EXPANDED: Indicates this object is expanded.
+
+        11 - ATSPI_STATE_FOCUSABLE: Indicates this object can accept keyboard focus,
+             which means all events resulting from typing on the keyboard will
+             normally be passed to it when it has focus.
+
+        12 - ATSPI_STATE_FOCUSED: Indicates this object currently has the keyboard
+             focus.
+
+        13 - ATSPI_STATE_HAS_TOOLTIP: Indicates that the object has an associated
+             tooltip.
+
+        14 - ATSPI_STATE_HORIZONTAL: Indicates the orientation of this object is
+             horizontal.
+
+        15 - ATSPI_STATE_ICONIFIED: Indicates this object is minimized and is
+             represented only by an icon.
+
+        16 - ATSPI_STATE_MODAL: Indicates something must be done with this object
+             before the user can interact with an object in a different window.
+
+        17 - ATSPI_STATE_MULTI_LINE: Indicates this (text) object can contain multiple
+             lines of text.
+
+        18 - ATSPI_STATE_MULTISELECTABLE: Indicates this object allows more than one of
+             its children to be selected at the same time, or in the case of text
+             objects, that the object supports non-contiguous text selections.
+
+        19 - ATSPI_STATE_OPAQUE: Indicates this object paints every pixel within its
+             rectangular region. It also indicates an alpha value of unity, if it
+             supports alpha blending.
+
+        20 - ATSPI_STATE_PRESSED: Indicates this object is currently pressed.
+
+        21 - ATSPI_STATE_RESIZABLE: Indicates the size of this object's size is not
+             fixed.
+
+        22 - ATSPI_STATE_SELECTABLE: Indicates this object is the child of an object
+             that allows its children to be selected and that this child is one of
+             those children that can be selected.
+
+        23 - ATSPI_STATE_SELECTED: Indicates this object is the child of an object that
+             allows its children to be selected and that this child is one of those
+             children that has been selected.
+
+        24 - ATSPI_STATE_SENSITIVE: Indicates this object is sensitive, e.g. to user
+             interaction. ATSPI_STATE_SENSITIVE usually accompanies.
+             ATSPI_STATE_ENABLED for user-actionable controls, but may be found in the
+             absence of ATSPI_STATE_ENABLED if the current visible state of the control
+             is "disconnected" from the application state.  In such cases, direct user
+             interaction can often result in the object gaining ATSPI_STATE_SENSITIVE,
+             for instance if a user makes an explicit selection using an object whose
+             current state is ambiguous or undefined. See ATSPI_STATE_ENABLED,
+             ATSPI_STATE_INDETERMINATE.
+
+        25 - ATSPI_STATE_SHOWING: Indicates this object, the object's parent, the
+             object's parent's parent, and so on, are all 'shown' to the end-user,
+             i.e. subject to "exposure" if blocking or obscuring objects do not
+             interpose between this object and the top of the window stack.
+
+        26 - ATSPI_STATE_SINGLE_LINE: Indicates this (text) object can contain only a
+             single line of text.
+
+        27 - ATSPI_STATE_STALE: Indicates that the information returned for this object
+             may no longer be synchronized with the application state.  This can occur
+             if the object has ATSPI_STATE_TRANSIENT, and can also occur towards the
+             end of the object peer's lifecycle.
+
+        28 - ATSPI_STATE_TRANSIENT: Indicates this object is transient.
+
+        29 - ATSPI_STATE_VERTICAL: Indicates the orientation of this object is vertical;
+             for example this state may appear on such objects as scrollbars, text
+             objects (with vertical text flow), separators, etc.
+
+        30 - ATSPI_STATE_VISIBLE: Indicates this object is visible, e.g. has been
+             explicitly marked for exposure to the user. ATSPI_STATE_VISIBLE is no
+             guarantee that the object is actually unobscured on the screen, only that
+             it is 'potentially' visible, barring obstruction, being scrolled or clipped
+             out of the field of view, or having an ancestor container that has not yet
+             made visible. A widget is potentially onscreen if it has both
+             ATSPI_STATE_VISIBLE and ATSPI_STATE_SHOWING. The absence of
+             ATSPI_STATE_VISIBLE and ATSPI_STATE_SHOWING is
+             semantically equivalent to saying that an object is 'hidden'.
+
+        31 - ATSPI_STATE_MANAGES_DESCENDANTS: Indicates that "active-descendant-changed"
+             event is sent when children become 'active' (i.e. are selected or
+             navigated to onscreen).  Used to prevent need to enumerate all children
+             in very large containers, like tables. The presence of
+             ATSPI_STATE_MANAGES_DESCENDANTS is an indication to the client that the
+             children should not, and need not, be enumerated by the client.
+             Objects implementing this state are expected to provide relevant state
+             notifications to listening clients, for instance notifications of
+             visibility changes and activation of their contained child objects, without
+             the client having previously requested references to those children.
+
+        32 - ATSPI_STATE_INDETERMINATE: Indicates that a check box or other boolean
+             indicator is in a state other than checked or not checked.  This
+             usually means that the boolean value reflected or controlled by the
+             object does not apply consistently to the entire current context.
+             For example, a checkbox for the "Bold" attribute of text may have
+             ATSPI_STATE_INDETERMINATE if the currently selected text contains a mixture
+             of weight attributes. In many cases interacting with a
+             ATSPI_STATE_INDETERMINATE object will cause the context's corresponding
+             boolean attribute to be homogenized, whereupon the object will lose
+             ATSPI_STATE_INDETERMINATE and a corresponding state-changed event will be
+             fired.
+
+        33 - ATSPI_STATE_REQUIRED: Indicates that user interaction with this object is
+             'required' from the user, for instance before completing the
+             processing of a form.
+
+        34 - ATSPI_STATE_TRUNCATED: Indicates that an object's onscreen content
+             is truncated, e.g. a text value in a spreadsheet cell.
+
+        35 - ATSPI_STATE_ANIMATED: Indicates this object's visual representation is
+             dynamic, not static. This state may be applied to an object during an
+             animated 'effect' and be removed from the object once its visual
+             representation becomes static. Some applications, notably content viewers,
+             may not be able to detect all kinds of animated content.  Therefore the
+             absence of this state should not be taken as
+             definitive evidence that the object's visual representation is
+             static; this state is advisory.
+
+        36 - ATSPI_STATE_INVALID_ENTRY: This object has indicated an error condition
+             due to failure of input validation.  For instance, a form control may
+             acquire this state in response to invalid or malformed user input.
+
+        37 - ATSPI_STATE_SUPPORTS_AUTOCOMPLETION: This state indicates that the object
+             in question implements some form of typeahead or
+             pre-selection behavior whereby entering the first character of one or more
+             sub-elements causes those elements to scroll into view or become
+             selected. Subsequent character input may narrow the selection further as
+             long as one or more sub-elements match the string. This state is normally
+             only useful and encountered on objects that implement AtspiSelection.
+             In some cases the typeahead behavior may result in full or partial
+             completion of the data in the input field, in which case
+             these input events may trigger text-changed events from the source.
+
+        38 - ATSPI_STATE_SELECTABLE_TEXT: This state indicates that the object in
+             question supports text selection. It should only be exposed on objects
+             which implement the AtspiText interface, in order to distinguish this state
+             from ATSPI_STATE_SELECTABLE, which infers that the object in question is a
+             selectable child of an object which implements AtspiSelection. While
+             similar, text selection and subelement selection are distinct operations.
+
+        39 - ATSPI_STATE_IS_DEFAULT: This state indicates that the object in question is
+             the 'default' interaction object in a dialog, i.e. the one that gets
+             activated if the user presses "Enter" when the dialog is initially
+             posted.
+
+        40 - ATSPI_STATE_VISITED: This state indicates that the object (typically a
+             hyperlink) has already been activated or invoked, with the result that
+             some backing data has been downloaded or rendered.
+
+        41 - ATSPI_STATE_CHECKABLE: Indicates this object has the potential to
+             be checked, such as a checkbox or toggle-able table cell. Since: 2.12
+
+        42 - ATSPI_STATE_HAS_POPUP: Indicates that the object has a popup
+             context menu or sub-level menu which may or may not be
+             showing. This means that activation renders conditional content.
+             Note that ordinary tooltips are not considered popups in this
+             context. Since: 2.12
+
+        43 - ATSPI_STATE_READ_ONLY: Indicates that an object which is ENABLED and
+             SENSITIVE has a value which can be read, but not modified, by the
+             user. Since: 2.16
+    -->
+    <method name="GetState">
+      <arg direction="out" type="au"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiIntList"/>
+    </method>
+
+    <!--
+        GetAttributes:
+
+        Gets a list of name/value pairs of attributes or annotations for this object.  For
+        typographic, textual, or textually-semantic attributes, see the Text.GetAttributes
+        method.
+
+        FIXME: is there a list of well-known attributes?
+    -->
+    <method name="GetAttributes">
+      <arg direction="out" type="a{ss}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
+    </method>
+
+    <!--
+        GetApplication:
+
+        Returns a string for the application name, and an object path for the containing
+        application object.
+    -->
+    <method name="GetApplication">
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <!--
+        GetInterfaces:
+
+        Returns an array of accessible interface names supported by the current object.
+    -->
+    <method name="GetInterfaces">
+      <arg direction="out" type="as"/>
+    </method>
+
+  </interface>
 </node>
index 1626700..1729562 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Action">
-
-  <property name="NActions" type="i" access="read"/>
-
-  <method name="GetDescription">
-    <arg type="i" name="index" direction="in"/>
-    <arg type="s" direction="out"/>
-  </method>
-
-  <method name="GetName">
-    <arg type="i" name="index" direction="in"/>
-    <arg type="s" direction="out"/>
-  </method>
-
-  <method name="GetLocalizedName">
-    <arg type="i" name="index" direction="in"/>
-    <arg type="s" direction="out"/>
-  </method>
-
-  <method name="GetKeyBinding">
-    <arg type="i" name="index" direction="in"/>
-    <arg type="s" direction="out"/>
-  </method>
-
-  <method name="GetActions">
-    <arg direction="out" type="a(sss)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiActionArray"/>
-  </method>
-
-  <method name="DoAction">
-    <arg direction="in" name="index" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-</interface>
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+  <!--
+      org.a11y.atspi.Action:
+      @short_description: Allows exploring and invoking the actions of a user-actionable UI component.
+
+      For example, a button may expose a "click" action; a popup menu may expose an "open"
+      action.  Components which are not "passive" providers of UI information should
+      implement this interface, unless there is a more specialized interface for
+      interaction like org.a11y.atspi.Text or org.a11y.atspi.Value.
+  -->
+  <interface name="org.a11y.atspi.Action">
+
+    <!--
+        NActions: returns the number of available actions.
+
+        By convention, if there is more than one action available, the first one is
+        considered the "default" action of the object.
+    -->
+    <property name="NActions" type="i" access="read"/>
+
+    <!--
+        GetDescription:
+        @index: 0-based index of the action to query.
+
+        Returns: The localized description for the action at the specified @index.  For
+        example, a screen reader will read out this description when the user asks for
+        extra detail on an action.  For example, "Clicks the button" for the "click"
+        action of a button.
+    -->
+    <method name="GetDescription">
+      <arg type="i" name="index" direction="in"/>
+      <arg type="s" direction="out"/>
+    </method>
+
+    <!--
+        GetName:
+        @index: 0-based index of the action to query.
+
+        Returns: Machine-readable name for the action at the specified @index.
+    -->
+    <method name="GetName">
+      <arg type="i" name="index" direction="in"/>
+      <arg type="s" direction="out"/>
+    </method>
+
+    <!--
+        GetLocalizedName:
+        @index: 0-based index of the action to query.
+
+        Returns: A short, localized name for the action at the specified @index.  This is
+        what screen readers will read out during normal navigation.  For example, "Click"
+        for a button.
+    -->
+    <method name="GetLocalizedName">
+      <arg type="i" name="index" direction="in"/>
+      <arg type="s" direction="out"/>
+    </method>
+
+    <!--
+        GetKeyBinding:
+        @index: 0-based index of the action to query.
+
+        Gets the keybinding which can be used to activate this action, if one
+        exists. The string returned should contain localized, human-readable,
+        key sequences as they would appear when displayed on screen. It must
+        be in the format "mnemonic;sequence;shortcut".
+
+        - The mnemonic key activates the object if it is presently enabled onscreen.
+          This typically corresponds to the underlined letter within the widget.
+          Example: "n" in a traditional "New..." menu item or the "a" in "Apply" for
+          a button.
+
+        - The sequence is the full list of keys which invoke the action even if the
+          relevant element is not currently shown on screen. For instance, for a menu
+          item the sequence is the keybindings used to open the parent menus before
+          invoking. The sequence string is colon-delimited. Example: "Alt+F:N" in a
+          traditional "New..." menu item.
+
+        - The shortcut, if it exists, will invoke the same action without showing
+          the component or its enclosing menus or dialogs. Example: "Ctrl+N" in a
+          traditional "New..." menu item.
+
+        Example: For a traditional "New..." menu item, the expected return value
+        would be: "N;Alt+F:N;Ctrl+N" for the English locale and "N;Alt+D:N;Strg+N"
+        for the German locale. If, hypothetically, this menu item lacked a mnemonic,
+        it would be represented by ";;Ctrl+N" and ";;Strg+N" respectively.
+
+        If there is no key binding for this action, return "".
+    -->
+    <method name="GetKeyBinding">
+      <arg type="i" name="index" direction="in"/>
+      <arg type="s" direction="out"/>
+    </method>
+
+    <!--
+        GetActions:
+
+        Returns: an array of (localized_name, localized description, keybinding) for the
+        actions that an object supports.  See the GetKeyBinding method for a description
+        of that field's syntax.
+
+        This is equivalent to using the methods GetLocalizedName, GetDescription,
+        GetKeyBinding for each action, but with a single call and thus less DBus traffic.
+
+        By convention, if there is more than one action available, the first one is
+        considered the "default" action of the object.
+    -->
+    <method name="GetActions">
+      <arg direction="out" type="a(sss)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiActionArray"/>
+    </method>
+
+    <!--
+        DoAction:
+        @index: 0-based index of the action to perform.
+
+        Performs the specified action on the object.
+
+        Returns: true on success, false otherwise.
+    -->
+    <method name="DoAction">
+      <arg direction="in" name="index" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+  </interface>
 </node>
index 2191f08..fbc8eb9 100644 (file)
@@ -1,26 +1,59 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Application">
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+  <!--
+      org.a11y.atspi.Application:
+      @short_description: Interface that must be implemented by the root object of an application.
+  -->
+  <interface name="org.a11y.atspi.Application">
 
-  <property name="ToolkitName" type="s" access="read"/>
+    <!--
+        ToolkitName: name of the toolkit used to implement the application's user interface.
+    -->
+    <property name="ToolkitName" type="s" access="read"/>
 
-  <property name="Version" type="s" access="read"/>
+    <!--
+        Version: version of the toolkit used to implement the application's user interface.
+    -->
+    <property name="Version" type="s" access="read"/>
 
-  <property name="AtspiVersion" type="s" access="read"/>
-  <property name="Id" type="i" access="readwrite"/>
+    <!--
+        AtspiVersion: You should return "2.1" here.
 
-  <method name="GetLocale">
-    <arg direction="in" name="lctype" type="u"/>
-    <arg direction="out" type="s"/>
-  </method>
+        This was intended to be the version of the atspi interfaces
+        that the application supports, but atspi will probably move to
+        using versioned interface names instead.  Just return "2.1" here.
+    -->
+    <property name="AtspiVersion" type="s" access="read"/>
 
-  <method name="RegisterEventListener">
-    <arg direction="in" name="event" type="s"/>
-  </method>
+    <!--
+        Id: set to an arbitrary numerical id when an application registers with the registry.
 
-  <method name="DeregisterEventListener">
-    <arg direction="in" name="event" type="s"/>
-  </method>
+        When a freshly-started application uses the
+        org.a11y.atspi.Socket.Embed method to register with the
+        accessibility registry, the registry will set a numerical id
+        on the application.
 
-</interface>
+        Per https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/82 it
+        may turn out that this id is not actually used subsequently.
+        This is a remnant of the time when registryd actually had to
+        make up identifiers for each application.  With DBus, however,
+        it is the bus that assigns unique names to applications that
+        connect to it.
+
+        Your application or toolkit can remember the Id passed when
+        the accessibility registry sets this property, and return it
+        back when the property is read.
+    -->
+    <property name="Id" type="i" access="readwrite"/>
+
+    <!-- This method is not used.
+
+         See https://gitlab.gnome.org/GNOME/orca/-/issues/260
+    -->
+    <method name="GetLocale">
+      <arg direction="in" name="lctype" type="u"/>
+      <arg direction="out" type="s"/>
+    </method>
+
+  </interface>
 </node>
index 8954616..7000bc9 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Cache">
+<node>
+  <!--
+      org.a11y.atspi.Cache:
+      @short_description: Interface to query accessible objects in bulk.
 
-  <method name="GetItems">
-    <arg direction="out" name="nodes" type="a((so)(so)(so)iiassusau)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAccessibleCacheArray"/>
-  </method>
+      The application should expose this interface at the /org/a11y/atspi/cache object
+      path.
 
-  <signal name="AddAccessible">
-    <arg direction="in" name="nodeAdded" type="((so)(so)(so)iiassusau)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiAccessibleCacheItem"/>
-  </signal>
+      The org.a11y.atspi.Accessible interface has methods like GetChildren and
+      GetChildAtIndex, but these only transfer an object's DBus id.  The caller has to
+      then query the object's properties individually.  Transferring objects one by one and
+      then their properties produces a lot of traffic in the accessibility bus.
 
-  <signal name="RemoveAccessible">
-    <arg direction="in" name="nodeRemoved" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
-  </signal>
+      So, this Cache interface can be used to query objects in bulk.  Assistive tech
+      should try to do a bulk query of all the objects in a new window with the GetItems
+      method, and then update them dynamically from the AddAccessible and RemoveAccessible
+      signals.
 
-</interface>
+      FIXME: Does GetItems only get called if an application implements
+      GetApplicationBusAddress?  GTK4 doesn't implement that, but it implements GetItems -
+      does that ever get called?
+  -->
+  <interface name="org.a11y.atspi.Cache">
+
+    <!--
+        GetItems: bulk query an application's accessible objects.
+
+        Returns: an array with one element for each available object.  Each element's
+        fields are like this:
+
+        - (so): accessible object reference - DBus name and object
+          path.  The rest of the fields refer to this main object.
+
+        - (so): application reference - DBus name and object path.  This is the owner of
+          the main object; the root path of the application that registered via
+          the Embed method of the org.a11y.atspi.Socket interface.
+
+        - (so): parent object reference - DBus name and object path.
+                If the main object has no parent:
+
+                - If it is a control, or a window, return the parent application.
+
+                - If the object has the application role, return a null reference.  FIXME:
+                  atk-adaptor/adaptors/cache-adaptor.c:append_cache_item() returns a
+                  reference to the registry in this case (the one it obtained from the
+                  initial Socket::Embed call); GTK4 returns a null reference.
+
+                - Otherwise, return a null reference ("" for the application name name and
+                  "/org/a11y/atspi/null" for the object path).
+
+        - i: index in parent, or -1 for transient widgets/menu items.  Equivalent to the
+          GetIndexInParent method of the org.a11y.atspi.Accessible interface.
+
+        - i: child count of main object, or -1 for defunct/menus.  Equivalent to the
+          ChildCount property of the org.a11y.atspi.Accessible interface.
+
+        - as: array of names of the interfaces that the main object supports.  Equivalent
+          to the GetInterfaces method of the org.a11y.atspi.Accessible interface.
+
+        - s: human-readable, localized, short name for the main object.  Equivalent to the
+          Name property of the org.a11y.atspi.Accessible interface.
+
+        - u: role.  Equivalent to the GetRole method of the org.a11y.atspi.Accessible interface.
+
+        - s: human-readable, localized description of the object in more detail.
+          Equivalent to the Description property of the org.a11y.atspi.Accessible interface.
+
+        - au: Set of states currently held by an object.  Equivalent to the GetState
+          method of the org.a11y.atspi.Accessible interface.
+
+        Deprecation note: The signature for the return value of this method changed in
+        2015, in commit b2c8c4c7.  It used to be "a((so)(so)(so)a(so)assusau)".  The
+        "a(so)" instead of "ii" is a list of references to child objects.  The
+        implementation in atspi-misc.c can handle either version, although the intention
+        is to deprecate the code that handles the old version.  Qt still uses this old
+        signature and should be changed to the new scheme (see qspi_struct_marshallers.cpp
+        in the Qt source code).
+    -->
+    <method name="GetItems">
+      <arg direction="out" name="nodes" type="a((so)(so)(so)iiassusau)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAccessibleCacheArray"/>
+    </method>
+
+    <!--
+        AddAccessible: to be emitted when a new object is added.
+
+        See the GetItems method for a description of the signature.
+    -->
+    <signal name="AddAccessible">
+      <arg name="nodeAdded" type="((so)(so)(so)iiassusau)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiAccessibleCacheItem"/>
+    </signal>
+
+    <!--
+        RemoveAccessible: to be emitted when an object is no longer available.
+
+        @nodeRemoved: (so) string for the application name and object path.
+    -->
+    <signal name="RemoveAccessible">
+      <arg name="nodeRemoved" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
+    </signal>
+
+  </interface>
 </node>
index 913ebcb..bace06a 100644 (file)
@@ -1,48 +1,48 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Collection">
+<node>
+  <interface name="org.a11y.atspi.Collection">
 
-  <method name="GetMatches">
-    <arg direction="in" name="rule" type="(aiia{ss}iaiiasib)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiMatchRule"/>
-    <arg direction="in" name="sortby" type="u"/>
-    <arg direction="in" name="count" type="i"/>
-    <arg direction="in" name="traverse" type="b"/>
-    <arg direction="out" type="a(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
-  </method>
+    <method name="GetMatches">
+      <arg direction="in" name="rule" type="(aiia{ss}iaiiasib)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiMatchRule"/>
+      <arg direction="in" name="sortby" type="u"/>
+      <arg direction="in" name="count" type="i"/>
+      <arg direction="in" name="traverse" type="b"/>
+      <arg direction="out" type="a(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
+    </method>
 
-  <method name="GetMatchesTo">
-    <arg direction="in" name="current_object" type="o"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
-    <arg direction="in" name="rule" type="(aiia{ss}iaiiasib)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiMatchRule"/>
-    <arg direction="in" name="sortby" type="u"/>
-    <arg direction="in" name="tree" type="u"/>
-    <arg direction="in" name="limit_scope" type="b"/>
-    <arg direction="in" name="count" type="i"/>
-    <arg direction="in" name="traverse" type="b"/>
-    <arg direction="out" type="a(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
-  </method>
+    <method name="GetMatchesTo">
+      <arg direction="in" name="current_object" type="o"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
+      <arg direction="in" name="rule" type="(aiia{ss}iaiiasib)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiMatchRule"/>
+      <arg direction="in" name="sortby" type="u"/>
+      <arg direction="in" name="tree" type="u"/>
+      <arg direction="in" name="limit_scope" type="b"/>
+      <arg direction="in" name="count" type="i"/>
+      <arg direction="in" name="traverse" type="b"/>
+      <arg direction="out" type="a(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
+    </method>
 
-  <method name="GetMatchesFrom">
-    <arg direction="in" name="current_object" type="o"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
-    <arg direction="in" name="rule" type="(aiia{ss}iaiiasib)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiMatchRule"/>
-    <arg direction="in" name="sortby" type="u"/>
-    <arg direction="in" name="tree" type="u"/>
-    <arg direction="in" name="count" type="i"/>
-    <arg direction="in" name="traverse" type="b"/>
-    <arg direction="out" type="a(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
-  </method>
+    <method name="GetMatchesFrom">
+      <arg direction="in" name="current_object" type="o"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
+      <arg direction="in" name="rule" type="(aiia{ss}iaiiasib)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiMatchRule"/>
+      <arg direction="in" name="sortby" type="u"/>
+      <arg direction="in" name="tree" type="u"/>
+      <arg direction="in" name="count" type="i"/>
+      <arg direction="in" name="traverse" type="b"/>
+      <arg direction="out" type="a(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
+    </method>
 
-  <method name="GetActiveDescendant">
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
-  </method>
+    <method name="GetActiveDescendant">
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiReferenceSet"/>
+    </method>
 
-</interface>
+  </interface>
 </node>
index afefab8..8d4a637 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Component">
-
-  <method name="Contains">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="coord_type" type="u"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="GetAccessibleAtPoint">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="coord_type" type="u"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
-
-  <method name="GetExtents">
-    <arg direction="in" name="coord_type" type="u"/>
-    <arg direction="out" type="(iiii)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRect"/>
-  </method>
-
-  <method name="GetPosition">
-    <arg direction="in" name="coord_type" type="u"/>
-    <arg direction="out" name="x" type="i"/>
-    <arg direction="out" name="y" type="i"/>
-  </method>
-
-  <method name="GetSize">
-    <arg direction="out" name="width" type="i"/>
-    <arg direction="out" name="height" type="i"/>
-  </method>
-
-  <method name="GetLayer">
-    <arg direction="out" type="u"/>
-  </method>
-
-  <method name="GetMDIZOrder">
-    <arg direction="out" type="n"/>
-  </method>
-
-  <method name="GrabFocus">
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="GetAlpha">
-    <arg direction="out" type="d"/>
-  </method>
-
-  <method name="SetExtents">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="width" type="i"/>
-    <arg direction="in" name="height" type="i"/>
-    <arg direction="in" name="coord_type" type="u"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="SetPosition">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="coord_type" type="u"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="SetSize">
-    <arg direction="in" name="width" type="i"/>
-    <arg direction="in" name="height" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="ScrollTo">
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="ScrollToPoint">
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-</interface>
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+  <!--
+      org.a11y.atspi.Component:
+      @short_description: Interface for GUI components like widgets or other visible elements.
+  -->
+  <interface name="org.a11y.atspi.Component">
+
+    <!--
+        Contains:
+        @x: X coordinate of point.
+        @y: Y coordinate of point.
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+
+        Queries whether a point (x, y) is inside the component.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+    -->
+    <method name="Contains">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <!--
+        GetAccessibleAtPoint:
+        @x: X coordinate of point.
+        @y: Y coordinate of point.
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+
+        Gets a reference to the accessible object that contains an (x, y) pair of
+        coordinates.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+
+        Returns: A DBus name and object reference (so) for the sought object, or a null
+        object reference "/org/a11y/atspi/null" if there is no object at the specified
+        coordinates.
+    -->
+    <method name="GetAccessibleAtPoint">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <!--
+        GetExtents:
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+
+        Queries the pixel extents of a component.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+
+        Returns: a tuple (x, y, width, height) corresponding to the rectangle for the
+        component's extents.
+    -->
+    <method name="GetExtents">
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="out" type="(iiii)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRect"/>
+    </method>
+
+    <!--
+        GetPosition:
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+
+        Queries the upper-left position of a component.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+
+        Returns: (x, y) coordinates of the component's upper-left corner.
+    -->
+    <method name="GetPosition">
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="out" name="x" type="i"/>
+      <arg direction="out" name="y" type="i"/>
+    </method>
+
+    <!--
+        GetSize:
+        Queries the pixel size of a component.
+
+        Returns: (width, height) of the component's rectangular area.
+    -->
+    <method name="GetSize">
+      <arg direction="out" name="width" type="i"/>
+      <arg direction="out" name="height" type="i"/>
+    </method>
+
+    <!--
+        GetLayer:
+
+        Queries the UI layer at which a component is rendered, which can help in
+        determining when components occlude one another.
+
+        The layer of a component indicates its relative stacking order with respect to the
+        onscreen visual representation of the UI.  The layer index, in combination
+        with the component's extents, can be used to compute the visibility of
+        all or part of a component.  This is important in programmatic determination of
+        region-of-interest for magnification, and in flat screen review models of the
+        screen, as well as for other uses.  Objects residing in two of the
+        Layer categories support further z-ordering information, with
+        respect to their peers in the same layer: namely, WINDOW and
+        MDI.  Relative stacking order for other objects within the same layer
+        is not available; the recommended heuristic is first child paints first. In other
+        words, assume that the first siblings in the child list are subject to being
+        overpainted by later siblings if their bounds intersect. The order of layers, from
+        bottom to top, is as follows:
+
+        0 - INVALID: Error condition.
+
+        1 - BACKGROUND: Reserved for the desktop background; this is the bottom-most
+        layer, over which everything else is painted.
+
+        2 - CANVAS: The 'background' layer for most content renderers and UI component containers.
+
+        3 - WIDGET: The layer in which the majority of ordinary 'foreground' widgets reside.
+
+        4 - MDI: A special layer between CANVAS and WIDGET, in which the 'pseudo-windows'
+        (e.g. the Multiple-Document Interface frames) reside.  See the GetMDIZOrder
+        method.
+
+        5 - POPUP: Layer for popup window content, above WIDGET.
+
+        6 - OVERLAY: The topmost layer.
+
+        7 - WINDOW: The layer in which a toplevel window background usually resides.
+    -->
+    <method name="GetLayer">
+      <arg direction="out" type="u"/>
+    </method>
+
+    <!--
+        GetMDIZOrder:
+
+        Queries the Z stacking order of a component which is in the MDI or WINDOW layer,
+        per the GetLayer method.  Bigger z-order numbers are nearer the top.
+
+        Returns: The z order of the component, or -1 if it is not in the MDI layer.
+    -->
+    <method name="GetMDIZOrder">
+      <arg direction="out" type="n"/>
+    </method>
+
+    <!--
+        GrabFocus:
+
+        Attempts to set the keyboard input focus to the component.
+
+        Returns: true if successful, or false otherwise.
+    -->
+    <method name="GrabFocus">
+      <arg direction="out" type="b"/>
+    </method>
+
+    <!--
+        GetAlpha:
+
+        Gets the opacity/alpha value of a component, if alpha blending is in use.
+
+        Returns: opacity value in the [0.0, 1.0] range.  0 is fully transparent and 1 is fully opaque.
+    -->
+    <method name="GetAlpha">
+      <arg direction="out" type="d"/>
+    </method>
+
+    <!--
+        SetExtents:
+        @x: the new horizontal position to which the component should be moved.
+        @y: the new vertical position to which the component should be moved.
+        @width: the width to which the component should be resized.
+        @height: the height to which the component should be resized.
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+
+        Moves and resizes the component.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+
+        Returns: true if successful, or false otherwise.
+    -->
+    <method name="SetExtents">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="width" type="i"/>
+      <arg direction="in" name="height" type="i"/>
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <!--
+        SetPosition:
+        @x: the new horizontal position to which the component should be moved.
+        @y: the new vertical position to which the component should be moved.
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+
+        Moves the component to the specified position.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+
+        Returns: true if successful, or false otherwise.
+    -->
+    <method name="SetPosition">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <!--
+        SetSize:
+        @width: the width to which the component should be resized.
+        @height: the height to which the component should be resized.
+
+        Resizes the component to the given pixel dimensions.
+
+        Returns: true if successful, or false otherwise.
+    -->
+    <method name="SetSize">
+      <arg direction="in" name="width" type="i"/>
+      <arg direction="in" name="height" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <!--
+        ScrollTo:
+        @type: How to position the component within its parent; see the description.
+
+        Makes the component visible on the screen by scrolling all necessary parents.
+
+        The @type corresponds to AtkScrollType:
+
+        0 - TOP_LEFT: Scroll the object vertically and horizontally to bring
+        its top left corner to the top left corner of the window.
+
+        1 - BOTTOM_RIGHT: Scroll the object vertically and horizontally to
+        bring its bottom right corner to the bottom right corner of the window.
+
+        2 - TOP_EDGE: Scroll the object vertically to bring its top edge to
+        the top edge of the window.
+
+        3 - BOTTOM_EDGE: Scroll the object vertically to bring its bottom
+        edge to the bottom edge of the window.
+
+        4 - LEFT_EDGE: Scroll the object vertically and horizontally to bring
+        its left edge to the left edge of the window.
+
+        5 - RIGHT_EDGE: Scroll the object vertically and horizontally to
+        bring its right edge to the right edge of the window.
+
+        6 - ANYWHERE: Scroll the object vertically and horizontally so that
+        as much as possible of the object becomes visible. The exact placement is
+        determined by the application.
+
+        Returns: true if successful, or false otherwise.
+    -->
+    <method name="ScrollTo">
+      <arg direction="in" name="type" type="u"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <!--
+        ScrollToPoint:
+        @coord_type: Whether the coordinates are relative to the screen or to the
+        component's top level window; see the description.
+        @x: X coordinate within the component to make visible.
+        @y: Y coordinate within the component to make visible.
+
+        Similar to the ScrollTo method, but makes a specific point from the component
+        visible in its parent.
+
+        The @coord_type values are as follows, and correspond to AtkCoordType:
+
+        0 - Coordinates are relative to the screen.
+        1 - Coordinates are relative to the component's toplevel window.
+        2 - Coordinates are relative to the component's immediate parent.
+
+        Returns: true if successful, or false otherwise.
+    -->
+    <method name="ScrollToPoint">
+      <arg direction="in" name="coord_type" type="u"/>
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+  </interface>
 </node>
index 460e79a..c006fe1 100644 (file)
@@ -1,60 +1,93 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.DeviceEventController">
-
-  <method name="RegisterKeystrokeListener">
-    <arg direction="in" name="listener" type="o"/>
-    <arg direction="in" name="keys" type="a(iisi)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiKeyTypeArray"/>
-    <arg direction="in" name="mask" type="u"/>
-    <arg direction="in" name="type" type="au"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In3" value="QSpiEventTypeArray"/>
-    <arg direction="in" name="mode" type="(bbb)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In4" value="QSpiEventMode"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="DeregisterKeystrokeListener">
-    <arg direction="in" name="listener" type="o"/>
-    <arg direction="in" name="keys" type="a(iisi)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiKeyTypeArray"/>
-    <arg direction="in" name="mask" type="u"/>
-    <arg direction="in" name="type" type="u"/>
-  </method>
-
-  <method name="RegisterDeviceEventListener">
-    <arg direction="in" name="listener" type="o"/>
-    <arg direction="in" name="types" type="u"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="DeregisterDeviceEventListener">
-    <arg direction="in" name="listener" type="o"/>
-    <arg direction="in" name="types" type="u"/>
-  </method>
-
-  <method name="GenerateKeyboardEvent">
-    <arg direction="in" name="keycode" type="i"/>
-    <arg direction="in" name="keystring" type="s"/>
-    <arg direction="in" name="type" type="u"/>
-  </method>
-
-  <method name="GenerateMouseEvent">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="eventName" type="s"/>
-  </method>
-
-  <method name="NotifyListenersSync">
-    <arg direction="in" name="event" type="(uiuuisb)"/>
-    <arg direction="out" type="b"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiDeviceEvent"/>
-  </method>
-
-  <method name="NotifyListenersAsync">
-    <arg direction="in" name="event" type="(uiuuisb)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiDeviceEvent"/>
-  </method>
-
-</interface>
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+  <!--
+      org.a11y.atspi.DeviceEventController:
+      @short_description: Legacy interface for keystroke listeners and generation of keyboard/mouse events
+
+      This interface is being replaced by the functions in atspi-device-listener.h.
+  -->
+  <interface name="org.a11y.atspi.DeviceEventController">
+
+    <!--
+        RegisterKeystrokeListener:
+        @listener: path of object to be notified when the following keys are pressed
+        @keys: array of (key_code, key_sym, key_string, unused)
+        @mask: modifier mask in X11 style (see Xlib.h)
+        @types: mask of press/release; see the description below.
+        @mode: struct of flags (synchronous, preemptive, global), see the description below.
+
+        The @types can be a mask of the following:
+
+          * KEY_PRESS   = 1 << 0
+          * KEY_RELEASE = 1 << 1
+
+        Note that Orca always passes (KEY_PRESS | KEY_RELEASE).
+
+        The @mode is composed of three flags (see AtspiKeyListenerSyncType):
+
+          * synchronous: Events are delivered synchronously, before
+            the currently focused application sees them.  If false,
+            events may be delivered asynchronously, which means in some
+            cases they may already have been delivered to the
+            application before the AT client receives the notification.
+
+          * preemptive: (called CANCONSUME in AtspiKeyListenerSyncType)
+            Events may be consumed by the AT client.  Requires the synchronous flag to be set.
+
+          * global: (called ALL_WINDOWS in AtspiKeyListenerSyncType)
+            Events are received not from the application toolkit layer,
+            but from the device driver or windowing system subsystem.
+
+        Returns: boolean indicating whether the operation was successful.  This is always
+        TRUE for non-global listeners (c.f. @mode), and may be FALSE for global listeners
+        if the underlying XGrabKey() failed (see spi_dec_x11_grab_key).
+    -->
+    <method name="RegisterKeystrokeListener">
+      <arg direction="in" name="listener" type="o"/>
+      <arg direction="in" name="keys" type="a(iisi)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiKeyTypeArray"/>
+      <arg direction="in" name="mask" type="u"/>
+      <arg direction="in" name="types" type="u"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In3" value="QSpiEventTypeArray"/>
+      <arg direction="in" name="mode" type="(bbb)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In4" value="QSpiEventMode"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="DeregisterKeystrokeListener">
+      <arg direction="in" name="listener" type="o"/>
+      <arg direction="in" name="keys" type="a(iisi)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QSpiKeyTypeArray"/>
+      <arg direction="in" name="mask" type="u"/>
+      <arg direction="in" name="type" type="u"/>
+    </method>
+
+    <method name="GetKeystrokeListeners">
+      <arg direction="out" type="a(souua(iisi)u(bbb))"/>
+    </method>
+
+    <method name="GenerateKeyboardEvent">
+      <arg direction="in" name="keycode" type="i"/>
+      <arg direction="in" name="keystring" type="s"/>
+      <arg direction="in" name="type" type="u"/>
+    </method>
+
+    <method name="GenerateMouseEvent">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="eventName" type="s"/>
+    </method>
+
+    <method name="NotifyListenersSync">
+      <arg direction="in" name="event" type="(uiuuisb)"/>
+      <arg direction="out" type="b"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiDeviceEvent"/>
+    </method>
+
+    <method name="NotifyListenersAsync">
+      <arg direction="in" name="event" type="(uiuuisb)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiDeviceEvent"/>
+    </method>
+
+  </interface>
 </node>
index 2c72973..38c63e6 100644 (file)
@@ -1,12 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.DeviceEventListener">
+<node>
+  <interface name="org.a11y.atspi.DeviceEventListener">
 
-  <method name="NotifyEvent">
-    <arg direction="in" name="event" type="(uiuuisb)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiDeviceEvent"/>
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="NotifyEvent">
+      <arg direction="in" name="event" type="(uiuuisb)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiDeviceEvent"/>
+      <arg direction="out" type="b"/>
+    </method>
 
-</interface>
+    <signal name="KeystrokeListenerRegistered">
+      <arg name="listener" type="(souua(iisi)u(bbb))"/>
+    </signal>
+
+    <signal name="KeystrokeListenerDeregistered">
+      <arg name="listener" type="(souua(iisi)u(bbb))"/>
+    </signal>
+
+  </interface>
 </node>
index 03c9693..95d6868 100644 (file)
@@ -1,24 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Document">
+<node>
+  <interface name="org.a11y.atspi.Document">
 
-  <property name="CurrentPageNumber" type="i" access="read"/>
+    <property name="CurrentPageNumber" type="i" access="read"/>
 
-  <property name="PageCount" type="i" access="read"/>
+    <property name="PageCount" type="i" access="read"/>
 
-  <method name="GetLocale">
-    <arg direction="out" type="s"/>
-  </method>
+    <method name="GetLocale">
+      <arg direction="out" type="s"/>
+    </method>
 
-  <method name="GetAttributeValue">
-    <arg direction="in" name="attributename" type="s"/>
-    <arg direction="out" type="s"/>
-  </method>
+    <method name="GetAttributeValue">
+      <arg direction="in" name="attributename" type="s"/>
+      <arg direction="out" type="s"/>
+    </method>
 
-  <method name="GetAttributes">
-    <arg direction="out" type="a{ss}"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
-  </method>
+    <method name="GetAttributes">
+      <arg direction="out" type="a{ss}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
+    </method>
 
-</interface>
+    <method name="GetTextSelections">
+      <arg direction="out" name="selections" type="a((so)i(so)ib)"/>
+    </method>
+
+    <method name="SetTextSelections">
+      <arg direction="in" name="selections" type="a((so)i(so)ib)"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+  </interface>
 </node>
index 09f62f5..1b93e30 100644 (file)
@@ -1,40 +1,40 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.EditableText">
+<node>
+  <interface name="org.a11y.atspi.EditableText">
 
-  <method name="SetTextContents">
-    <arg direction="in" name="newContents" type="s"/>
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="SetTextContents">
+      <arg direction="in" name="newContents" type="s"/>
+      <arg direction="out" type="b"/>
+    </method>
 
-  <method name="InsertText">
-    <arg direction="in" name="position" type="i"/>
-    <arg direction="in" name="text" type="s"/>
-    <arg direction="in" name="length" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="InsertText">
+      <arg direction="in" name="position" type="i"/>
+      <arg direction="in" name="text" type="s"/>
+      <arg direction="in" name="length" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
 
-  <method name="CopyText">
-    <arg direction="in" name="startPos" type="i"/>
-    <arg direction="in" name="endPos" type="i"/>
-  </method>
+    <method name="CopyText">
+      <arg direction="in" name="startPos" type="i"/>
+      <arg direction="in" name="endPos" type="i"/>
+    </method>
 
-  <method name="CutText">
-    <arg direction="in" name="startPos" type="i"/>
-    <arg direction="in" name="endPos" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="CutText">
+      <arg direction="in" name="startPos" type="i"/>
+      <arg direction="in" name="endPos" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
 
-  <method name="DeleteText">
-    <arg direction="in" name="startPos" type="i"/>
-    <arg direction="in" name="endPos" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="DeleteText">
+      <arg direction="in" name="startPos" type="i"/>
+      <arg direction="in" name="endPos" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
 
-  <method name="PasteText">
-    <arg direction="in" name="position" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="PasteText">
+      <arg direction="in" name="position" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
 
-</interface>
+  </interface>
 </node>
index 3614358..26ae546 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
+<node>
 
-<interface name="org.a11y.atspi.Event.Object">
-       <signal name="PropertyChange"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="BoundsChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="LinkSelected"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="StateChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ChildrenChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="VisibleDataChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="SelectionChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ModelChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ActiveDescendantChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="RowInserted"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="RowReordered"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="RowDeleted"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ColumnInserted"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ColumnReordered"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ColumnDeleted"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="TextBoundsChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="TextSelectionChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="TextChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="TextAttributesChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="TextCaretMoved"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="AttributesChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+  <!-- FIXME: all the following signatures are incorrect and need to be synched
+       with the C code and the actual implementations in toolkits.
 
-<interface name="org.a11y.atspi.Event.Window">
-       <signal name="PropertyChange"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Minimize"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Maximize"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Restore"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Close"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Create"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Reparent"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="DesktopCreate"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="DesktopDestroy"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Destroy"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Activate"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Deactivate"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Raise"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Lower"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Move"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Resize"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Shade"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="uUshade"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Restyle"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+       See https://gitlab.gnome.org/GNOME/at-spi2-core/-/issues/74
+  -->
 
-<interface name="org.a11y.atspi.Event.Mouse">
-       <signal name="Abs"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Rel"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Button"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+  <interface name="org.a11y.atspi.Event.Object">
+    <signal name="PropertyChange">
+      <arg name="property" type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg name="value" type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="BoundsChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="LinkSelected">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="StateChanged">
+      <arg name="state" type="s"/>
+      <arg name="enabled" type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ChildrenChanged">
+      <arg name="operation" type="s"/>
+      <arg name="index_in_parent" type="i"/>
+      <arg type="i"/>
+      <arg name="child" type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="VisibleDataChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="SelectionChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ModelChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ActiveDescendantChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg name="child" type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Announcement">
+      <arg name="text" type="s"/>
+      <!-- politeness should be 1 (ATSPI_LIVE_POLITE) or 2
+           (ATSPI_LIVE_ASSERTIVE) -->
+      <arg type="i" name="politeness"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="AttributesChanged">
+      <!-- name specifies the name of the attribute that has changed, when available -->
+      <arg name="name" type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <!-- The variant should include a string with the attribute's new value, when available -->
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <!-- Table events. TODO: move to Table interface? -->
+    <signal name="RowInserted">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="RowReordered">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="RowDeleted">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ColumnInserted">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ColumnReordered">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ColumnDeleted">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <!-- Text events. TODO: move to Text interface? -->
+    <signal name="TextBoundsChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="TextSelectionChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="TextChanged">
+      <arg name="detail" type="s"/>
+      <arg name="start_pos" type="i"/>
+      <arg name="length" type="i"/>
+      <arg name="text" type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="TextAttributesChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="TextCaretMoved">
+      <arg type="s"/>
+      <arg name="position" type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
 
-<interface name="org.a11y.atspi.Event.Keyboard">
-       <signal name="Modifiers"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+  <interface name="org.a11y.atspi.Event.Window">
+    <signal name="PropertyChange">
+      <arg name="property" type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Minimize">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Maximize">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Restore">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Close">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Create">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Reparent">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="DesktopCreate">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="DesktopDestroy">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Destroy">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Activate">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Deactivate">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Raise">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Lower">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Move">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Resize">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Shade">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="uUshade">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Restyle">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
 
-<interface name="org.a11y.atspi.Event.Terminal">
-       <signal name="LineChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ColumncountChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="LinecountChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ApplicationChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="CharwidthChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+  <interface name="org.a11y.atspi.Event.Mouse">
+    <signal name="Abs">
+      <arg type="s"/>
+      <arg name="x" type="i"/>
+      <arg name="y" type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Rel">
+      <arg type="s"/>
+      <arg name="x" type="i"/>
+      <arg name="y" type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Button">
+      <arg name="detail" type="s"/>
+      <arg name="mouse_x" type="i"/>
+      <arg name="mouse_y" type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
 
-<interface name="org.a11y.atspi.Event.Document">
-       <signal name="LoadComplete"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="Reload"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="LoadStopped"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="ContentChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="AttributesChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-       <signal name="PageChanged"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+  <interface name="org.a11y.atspi.Event.Keyboard">
+    <signal name="Modifiers">
+      <arg type="s"/>
+      <arg name="previous_modifiers" type="i"/>
+      <arg name="current_modifiers" type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
 
-<interface name="org.a11y.atspi.Event.Focus">
-       <signal name="Focus"><arg direction="in" type="(suuv)"/>
-          <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
-        </signal>
-</interface>
+  <interface name="org.a11y.atspi.Event.Terminal">
+    <signal name="LineChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ColumncountChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="LinecountChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ApplicationChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="CharwidthChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
+
+  <interface name="org.a11y.atspi.Event.Document">
+    <signal name="LoadComplete">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="Reload">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="LoadStopped">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="ContentChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="AttributesChanged">
+      <!-- name specifies the name of the attribute that has changed, when available -->
+      <arg name="name" type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <!-- The variant should include a string with the attribute's new value, when available -->
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+    <signal name="PageChanged">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
+
+  <interface name="org.a11y.atspi.Event.Focus">
+    <!-- Focus is deprecated in favor of StateChanged with focus passed as its first argument -->
+    <signal name="Focus">
+      <arg type="s"/>
+      <arg type="i"/>
+      <arg type="i"/>
+      <arg type="v"/>
+      <arg name="properties" type="a{sv}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiEvent"/>
+    </signal>
+  </interface>
 
 </node>
index 80d5777..1d29bb8 100644 (file)
@@ -1,27 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Hyperlink">
+<node>
+  <interface name="org.a11y.atspi.Hyperlink">
 
-  <property name="NAnchors" type="n" access="read"/>
+    <property name="NAnchors" type="n" access="read"/>
 
-  <property name="StartIndex" type="i" access="read"/>
+    <property name="StartIndex" type="i" access="read"/>
 
-  <property name="EndIndex" type="i" access="read"/>
+    <property name="EndIndex" type="i" access="read"/>
 
-  <method name="GetObject">
-    <arg direction="in" name="i" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
+    <method name="GetObject">
+      <arg direction="in" name="i" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
 
-  <method name="GetURI">
-    <arg direction="in" name="i" type="i"/>
-    <arg direction="out" type="s"/>
-  </method>
+    <method name="GetURI">
+      <arg direction="in" name="i" type="i"/>
+      <arg direction="out" type="s"/>
+    </method>
 
-  <method name="IsValid">
-    <arg direction="out" type="b"/>
-  </method>
+    <method name="IsValid">
+      <arg direction="out" type="b"/>
+    </method>
 
-</interface>
+  </interface>
 </node>
index 79b5277..2e0346f 100644 (file)
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Hypertext">
+<node>
+  <interface name="org.a11y.atspi.Hypertext">
 
-  <method name="GetNLinks">
-    <arg direction="out" type="i"/>
-  </method>
+    <method name="GetNLinks">
+      <arg direction="out" type="i"/>
+    </method>
 
-  <method name="GetLink">
-    <arg direction="in" name="linkIndex" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
+    <method name="GetLink">
+      <arg direction="in" name="linkIndex" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
 
-  <method name="GetLinkIndex">
-    <arg direction="in" name="characterIndex" type="i"/>
-    <arg direction="out" type="i"/>
-  </method>
+    <method name="GetLinkIndex">
+      <arg direction="in" name="characterIndex" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
 
-</interface>
+  </interface>
 </node>
index 1dd72f1..6054c44 100644 (file)
@@ -1,27 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Image">
+<node>
+  <interface name="org.a11y.atspi.Image">
 
-  <property name="ImageDescription" type="s" access="read"/>
+    <property name="ImageDescription" type="s" access="read"/>
 
-  <property name="ImageLocale" type="s" access="read"/>
+    <property name="ImageLocale" type="s" access="read"/>
 
-  <method name="GetImageExtents">
-    <arg direction="in" name="coordType" type="u"/>
-    <arg direction="out" type="(iiii)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRect"/>
-  </method>
+    <method name="GetImageExtents">
+      <arg direction="in" name="coordType" type="u"/>
+      <arg direction="out" type="(iiii)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRect"/>
+    </method>
 
-  <method name="GetImagePosition">
-    <arg direction="out" name="x" type="i"/>
-    <arg direction="out" name="y" type="i"/>
-    <arg direction="in" name="coordType" type="u"/>
-  </method>
+    <method name="GetImagePosition">
+      <arg direction="in" name="coordType" type="u"/>
+      <arg direction="out" name="x" type="i"/>
+      <arg direction="out" name="y" type="i"/>
+    </method>
 
-  <method name="GetImageSize">
-    <arg direction="out" name="width" type="i"/>
-    <arg direction="out" name="height" type="i"/>
-  </method>
+    <method name="GetImageSize">
+      <arg direction="out" name="width" type="i"/>
+      <arg direction="out" name="height" type="i"/>
+    </method>
 
-</interface>
+  </interface>
 </node>
index 7603328..d42c44f 100644 (file)
@@ -1,30 +1,30 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Registry">
+<node>
+  <interface name="org.a11y.atspi.Registry">
 
-  <method name="RegisterEvent">
-    <arg direction="in" name="event" type="s">
-    </arg>
-  </method>
+    <method name="RegisterEvent">
+      <arg direction="in" name="event" type="s"/>
+      <arg direction="in" name="properties" type="as"/>
+      <arg direction="in" name="app_bus_name" type="s"/>
+    </method>
 
-  <method name="DeregisterEvent">
-    <arg direction="in" name="event" type="s">
-    </arg>
-  </method>
+    <method name="DeregisterEvent">
+      <arg direction="in" name="event" type="s"/>
+    </method>
 
-  <method name="GetRegisteredEvents">
-    <arg direction="out" name="events" type="a(ss)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiEventListenerArray"/>
-  </method>
+    <method name="GetRegisteredEvents">
+      <arg direction="out" name="events" type="a(ss)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiEventListenerArray"/>
+    </method>
 
-  <signal name="EventListenerRegistered">
-    <arg direction="out" name="bus" type="s"/>
-    <arg direction="out" name="path" type="s"/>
-  </signal>
+    <signal name="EventListenerRegistered">
+      <arg name="bus" type="s"/>
+      <arg name="path" type="s"/>
+    </signal>
 
-  <signal name="EventListenerDeregistered">
-    <arg direction="out" name="bus" type="s"/>
-    <arg direction="out" name="path" type="s"/>
-  </signal>
-</interface>
+    <signal name="EventListenerDeregistered">
+      <arg name="bus" type="s"/>
+      <arg name="path" type="s"/>
+    </signal>
+  </interface>
 </node>
index 7b0ad21..967d4cf 100644 (file)
@@ -1,42 +1,42 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Selection">
-
-  <property name="NSelectedChildren" type="i" access="read"/>
-
-  <method name="GetSelectedChild">
-    <arg direction="in" name="selectedChildIndex" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
-
-  <method name="SelectChild">
-    <arg direction="in" name="childIndex" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="DeselectSelectedChild">
-    <arg direction="in" name="selectedChildIndex" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="IsChildSelected">
-    <arg direction="in" name="childIndex" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="SelectAll">
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="ClearSelection">
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="DeselectChild">
-    <arg direction="in" name="childIndex" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-</interface>
+<node>
+  <interface name="org.a11y.atspi.Selection">
+
+    <property name="NSelectedChildren" type="i" access="read"/>
+
+    <method name="GetSelectedChild">
+      <arg direction="in" name="selectedChildIndex" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <method name="SelectChild">
+      <arg direction="in" name="childIndex" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="DeselectSelectedChild">
+      <arg direction="in" name="selectedChildIndex" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="IsChildSelected">
+      <arg direction="in" name="childIndex" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="SelectAll">
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="ClearSelection">
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="DeselectChild">
+      <arg direction="in" name="childIndex" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+  </interface>
 </node>
index f9ac76d..e8b9e61 100644 (file)
@@ -1,23 +1,73 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Socket">
-
-  <method name="Embed">
-    <arg direction="in" name="plug" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
-    <arg direction="out" name="socket" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
-
-  <method name="Unembed">
-    <arg direction="in" name="plug" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
-  </method>
-
-  <signal name="Available">
-    <arg direction="in" name="socket" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
-  </signal>
-
-</interface>
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+  <!--
+      org.a11y.atspi.Socket:
+      @short_description: Interface to register an application on the registry.
+  -->
+  <interface name="org.a11y.atspi.Socket">
+
+    <!--
+        Embed:
+        @plug: a string for the unique bus name of the application, and an object path
+        for the application's' root object.
+
+        This is the entry point for an application that wants to register itself against
+        the accessibility registry.  The application's root object, which it passes in
+        @plug, must support the org.a11y.atspi.Application interface.
+
+        When an application calls this method on the registry, the following handshake happens:
+
+        * Application calls this method on the registry to identify itself.
+
+        * The registry sets the "Id" property on the org.a11y.atspi.Application interface on the @plug object.
+
+        * The Embed method returns with the bus name and object path for the registry's root object.
+
+        Returns: the bus name and object path of the registry's root object.
+    -->
+    <method name="Embed">
+      <arg direction="in" name="plug" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
+      <arg direction="out" name="socket" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <!--
+        Embedded:
+        @path: the object path of the socket.
+
+        This method is called by a socket to inform the plug that it is being
+        embedded. The plug should register the embedding socket as its parent.
+    -->
+    <method name="Embedded">
+      <arg direction="in" name="path" type="s"/>
+    </method>
+
+    <!--
+        Unembed:
+        @plug: a string for the unique bus name of the application, and an object path
+        for the application's' root object.
+
+        Unregisters an application from the accesibility registry.  It is not necessary to
+        call this method; the accessibility registry detects when an application
+        disconnects from the bus.
+    -->
+    <method name="Unembed">
+      <arg direction="in" name="plug" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
+    </method>
+
+    <!--
+        Available:
+        @socket: application and object path for the registry's root object.
+
+        The accessibility registry emits this signal early during startup, when it has
+        registered with the DBus daemon and is available for calls from applications.
+    -->
+    <signal name="Available">
+      <arg name="socket" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QSpiObjectReference"/>
+    </signal>
+
+  </interface>
 </node>
index 3b35989..6167096 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Table">
-
-  <property name="NRows" type="i" access="read"/>
-
-  <property name="NColumns" type="i" access="read"/>
-
-  <property name="Caption" type="(so)" access="read">
-    <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
-  </property>
-
-  <property name="Summary" type="(so)" access="read">
-    <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
-  </property>
-
-  <property name="NSelectedRows" type="i" access="read"/>
-
-  <property name="NSelectedColumns" type="i" access="read"/>
-
-  <method name="GetAccessibleAt">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
-
-  <method name="GetIndexAt">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetRowAtIndex">
-    <arg direction="in" name="index" type="i"/>
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetColumnAtIndex">
-    <arg direction="in" name="index" type="i"/>
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetRowDescription">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="out" type="s"/>
-  </method>
-
-  <method name="GetColumnDescription">
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="s"/>
-  </method>
-
-  <method name="GetRowExtentAt">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetColumnExtentAt">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetRowHeader">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
-
-  <method name="GetColumnHeader">
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="(so)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
-  </method>
-
-  <method name="GetSelectedRows">
-    <arg direction="out" type="ai"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiIntList"/>
-  </method>
-
-  <method name="GetSelectedColumns">
-    <arg direction="out" type="ai"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiIntList"/>
-  </method>
-
-  <method name="IsRowSelected">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="IsColumnSelected">
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="IsSelected">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="AddRowSelection">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="AddColumnSelection">
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="RemoveRowSelection">
-    <arg direction="in" name="row" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="RemoveColumnSelection">
-    <arg direction="in" name="column" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="GetRowColumnExtentsAtIndex">
-    <arg direction="in" name="index" type="i"/>
-    <arg direction="out" type="b"/>
-    <arg direction="out" name="row" type="i"/>
-    <arg direction="out" name="col" type="i"/>
-    <arg direction="out" name="row_extents" type="i"/>
-    <arg direction="out" name="col_extents" type="i"/>
-    <arg direction="out" name="is_selected" type="b"/>
-  </method>
-
-</interface>
+<node>
+  <interface name="org.a11y.atspi.Table">
+
+    <property name="NRows" type="i" access="read"/>
+
+    <property name="NColumns" type="i" access="read"/>
+
+    <property name="Caption" type="(so)" access="read">
+      <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
+    </property>
+
+    <property name="Summary" type="(so)" access="read">
+      <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
+    </property>
+
+    <property name="NSelectedRows" type="i" access="read"/>
+
+    <property name="NSelectedColumns" type="i" access="read"/>
+
+    <method name="GetAccessibleAt">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <method name="GetIndexAt">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetRowAtIndex">
+      <arg direction="in" name="index" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetColumnAtIndex">
+      <arg direction="in" name="index" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetRowDescription">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="out" type="s"/>
+    </method>
+
+    <method name="GetColumnDescription">
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="s"/>
+    </method>
+
+    <method name="GetRowExtentAt">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetColumnExtentAt">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetRowHeader">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <method name="GetColumnHeader">
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReference"/>
+    </method>
+
+    <method name="GetSelectedRows">
+      <arg direction="out" type="ai"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiIntList"/>
+    </method>
+
+    <method name="GetSelectedColumns">
+      <arg direction="out" type="ai"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiIntList"/>
+    </method>
+
+    <method name="IsRowSelected">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="IsColumnSelected">
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="IsSelected">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="AddRowSelection">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="AddColumnSelection">
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="RemoveRowSelection">
+      <arg direction="in" name="row" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="RemoveColumnSelection">
+      <arg direction="in" name="column" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="GetRowColumnExtentsAtIndex">
+      <arg direction="in" name="index" type="i"/>
+      <arg direction="out" type="b"/>
+      <arg direction="out" name="row" type="i"/>
+      <arg direction="out" name="col" type="i"/>
+      <arg direction="out" name="row_extents" type="i"/>
+      <arg direction="out" name="col_extents" type="i"/>
+      <arg direction="out" name="is_selected" type="b"/>
+    </method>
+
+  </interface>
 </node>
index dbdbe8c..269a7ad 100644 (file)
@@ -1,26 +1,45 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.TableCell">
+<node>
+  <interface name="org.a11y.atspi.TableCell">
 
-  <property access="read" name="ColumnSpan" type="i" />
+    <property access="read" name="ColumnSpan" type="i" />
 
-  <property access="read" name="Position" type="(ii)">
-    <annotation name="org.qtproject.QtDBus.QtTypeName" value="QPoint"/>
-  </property>
+    <property access="read" name="Position" type="(ii)">
+      <annotation name="org.qtproject.QtDBus.QtTypeName" value="QPoint"/>
+    </property>
 
-  <property access="read" name="RowSpan" type="i" />
+    <property access="read" name="RowSpan" type="i" />
 
-  <property access="read" name="Table" type="(so)" >
-    <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
-  </property>
+    <property access="read" name="Table" type="(so)" >
+      <annotation name="org.qtproject.QtDBus.QtTypeName" value="QSpiObjectReference"/>
+    </property>
 
-  <method name="GetRowColumnSpan">
-    <arg direction="out" type="b" />
-    <arg direction="out" name="row" type="i" />
-    <arg direction="out" name="col" type="i" />
-    <arg direction="out" name="row_extents" type="i" />
-    <arg direction="out" name="col_extents" type="i" />
-  </method>
+    <method name="GetRowColumnSpan">
+      <arg direction="out" type="b" />
+      <arg direction="out" name="row" type="i" />
+      <arg direction="out" name="col" type="i" />
+      <arg direction="out" name="row_extents" type="i" />
+      <arg direction="out" name="col_extents" type="i" />
+    </method>
 
-</interface>
+    <!--
+        GetColumnHeaderCells:
+
+        Returns a list of the table cell's column header cells.
+    -->
+    <method name="GetColumnHeaderCells">
+      <arg direction="out" type="a(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReferenceArray"/>
+    </method>
+
+    <!--
+        GetRowHeaderCells:
+
+        Returns a list of the table cell's row header cells.
+    -->
+    <method name="GetRowHeaderCells">
+      <arg direction="out" type="a(so)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiObjectReferenceArray"/>
+    </method>
+  </interface>
 </node>
index da772ae..334c222 100644 (file)
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Text">
-
-  <property name="CharacterCount" type="i" access="read"/>
-
-  <property name="CaretOffset" type="i" access="read"/>
-
-  <method name="GetStringAtOffset">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="in" name="granularity" type="u"/>
-    <arg direction="out" type="s"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-  </method>
-
-  <method name="GetText">
-    <arg direction="in" name="startOffset" type="i"/>
-    <arg direction="in" name="endOffset" type="i"/>
-    <arg direction="out" type="s"/>
-  </method>
-
-  <method name="SetCaretOffset">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="GetTextBeforeOffset">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="out" type="s"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-  </method>
-
-  <method name="GetTextAtOffset">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="out" type="s"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-  </method>
-
-  <method name="GetTextAfterOffset">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="out" type="s"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-  </method>
-
-  <method name="GetCharacterAtOffset">
-    <arg name="offset" type="i" direction="in"/>
-    <arg type="i" direction="out"/>
-  </method>
-
-  <method name="GetAttributeValue">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="in" name="attributeName" type="s"/>
-    <arg direction="out" type="s"/>
-  </method>
-
-  <method name="GetAttributes">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="out" type="a{ss}"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
-  </method>
-
-  <method name="GetDefaultAttributes">
-    <arg direction="out" type="a{ss}"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
-  </method>
-
-  <method name="GetCharacterExtents">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="out" name="x" type="i"/>
-    <arg direction="out" name="y" type="i"/>
-    <arg direction="out" name="width" type="i"/>
-    <arg direction="out" name="height" type="i"/>
-    <arg direction="in" name="coordType" type="u"/>
-  </method>
-
-  <method name="GetOffsetAtPoint">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="coordType" type="u"/>
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetNSelections">
-    <arg direction="out" type="i"/>
-  </method>
-
-  <method name="GetSelection">
-    <arg direction="in" name="selectionNum" type="i"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-  </method>
-
-  <method name="AddSelection">
-    <arg direction="in" name="startOffset" type="i"/>
-    <arg direction="in" name="endOffset" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="RemoveSelection">
-    <arg direction="in" name="selectionNum" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="SetSelection">
-    <arg direction="in" name="selectionNum" type="i"/>
-    <arg direction="in" name="startOffset" type="i"/>
-    <arg direction="in" name="endOffset" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="GetRangeExtents">
-    <arg direction="in" name="startOffset" type="i"/>
-    <arg direction="in" name="endOffset" type="i"/>
-    <arg direction="out" name="x" type="i"/>
-    <arg direction="out" name="y" type="i"/>
-    <arg direction="out" name="width" type="i"/>
-    <arg direction="out" name="height" type="i"/>
-    <arg direction="in" name="coordType" type="u"/>
-  </method>
-
-  <method name="GetBoundedRanges">
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="in" name="width" type="i"/>
-    <arg direction="in" name="height" type="i"/>
-    <arg direction="in" name="coordType" type="u"/>
-    <arg direction="in" name="xClipType" type="u"/>
-    <arg direction="in" name="yClipType" type="u"/>
-    <arg direction="out" type="a(iisv)"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRangeList"/>
-  </method>
-
-  <method name="GetAttributeRun">
-    <arg direction="in" name="offset" type="i"/>
-    <arg direction="in" name="includeDefaults" type="b"/>
-    <arg direction="out" type="a{ss}"/>
-    <arg direction="out" name="startOffset" type="i"/>
-    <arg direction="out" name="endOffset" type="i"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
-  </method>
-
-  <method name="GetDefaultAttributeSet">
-    <arg direction="out" type="a{ss}"/>
-    <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
-  </method>
-
-  <method name="ScrollSubstringTo">
-    <arg direction="in" name="startOffset" type="i"/>
-    <arg direction="in" name="endOffset" type="i"/>
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-  <method name="ScrollSubstringToPoint">
-    <arg direction="in" name="startOffset" type="i"/>
-    <arg direction="in" name="endOffset" type="i"/>
-    <arg direction="in" name="type" type="u"/>
-    <arg direction="in" name="x" type="i"/>
-    <arg direction="in" name="y" type="i"/>
-    <arg direction="out" type="b"/>
-  </method>
-
-</interface>
+<node>
+  <interface name="org.a11y.atspi.Text">
+
+    <property name="CharacterCount" type="i" access="read"/>
+
+    <property name="CaretOffset" type="i" access="read"/>
+
+    <method name="GetStringAtOffset">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="granularity" type="u"/>
+      <arg direction="out" type="s"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="GetText">
+      <arg direction="in" name="startOffset" type="i"/>
+      <arg direction="in" name="endOffset" type="i"/>
+      <arg direction="out" type="s"/>
+    </method>
+
+    <method name="SetCaretOffset">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="GetTextBeforeOffset">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="type" type="u"/>
+      <arg direction="out" type="s"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="GetTextAtOffset">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="type" type="u"/>
+      <arg direction="out" type="s"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="GetTextAfterOffset">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="type" type="u"/>
+      <arg direction="out" type="s"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="GetCharacterAtOffset">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetAttributeValue">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="attributeName" type="s"/>
+      <arg direction="out" type="s"/>
+    </method>
+
+    <method name="GetAttributes">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="out" type="a{ss}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="GetDefaultAttributes">
+      <arg direction="out" type="a{ss}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
+    </method>
+
+    <method name="GetCharacterExtents">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="coordType" type="u"/>
+      <arg direction="out" name="x" type="i"/>
+      <arg direction="out" name="y" type="i"/>
+      <arg direction="out" name="width" type="i"/>
+      <arg direction="out" name="height" type="i"/>
+    </method>
+
+    <method name="GetOffsetAtPoint">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="coordType" type="u"/>
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetNSelections">
+      <arg direction="out" type="i"/>
+    </method>
+
+    <method name="GetSelection">
+      <arg direction="in" name="selectionNum" type="i"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="AddSelection">
+      <arg direction="in" name="startOffset" type="i"/>
+      <arg direction="in" name="endOffset" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="RemoveSelection">
+      <arg direction="in" name="selectionNum" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="SetSelection">
+      <arg direction="in" name="selectionNum" type="i"/>
+      <arg direction="in" name="startOffset" type="i"/>
+      <arg direction="in" name="endOffset" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="GetRangeExtents">
+      <arg direction="in" name="startOffset" type="i"/>
+      <arg direction="in" name="endOffset" type="i"/>
+      <arg direction="in" name="coordType" type="u"/>
+      <arg direction="out" name="x" type="i"/>
+      <arg direction="out" name="y" type="i"/>
+      <arg direction="out" name="width" type="i"/>
+      <arg direction="out" name="height" type="i"/>
+    </method>
+
+    <method name="GetBoundedRanges">
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="in" name="width" type="i"/>
+      <arg direction="in" name="height" type="i"/>
+      <arg direction="in" name="coordType" type="u"/>
+      <arg direction="in" name="xClipType" type="u"/>
+      <arg direction="in" name="yClipType" type="u"/>
+      <arg direction="out" type="a(iisv)"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiRangeList"/>
+    </method>
+
+    <method name="GetAttributeRun">
+      <arg direction="in" name="offset" type="i"/>
+      <arg direction="in" name="includeDefaults" type="b"/>
+      <arg direction="out" type="a{ss}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
+      <arg direction="out" name="startOffset" type="i"/>
+      <arg direction="out" name="endOffset" type="i"/>
+    </method>
+
+    <method name="GetDefaultAttributeSet">
+      <arg direction="out" type="a{ss}"/>
+      <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
+    </method>
+
+    <method name="ScrollSubstringTo">
+      <arg direction="in" name="startOffset" type="i"/>
+      <arg direction="in" name="endOffset" type="i"/>
+      <arg direction="in" name="type" type="u"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+    <method name="ScrollSubstringToPoint">
+      <arg direction="in" name="startOffset" type="i"/>
+      <arg direction="in" name="endOffset" type="i"/>
+      <arg direction="in" name="type" type="u"/>
+      <arg direction="in" name="x" type="i"/>
+      <arg direction="in" name="y" type="i"/>
+      <arg direction="out" type="b"/>
+    </method>
+
+  </interface>
 </node>
index ccd6c7a..b7add6d 100644 (file)
@@ -1,14 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<node name="/node">
-<interface name="org.a11y.atspi.Value">
+<node>
+  <interface name="org.a11y.atspi.Value">
 
-        <property name="MinimumValue" type="d" access="read"/>
+    <property name="MinimumValue" type="d" access="read"/>
 
-        <property name="MaximumValue" type="d" access="read"/>
+    <property name="MaximumValue" type="d" access="read"/>
 
-        <property name="MinimumIncrement" type="d" access="read"/>
+    <property name="MinimumIncrement" type="d" access="read"/>
 
-        <property name="CurrentValue" type="d" access="readwrite"/>
+    <property name="CurrentValue" type="d" access="readwrite"/>
 
-</interface>
+    <property name="Text" type="s" access="read"/>
+
+  </interface>
 </node>
diff --git a/xml/create-introspection.sh b/xml/create-introspection.sh
deleted file mode 100755 (executable)
index 81d60e4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-xsltproc --xinclude remove-annotations.xsl Accessibility.xml >Processed.xml
-python versioned-introspection.py
diff --git a/xml/generate-introspection.py b/xml/generate-introspection.py
new file mode 100644 (file)
index 0000000..a0b4d1e
--- /dev/null
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+#
+# Takes DBus XML files and writes out a pair of introspection.[ch] files for inclusion
+# in C code.
+
+import argparse
+import os
+import sys
+from xml.etree import ElementTree
+
+CTEMPLATE = """
+/*
+ * This file has been auto-generated from the introspection data available
+ * in the at-spi2-core repository. The D-Bus protocol is defined in this
+ * repository, which can be found at:
+ *
+ * https://gitlab.gnome.org/GNOME/at-spi2-core
+ *
+ * DO NOT EDIT.
+ */
+
+%s
+"""
+
+HTEMPLATE = """
+/*
+ * This file has been auto-generated from the introspection data available
+ * in the at-spi2-core repository. The D-Bus protocol is defined in this
+ * repository, which can be found at:
+ *
+ * https://gitlab.gnome.org/GNOME/at-spi2-core
+ *
+ * DO NOT EDIT.
+ */
+
+#ifndef SPI_INTROSPECTION_DATA_H_
+#define SPI_INTROSPECTION_DATA_H_
+
+%s
+
+#endif /* SPI_INTROSPECTION_DATA_H_ */
+"""
+
+DECTEMPLATE = """
+extern const char *%s;
+"""
+
+DEFTEMPLATE = """
+const char *%s =
+%s;
+"""
+
+def convert_name (name):
+    return "spi_" + name.replace (".", "_")
+
+def convert_contents (contents):
+    contents = contents.replace ("\"", "\\\"")
+    literals = ["\"%s\"" % (line) for line in contents.split ("\n")]
+    return "\n".join (literals)
+
+def generate_introspection (inputs, c_output_filename, h_output_filename):
+    #Open the output files.
+    cfile = open (c_output_filename, "w")
+    hfile = open (h_output_filename, "w")
+
+    ccontents = ""
+    hcontents = ""
+
+    for input_filename in inputs:
+        #Open the XML file and process includes.
+        try:
+            tree = ElementTree.parse (input_filename)
+        except Exception as e:
+            raise type(e)(f"Invalid XML while parsing {input_filename}: {str(e)}")
+
+        root = tree.getroot ()
+
+        for itf in root.findall ("interface"):
+            #Get and convert the name of the interface.
+            name = convert_name (itf.attrib["name"])
+
+            contents = convert_contents (ElementTree.tostring (itf, encoding="unicode"))
+
+            hcontents += DECTEMPLATE % (name)
+            ccontents += DEFTEMPLATE % (name, contents)
+
+    cfile.write (CTEMPLATE % (ccontents))
+    hfile.write (HTEMPLATE % (hcontents))
+
+    cfile.close ()
+    hfile.close ()
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="Create a C source file and header file from DBus XML files")
+    parser.add_argument('sources', metavar='FILE.XML', nargs='+', help='DBus XML interface file')
+    parser.add_argument('--c-output', metavar='OUT.C', required=True, help='Name out output C file')
+    parser.add_argument('--h-output', metavar='OUT.H', required=True, help='Name out output H file')
+    args = parser.parse_args()
+
+    input_filename = sys.argv[1]
+    c_output_filename = sys.argv[2]
+    h_output_filename = sys.argv[3]
+
+    generate_introspection (args.sources, args.c_output, args.h_output)
diff --git a/xml/meson.build b/xml/meson.build
new file mode 100644 (file)
index 0000000..9cbc5a4
--- /dev/null
@@ -0,0 +1,32 @@
+generator = find_program('generate-introspection.py')
+
+introspection_sources = [
+  'Accessible.xml',
+  'Action.xml',
+  'Application.xml',
+  'Cache.xml',
+  'Collection.xml',
+  'Component.xml',
+  'DeviceEventController.xml',
+  'DeviceEventListener.xml',
+  'Document.xml',
+  'EditableText.xml',
+  'Event.xml',
+  'Hyperlink.xml',
+  'Hypertext.xml',
+  'Image.xml',
+  'Registry.xml',
+  'Selection.xml',
+  'Socket.xml',
+  'Table.xml',
+  'TableCell.xml',
+  'Text.xml',
+  'Value.xml',
+]
+
+introspection_generated = custom_target(
+  'introspection_generated',
+  input: introspection_sources,
+  output: [ 'introspection.c', 'introspection.h' ],
+  command: [ generator, '@INPUT@', '--c-output=@OUTPUT0@', '--h-output=@OUTPUT1@' ],
+)
diff --git a/xml/remove-annotations.xsl b/xml/remove-annotations.xsl
deleted file mode 100644 (file)
index 5d25d0e..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
-  <xsl:template match="@*|node()">
-    <xsl:copy>
-      <xsl:apply-templates select="@*|node()"/>
-    </xsl:copy>
-  </xsl:template>
-
-  <xsl:template match="annotation"/>
-
-  <xsl:output method="xml" indent="yes" encoding="UTF-8"
-    omit-xml-declaration="yes"/>
-
-</xsl:stylesheet>
diff --git a/xml/versioned-introspection.py b/xml/versioned-introspection.py
deleted file mode 100644 (file)
index 3922f66..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-
-import sys
-from xml.etree import ElementTree
-
-CTEMPLATE = \
-"""
-/*
- * This file has been auto-generated from the introspection data available
- * in the at-spi2-core repository. The D-Bus procol is defined in this
- * repository, which can be found at:
- *
- * http://download.gnome.org/sources/at-spi2-core/0.1/
- *
- * DO NOT EDIT.
- */
-
-%s
-"""
-
-HTEMPLATE = \
-"""
-/*
- * This file has been auto-generated from the introspection data available
- * in the at-spi2-core repository. The D-Bus procol is defined in this
- * repository, which can be found at:
- *
- * http://download.gnome.org/sources/at-spi2-core/0.1/
- *
- * DO NOT EDIT.
- */
-
-#ifndef SPI_INTROSPECTION_DATA_H_
-#define SPI_INTROSPECTION_DATA_H_
-
-%s
-
-#endif /* SPI_INTROSPECTION_DATA_H_ */
-"""
-
-DECTEMPLATE = \
-"""
-extern const char *%s;
-"""
-
-DEFTEMPLATE = \
-"""
-const char *%s = 
-%s;
-"""
-
-VERSION = "0.1.7"
-
-def convert_name (name):
-       return "spi_" + name.replace (".", "_")
-
-def convert_contents (contents):
-       contents = contents.replace ("\"", "\\\"")
-       literals = ["\"%s\"" % (line) for line in contents.split ("\n")]
-       return "\n".join (literals)
-
-def main (argv):
-       #Open the XML file and process includes.
-       tree = ElementTree.parse ("Processed.xml")
-       root = tree.getroot ()
-
-       #Open the output files.
-       cfile = open ("introspection.c", "w")
-       hfile = open ("introspection.h", "w")
-
-       ccontents = ""
-       hcontents = ""
-
-       for itf in root.findall ("node/interface"):
-               #Get and convert the name of the interface.
-               name = convert_name (itf.attrib["name"])
-
-               #Create the introspection string with version information.
-               itf.attrib["version"] = VERSION
-               contents = convert_contents (ElementTree.tostring (itf))
-
-               hcontents += DECTEMPLATE % (name)
-               ccontents += DEFTEMPLATE % (name, contents)
-
-       cfile.write (CTEMPLATE % (ccontents))
-       hfile.write (HTEMPLATE % (hcontents))
-
-       cfile.close ()
-       hfile.close ()  
-       
-if __name__ == "__main__":
-       sys.exit(main(sys.argv))