Looking for people to test text-mode version of the game "Thaumistry"
Looking for people to test text-mode version of the game "Thaumistry" (I hope this is the right forum section.)Hello. Back in September, we released the text adventure game "Thaumistry: In Charm's Way." Being a text-based game, we tried to make it accessible. However, there were problems with the JAWS screen reader, due to the development framework used by the game (the Qt toolkit) not cooperating well with JAWS.In order to resolve the issues, we decided to create a pure text-mode version of the game that runs inside a console window. This should effectively make the game fully accessible by every screen reader in existence. That's the theory, at least. We are looking for a few volunteers to play this version of the game and provide feedback.The game is a parser-based text adventure, aka "Interactive Fiction", written by Bob Bates, in the same vein as the Infocom games of the late 1980's.This version of the game requires Microsoft Windows. If anyone is interested, please send an email to rea...@gmail.com URL: http://forum.audiogames.net/viewtopic.php?pid=348145#p348145 ___ Audiogames-reflector mailing list Audiogames-reflector@sabahattin-gucukoglu.com https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector
Looking for people to test text-mode version of the game "Thaumistry"
Looking for people to test text-mode version of the game "Thaumistry" (I hope this is the right forum section.)Hello. Back in September, we released the text adventure game "Thaumistry: In Charm's Way." Being a text-based game, we tried to make it accessible. However, there were problems with the JAWS screen reader, due to the development framework used by the game (the Qt toolkit) not cooperating well with JAWS.In order to resolve the issues, we decided to create a pure text-mode version of the game that runs inside a console window. This should effectively make the game fully accessible by every screen reader in existence. That's the theory, at least. We are looking for a few volunteers to play this version of the game and provide feedback.The game is a parser-based text adventure, aka "Interactive Fiction", written by Bob Bates, in the same vein as the Infocom games of the late 1980's.This version of the game requires Microsoft Windows. If anyone is interested, please send an email to rea...@gmail.com. URL: http://forum.audiogames.net/viewtopic.php?pid=348145#p348145 ___ Audiogames-reflector mailing list Audiogames-reflector@sabahattin-gucukoglu.com https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector
Re: JAWS unable to read text through IAccessible2 with Qt
Re: JAWS unable to read text through IAccessible2 with Qt pitermach wrote:So the other thing you could do is use a library like TOLK to directly speak text with screen readers.I didn't even know this existed. Thanks!I'll do some testing with this before trying anything else and see whether this gives good enough results. URL: http://forum.audiogames.net/viewtopic.php?pid=336857#p336857 ___ Audiogames-reflector mailing list Audiogames-reflector@sabahattin-gucukoglu.com https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector
Re: JAWS unable to read text through IAccessible2 with Qt
Re: JAWS unable to read text through IAccessible2 with Qt It would be nice if this would not turn into a JAWS vs NVDA battle. URL: http://forum.audiogames.net/viewtopic.php?pid=336515#p336515 ___ Audiogames-reflector mailing list Audiogames-reflector@sabahattin-gucukoglu.com https://sabahattin-gucukoglu.com/cgi-bin/mailman/listinfo/audiogames-reflector
JAWS unable to read text through IAccessible2 with Qt
JAWS unable to read text through IAccessible2 with Qt Hello.I am trying to make an Interactive Fiction interpreter (you could call it an "engine" if you will) accessible with JAWS. The application uses Qt 5. For the curious, the application in question is QTads (http://qtads.sf.net).Accessibility in Qt is provided though the IAccessible2 interface, wrapped in Qt-specific classes, and I have implemented the required callbacks in a way that allows me to see what the screen reader is calling. When running NVDA, it works fine. NVDA queries the role of the output window, for which I specify QAccessible::EditableText, and it then requests a QAccessible::TextInterface, for which I return a QAccessibleTextInterface object (which translates into an IAccessibleText object). NVDA will then call characterCount() on the returned object (this is the wrapper for nCharacters() in IAccessible2) and then the various text extraction methods, like text(), textAtOffset(), offsetAtPoint() (when moving the mouse over the text), etc. It then speaks the text I return in those methods.JAWS, however, doesn't want to play along. After it queries the object role, it performs a few calls to characterCount(), selection() and attributes(), but calls to text extraction methods never happen. QAccessibleTextInterface::text(), textAtOffset(), etc, are never called and thus the text is never spoken by JAWS. When the window is activated, JAWS speaks this out:"Alt tab, game text, edit read only, insert f1 help, type and text." (Not sure about the "type and text"; it's kind of hard to tell what it says exactly.)("game text" is the text I return when the QAccessible::Name text is requested though the QAccessibleInterface::text() function.)I do not know where to go from here. Is this a Qt issue? Something I'm doing wrong? I can't tell.My implementation looks like this:I have a QWidget subclass, called DispWidget, that paints the text on screen, driven by the game engine's text layout engine. To make DispWidget accessible, I implement an AccessibleDispWidget class that inherits from QAccessibleWidget, QAccessibleTextInterface and QAccessibleEditableTextInterface:class AccessibleDispWidget: public QAccessibleWidget, public QAccessibleTextInterface, public QAccessibleEditableTextInterface { public: explicit AccessibleDispWidget(QWidget* w) : QAccessibleWidget(w, QAccessible::EditableText) { /* ... */ } // ... // Overrides of the virtuals here -- see below. // ... }I then implement or override the appropriate virtuals:// = // QAccessibleInterface // = QString text(QAccessible::Text txt) const override { switch (txt) { case QAccessible::Name: return "Game text."; case QAccessible::Description: return ""; case QAccessible::Value: return ""; case QAccessible::Help: return "Help."; case QAccessible::Accelerator: return ""; default: return QAccessibleWidget::text(txt); } } void* interface_cast(QAccessible::InterfaceType t) override { if (t == QAccessible::TextInterface) { return static_cast(this); } if (t == QAccessible::EditableTextInterface) { return static_cast (this); } return QAccessibleWidget::interface_cast(t); } QAccessible::State state() const override { auto s = QAccessibleWidget::state(); s.multiLine = true; s.readOnly = true; s.selectableText = false; s.editable = false; return s; } // = // QAccessibleTextInterface // = // never called void addSelection(int startOffset, int endOffset) override; QString attributes(int offset, int* startOffset, int* endOffset) const override { // Simple implementation for now as to not complicate things; // all text uses the same attributes. *startOffset = 0; *endOffset = characterCount(); return QLatin1String("font-family:\"Open Sans\";font-size:14pt;font-style:normal;font-weight:normal;language:en-US;"); } int characterCount() const override { return length_of_text; } // never called QRect characterRect(int offset) const override; // never called int cursorPosition() const override; // never called int offsetAtPoint(const QPoint& point) const override; // never called void removeSelection(int selectionIndex) override; // never called void scrollToSubstring(int startIndex, int endIndex) override; void selection(int selectionIndex, int* startOffset, int* endOffset) const override { *startOffset = *endOffset = 0; } // never called int selectionCount() const override; // never called void setCursorPosition(int position) override; // never called void setSelection(int
JAWS unable to read text through IAccessible2 with Qt
JAWS unable to read text through IAccessible2 with Qt Hello.I am trying to make an Interactive Fiction interpreter (you could call it an "engine" if you will) accessible with JAWS. The application uses Qt 5. For the curious, the application in question is QTads (http://qtads.sf.net).Accessibility in Qt is provided though the IAccessible2 interface, wrapped in Qt-specific classes, and I have implemented the required callbacks in a way that allows me to see what the screen reader is calling. When running NVDA, it works fine. NVDA queries the role of the output window, for which I specify QAccessible::EditableText, and it then requests a QAccessible::TextInterface, for which I return a QAccessibleTextInterface object (which translates into an IAccessibleText object). NVDA will then call characterCount() on the returned object (this is the wrapper for nCharacters() in IAccessible2) and then the various text extraction methods, like text(), textAtOffset(), offsetAtPoint() (when moving the mouse over the text), etc. It then speaks the text I return in those methods.JAWS, however, doesn't want to play along. After it queries the object role, it performs a few calls to characterCount(), selection() and attributes(), but calls to text extraction methods never happen. QAccessibleTextInterface::text(), textAtOffset(), etc, are never called and thus the text is never spoken by JAWS. When the window is activated, JAWS speaks this out:"Alt tab, game text, edit read only, insert f1 help, type and text." (Not sure about the "type and text"; it's kind of hard to tell what it says exactly.)("game text" is the text I return when the QAccessible::Name text is requested though the QAccessibleInterface::text() function.)I do not know where to go from here. Is this a Qt issue? Something I'm doing wrong? I can't tell.My implementation looks like this:I have a QWidget subclass, called DispWidget, that paints the text on screen, driven by the game engine's text layout engine. To make DispWidget accessible, I implement an AccessibleDispWidget class that inherits from QAccessibleWidget, QAccessibleTextInterface and QAccessibleEditableTextInterface:class AccessibleDispWidget: public QAccessibleWidget, public QAccessibleTextInterface, public QAccessibleEditableTextInterface { explicit AccessibleDispWidget(class QWidget* w) : QAccessibleWidget(w, QAccessible::EditableText) { /* ... */ } // ... // Overrides of the virtuals here -- see below. // ... }I then implement or override the appropriate virtuals:// = // QAccessibleInterface // = QString text(QAccessible::Text txt) const override { switch (txt) { case QAccessible::Name: return "Game text."; case QAccessible::Description: return ""; case QAccessible::Value: return ""; case QAccessible::Help: return "Help."; case QAccessible::Accelerator: return ""; default: return QAccessibleWidget::text(txt); } } void* interface_cast(QAccessible::InterfaceType t) override { if (t == QAccessible::TextInterface) { return static_cast(this); } if (t == QAccessible::EditableTextInterface) { return static_cast (this); } return QAccessibleWidget::interface_cast(t); } QAccessible::State state() const override { auto s = QAccessibleWidget::state(); s.multiLine = true; s.readOnly = true; s.selectableText = false; s.editable = false; return s; } // = // QAccessibleTextInterface // = // never called void addSelection(int startOffset, int endOffset) override; QString attributes(int offset, int* startOffset, int* endOffset) const override { // Simple implementation for now as to not complicate things; // all text uses the same attributes. *startOffset = 0; *endOffset = characterCount(); return QLatin1String("font-family:\"Open Sans\";font-size:14pt;font-style:normal;font-weight:normal;language:en-US;"); } int characterCount() const override { return length_of_text; } // never called QRect characterRect(int offset) const override; // never called int cursorPosition() const override; // never called int offsetAtPoint(const QPoint& point) const override; // never called void removeSelection(int selectionIndex) override; // never called void scrollToSubstring(int startIndex, int endIndex) override; void selection(int selectionIndex, int* startOffset, int* endOffset) const override { *startOffset = *endOffset = 0; } // never called int selectionCount() const override; // never called void setCursorPosition(int position) override; // never called void setSelection(int