brltty changes for wheezy
Hello,
We would like to apply some upstream fixes to the brltty package.
- r6587 fixes accent output in some messages (Bug#680648). It is a
matter of passing them through mbrtowc.
- r6588 simply unfuzzies translations which are actually up-to-date (the
translator didn't know about the fuzzy keyword) (Bug#680638).
- r6592 and r6625 fix typing shift/control/alt from braille devices in
X11 (Bug#681460). The patch looks long, but passing it through interdiff
-w (30-late-fixes-r6592-w.patch) better shows what it changes: "if"
into "switch" and a new next_modifiers variable which adds itself to
the existing modifier management. r6625, applied after that, fixes the
behavior.
- r6623 is quite invasive, but without it, the at-spi2 driver simply
does not work at all. That means that brltty can not be used to access
gnome-terminal windows along orca, which makes them way less usable with
a braille device.
- eventually, because of r6623, new build-deps are needed and the
configure script has to be regenerated, see "patch". That further
triggers a rebuild of the pot file, which I had to disable trivially
with 40-no-update-pot.patch.
Are these all OK to upload?
Samuel
commit 571992bf34ef0323f6e15aee0e7fd21433dfd4e2
Author: dave <dave@91a5dbb7-01b9-0310-9b5f-b28072856b6e>
Date: Sun Jul 8 14:32:00 2012 +0000
setScreenMessage() should do text->Unicode conversion. (dm)
git-svn-id: svn://mielke.cc/main/brltty@6587 91a5dbb7-01b9-0310-9b5f-b28072856b6e
diff --git a/Programs/scr.c b/Programs/scr.c
index fe5d5ad..d50b7fd 100644
--- a/Programs/scr.c
+++ b/Programs/scr.c
@@ -231,14 +231,6 @@ setScreenCharacterText (ScreenCharacter *characters, wchar_t text, size_t count)
}
void
-copyScreenCharacterText (ScreenCharacter *characters, const char *text, size_t count) {
- while (count > 0) {
- --count;
- characters[count].text = text[count];
- }
-}
-
-void
setScreenCharacterAttributes (ScreenCharacter *characters, unsigned char attributes, size_t count) {
while (count > 0) {
characters[--count].attributes = attributes;
@@ -253,14 +245,26 @@ clearScreenCharacters (ScreenCharacter *characters, size_t count) {
void
setScreenMessage (const ScreenBox *box, ScreenCharacter *buffer, const char *message) {
- int count = box->width * box->height;
+ const ScreenCharacter *end = buffer + box->width;
+ unsigned int index = 0;
size_t length = strlen(message);
+ mbstate_t state;
+
+ memset(&state, 0, sizeof(state));
+ clearScreenCharacters(buffer, (box->width * box->height));
- clearScreenCharacters(buffer, count);
+ while (length) {
+ wchar_t wc;
+ size_t result = mbrtowc(&wc, message, length, &state);
+ if ((ssize_t)result < 1) break;
- if (length > box->left) {
- if ((length -= box->left) > box->width) length = box->width;
- if (length) copyScreenCharacterText(buffer, &message[box->left], length);
+ message += result;
+ length -= result;
+
+ if (index++ >= box->left) {
+ if (buffer == end) break;
+ (buffer++)->text = wc;
+ }
}
}
diff --git a/Programs/scr.h b/Programs/scr.h
index 171847f..d8282a3 100644
--- a/Programs/scr.h
+++ b/Programs/scr.h
@@ -86,7 +86,6 @@ extern void setScreenMessage (const ScreenBox *box, ScreenCharacter *buffer, con
extern void clearScreenCharacters (ScreenCharacter *characters, size_t count);
extern void setScreenCharacterText (ScreenCharacter *characters, wchar_t text, size_t count);
-extern void copyScreenCharacterText (ScreenCharacter *characters, const char *text, size_t count);
extern void setScreenCharacterAttributes (ScreenCharacter *characters, unsigned char attributes, size_t count);
#define SCR_KEY_SHIFT 0X40000000
Index: brltty/Messages/fr.po
===================================================================
--- brltty.orig/Messages/fr.po 2012-07-20 13:43:14.482771503 +1000
+++ brltty/Messages/fr.po 2012-07-20 13:45:24.626774855 +1000
@@ -117,7 +117,6 @@
msgstr "Agogo"
#: Programs/menu_prefs.c:1031
-#, fuzzy
msgid "Alert"
msgstr "Alerte"
@@ -274,7 +273,6 @@
msgstr "Sensibilité du braille"
#: Programs/menu_prefs.c:1005
-#, fuzzy
msgid "Braille Tables"
msgstr "Tables braille"
@@ -361,7 +359,6 @@
msgstr "Fermer"
#: Programs/menu_prefs.c:902
-#, fuzzy
msgid "Colon"
msgstr "Deux-points"
@@ -444,12 +441,10 @@
msgstr "Format de la date"
#: Programs/menu_prefs.c:922
-#, fuzzy
msgid "Date Position"
msgstr "Position de la date"
#: Programs/menu_prefs.c:945
-#, fuzzy
msgid "Date Separator"
msgstr "Séparateur de la date"
@@ -462,7 +457,6 @@
msgstr "Débogage"
#: Programs/brltty.c:557
-#, fuzzy
msgid "December"
msgstr "Décembre"
@@ -581,7 +575,6 @@
msgstr "Instruments folkloriques"
#: Programs/menu_prefs.c:677
-#, fuzzy
msgid "Event Alerts"
msgstr "Signaux d'événements"
@@ -724,7 +717,6 @@
msgstr "Support du serveur XKB incompatible\n"
#: Programs/menu_prefs.c:1036
-#, fuzzy
msgid "Information"
msgstr "Informations"
@@ -734,7 +726,6 @@
msgstr "Installe le service %s et quittez."
#: Programs/menu_prefs.c:1040
-#, fuzzy
msgid "Internal Parameters"
msgstr "Paramètres internes"
@@ -812,22 +803,18 @@
msgstr "Liste la table de touches sur la sortie standard"
#: Programs/menu_prefs.c:1074
-#, fuzzy
msgid "Log Braille Key Events"
msgstr "Journal des événements du clavier braille"
#: Programs/menu_prefs.c:1091
-#, fuzzy
msgid "Log Cursor Routing"
msgstr "Journal des routines curseur"
#: Programs/menu_prefs.c:1086
-#, fuzzy
msgid "Log Cursor Tracking"
msgstr "Journal des poursuites du curseur"
#: Programs/menu_prefs.c:1059
-#, fuzzy
msgid "Log Generic Input"
msgstr "Journal des ntrées génériques"
@@ -946,7 +933,6 @@
msgstr "Aucune"
#: Programs/menu_prefs.c:1035
-#, fuzzy
msgid "Notice"
msgstr "Remarque"
@@ -1261,7 +1247,6 @@
msgstr "Bord de mer"
#: Programs/brltty.c:554
-#, fuzzy
msgid "September"
msgstr "Septembre"
@@ -1278,7 +1263,6 @@
msgstr "Shanai"
#: Programs/menu_prefs.c:445
-#, fuzzy
msgid "Show Advanced Submenus"
msgstr "Afficher les sous-menus avancés"
@@ -1295,7 +1279,6 @@
msgstr "Afficher le curseur"
#: Programs/menu_prefs.c:911
-#, fuzzy
msgid "Show Seconds"
msgstr "Afficher les secondes"
@@ -1329,7 +1312,6 @@
msgstr "Basse frappée 2"
#: Programs/menu_prefs.c:941
-#, fuzzy
msgid "Slash"
msgstr "Barre oblique"
@@ -1371,12 +1353,10 @@
msgstr "Dire les caractères remplacés"
#: Programs/menu_prefs.c:827
-#, fuzzy
msgid "Speak Selected Character"
msgstr "Dire le caractère sélectionné"
#: Programs/menu_prefs.c:821
-#, fuzzy
msgid "Speak Selected Line"
msgstr "Lire la ligne sélectionnée"
@@ -1402,7 +1382,6 @@
msgstr "Entrée de la parole"
#: Programs/menu_prefs.c:746
-#, fuzzy
msgid "Speech Options"
msgstr "Options de la synthèse"
@@ -1566,12 +1545,10 @@
msgstr "Saxo tenor"
#: Programs/menu_prefs.c:506
-#, fuzzy
msgid "Text Indicators"
msgstr "Indicateurs de texte"
#: Programs/menu_prefs.c:456
-#, fuzzy
msgid "Text Presentation"
msgstr "Présentation du texte"
@@ -1596,12 +1573,10 @@
msgstr "Format de l'heure"
#: Programs/menu_prefs.c:888
-#, fuzzy
msgid "Time Presentation"
msgstr "Présentation de l'heure"
#: Programs/menu_prefs.c:906
-#, fuzzy
msgid "Time Separator"
msgstr "Séparateur de l'heure"
@@ -1782,7 +1757,6 @@
msgstr "Tous les points"
#: Programs/brltty.c:512
-#, fuzzy
msgid "and"
msgstr "et"
@@ -2001,7 +1975,6 @@
msgstr "Changements annulés"
#: Programs/brltty.c:2897
-#, fuzzy
msgid "column"
msgstr "colonne"
@@ -2286,7 +2259,6 @@
msgstr "Aller et lire le premier caractère non-vide de la ligne"
#: Programs/cmds.auto.h:671
-#, fuzzy
msgid "go to and speak first non-blank line on screen"
msgstr "Aller et lire la première ligne non-vide de l'écran"
@@ -2295,7 +2267,6 @@
msgstr "Aller et lire le dernier caractère non-vide de la ligne"
#: Programs/cmds.auto.h:678
-#, fuzzy
msgid "go to and speak last non-blank line on screen"
msgstr "Aller et lire la dernière ligne non-vide de l'écran"
@@ -2320,7 +2291,6 @@
msgstr "Va et lit la ligne précédente"
#: Programs/cmds.auto.h:623
-#, fuzzy
msgid "go to and speak previous word"
msgstr "Va et lit le mot précédent"
@@ -2429,7 +2399,6 @@
msgstr "Aide non disponible"
#: Programs/scr_help.c:234
-#, fuzzy
msgid "help screen not readable"
msgstr "Écran d'aide illisible"
@@ -2531,7 +2500,6 @@
msgstr "rouge clair"
#: Programs/brltty.c:2896
-#, fuzzy
msgid "line"
msgstr "ligne"
@@ -2728,17 +2696,14 @@
msgstr "Active ou désactive la répétition automatique"
#: Programs/cmds.auto.h:590
-#, fuzzy
msgid "set autospeak completed words on/off"
msgstr "Activer/désactiver la diction automatique des mots complétés"
#: Programs/cmds.auto.h:576
-#, fuzzy
msgid "set autospeak deleted characters on/off"
msgstr "Activer/désactiver la diction automatique des mots effacés"
#: Programs/cmds.auto.h:569
-#, fuzzy
msgid "set autospeak inserted characters on/off"
msgstr "Activer/désactiver la diction automatique des caractères insérés"
@@ -2747,17 +2712,14 @@
msgstr "Active ou désactive la parle automatique"
#: Programs/cmds.auto.h:583
-#, fuzzy
msgid "set autospeak replaced characters on/off"
msgstr "Active ou désactive la diction automatique des caractères remplacés"
#: Programs/cmds.auto.h:562
-#, fuzzy
msgid "set autospeak selected character on/off"
msgstr "Activer/désactiver la diction automatique du caractère sélectionné"
#: Programs/cmds.auto.h:555
-#, fuzzy
msgid "set autospeak selected line on/off"
msgstr "Activer/désactiver la diction automatique de la ligne sélectionnée"
@@ -2802,7 +2764,6 @@
msgstr "Active ou désactive le glissement de la fenêtre"
#: Programs/cmds.auto.h:710
-#, fuzzy
msgid "set speech location visibility on/off"
msgstr "Activer/désactiver la verbosité de la position"
Index: brltty/Programs/xbrlapi.c
===================================================================
--- brltty.orig/Programs/xbrlapi.c 2012-06-08 15:15:06.116916531 +1000
+++ brltty/Programs/xbrlapi.c 2012-07-20 13:46:18.382776217 +1000
@@ -205,6 +205,18 @@
brlapi_keyCode_t cmd = BRLAPI_KEY_TYPE_SYM;
if (brlapi_acceptKeys(brlapi_rangeType_type, &cmd, 1))
fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_SHIFT;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_UPPER;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_CONTROL;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_META;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
#endif /* CAN_SIMULATE_KEY_PRESSES */
}
@@ -501,7 +513,7 @@
#ifdef CAN_SIMULATE_KEY_PRESSES
int res;
brlapi_keyCode_t code;
- unsigned int keysym, keycode, modifiers;
+ unsigned int keysym, keycode, modifiers, next_modifiers = 0;
Bool haveXTest;
int eventBase, errorBase, majorVersion, minorVersion;
#endif /* CAN_SIMULATE_KEY_PRESSES */
@@ -659,52 +671,77 @@
#ifdef CAN_SIMULATE_KEY_PRESSES
if (haveXTest && FD_ISSET(brlapi_fd,&readfds)) {
while ((res = brlapi_readKey(0, &code)==1)) {
- if (((code & BRLAPI_KEY_TYPE_MASK) != BRLAPI_KEY_TYPE_SYM)) {
- fprintf(stderr, "%s: %" BRLAPI_PRIxKEYCODE "\n",
- gettext("unexpected block type"), code);
- continue;
+ switch (code & BRLAPI_KEY_TYPE_MASK) {
+ case BRLAPI_KEY_TYPE_CMD:
+ switch (code & BRLAPI_KEY_CODE_MASK) {
+ case BRLAPI_KEY_CMD_SHIFT:
+ next_modifiers |= ShiftMask;
+ break;
+ case BRLAPI_KEY_CMD_UPPER:
+ next_modifiers |= ShiftMask;
+ break;
+ case BRLAPI_KEY_CMD_CONTROL:
+ next_modifiers |= ControlMask;
+ break;
+ case BRLAPI_KEY_CMD_META:
+ next_modifiers |= Mod1Mask;
+ break;
+ default:
+ fprintf(stderr, "%s: %" BRLAPI_PRIxKEYCODE "\n",
+ gettext("unexpected cmd"), code);
+ break;
+ }
+ break;
+ case BRLAPI_KEY_TYPE_SYM:
+ modifiers = ((code & BRLAPI_KEY_FLAGS_MASK) >> BRLAPI_KEY_FLAGS_SHIFT) & 0xFF;
+ keysym = code & BRLAPI_KEY_CODE_MASK;
+ keycode = XKeysymToKeycode(dpy,keysym);
+ if (keycode == NoSymbol) {
+ fprintf(stderr,gettext("Couldn't translate keysym %08X to keycode.\n"),keysym);
+ continue;
+ }
+
+ {
+ static const unsigned int tryTable[] = {
+ 0,
+ ShiftMask,
+ Mod2Mask,
+ Mod3Mask,
+ Mod4Mask,
+ Mod5Mask,
+ ShiftMask|Mod2Mask,
+ ShiftMask|Mod3Mask,
+ ShiftMask|Mod4Mask,
+ ShiftMask|Mod5Mask,
+ 0
+ };
+ const unsigned int *try = tryTable;
+
+ do {
+ if (tryModifiers(keycode, &modifiers, *try, keysym)) goto foundModifiers;
+ } while (*++try);
+
+ fprintf(stderr,gettext("Couldn't find modifiers to apply to %d for getting keysym %08X\n"),keycode,keysym);
+ continue;
+ }
+ foundModifiers:
+
+ debugf("key %08X: (%d,%x,%x)\n", keysym, keycode, next_modifiers, modifiers);
+ modifiers |= next_modifiers;
+ next_modifiers = 0;
+ if (modifiers)
+ XkbLockModifiers(dpy, XkbUseCoreKbd, modifiers, modifiers);
+ XTestFakeKeyEvent(dpy,keycode,True,CurrentTime);
+ XTestFakeKeyEvent(dpy,keycode,False,CurrentTime);
+ if (modifiers)
+ XkbLockModifiers(dpy, XkbUseCoreKbd, modifiers, 0);
+ break;
+ default:
+ fprintf(stderr, "%s: %" BRLAPI_PRIxKEYCODE "\n",
+ gettext("unexpected block type"), code);
+ next_modifiers = 0;
+ break;
}
-
- modifiers = ((code & BRLAPI_KEY_FLAGS_MASK) >> BRLAPI_KEY_FLAGS_SHIFT) & 0xFF;
- keysym = code & BRLAPI_KEY_CODE_MASK;
- keycode = XKeysymToKeycode(dpy,keysym);
- if (keycode == NoSymbol) {
- fprintf(stderr,gettext("Couldn't translate keysym %08X to keycode.\n"),keysym);
- continue;
- }
-
- {
- static const unsigned int tryTable[] = {
- 0,
- ShiftMask,
- Mod2Mask,
- Mod3Mask,
- Mod4Mask,
- Mod5Mask,
- ShiftMask|Mod2Mask,
- ShiftMask|Mod3Mask,
- ShiftMask|Mod4Mask,
- ShiftMask|Mod5Mask,
- 0
- };
- const unsigned int *try = tryTable;
-
- do {
- if (tryModifiers(keycode, &modifiers, *try, keysym)) goto foundModifiers;
- } while (*++try);
-
- fprintf(stderr,gettext("Couldn't find modifiers to apply to %d for getting keysym %08X\n"),keycode,keysym);
- continue;
- }
- foundModifiers:
-
- debugf("key %08X: (%d,%x)\n", keysym, keycode, modifiers);
- if (modifiers)
- XkbLockModifiers(dpy, XkbUseCoreKbd, modifiers, modifiers);
- XTestFakeKeyEvent(dpy,keycode,True,CurrentTime);
- XTestFakeKeyEvent(dpy,keycode,False,CurrentTime);
- if (modifiers)
- XkbLockModifiers(dpy, XkbUseCoreKbd, modifiers, 0);
}
if (res<0)
fatal_brlapi_errno("brlapi_readKey",NULL);
only in patch2:
--- brltty.orig/Programs/xbrlapi.c 2012-06-08 15:15:06.116916531 +1000
+++ brltty/Programs/xbrlapi.c 2012-07-20 13:46:18.382776217 +1000
@@ -207,2 +207,14 @@
fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_SHIFT;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_UPPER;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_CONTROL;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
+ cmd = BRLAPI_KEY_TYPE_CMD | BRLAPI_KEY_CMD_META;
+ if (brlapi_acceptKeys(brlapi_rangeType_key, &cmd, 1))
+ fatal_brlapi_errno("acceptKeys",NULL);
#endif /* CAN_SIMULATE_KEY_PRESSES */
@@ -503,3 +515,3 @@
brlapi_keyCode_t code;
- unsigned int keysym, keycode, modifiers;
+ unsigned int keysym, keycode, modifiers, next_modifiers = 0;
Bool haveXTest;
@@ -661,8 +673,24 @@
while ((res = brlapi_readKey(0, &code)==1)) {
- if (((code & BRLAPI_KEY_TYPE_MASK) != BRLAPI_KEY_TYPE_SYM)) {
+ switch (code & BRLAPI_KEY_TYPE_MASK) {
+ case BRLAPI_KEY_TYPE_CMD:
+ switch (code & BRLAPI_KEY_CODE_MASK) {
+ case BRLAPI_KEY_CMD_SHIFT:
+ next_modifiers |= ShiftMask;
+ break;
+ case BRLAPI_KEY_CMD_UPPER:
+ next_modifiers |= ShiftMask;
+ break;
+ case BRLAPI_KEY_CMD_CONTROL:
+ next_modifiers |= ControlMask;
+ break;
+ case BRLAPI_KEY_CMD_META:
+ next_modifiers |= Mod1Mask;
+ break;
+ default:
fprintf(stderr, "%s: %" BRLAPI_PRIxKEYCODE "\n",
- gettext("unexpected block type"), code);
- continue;
+ gettext("unexpected cmd"), code);
+ break;
}
-
+ break;
+ case BRLAPI_KEY_TYPE_SYM:
modifiers = ((code & BRLAPI_KEY_FLAGS_MASK) >> BRLAPI_KEY_FLAGS_SHIFT) & 0xFF;
@@ -700,3 +728,5 @@
- debugf("key %08X: (%d,%x)\n", keysym, keycode, modifiers);
+ debugf("key %08X: (%d,%x,%x)\n", keysym, keycode, next_modifiers, modifiers);
+ modifiers |= next_modifiers;
+ next_modifiers = 0;
if (modifiers)
@@ -707,2 +737,9 @@
XkbLockModifiers(dpy, XkbUseCoreKbd, modifiers, 0);
+ break;
+ default:
+ fprintf(stderr, "%s: %" BRLAPI_PRIxKEYCODE "\n",
+ gettext("unexpected block type"), code);
+ next_modifiers = 0;
+ break;
+ }
}
Index: a/config.mk.in
===================================================================
--- a/config.mk.in (révision 6622)
+++ b/config.mk.in (révision 6623)
@@ -186,6 +186,12 @@
CSPI_INCLUDES = @cspi_includes@
CSPI_LIBS = @cspi_libs@
+ATSPI2_INCLUDES = @atspi2_includes@
+ATSPI2_LIBS = @atspi2_libs@
+
+GLIB2_INCLUDES = @glib2_includes@
+GLIB2_LIBS = @glib2_libs@
+
DBUS_INCLUDES = @dbus_includes@
DBUS_LIBS = @dbus_libs@
Index: a/configure.ac
===================================================================
--- a/configure.ac (révision 6622)
+++ b/configure.ac (révision 6623)
@@ -1557,7 +1557,22 @@
BRLTTY_HAVE_PACKAGE([dbus], ["dbus-1 >= 1.0"], [dnl
AC_CHECK_HEADER([X11/keysym.h], [dnl
- BRLTTY_SCREEN_DRIVER([a2], [AtSpi2], [$(DBUS_LIBS)])
+ BRLTTY_HAVE_PACKAGE([atspi2], [atspi-2], [dnl
+ brltty_cppflags_save="${CPPFLAGS}"
+ CPPFLAGS="${CPPFLAGS} ${atspi2_cflags}"
+
+ brltty_libs_save="${LIBS}"
+ LIBS="${atspi2_libs} ${LIBS}"
+
+ AC_CHECK_FUNCS([atspi_get_a11y_bus])
+
+ CPPFLAGS="${brltty_cppflags_save}"
+ LIBS="${brltty_libs_save}"
+
+ BRLTTY_HAVE_PACKAGE([glib2], [glib-2.0])
+ ])
+
+ BRLTTY_SCREEN_DRIVER([a2], [AtSpi2], [$(DBUS_LIBS) $(ATSPI2_LIBS) $(GLIB2_LIBS)])
])
])
Index: a/Drivers/Screen/AtSpi2/screen.c
===================================================================
--- a/Drivers/Screen/AtSpi2/screen.c (révision 6622)
+++ b/Drivers/Screen/AtSpi2/screen.c (révision 6623)
@@ -26,6 +26,10 @@
#include <limits.h>
#include <locale.h>
+#ifdef HAVE_ATSPI_GET_A11Y_BUS
+#include <atspi/atspi.h>
+#endif
+
#ifdef HAVE_LANGINFO_H
#include <langinfo.h>
#endif /* HAVE_LANGINFO_H */
@@ -39,8 +43,10 @@
#include <dbus/dbus.h>
#define SPI2_DBUS_INTERFACE "org.a11y.atspi"
#define SPI2_DBUS_INTERFACE_REG SPI2_DBUS_INTERFACE".Registry"
-#define SPI2_DBUS_PATH_DEC "/org/a11y/atspi/registry/deviceeventcontroller"
+#define SPI2_DBUS_PATH_REG "/org/a11y/atspi/registry"
+#define SPI2_DBUS_PATH_DEC SPI2_DBUS_PATH_REG "/deviceeventcontroller"
#define SPI2_DBUS_INTERFACE_DEC SPI2_DBUS_INTERFACE".DeviceEventController"
+#define SPI2_DBUS_INTERFACE_DEL SPI2_DBUS_INTERFACE".DeviceEventListener"
#define SPI2_DBUS_INTERFACE_EVENT SPI2_DBUS_INTERFACE".Event"
#define SPI2_DBUS_INTERFACE_TREE SPI2_DBUS_INTERFACE".Tree"
#define SPI2_DBUS_INTERFACE_TEXT SPI2_DBUS_INTERFACE".Text"
@@ -730,19 +736,72 @@
static int finished;
-static void *doAtSpi2ScreenOpen(void *arg) {
+static int watch(const char *message, const char *event) {
DBusError error;
+ DBusMessage *msg, *reply;
- sem_t *SPI2_init_sem = (sem_t *)arg;
+ dbus_error_init(&error);
+ dbus_bus_add_match(bus, message, &error);
+ if (dbus_error_is_set(&error)) {
+ logMessage(LOG_ERR, "error while adding watch %s: %s %s", message, error.name, error.message);
+ dbus_error_free(&error);
+ return 0;
+ }
+
+ if (!event)
+ return 1;
+ /* Register as event listener. */
dbus_error_init(&error);
- /* TODO: try to use the accessibility bus */
- bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
+ msg = dbus_message_new_method_call(SPI2_DBUS_INTERFACE_REG, SPI2_DBUS_PATH_REG, SPI2_DBUS_INTERFACE_REG, "RegisterEvent");
if (dbus_error_is_set(&error)) {
- logMessage(LOG_ERR, "Can't get dbus session bus: %s %s", error.name, error.message);
+ logMessage(LOG_DEBUG, "error while registering listener: %s %s", error.name, error.message);
dbus_error_free(&error);
- goto out;
+ return 0;
}
+ if (!msg) {
+ logMessage(LOG_DEBUG, "no memory while registering listener");
+ return 0;
+ }
+
+ dbus_message_append_args(msg, DBUS_TYPE_STRING, &event, DBUS_TYPE_INVALID);
+
+ dbus_error_init(&error);
+ /* 1s max delay */
+ reply = dbus_connection_send_with_reply_and_block(bus, msg, 1000, &error);
+ dbus_message_unref(msg);
+ if (dbus_error_is_set(&error)) {
+ logMessage(LOG_DEBUG, "error while registering listener: %s %s", error.name, error.message);
+ dbus_error_free(&error);
+ return 0;
+ }
+ if (!reply) {
+ logMessage(LOG_DEBUG, "timeout while registering listener");
+ return 0;
+ }
+ dbus_message_unref(reply);
+
+ return 1;
+}
+
+static void *doAtSpi2ScreenOpen(void *arg) {
+ DBusError error;
+
+ sem_t *SPI2_init_sem = (sem_t *)arg;
+
+ dbus_error_init(&error);
+#ifdef HAVE_ATSPI_GET_A11Y_BUS
+ bus = atspi_get_a11y_bus();
+ if (!bus)
+#endif
+ {
+ bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
+ if (dbus_error_is_set(&error)) {
+ logMessage(LOG_ERR, "Can't get dbus session bus: %s %s", error.name, error.message);
+ dbus_error_free(&error);
+ goto out;
+ }
+ }
if (!bus) {
logMessage(LOG_ERR, "Can't get dbus session bus.");
goto out;
@@ -750,21 +809,19 @@
if (!dbus_connection_add_filter(bus, AtSpi2Filter, NULL, NULL)) {
goto outConn;
}
-#define WATCH(str) \
- dbus_error_init(&error); \
- dbus_bus_add_match(bus, str, &error); \
- if (dbus_error_is_set(&error)) { \
- logMessage(LOG_ERR, "error while adding watch %s: %s %s", str, error.name, error.message); \
- dbus_error_free(&error); \
- goto out; \
- }
- WATCH("type='method_call',interface='"SPI2_DBUS_INTERFACE_TREE"'");
- WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Focus'");
- WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object'");
- WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='TextChanged'");
- WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='TextCaretMoved'");
- WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='StateChanged'");
+#define WATCH(str, event) \
+ if (!watch((str), (event))) \
+ goto outConn;
+
+ WATCH("type='method_call',interface='"SPI2_DBUS_INTERFACE_TREE"'", NULL);
+ WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Focus'", "focus");
+ WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object'", "object");
+ WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='ChildrenChanged'", "object:childrenchanged");
+ WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='TextChanged'", "object:textchanged");
+ WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='TextCaretMoved'", "object:textcaretmoved");
+ WATCH("type='signal',interface='"SPI2_DBUS_INTERFACE_EVENT".Object',member='StateChanged'", "object:statechanged");
+
/* TODO: use dbus_watch_get_unix_fd() or dbus_watch_get_socket() instead */
sem_post(SPI2_init_sem);
while (!finished && dbus_connection_read_write_dispatch (bus, 1000))
Index: a/Drivers/Screen/AtSpi2/Makefile.in
===================================================================
--- a/Drivers/Screen/AtSpi2/Makefile.in (révision 6622)
+++ b/Drivers/Screen/AtSpi2/Makefile.in (révision 6623)
@@ -25,5 +25,5 @@
include $(SRC_TOP)screen.mk
screen.$O:
- $(CC) $(SCR_CFLAGS) $(DBUS_INCLUDES) -c $(SRC_DIR)/screen.c
+ $(CC) $(SCR_CFLAGS) $(DBUS_INCLUDES) $(ATSPI2_INCLUDES) $(GLIB2_INCLUDES) -c $(SRC_DIR)/screen.c
Index: a/config.h.in
===================================================================
--- a/config.h.in (révision 6622)
+++ b/config.h.in (révision 6623)
@@ -405,6 +405,9 @@
#undef HAVE_PKG_XAWPLUS
#undef HAVE_PKG_XM
+/* Define this if the function atspi_get_a11y_bus exists in atspi2. */
+#undef HAVE_ATSPI_GET_A11Y_BUS
+
#define TEXT_TABLE_EXTENSION ".ttb"
#define TEXT_SUBTABLE_EXTENSION ".tti"
Index: brltty/Programs/xbrlapi.c
===================================================================
--- brltty/Programs/xbrlapi.c (révision 6624)
+++ brltty/Programs/xbrlapi.c (révision 6625)
@@ -675,16 +675,16 @@
case BRLAPI_KEY_TYPE_CMD:
switch (code & BRLAPI_KEY_CODE_MASK) {
case BRLAPI_KEY_CMD_SHIFT:
- next_modifiers |= ShiftMask;
+ next_modifiers ^= ShiftMask;
break;
case BRLAPI_KEY_CMD_UPPER:
- next_modifiers |= ShiftMask;
+ next_modifiers ^= ShiftMask;
break;
case BRLAPI_KEY_CMD_CONTROL:
- next_modifiers |= ControlMask;
+ next_modifiers ^= ControlMask;
break;
case BRLAPI_KEY_CMD_META:
- next_modifiers |= Mod1Mask;
+ next_modifiers ^= Mod1Mask;
break;
default:
fprintf(stderr, "%s: %" BRLAPI_PRIxKEYCODE "\n",
diff --git a/debian/control b/debian/control
index 01b9b71..a9028bc 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Vcs-Browser: http://git.debian.org/?p=pkg-a11y/brltty.git;a=summary
Vcs-Git: git://git.debian.org/git/pkg-a11y/brltty.git
Homepage: http://mielke.cc/brltty/
Build-Depends: debhelper (>= 7), dh-lisp,
- autotools-dev,
+ autotools-dev, autoconf, tcl,
libasound2-dev [linux-any],
python-dev (>= 2.7~0),
python-pyrex,
@@ -17,7 +17,7 @@ Build-Depends: debhelper (>= 7), dh-lisp,
doxygen, linuxdoc-tools, groff,
flite1-dev, libncursesw5-dev,
libxaw7-dev, x11proto-kb-dev, libxtst-dev,
- libdbus-1-dev,
+ libdbus-1-dev, libatspi2.0-dev, libglib2.0-dev,
libbluetooth-dev [linux-any],
libspeechd-dev,
libespeak-dev,
diff --git a/debian/rules b/debian/rules
index c405eb2..43dbcc0 100755
--- a/debian/rules
+++ b/debian/rules
@@ -41,6 +41,7 @@ clean:
rm -f Bindings/Python/bindings.o
rm -f acdir/config.sub
rm -f acdir/config.guess
+ rm -f configure
dh_clean
@@ -49,15 +50,18 @@ acdir/config.sub: /usr/share/misc/config.sub
acdir/config.guess: /usr/share/misc/config.guess
cp -f $< $@
-configure: build-brltty/config.status
-build-brltty/config.status: acdir/config.sub acdir/config.guess
+configure:
+ ./autogen
+
+config: build-brltty/config.status
+build-brltty/config.status: configure acdir/config.sub acdir/config.guess
mkdir build-brltty
cd build-brltty && ../configure --bindir=/sbin --mandir=/usr/share/man \
--with-curses=ncursesw --disable-stripping \
$(CONFIGURE_OPTIONS)
-configure-udeb: build-brltty-udeb/config.status
-build-brltty-udeb/config.status: acdir/config.sub acdir/config.guess
+config-udeb: build-brltty-udeb/config.status
+build-brltty-udeb/config.status: configure acdir/config.sub acdir/config.guess
mkdir build-brltty-udeb
cd build-brltty-udeb && \
CFLAGS="$(UDEB_CFLAGS)" ../configure --bindir=/sbin \
@@ -68,7 +72,7 @@ build-indep: build-arch
build: build-indep build-arch
build-brltty: build-stamp
-build-stamp: configure
+build-stamp: config
dh_testdir
DEB_BUILD_HARDENING=1 $(MAKE) -C build-brltty
@@ -77,7 +81,7 @@ build-stamp: configure
touch $@
build-udeb: build-udeb-stamp
-build-udeb-stamp: configure-udeb
+build-udeb-stamp: config-udeb
dh_testdir
$(MAKE) -C build-brltty-udeb
diff --git a/Messages/Makefile.in b/Messages/Makefile.in
index 193a9ee..4ca48c1 100644
--- a/Messages/Makefile.in
+++ b/Messages/Makefile.in
@@ -33,9 +33,9 @@ OBJECT_FILES = $(LANGUAGE_CODES:=.$(OBJECT_EXTENSION))
objects: $(OBJECT_FILES)
-TEMPLATE_FILE = $(PACKAGE_NAME).$(TEMPLATE_EXTENSION)
-$(TEMPLATE_FILE): $(BLD_TOP)$(PGM_DIR)/cmds.auto.h
- $(SRC_TOP)mkpot -n "$(PACKAGE_NAME)" -v "$(PACKAGE_VERSION)" -o $@ -b "$(BUGS_ADDRESS)" -c "$(COPYRIGHT_HOLDER)" $(SRC_TOP) $(BLD_TOP)
+#TEMPLATE_FILE = $(PACKAGE_NAME).$(TEMPLATE_EXTENSION)
+#$(TEMPLATE_FILE): $(BLD_TOP)$(PGM_DIR)/cmds.auto.h
+# $(SRC_TOP)mkpot -n "$(PACKAGE_NAME)" -v "$(PACKAGE_VERSION)" -o $@ -b "$(BUGS_ADDRESS)" -c "$(COPYRIGHT_HOLDER)" $(SRC_TOP) $(BLD_TOP)
template $(TEMPLATE_EXTENSION): $(TEMPLATE_FILE)
%.$(SOURCE_EXTENSION): $(TEMPLATE_FILE)
Reply to: