+What's new in at-spi2-core 2.42.0:
+
+* Set X root property when Xwayland starts on demand.
+
+* Several dbus introspection fixes.
+
+What's new in at-spi2-core 2.40.3:
+
+* Use abstract sockets if libdbus is older than 1.12.0 (#37).
+
+What's new in at-spi2-core 2.40.2:
+
+* README: Remove outdated links.
+
+* Key grab fixes for the new API.
+
+* registryd: Add a missing call to va_end.
+
+What's new in at-spi2-core 2.40.1:
+
+* Fix double free when removing event listeners (#35).
+
+* Fix numlock detection.
+
+What's new in at-spi2-core 2.39.91:
+* Fix a couple of memory leaks.
+
+* Remove const from AtspiDeviceListenerCB prototype (#31).
+
What's new in at-spi2-core 2.39.90.1:
* Fix a crash introduced in 2.39.90, along with a few warnings (#30).
It has been completely rewritten to use D-Bus rather than
ORBIT / CORBA for its transport protocol.
-A page including instructions for testing, project status and
-TODO items is kept up to date at:
+An outdated page including instructions for testing, project status and
+TODO items is at:
- http://www.linuxfoundation.org/en/AT-SPI_on_D-Bus
+ https://wiki.linuxfoundation.org/accessibility/atk/at-spi/at-spi_on_d-bus
The mailing list used for general questions is:
- accessibility-atspi@lists.linux-foundation.org
+ https://lists.linuxfoundation.org/mailman/listinfo/accessibility-atspi
-For bug reports, feature requests, patches or enhancements please use
-the AT-SPI project on bugzilla.gnome.org. Use the at-spi2-core component for
-bugs specific to this module.
+For bug reports, feature requests, patches or enhancements please use:
- http://bugzilla.gnome.org
+ https://gitlab.gnome.org/GNOME/at-spi2-core/
A git repository with the latest development code is available at:
- git://git.gnome.org/at-spi2-core
+ https://gitlab.gnome.org/GNOME/at-spi2-core/
More information
----------------
mind that the D-Bus AT-SPI design documents on this page
have not been kept up to date.
- http://live.gnome.org/GAP/AtSpiDbusInvestigation/
+ https://wiki.gnome.org/Accessibility/Documentation/GNOME2/ATSPI2-Investigation
Other sources of relevant information about AT-SPI and Accessibility
include:
- http://live.gnome.org/Accessibility
- http://www.sun.com/software/star/gnome/accessibility/architecture.xml
- http://accessibility.kde.org/developer/atk.php
- http://www.gnome.org/~billh/at-spi-idl/html/
+ https://wiki.gnome.org/Accessibility
+ https://community.kde.org/Accessibility
Contents of this package
atspi_accessible_get_name (AtspiAccessible *obj, GError **error)
{
g_return_val_if_fail (obj != NULL, g_strdup (""));
+
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 ("");
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))
GSList *modifiers;
guint virtual_mods_enabled;
gboolean keyboard_grabbed;
+ unsigned int numlock_physical_mask;
};
GObjectClass *device_legacy_parent_class;
gboolean
-key_cb (const AtspiDeviceEvent *event, void *user_data)
+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;
+
set_virtual_modifier (legacy_device, event->hw_code,
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->hw_code, event->id,
- event->modifiers | priv->virtual_mods_enabled,
+ modifiers,
event->event_string);
+ g_boxed_free (ATSPI_TYPE_DEVICE_EVENT, event);
return ret;
}
AtspiDeviceLegacyPrivate *priv = atspi_device_legacy_get_instance_private (legacy_device);
GSList *l;
+ if (modifier == (1 << ATSPI_MODIFIER_NUMLOCK))
+ return TRUE;
+
for (l = priv->modifiers; l; l = l->next)
{
AtspiLegacyKeyModifier *entry = l->data;
priv->display=XOpenDisplay("");
if (priv->display)
priv->window = DefaultRootWindow(priv->display);
+ priv->numlock_physical_mask = XkbKeysymToModifiers (priv->display,
+ XK_Num_Lock);
#endif
}
* 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) (const AtspiDeviceEvent *stroke,
+typedef gboolean (*AtspiDeviceListenerCB) (AtspiDeviceEvent *stroke,
void *user_data);
/**
GSList *key_grabs;
guint virtual_mods_enabled;
gboolean keyboard_grabbed;
+ unsigned int numlock_physical_mask;
};
GObjectClass *device_x11_parent_class;
}
static void
-grab_key (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+grab_key_aux (AtspiDeviceX11 *x11_device, int keycode, int modmask)
{
AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
XIGrabModifiers xi_modifiers;
}
static void
+grab_key (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+{
+ AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
+
+ grab_key_aux (x11_device, 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);
+ }
+}
+
+static void
enable_key_grab (AtspiDeviceX11 *x11_device, AtspiX11KeyGrab *grab)
{
AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
}
static void
-ungrab_key (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+ungrab_key_aux (AtspiDeviceX11 *x11_device, int keycode, int modmask)
{
AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
XIGrabModifiers xi_modifiers;
}
static void
+ungrab_key (AtspiDeviceX11 *x11_device, int keycode, int modmask)
+{
+ AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
+
+ ungrab_key_aux (x11_device, keycode, modmask);
+ if (!(modmask & LockMask))
+ ungrab_key_aux (x11_device, 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);
+ }
+}
+
+static void
disable_key_grab (AtspiDeviceX11 *x11_device, AtspiX11KeyGrab *grab)
{
AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
char text[10];
KeySym keysym;
XComposeStatus status;
+ guint modifiers;
while (XPending (display))
{
case KeyPress:
case KeyRelease:
XLookupString(&xevent.xkey, text, sizeof (text), &keysym, &status);
- atspi_device_notify_key (ATSPI_DEVICE (device), (xevent.type == KeyPress), xevent.xkey.keycode, keysym, xevent.xkey.state | priv->virtual_mods_enabled, text);
+ 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)
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;
+ 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, keyevent.xkey.state, text);
+ 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;
AtspiDeviceX11Private *priv = atspi_device_x11_get_instance_private (x11_device);
GSList *l;
+ if (modifier == (1 << ATSPI_MODIFIER_NUMLOCK))
+ return TRUE;
+
for (l = priv->modifiers; l; l = l->next)
{
AtspiX11KeyModifier *entry = l->data;
create_event_source (device);
}
}
+
+ priv->numlock_physical_mask = XkbKeysymToModifiers (priv->display,
+ XK_Num_Lock);
}
static void
return ATSPI_DEVICE (atspi_device_legacy_new ());
}
+static gboolean
+key_matches_modifiers (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
+ keypress has modifiers that (a) the grab does not check for and (b) are
+ 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));
+ return (key_mods == grab_mods);
+}
+
gboolean
atspi_device_notify_key (AtspiDevice *device, gboolean pressed, int keycode, int keysym, gint state, gchar *text)
{
for (l = priv->keygrabs; l; l = l->next)
{
AtspiKeyGrab *grab = l->data;
- //if (keycode == grab->keycode && (grab->modifiers & state) == grab->modifiers)
- if (keycode == grab->keycode && grab->modifiers == state)
+ if (keycode == grab->keycode && key_matches_modifiers (state, grab->modifiers))
{
if (grab->callback)
grab->callback (device, pressed, keycode, keysym, state, text, grab->callback_data);
DBusMessage *message, *reply;
l = g_list_next (l);
if (in_send)
- pending_removals = g_list_append (pending_removals, e);
+ {
+ 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++)
--- /dev/null
+#!/bin/sh
+
+# Copy a11y bus address from the DBus session bus to the X11 root property.
+# This is useful when Xwayland is started on demand and if the user has an
+# application with X11 access that does not have access to the session bus.
+
+ADDR="$( busctl call --user org.a11y.Bus /org/a11y/bus org.a11y.Bus GetAddress )" || exit 0
+ADDR="$( echo $ADDR | sed 's/s "\(.*\)"/\1/' )" || exit 0
+
+exec xprop -root -format AT_SPI_BUS 8s -set AT_SPI_BUS "$ADDR"
<servicedir>@DATADIR@/dbus-1/accessibility-services</servicedir>
<auth>EXTERNAL</auth>
- <listen>unix:dir=/tmp</listen>
+ <listen>@SOCKET_ADDRESS@</listen>
<policy context="default">
<!-- Allow root to connect -->
accessibility_conf = configuration_data()
accessibility_conf.set('DATADIR', atspi_datadir)
+if libdbus_dep.version().version_compare('>= 1.12.0')
+ accessibility_conf.set('SOCKET_ADDRESS', 'unix:dir=/tmp')
+else
+ accessibility_conf.set('SOCKET_ADDRESS', 'unix:tmpdir=/tmp')
+endif
+
busconfig_dir = join_paths(atspi_datadir, 'defaults/at-spi2')
session_dir = join_paths(atspi_sysconfdir, 'xdg/autostart')
+xwayland_session_dir = join_paths(atspi_sysconfdir, 'xdg/Xwayland-session.d')
configure_file(input: 'accessibility.conf.in',
output: 'accessibility.conf',
configuration: libexec_conf,
install_dir: systemd_user_dir)
+if x11_dep.found()
+ # Note: It is safe to always install it. However, we only need this on
+ # systemd enabled machines where Xwayland may be started on-demand.
+ install_data('00-at-spi',
+ install_dir: xwayland_session_dir)
+endif
+
launcher_args = [
'-DSYSCONFDIR="@0@"'.format(atspi_sysconfdir),
'-DDATADIR="@0@"'.format(atspi_datadir),
project('at-spi2-core', 'c',
- version: '2.39.90.1',
+ version: '2.42.0',
license: 'LGPLv2.1+',
default_options: [
'buildtype=debugoptimized',
--- /dev/null
+# 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"
+"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"
+
+#: ../atspi/atspi-component.c:325 ../atspi/atspi-misc.c:1034
+#: ../atspi/atspi-value.c:111
+msgid "The application no longer exists"
+msgstr "Аԥшьы уаҳа ыҟаӡам"
+
+#: ../atspi/atspi-misc.c:1777
+msgid "Attempted synchronous call where prohibited"
+msgstr "Синхронтәу асра аҟаҵара азин ыҟаӡам"
# Yuras Shumovich <shumovichy@gmail.com>, 2017.
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-03-13 21:58+0000\n"
-"PO-Revision-Date: 2017-03-26 18:30+0300\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"
+"PO-Revision-Date: 2021-06-15 12:46\n"
"Last-Translator: Yuras Shumovich <shumovichy@gmail.com>\n"
-"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
+"Language-Team: Belarusian\n"
"Language: be\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=3; plural=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%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-ID: 2608\n"
-#: ../atspi/atspi-component.c:326 ../atspi/atspi-misc.c:1073
-#: ../atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1077 atspi/atspi-value.c:111
msgid "The application no longer exists"
msgstr "Праграма больш не існуе"
-#: ../atspi/atspi-misc.c:1832
+#: atspi/atspi-misc.c:1855
msgid "Attempted synchronous call where prohibited"
-msgstr "Спроба зрабіць сінхронны выклік, там дзе гэта забаронена"
+msgstr "Спроба сінхроннага выкліку ў забароненым месцы"
#~ msgid "AT-SPI: Unknown signature %s for RemoveAccessible"
#~ msgstr "AT-SPI: Невядомы подпіс %s для RemoveAccessible"
#~ "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"
#~ msgid "Got invalid signature %s for signal %s from interface %s\n"
#~ msgstr "Атрыманы хібны подпіс %s для сігналу %s інтэрфейсу %s\n"
+
msgstr ""
"Project-Id-Version: at-spi 2-core\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"
+"POT-Creation-Date: 2020-12-28 16:53+0000\n"
"PO-Revision-Date: 2019-12-25 05:11+0100\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
-"Language-Team: gnome-l10n-gl@gnome.org\n"
+"Language-Team: Proxecto Trasno <proxecto@trasno.gal>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.2.4\n"
-#: atspi/atspi-component.c:326 atspi/atspi-misc.c:1073 atspi/atspi-value.c:111
+#: atspi/atspi-component.c:332 atspi/atspi-misc.c:1077 atspi/atspi-value.c:111
msgid "The application no longer exists"
msgstr "A aplicación xa non existe"
-#: atspi/atspi-misc.c:1850
+#: atspi/atspi-misc.c:1855
msgid "Attempted synchronous call where prohibited"
msgstr "Tentouse unha chamada síncrona onde estaba prohibida"
ptr = va_arg(args, void *);
dbus_message_iter_append_basic(&iter_struct, type, ptr);
}
- if (!dbus_message_iter_close_container(iter, &iter_struct)) return FALSE;
+ if (!dbus_message_iter_close_container(iter, &iter_struct))
+ {
+ va_end(args);
+ return FALSE;
+ }
va_end(args);
return TRUE;
}
Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask;
static unsigned int key_modifier_mask =
Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | LockMask | ControlMask | SPI_KEYMASK_NUMLOCK;
-static unsigned int _numlock_physical_mask = Mod2Mask; /* a guess, will be reset */
+extern unsigned int _numlock_physical_mask;
static XModifierKeymap* xmkeymap = NULL;
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;
-static unsigned int _numlock_physical_mask = SPI_KEYMASK_MOD2; /* a guess, will be reset */
+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;
<interface name="org.a11y.atspi.Collection">
<method name="GetMatches">
- <arg direction="in" name="rule" type="(auuasuauusub)"/>
+ <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"/>
<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="(auuasuauusub)"/>
+ <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"/>
<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="(auuasuauusub)"/>
+ <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"/>
<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>
</method>
<method name="GetAttributes">
- <arg direction="out" type="{ss}"/>
+ <arg direction="out" type="a{ss}"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QSpiAttributeSet"/>
</method>
<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="type" type="u"/>
<arg direction="in" name="x" type="i"/>
<arg direction="in" name="y" type="i"/>
+ <arg direction="out" type="b"/>
</method>
</interface>