[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: