File orca-bgo550717-brld.patch of Package orca

diff -ruN orca-2.22.1/src/brl/brl.h orca-brld/src/brl/brl.h
--- orca-2.22.1/src/brl/brl.h	1970-01-01 01:00:00.000000000 +0100
+++ orca-brld/src/brl/brl.h	2008-07-02 16:58:28.019175000 +0200
@@ -0,0 +1,125 @@
+#ifndef _BRL_H
+#define MYLiB "/usr/lib/suse-blinux/lib/libsbl-fhp.so.1"
+#define _BRL_H
+
+#define MAXNAMELEN 20
+#define MAXPATHLEN 100
+#define MAXSCRIPTS 200
+#define NAMELEN 7
+
+/* orca key-bindings */
+#define ORCA_LNUP     0x01
+#define ORCA_LNDN     0x02
+#define ORCA_LNLFT    0x17
+#define ORCA_LNRGT    0x18
+#define ORCA_TOPLEFT   0x0b
+#define ORCA_BOTLEFT   0x0c
+#define ORCA_CSRTRK   0x1d
+typedef struct
+{
+  int brl, kbd;
+} brlkbd;
+
+/* entries of $SBLDIR/keymap/ */
+typedef struct
+{
+  brlkbd resetbrl, line01, topleft, botleft;
+  brlkbd winup, windn, lnlft, lnrgt;
+  brlkbd lnup, lndn, csrtrk, syscsr, softcsr;
+  brlkbd chrlft, chrrgt, hwinlft, hwinrgt, fwinlft;
+  brlkbd fwinrgt, csrjump, csrjmpvert, keyup;
+  brlkbd keydn, keyrgt, keylft, keyenter, keyesc, csrvisoff;
+  brlkbd jmpmark1, jmpmark2, jmpmark3, jmpmark4;
+  brlkbd attr1, attr2, attr3, attr4;
+  brlkbd csrtrkoff, prof1, prof2, prof3, prof4;
+  brlkbd attroff, attrmodonoff, sixdotsonoff, csrblinkonoff;
+  brlkbd csrblockonoff, cutbegin, cutend, paste;
+  brlkbd spktocsr, spkfromcsr;
+  brlkbd spkmod, spkoff;
+  brlkbd spkcurln, spkscrtocsr, spkscrfromcsr;
+  brlkbd nextlang, prevlang;
+  brlkbd nextfrq, prevfrq;
+  brlkbd nextspd, prevspd;
+  brlkbd nextvol, prevvol;
+  brlkbd nextvoice, prevvoice;
+  brlkbd nextspec, prevspec;
+  brlkbd spkcharmod;
+  brlkbd kbdsniffon1, kbdsniffon2, kbdsniffoff;
+  brlkbd soundonoff, loadkeymap, autoprofonoff;
+  brlkbd setmark, jmptomark;
+  int lineroutend, lineroutbeg, csrroutend, csrroutbeg;
+  brlkbd scripts[MAXSCRIPTS];
+  char scriptnames[MAXSCRIPTS][MAXNAMELEN];
+}
+keymap_file;
+
+/* entries of /etc/suse-blinux.conf */
+typedef struct
+{
+  char brlname[MAXNAMELEN];
+  char brld_auth_key[MAXNAMELEN];
+  char brld_host[MAXNAMELEN];
+  int brld_port;
+  char brlport[MAXNAMELEN];
+  char spkname[MAXNAMELEN];
+  char spkport[MAXNAMELEN];
+  int keydelay, repeatdelay, profdelay, sleep;
+  int debug;
+  char brltbl[MAXNAMELEN];
+  char profile1[MAXNAMELEN];
+  char profile2[MAXNAMELEN];
+  char profile3[MAXNAMELEN];
+  char profile4[MAXNAMELEN];
+  char progpath[MAXPATHLEN];
+} sbl_config;
+
+/* info structure for brailledisplays */
+struct brlinfo
+{
+  char name[50];
+  char fullname[80];
+  int cols;
+  int st_cells;
+  int offvert;
+  int offhor;
+  int baud;
+};
+
+/* Braille information structure */
+typedef struct
+{
+  int brl_fd;
+  unsigned char *disp;		/* display contents - allocted by the driver */
+  int x, y;			/* size of display */
+}
+brldim;				/* used for writing to a braille display */
+
+/* only for libs */
+typedef struct
+{
+  char *identifier;		/* name of driver */
+/* Routines provided by the braille driver library: */
+  void (*setxtty) (int tty);
+  void (*setlock) (int lock);
+  int (*getxtty) ();
+  int (*getlock) ();
+  struct brlinfo (*identify) (const char *, const char *);	/* print start-up messages */
+  void (*debug) (unsigned int dbg);	/* set driver debuging */
+  void (*initialize) (brldim *, const char *);	/* initialise Braille display */
+  void (*close) (brldim *);	/* close braille display */
+  void (*write) (brldim *);	/* write to braille display */
+  int (*read) (int *);		/* get key press from braille display */
+  void (*setstatus) (const unsigned char *);	/* set status cells */
+
+}
+braille_driver;
+
+/* function to load the sbl configuartion files */
+void getsblconf (sbl_config * sblconf, char *conf);
+brlkbd keytrans (char *);
+void getkeymap (sbl_config sblconf, char *profname, char *homedir);
+
+/* helper function to parse the config files */
+int confread (char *realname);
+char *confsearch (char *serchstring);
+#endif
diff -ruN orca-2.22.1/src/brl/brlmodule.c orca-brld/src/brl/brlmodule.c
--- orca-2.22.1/src/brl/brlmodule.c	2008-03-08 13:27:36.000000000 +0100
+++ orca-brld/src/brl/brlmodule.c	2008-07-02 16:58:28.033159000 +0200
@@ -19,33 +19,33 @@
  * Boston, MA 02111-1307, USA.
  *
  */
+
 #include <string.h>
 #include <errno.h>
 #include <dlfcn.h>
 #include <glib.h>
 #include <Python.h>
+#include <fcntl.h>
+#include "brl.h"
+#include "libbrld.h"
 
+/* global variables - config stuff */
+static sbl_config sblconf;
+static char varvec[200][150];
+static keymap_file keymap;
 
-/* BrlAPI function pointers - these map directly to BrlAPI 3.6.2 methods.
- */
-static int (*brlapi_initializeConnection)(const void *clientSettings,
-                                          const void *usedSettings);
-static void (*brlapi_closeConnection)(void);
-
-static int (*brlapi_getDriverId)(unsigned char *id, unsigned int n);
-static int (*brlapi_getDriverName)(unsigned char *name, unsigned int n);
-static int (*brlapi_getDisplaySize)(unsigned int *x, unsigned int *y);
+static brld_interface *brld = NULL;     /* filled by dynamic libbrld */
 
-static int (*brlapi_getTty) (int tty, int how);
-static int (*brlapi_leaveTty) (void);
+static void *libbrld = NULL;    /* handle to driver */
 
-static int (*brlapi_writeText) (int cursor, const unsigned char *str);
-static int (*brlapi_writeDots) (const unsigned char *dots);
+static int csrvis = 1, csr_form = 1;
+static int old_csr = 0;
+static char old_text[100] = "", old_attr[100]="";
 
-static int (*brlapi_readKey) (int block, unsigned int *code);
+#define BRL_SYMBOL "brld"
 
 /* A non-zero value indicates this module has been initialized and is
- * ready for communication with BrlTTY.
+ * ready for communication with brld.
  */
 static long brl_initialized = 0;
 
@@ -55,39 +55,109 @@
 static PyObject *brl_callback = NULL;
 
 /* The g_io_add_watch (see glib docs) that keeps track of input events
- * coming from BrlTTY.
+ * coming from brld.
  */
-static gboolean brlapi_io_cb(GIOChannel *ch,
-                             GIOCondition condition,
-                             void *data) {
-
-        unsigned int keypress;
-        PyObject *result;
-        PyObject *args;
-        PyGILState_STATE gstate;
-
-        while (brlapi_readKey(0, &keypress) == 1) {
-                if (!brl_callback) {
-                        break;
-                }
-                args = Py_BuildValue("(i)", keypress);
-                gstate = PyGILState_Ensure();
-                result = PyObject_CallObject(brl_callback, args);
-                if (result != NULL) {
-                        Py_DECREF(result);
-                } else {
-                        PyErr_Print();
-                }
-                PyGILState_Release(gstate);
-                Py_DECREF(args);
-        }
-        return TRUE;
+static gboolean brl_sbl_io_cb (GIOChannel * ch,
+                               GIOCondition condition, void *data)
+{
+
+  int key, pressed;
+  static int lastkey = 0;
+  PyObject *result;
+  PyObject *args;
+  PyGILState_STATE gstate;
+
+/* do this to avoid compiler warnings */
+  if (ch && condition && data)
+    usleep (1);
+
+  key = brld->getkey (&pressed);
+  {
+    if (key && !csrvis)
+     {
+       csrvis = 1;
+       brld->write (old_csr - 1, old_text, old_attr);
+     }
+
+    if (pressed && lastkey >= 1000)
+      lastkey = 0;
+
+    if (!lastkey && pressed)
+      lastkey = key;
+    else
+      lastkey = (lastkey * 1000) + key;
+    if (!brl_callback)
+     {
+/*	break;*/
+     }
+    if (lastkey == keymap.lnup.brl)
+      key = ORCA_LNUP;
+    else if (lastkey == keymap.lndn.brl)
+      key = ORCA_LNDN;
+    else if (lastkey == keymap.lnlft.brl)
+      key = ORCA_LNLFT;
+    else if (lastkey == keymap.lnrgt.brl)
+      key = ORCA_LNRGT;
+    else if (lastkey == keymap.topleft.brl)
+      key = ORCA_TOPLEFT;
+    else if (lastkey == keymap.botleft.brl)
+      key = ORCA_BOTLEFT;
+    else if (lastkey == keymap.csrtrk.brl)
+      key = ORCA_CSRTRK;
+    else if (lastkey == keymap.csrvisoff.brl)
+     {
+       csrvis = 0;
+       brld->write (-1, old_text, old_attr);
+       key = 0;
+     }
+    else if (lastkey == keymap.csrblockonoff.brl)
+     {
+       if (csr_form)
+         csr_form = 0;
+       else
+         csr_form = 1;
+       brld->cursor (csr_form);
+       brld->write (csrvis ? (old_csr - 1) : -1, old_text, old_attr);
+       key = 0;
+     }
+    else if (lastkey >= keymap.csrroutbeg && lastkey <= keymap.csrroutend)
+     {
+       if (pressed)
+         key = (lastkey - keymap.csrroutbeg) + 0x100;
+
+       lastkey = 0;
+     }
+    else
+      key = 0;
+
+    if (!pressed)
+     {
+       lastkey = 0;
+     }
+
+    pressed = 0;
+
+    args = Py_BuildValue ("(i)", key);
+
+    gstate = PyGILState_Ensure ();
+    result = PyObject_CallObject (brl_callback, args);
+    if (result != NULL)
+     {
+       Py_DECREF (result);
+     }
+    else
+     {
+       PyErr_Print ();
+     }
+    PyGILState_Release (gstate);
+    Py_DECREF (args);
+  }
+  return TRUE;
 }
 
-
 /* Initializes the brl module, connecting to BrlTTY.  Returns 0 on failure or
  * 1 on success.  The first argument is optional and indicated the tty to
- * open.  The default value for this argument is -1, which means to let BrlTTY
+ * open.  The default value for this argument is -1, which means to let brld
  * use its default logic.  A typical value might be 7 which is usually what
  * the CONTROLVT should be set to for a console running the X11 server.  The
  * second argument is also optional and is to be passed to brlapi_getTty and
@@ -95,316 +165,529 @@
  * BrlTTY commands (BRLCOMMANDS=0).  The default value is to give us
  * BRLCOMMANDS.
  */
-static PyObject *brl_module_init(PyObject *self,
-                                 PyObject *args) {
-        int tty = -1;
-        int how = 0;  /* BRLCOMMANDS */
-        int ttyNum;
-
-        void *brlapi_library;
-        int brlapi_fd;
-        GIOChannel *brlapi_channel;
-
-        if (brl_initialized) {
-                PyErr_SetString(PyExc_StandardError, "Already initialized");
-                return NULL;
-        }
-
-        if (!PyArg_ParseTuple (args, "|ii:init", &tty, &how))
-                return NULL;
-
-        /* Open the brlapi library
-         */
-        brlapi_library = dlopen("libbrlapi.so", RTLD_LAZY);
-        if (!brlapi_library) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to load libbrlapi.so");
-                return NULL;
-        }
-
-        /* Load the functions */
-
-        brlapi_initializeConnection =
-                (int (*)(const void *, const void *)) dlsym(brlapi_library,
-                                            "brlapi_initializeConnection");
-        if (!brlapi_initializeConnection) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_initializeConnection in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_closeConnection =
-                (void (*)(void)) dlsym(brlapi_library,
-                                       "brlapi_closeConnection");
-        if (!brlapi_closeConnection) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_closeConnection in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_getDriverId =
-                (int (*)(unsigned char *, unsigned int)) dlsym(brlapi_library,
-                                                        "brlapi_getDriverId");
-        if (!brlapi_getDriverId) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_getDriverId in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_getDriverName =
-                (int (*)(unsigned char *, unsigned int)) dlsym(brlapi_library,
-                                                       "brlapi_getDriverName");
-        if (!brlapi_getDriverName) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_getDriverName in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_getDisplaySize =
-                (int (*)(unsigned int *, unsigned int *)) dlsym(brlapi_library,
-                                                      "brlapi_getDisplaySize");
-        if (!brlapi_getDisplaySize) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_getDisplaySize in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_getTty =
-                (int (*) (int tty, int how)) dlsym(brlapi_library,
-                                                   "brlapi_getTty");
-        if (!brlapi_getTty) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_getTty in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_leaveTty =
-                (int (*) (void)) dlsym(brlapi_library,
-                                       "brlapi_leaveTty");
-        if (!brlapi_leaveTty) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_leaveTty in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_writeText =
-                (int (*) (int, const unsigned char *)) dlsym(brlapi_library,
-                                                         "brlapi_writeText");
-        if (!brlapi_writeText) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_writeText in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_writeDots =
-                (int (*) (const unsigned char *)) dlsym(brlapi_library,
-                                                        "brlapi_writeDots");
-        if (!brlapi_writeDots) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_writeDots in BrlTTY");
-                return NULL;
-        }
-
-        brlapi_readKey =
-                (int (*) (int, unsigned int *)) dlsym(brlapi_library,
-                                                      "brlapi_readKey");
-        if (!brlapi_readKey) {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed to find brlapi_readKey in BrlTTY");
-                return NULL;
-        }
-
-        /* Connect to BrlTTY
-         */
-        brlapi_fd = brlapi_initializeConnection(NULL, NULL);
-        if (brlapi_fd >= 0) {
-                /* Take over the owning tty.
-                 */
-                ttyNum = brlapi_getTty(tty,
-                                       0); /* HOW = give me BRLCOMMANDS */
-                if (ttyNum == -1) {
-                        PyErr_SetString(
-                                PyExc_StandardError,
-                                "Failed on call to brlapi_getTty in BrlTTY");
-                        return NULL;
-                }
-
-                /* Setup the GIOChannel to receive notifications of Braille
-                 * key events
-                 */
-                brlapi_channel = g_io_channel_unix_new(brlapi_fd);
-                g_io_add_watch(brlapi_channel,
-                               G_IO_IN,
-                               brlapi_io_cb,
-                               NULL);
-                brl_initialized = 1;
-                return PyInt_FromLong(brl_initialized);
-        } else {
-                PyErr_SetString(
-                        PyExc_StandardError,
-                        "Failed on call to brlapi_initializeConnection in BrlTTY");
-                return NULL;
-        }
-}
-
-
-static PyObject *brl_module_shutdown(PyObject *self) {
-        if (brl_initialized) {
-                /* [[[TODO: WDW - clean up the g_io_channel here?  Logged
-                 * as bugzilla bug 319649.]]]
-                 */
-                brlapi_leaveTty();
-                brlapi_closeConnection();
-        }
-        brl_initialized = 0;
-        return PyInt_FromLong(1);
-}
-
-
-static PyObject *brl_module_getDriverId (PyObject *self) {
-        unsigned char id[3];
-
-        if (!brl_initialized) {
-                Py_INCREF (Py_None);
-                return Py_None;
-        }
-
-        if (brlapi_getDriverId(id, sizeof(id)) >= 0) {
-                return PyString_FromString((const char *) id);
-        } else {
-                Py_INCREF (Py_None);
-                return Py_None;
-        }
-
-	return Py_None;
-}
-
-
-static PyObject *brl_module_getDriverName(PyObject *self) {
-        unsigned char name[80];
-
-        if (!brl_initialized) {
-                Py_INCREF(Py_None);
-                return Py_None;
-        }
-
-        if (brlapi_getDriverName(name, sizeof(name)) >= 0) {
-                return PyString_FromString((const char *) name);
-        } else {
-                Py_INCREF (Py_None);
-                return Py_None;
-        }
-
-	return Py_None;
-}
-
-
-static PyObject *brl_module_getDisplayWidth(PyObject *self) {
-        unsigned int x, y;
-
-        if (!brl_initialized) {
-                return PyInt_FromLong(0);
-        }
-
-        brlapi_getDisplaySize(&x, &y);
-        return PyInt_FromLong(x);
-}
-
-
-static PyObject *brl_module_getDisplayHeight(PyObject *self) {
-        unsigned int x, y;
-
-        if (!brl_initialized) {
-                return PyInt_FromLong(0);
-        }
-
-        brlapi_getDisplaySize(&x, &y);
-        return PyInt_FromLong(y);
-}
-
-
-static PyObject *brl_module_writeText(PyObject *self,
-                                      PyObject *args) {
-        int cursor;
-        char *str;
-
-        if (!PyArg_ParseTuple(args, "is:writeText", &cursor, &str)) {
-                return NULL;
-        }
-
-        if (brl_initialized) {
-            brlapi_writeText(cursor, (const unsigned char *) str);
-        }
-
-        Py_INCREF(Py_None);
-        return Py_None;
-}
-
-
-static PyObject *brl_module_writeDots(PyObject *self,
-                                      PyObject *args) {
-        char *str;
-
-        if (!PyArg_ParseTuple(args, "s:writeText", &str)) {
-                return NULL;
-        }
-
-        if (brl_initialized) {
-            brlapi_writeDots((const unsigned char *) str);
-        }
-        Py_INCREF(Py_None);
-        return Py_None;
-}
-
-
-static PyObject *brl_module_registerCallback(PyObject *self,
-                                             PyObject *args) {
-        if (brl_callback) {
-                Py_DECREF (brl_callback);
-        }
-        if (brl_initialized) {
-                brl_callback = PyTuple_GetItem(args, 0);
-                Py_INCREF(brl_callback);
-        }
-        Py_INCREF(Py_None);
-        return Py_None;
-}
-
-
-static PyObject *brl_module_unregisterCallback(PyObject *self) {
-        if (brl_callback)
-                Py_DECREF(brl_callback);
-        brl_callback = NULL;
-        Py_INCREF(Py_None);
-        return Py_None;
+static PyObject *brl_module_init (PyObject * self, PyObject * args)
+{
+  int tty = -1;
+  int how = 0;                  /* BRLCOMMANDS */
+
+  GIOChannel *brl_channel;
+
+  fprintf (stderr, "try to init brl\n");
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+  if (brl_initialized)
+   {
+     PyErr_SetString (PyExc_StandardError, "Already initialized");
+     return NULL;
+   }
+
+  if (!PyArg_ParseTuple (args, "|ii:init", &tty, &how))
+    return NULL;
+
+  const char *error = NULL;
+  int sock_fd = 0;
+
+  getsblconf (&sblconf, NULL);
+
+  if (libbrld)
+    dlclose (libbrld);
+
+  libbrld = dlopen ("libbrld.so.1", RTLD_LAZY);
+
+  if (libbrld == NULL)
+    libbrld = dlopen ("/usr/local/lib/libbrld.so.1", RTLD_LAZY);
+
+  if (libbrld == NULL)
+    libbrld = dlopen ("/tmp/suse-blinux/libbrld.so.1", RTLD_LAZY);
+
+  if (libbrld == NULL)
+   {
+     fprintf (stderr, "error: can't load libbrld.so.1\n");
+     return 0;
+   }
+
+  brld = (brld_interface *) dlsym (libbrld, BRL_SYMBOL);
+
+  error = dlerror ();
+
+  if (error)
+   {
+     fprintf (stderr, "%s\n", error);
+     return 0;
+   }
+  fprintf (stderr, "try to open brld-conn\n");
+  if ((sock_fd = brld->open ("localhost", 8888)) < 0)
+   {
+     fprintf (stderr, "error: connecting brld\n");
+     return 0;
+   }
+
+  fprintf (stderr, "try to reg to brld\n");
+  if (brld->reg (X11, "default"))
+   {
+     fprintf (stderr, "error: brld registration failed\n");
+     brld->close ();
+     return 0;
+   }
+
+  brld->getalias (sblconf.brlname);
+
+/* set event mode  to get SIGIO*/
+  brld->seteventmode ();
+
+  /* set translation-table to text */
+  brld->texttbl ();
+
+  /* set block-cursor */
+  brld->cursor (csr_form);
+
+  getkeymap (sblconf, NULL, NULL);
+  /* Setup the GIOChannel to receive notifications of Braille key events */
+  brl_channel = g_io_channel_unix_new (sock_fd);
+  g_io_add_watch (brl_channel, G_IO_IN, brl_sbl_io_cb, NULL);
+  brl_initialized = 1;
+  return PyInt_FromLong (brl_initialized);
+}
+
+static PyObject *brl_module_shutdown (PyObject * self)
+{
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+  if (brl_initialized)
+   {
+     brld->close ();
+   }
+  brl_initialized = 0;
+  if (libbrld)
+    dlclose (libbrld);
+  return PyInt_FromLong (1);
+}
+
+static PyObject *brl_module_getDriverId (PyObject * self)
+{
+
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+
+  if (!brl_initialized)
+   {
+     Py_INCREF (Py_None);
+     return Py_None;
+   }
+
+  return PyString_FromString ((const char *) "sbl");
+}
+
+static PyObject *brl_module_getDriverName (PyObject * self)
+{
+  char name[80];
+
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+  if (!brl_initialized)
+   {
+     Py_INCREF (Py_None);
+     return Py_None;
+   }
+
+  brld->getname (name);
+  if (strlen (name) > 0)
+   {
+     return PyString_FromString ((const char *) name);
+   }
+  else
+   {
+     Py_INCREF (Py_None);
+     return Py_None;
+   }
+
+  return Py_None;
+}
+
+static PyObject *brl_module_getDisplayWidth (PyObject * self)
+{
+
+  int x = 0, y = 0;
+
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+
+  if (!brl_initialized)
+   {
+     return PyInt_FromLong (0);
+   }
+
+  brld->getxy (&x, &y);
+  return PyInt_FromLong (x);
+}
+
+static PyObject *brl_module_getDisplayHeight (PyObject * self)
+{
+
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+
+  if (!brl_initialized)
+   {
+     return PyInt_FromLong (0);
+   }
+
+/* we only support displays with one line */
+  return PyInt_FromLong (1);
+}
+
+static PyObject *brl_module_writeText (PyObject * self, PyObject * args)
+{
+  int cursor;
+  char *str;
+  char *attr;
+
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+
+  if (!PyArg_ParseTuple (args, "iss:writeText", &cursor, &str, &attr))
+   {
+     return NULL;
+   }
+
+  if (brl_initialized)
+   {
+
+     if (old_csr != cursor || strcmp (old_text, str) || strcmp(old_attr, attr))
+      {
+        brld->write (csrvis ? (cursor - 1) : -1, str, attr);
+        old_csr = cursor;
+        strcpy (old_text, str);
+        strcpy(old_attr,attr);
+      }
+   }
+
+  Py_INCREF (Py_None);
+  return Py_None;
+}
+
+static PyObject *brl_module_writeDots (PyObject * self, PyObject * args)
+{
+  char *str;
+
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+
+  if (!PyArg_ParseTuple (args, "s:writeText", &str))
+   {
+     return NULL;
+   }
+
+  if (brl_initialized)
+   {
+     brld->write (-1, str, NULL);
+   }
+  Py_INCREF (Py_None);
+  return Py_None;
+}
+
+static PyObject *brl_module_registerCallback (PyObject * self,
+                                              PyObject * args)
+{
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+  if (brl_callback)
+   {
+     Py_DECREF (brl_callback);
+   }
+  if (brl_initialized)
+   {
+     brl_callback = PyTuple_GetItem (args, 0);
+     Py_INCREF (brl_callback);
+   }
+  Py_INCREF (Py_None);
+  return Py_None;
+}
+
+static PyObject *brl_module_unregisterCallback (PyObject * self)
+{
+/* just to avoid compiler warnings */
+  if (self)
+    usleep (1);
+
+  if (brl_callback)
+   {
+     Py_DECREF (brl_callback);
+   }
+
+  brl_callback = NULL;
+  Py_INCREF (Py_None);
+  return Py_None;
 }
 
-
 static PyMethodDef brl_methods[] = {
-        {"init", (PyCFunction) brl_module_init, METH_VARARGS},
-        {"shutdown", (PyCFunction) brl_module_shutdown, METH_NOARGS},
-        {"getDriverId", (PyCFunction) brl_module_getDriverId, METH_NOARGS},
-        {"getDriverName", (PyCFunction) brl_module_getDriverName, METH_NOARGS},
-        {"getDisplayWidth", (PyCFunction) brl_module_getDisplayWidth, METH_NOARGS},
-        {"getDisplayHeight", (PyCFunction) brl_module_getDisplayWidth, METH_NOARGS},
-        {"writeText", (PyCFunction) brl_module_writeText, METH_VARARGS},
-        {"writeDots", (PyCFunction) brl_module_writeDots, METH_VARARGS},
-        {"registerCallback", (PyCFunction) brl_module_registerCallback, METH_VARARGS},
-        {"unregisterCallback", (PyCFunction) brl_module_unregisterCallback, METH_NOARGS},
-        {NULL, NULL}
+  {"init", (PyCFunction) brl_module_init, METH_VARARGS, NULL},
+  {"shutdown", (PyCFunction) brl_module_shutdown, METH_NOARGS, NULL},
+  {"getDriverId", (PyCFunction) brl_module_getDriverId, METH_NOARGS, NULL},
+  {"getDriverName", (PyCFunction) brl_module_getDriverName, METH_NOARGS,
+   NULL},
+  {"getDisplayWidth", (PyCFunction) brl_module_getDisplayWidth, METH_NOARGS,
+   NULL},
+  {"getDisplayHeight", (PyCFunction) brl_module_getDisplayHeight, METH_NOARGS,
+   NULL},
+  {"writeText", (PyCFunction) brl_module_writeText, METH_VARARGS, NULL},
+  {"writeDots", (PyCFunction) brl_module_writeDots, METH_VARARGS, NULL},
+  {"registerCallback", (PyCFunction) brl_module_registerCallback,
+   METH_VARARGS, NULL},
+  {"unregisterCallback", (PyCFunction) brl_module_unregisterCallback,
+   METH_NOARGS, NULL},
+  {NULL, NULL, 0, NULL}
 };
 
-void initbrl (void) {
-        (void) Py_InitModule ("brl", brl_methods);
+void initbrl (void)
+{
+  (void) Py_InitModule ("brl", brl_methods);
+}
+
+/* load sbl configuration files */
+
+void getsblconf (sbl_config * sblconf, char *conf)
+{
+  char str[100];
+
+  if (!conf)
+    confread ("/etc/suse-blinux.conf");
+  else
+    confread (conf);
+
+  confsearch (strcpy (sblconf->brld_host, "brld_host"));
+  confsearch (strcpy (str, "brld_port"));
+  if (atoi (str))
+    sblconf->brld_port = atoi (str);
+  else
+    sblconf->brld_port = 8888;
+
+  confsearch (strcpy (str, "brld_auth_key"));
+  if (str[0] != 0)
+    strcpy (sblconf->brld_auth_key, str);
+  else
+    strcpy (sblconf->brld_auth_key, "default");
+
+  confsearch (strcpy (sblconf->progpath, "progpath"));
+}
+
+void getkeymap (sbl_config sblconf, char *profname, char *homedir)
+{
+  char str[120];
+
+  sprintf (str, "%s/.suse-blinux/keymap/%s.map.%s", homedir, sblconf.brlname,
+           profname);
+  if (!confread (str))
+   {
+     sprintf (str, "%s/.suse-blinux/keymap/%s.map", homedir, sblconf.brlname);
+     if (!confread (str))
+      {
+        sprintf (str, "%s/keymap/%s.map.%s", sblconf.progpath,
+                 sblconf.brlname, profname);
+        if (!confread (str))
+         {
+           sprintf (str, "%s/keymap/%s.map", sblconf.progpath,
+                    sblconf.brlname);
+           confread (str);
+         }
+      }
+   }
+
+  keymap.kbdsniffon1 = keytrans (confsearch (strcpy (str, "kbdsniffon1")));
+  keymap.kbdsniffon2 = keytrans (confsearch (strcpy (str, "kbdsniffon2")));
+  keymap.kbdsniffoff = keytrans (confsearch (strcpy (str, "kbdsniffoff")));
+  keymap.resetbrl = keytrans (confsearch (strcpy (str, "resetbrl")));
+  keymap.line01 = keytrans (confsearch (strcpy (str, "line01")));
+  keymap.topleft = keytrans (confsearch (strcpy (str, "topleft")));
+  keymap.botleft = keytrans (confsearch (strcpy (str, "botleft")));
+  keymap.winup = keytrans (confsearch (strcpy (str, "winup")));
+  keymap.windn = keytrans (confsearch (strcpy (str, "windn")));
+  keymap.lnlft = keytrans (confsearch (strcpy (str, "lnlft")));
+  keymap.lnrgt = keytrans (confsearch (strcpy (str, "lnrgt")));
+  keymap.lnup = keytrans (confsearch (strcpy (str, "lnup")));
+  keymap.lndn = keytrans (confsearch (strcpy (str, "lndn")));
+  keymap.csrtrk = keytrans (confsearch (strcpy (str, "csrtrk")));
+  keymap.syscsr = keytrans (confsearch (strcpy (str, "syscsr")));
+  keymap.softcsr = keytrans (confsearch (strcpy (str, "softcsr")));
+  keymap.chrlft = keytrans (confsearch (strcpy (str, "chrlft")));
+  keymap.chrrgt = keytrans (confsearch (strcpy (str, "chrrgt")));
+  keymap.hwinlft = keytrans (confsearch (strcpy (str, "hwinlft")));
+  keymap.hwinrgt = keytrans (confsearch (strcpy (str, "hwinrgt")));
+  keymap.fwinlft = keytrans (confsearch (strcpy (str, "fwinlft")));
+  keymap.fwinrgt = keytrans (confsearch (strcpy (str, "fwinrgt")));
+  keymap.csrjump = keytrans (confsearch (strcpy (str, "csrjump")));
+  keymap.csrjmpvert = keytrans (confsearch (strcpy (str, "csrjmpvert")));
+  keymap.keyup = keytrans (confsearch (strcpy (str, "keyup")));
+  keymap.keydn = keytrans (confsearch (strcpy (str, "keydn")));
+  keymap.keylft = keytrans (confsearch (strcpy (str, "keylft")));
+  keymap.keyrgt = keytrans (confsearch (strcpy (str, "keyrgt")));
+  keymap.keyenter = keytrans (confsearch (strcpy (str, "keyenter")));
+  keymap.keyesc = keytrans (confsearch (strcpy (str, "keyesc")));
+  keymap.csrvisoff = keytrans (confsearch (strcpy (str, "csrvisoff")));
+  keymap.jmpmark1 = keytrans (confsearch (strcpy (str, "jmpmark1")));
+  keymap.jmpmark2 = keytrans (confsearch (strcpy (str, "jmpmark2")));
+  keymap.jmpmark3 = keytrans (confsearch (strcpy (str, "jmpmark3")));
+  keymap.jmpmark4 = keytrans (confsearch (strcpy (str, "jmpmark4")));
+  keymap.setmark = keytrans (confsearch (strcpy (str, "setmark")));
+  keymap.jmptomark = keytrans (confsearch (strcpy (str, "jmptomark")));
+  keymap.attr1 = keytrans (confsearch (strcpy (str, "attr1")));
+  keymap.attr2 = keytrans (confsearch (strcpy (str, "attr2")));
+  keymap.attr3 = keytrans (confsearch (strcpy (str, "attr3")));
+  keymap.attr4 = keytrans (confsearch (strcpy (str, "attr4")));
+  keymap.csrtrkoff = keytrans (confsearch (strcpy (str, "csrtrkoff")));
+  keymap.prof1 = keytrans (confsearch (strcpy (str, "prof1")));
+  keymap.prof2 = keytrans (confsearch (strcpy (str, "prof2")));
+  keymap.prof3 = keytrans (confsearch (strcpy (str, "prof3")));
+  keymap.prof4 = keytrans (confsearch (strcpy (str, "prof4")));
+  keymap.attroff = keytrans (confsearch (strcpy (str, "attroff")));
+  keymap.attrmodonoff = keytrans (confsearch (strcpy (str, "attrmodonoff")));
+  keymap.sixdotsonoff = keytrans (confsearch (strcpy (str, "sixdotsonoff")));
+  keymap.csrblinkonoff =
+    keytrans (confsearch (strcpy (str, "csrblinkonoff")));
+  keymap.csrblockonoff =
+    keytrans (confsearch (strcpy (str, "csrblockonoff")));
+  keymap.cutbegin = keytrans (confsearch (strcpy (str, "cutbegin")));
+  keymap.cutend = keytrans (confsearch (strcpy (str, "cutend")));
+  keymap.loadkeymap = keytrans (confsearch (strcpy (str, "loadkeymap")));
+  keymap.paste = keytrans (confsearch (strcpy (str, "paste")));
+  keymap.soundonoff = keytrans (confsearch (strcpy (str, "soundonoff")));
+  keymap.autoprofonoff =
+    keytrans (confsearch (strcpy (str, "autoprofonoff")));
+  keymap.spktocsr = keytrans (confsearch (strcpy (str, "spktocsr")));
+  keymap.spkcurln = keytrans (confsearch (strcpy (str, "spkcurln")));
+  keymap.spkscrtocsr = keytrans (confsearch (strcpy (str, "spkscrtocsr")));
+  keymap.spkscrfromcsr =
+    keytrans (confsearch (strcpy (str, "spkscrfromcsr")));
+  keymap.spkfromcsr = keytrans (confsearch (strcpy (str, "spkfromcsr")));
+  keymap.spkmod = keytrans (confsearch (strcpy (str, "spkmod")));
+  keymap.spkoff = keytrans (confsearch (strcpy (str, "spkoff")));
+  keymap.nextlang = keytrans (confsearch (strcpy (str, "nextlang")));
+  keymap.nextvol = keytrans (confsearch (strcpy (str, "nextvol")));
+  keymap.nextvoice = keytrans (confsearch (strcpy (str, "nextvoice")));
+  keymap.nextspec = keytrans (confsearch (strcpy (str, "nextspec")));
+  keymap.nextfrq = keytrans (confsearch (strcpy (str, "nextfrq")));
+  keymap.nextspd = keytrans (confsearch (strcpy (str, "nextspd")));
+  keymap.prevlang = keytrans (confsearch (strcpy (str, "prevlang")));
+  keymap.prevvol = keytrans (confsearch (strcpy (str, "prevvol")));
+  keymap.prevvoice = keytrans (confsearch (strcpy (str, "prevvoice")));
+  keymap.prevspec = keytrans (confsearch (strcpy (str, "prevspec")));
+  keymap.prevfrq = keytrans (confsearch (strcpy (str, "prevfrq")));
+  keymap.prevspd = keytrans (confsearch (strcpy (str, "prevspd")));
+  keymap.spkcharmod = keytrans (confsearch (strcpy (str, "spkcharmod")));
+
+  keymap.csrroutbeg = atoi (confsearch (strcpy (str, "csrroutbeg")) + 1);
+  keymap.csrroutend = atoi (confsearch (strcpy (str, "csrroutend")) + 1);
+  keymap.lineroutbeg = atoi (confsearch (strcpy (str, "lineroutbeg")) + 1);
+  keymap.lineroutend = atoi (confsearch (strcpy (str, "lineroutend")) + 1);
+}
+
+#define CKEYS 37
+brlkbd keytrans (char *str)
+{
+  brlkbd keys;
+  unsigned int i = 0;
+  int code = 0, kbdcode = 0;
+  char key1[10] = "", key2[10] = "", kbdstr[30] = "";
+
+  keys.kbd = 0;
+  keys.brl = 0;
+
+  for (i = 0; i < strlen (str); i++)
+    if (str[i] == ',')
+      kbdcode = i;
+  if (strlen (str) < 2)
+   {
+     keys.brl = 0;
+     keys.kbd = 0;
+     return keys;
+   }
+  if (str[kbdcode] == ',')
+   {
+     str[kbdcode] = 0;
+   }
+  else
+    kbdstr[0] = 0;
+  if (strlen (str) > 3)
+   {
+     strncpy (key1, str, 4);
+     key1[4] = 0;
+     if (strlen (str) > 4)
+       strcpy (key2, str + 5);
+     key2[4] = 0;
+     code = 0;
+     code = (atoi (key1 + 1));
+     if (strlen (key2))
+       code = (code * 1000) + atoi (key2 + 1);
+
+     keys.brl = code;
+   }                            /* if */
+  else
+    keys.brl = 0;
+
+  memset (key1, 0, sizeof (key1));
+  code = 0;
+  return keys;
+
+}
+
+/* helper function to parse the config files */
+int confread (char *realname)
+{
+  FILE *pname;
+  int i = 0;
+  char row[100] = "";
+
+  pname = fopen (realname, "r");
+  if (pname == NULL)
+    return 0;
+  while (!feof (pname))
+   {
+     fgets (row, 80, pname);
+     if (row[0] != '#' && strlen (row) > 5)
+      {
+        strcpy (varvec[i], row);
+        i++;
+      }
+     if (feof (pname))
+       break;
+   }
+  fclose (pname);
+  varvec[i][0] = 0;
+  return 1;
+}
+
+char *confsearch (char *searchstring)
+{
+  int i = 0, end = 0;
+
+  strcat (searchstring, "=\0");
+  do
+   {
+     if (strncmp (varvec[i], searchstring, strlen (searchstring)) == 0)
+      {
+        strcpy (searchstring, varvec[i] + strlen (searchstring));
+        end = 1;
+      }
+     i++;
+   }
+  while (varvec[i][0] != 0 && !end);
+
+  if (!end)
+   {
+     searchstring[0] = 0;
+     return searchstring;
+   }
+
+  if (strlen (searchstring))
+    searchstring[strlen (searchstring) - 1] = 0;
+  return searchstring;
 }
diff -ruN orca-2.22.1/src/brl/libbrld.h orca-brld/src/brl/libbrld.h
--- orca-2.22.1/src/brl/libbrld.h	1970-01-01 01:00:00.000000000 +0100
+++ orca-brld/src/brl/libbrld.h	2008-07-02 16:58:28.043145000 +0200
@@ -0,0 +1,114 @@
+#ifndef _LIBBRLD_H
+#define _LIBBRLD_H
+
+#define MAX_MSG_LEN 800
+/* registration types */
+#define TEXT 1
+#define X11 2
+#define ADMIN 3
+#define BRLD_TIMEOUT -3
+#define BRLD_CMD_ERR -2
+#define BRLD_NO_CONN -4
+#define BRLD_CLIENT_TIMEOUT 20   /* in seconds */
+
+typedef struct
+{
+  int (*open) (char *, int);
+  int (*reg) (int, char *);
+  void (*close) ();
+  int (*getkey) (int *);
+  int (*write) (int, char *, char *);
+  int (*reset) ();
+  int (*getname) (char *name);
+  int (*getalias) (char *alias);
+  int (*getxy) (int *x, int *y);
+  int (*cursor) (int form);
+  int (*attrtbl) ();
+  int (*texttbl) ();
+  void (*seteventmode) ();
+  int (*unseteventmode) ();
+} brld_interface;
+
+/* connect to brld 
+ * if hostname is NULL - we assume localhost
+ * if port is 0 - we assume default 
+ * returns >=0 = (socket_fd)  <0 = failed
+ */
+
+int brld_open (char *host, int port);
+
+/* register your application */
+int brld_reg (int type, char *authkey);
+
+/* close connection to brld */
+void brld_close ();
+
+/* get a brlkey from brld
+ * retunrs the key-value or <=0 on error
+ * pressed is 1 on if key is pressed - 0 if key is released
+ */
+int brld_getkey (int *pressed);
+
+/* write a string to the braille-display
+ * the string will be translated in brld
+ * csrpos - is the brl-cursor positon csrpos=-1 means cursor off
+ * text - is a plain text string (zero terminated)
+ * attr - is an attribute string (zero terminated)
+ * text and attr should have the same length otherwise attr will be ignored
+ * if you want to display the string "hello wolrd" 
+ * and "world" should be underlined by dot 7 and 8
+ * do the following:
+ * brld_write(-1,"hello world","      -----");
+ * the "-" character in attr indicates the underline
+ */
+int brld_write (int csrpos, char *text, char *attr);
+
+/* braille device reset */
+int brld_reset ();
+
+/* get the fullname of the connected brailledisplay 
+ * retunrn 0= OK - not 0 = failed
+ */
+
+int brld_getname (char *name);
+
+/* get the shortname of the connected brailledisplay
+ * retunr 0=OK - not 0 = failed
+ */
+int brld_getalias (char *alias);
+
+/* get braille-celss and lines
+ * return 0=OK - not 0=failed
+ */
+int brld_getxy (int *x, int *y);
+
+/* set braille-cursor form
+ * form=0 - block-cursor 
+ * form=1 - underline the cursor position with dot 7 and 8
+ * return 0=OK - not 0 failed
+ */
+int brld_cursor (int form);
+
+/* set braille translation table to attribute
+ * attribute mode for displaying a attribute pattern in conosle-applications
+ * return 0=OK - not 0=failed
+ */
+int brld_attrtbl ();
+
+/* set braille translation table to text
+ * use the normal text-translation-table
+ * return 0=OK - not 0=failed
+ */
+int brld_texttbl ();
+
+/* set the event-mode for incoming key-storkes
+ * needed if the connected applications wants to use SIGIO like orca
+ */
+void brld_seteventmode ();
+
+/* disable event-mode
+ * the application has to poll
+ * return 0=OK - not 0=failed
+ */
+int brld_unseteventmode ();
+#endif
diff -ruN orca-2.22.1/src/orca/braille.py orca-brld/src/orca/braille.py
--- orca-2.22.1/src/orca/braille.py	2008-03-08 13:27:38.000000000 +0100
+++ orca-brld/src/orca/braille.py	2008-07-02 17:05:17.037243000 +0200
@@ -936,7 +936,7 @@
             if brlAPIRunning:
                 brlAPI.writeText("", 0)
         else:
-            brl.writeText(0, "")
+            brl.writeText(0, "", "")
         return
 
     # Now determine the location of the cursor.  First, we'll figure
@@ -1027,7 +1027,13 @@
 
             brlAPI.write(writeStruct)
     else:
-        brl.writeText(cursorCell, substring)
+        attr_str=""
+        if attributeMask:
+           attr_str=attributeMask[startPos:endPos].replace('\x00',' ')
+           if len(attr_str) < len(substring):
+              attr_str+=' ' * (len(substring) - len(attr_str))
+                                                                    
+        brl.writeText(cursorCell, substring, attr_str)
 
     if settings.enableBrailleMonitor:
         if not monitor: