aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2017-03-07 22:20:45 +1100
committerNeil <nyamatongwe@gmail.com>2017-03-07 22:20:45 +1100
commitf60ab1f9516f12b5fccd81f2376f2aef42d83152 (patch)
tree3251922fba5b0c1281146f7a250fbb0fe5662eaa
parent25acad3cbc9b56dd0f006e32c94d56824f1669db (diff)
downloadscintilla-mirror-f60ab1f9516f12b5fccd81f2376f2aef42d83152.tar.gz
Bug [#1910]. Accessibility support may be queried and, on GTK+, disabled.
-rw-r--r--cocoa/ScintillaCocoa.mm3
-rw-r--r--doc/ScintillaDoc.html71
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--gtk/ScintillaGTK.cxx14
-rw-r--r--gtk/ScintillaGTK.h1
-rw-r--r--gtk/ScintillaGTKAccessible.cxx23
-rw-r--r--gtk/ScintillaGTKAccessible.h5
-rw-r--r--include/Scintilla.h4
-rw-r--r--include/Scintilla.iface10
-rw-r--r--src/Editor.cxx7
10 files changed, 129 insertions, 13 deletions
diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm
index 1caed47da..cc5ee0fc7 100644
--- a/cocoa/ScintillaCocoa.mm
+++ b/cocoa/ScintillaCocoa.mm
@@ -906,6 +906,9 @@ sptr_t ScintillaCocoa::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lPar
return r;
}
+ case SCI_GETACCESSIBILITY:
+ return SC_ACCESSIBILITY_ENABLED;
+
default:
sptr_t r = ScintillaBase::WndProc(iMessage, wParam, lParam);
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index a29bfe617..631b38eb8 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -367,16 +367,16 @@
<tr>
<td>&cir; <a class="toc" href="#LongLines">Long lines</a></td>
- <td>&cir; <a class="toc" href="#Lexer">Lexer</a></td>
+ <td>&cir; <a class="toc" href="#Accessibility">Accessibility</a></td>
- <td>&cir; <a class="toc" href="#LexerObjects">Lexer objects</a></td>
+ <td>&cir; <a class="toc" href="#Lexer">Lexer</a></td>
</tr>
<tr>
- <td>&cir; <a class="toc" href="#Notifications">Notifications</a></td>
+ <td>&cir; <a class="toc" href="#LexerObjects">Lexer objects</a></td>
- <td>&cir; <a class="toc" href="#Accessibility">Accessibility</a></td>
+ <td>&cir; <a class="toc" href="#Notifications">Notifications</a></td>
<td>&cir; <a class="toc" href="#Images">Images</a></td>
@@ -6511,6 +6511,60 @@ sptr_t CallScintilla(unsigned int iMessage, uptr_t wParam, sptr_t lParam){
of a space character in <code>STYLE_DEFAULT</code>. All the edges can be cleared with
<code>SCI_MULTIEDGECLEARALL</code>.</p>
+ <h2 id="Accessibility">Accessibility</h2>
+
+ <p>Scintilla supports some platform accessibility features.
+ This support differs between platforms.
+ On GTK+ and Cocoa the platform accessibility APIs are implemented sufficiently to
+ make screen readers work.
+ On Win32, the system caret is manipulated to help screen readers.
+ </p>
+
+ <code><a class="message" href="#SCI_SETACCESSIBILITY">SCI_SETACCESSIBILITY(int accessibility)</a><br />
+ <a class="message" href="#SCI_GETACCESSIBILITY">SCI_GETACCESSIBILITY &rarr; int</a><br />
+ </code>
+
+ <p><b id="SCI_SETACCESSIBILITY">SCI_SETACCESSIBILITY(int accessibility)</b><br />
+ <b id="SCI_GETACCESSIBILITY">SCI_GETACCESSIBILITY &rarr; int</b><br />
+ These messages may enable or disable accessibility and report its current status.</p>
+
+ <p>On most platforms, accessibility is either implemented or not implemented and this can be
+ discovered with <code>SCI_GETACCESSIBILITY</code> with
+ <code>SCI_SETACCESSIBILITY</code> performing no action.
+ On GTK+, there are storage and performance costs to accessibility, so it can be disabled
+ by calling <code>SCI_SETACCESSIBILITY</code>.
+ </p>
+
+ <table class="standard" summary="Accessibility status">
+ <tbody>
+ <tr>
+ <th align="left">Symbol</th>
+
+ <th>Value</th>
+
+ <th align="left">Accessibility status</th>
+ </tr>
+ </tbody>
+
+ <tbody valign="top">
+ <tr>
+ <td align="left"><code>SC_ACCESSIBILITY_DISABLED</code></td>
+
+ <td align="center">0</td>
+
+ <td>Accessibility is disabled.</td>
+ </tr>
+
+ <tr>
+ <td align="left"><code>SC_ACCESSIBILITY_ENABLED</code></td>
+
+ <td align="center">1</td>
+
+ <td>Accessibility is enabled.</td>
+ </tr>
+ </tbody>
+ </table>
+
<h2 id="Lexer">Lexer</h2>
<p>If you define the symbol <code>SCI_LEXER</code> when building Scintilla, (this is sometimes
@@ -7891,15 +7945,6 @@ for line = lineStart to lineEnd do SCI_ENSUREVISIBLE(line) next
<a class="jump" href="#SCN_AUTOCSELECTION">SCN_AUTOCSELECTION</a></code>
notification.</p>
- <h2 id="Accessibility">Accessibility</h2>
-
- <p>Scintilla supports some platform accessibility features.
- This support differs between platforms.
- On GTK+ and Cocoa the platform accessibility APIs are implemented sufficiently to
- make screen readers work.
- On Win32, the system caret is manipulated to help screen readers.
- </p>
-
<h2 id="Images">Images</h2>
<p>Two formats are supported for images used in margin markers and autocompletion lists, RGBA and XPM.</p>
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index a8bad7678..290ac3927 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -527,6 +527,10 @@
Released 19 February 2017.
</li>
<li>
+ Accessibility support may be queried with SCI_GETACCESSIBILITY.
+ On GTK+, accessibility may be disabled by calling SCI_SETACCESSIBILITY.
+ </li>
+ <li>
Lexer added for "indent" language which is styled as plain text but folded by indentation level.
</li>
<li>
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx
index 35622bc02..46a4b488f 100644
--- a/gtk/ScintillaGTK.cxx
+++ b/gtk/ScintillaGTK.cxx
@@ -175,6 +175,7 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :
rgnUpdate(0),
repaintFullWindow(false),
styleIdleID(0),
+ accessibilityEnabled(SC_ACCESSIBILITY_ENABLED),
accessible(0) {
sci = sci_;
wMain = GTK_WIDGET(sci);
@@ -875,6 +876,19 @@ sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam
return ret;
}
+ case SCI_GETACCESSIBILITY:
+ return accessibilityEnabled;
+
+ case SCI_SETACCESSIBILITY:
+ accessibilityEnabled = wParam;
+ if (accessible) {
+ ScintillaGTKAccessible *sciAccessible = ScintillaGTKAccessible::FromAccessible(accessible);
+ if (sciAccessible) {
+ sciAccessible->SetAccessibility();
+ }
+ }
+ break;
+
default:
return ScintillaBase::WndProc(iMessage, wParam, lParam);
}
diff --git a/gtk/ScintillaGTK.h b/gtk/ScintillaGTK.h
index 6f69661f2..4ee55a6c8 100644
--- a/gtk/ScintillaGTK.h
+++ b/gtk/ScintillaGTK.h
@@ -68,6 +68,7 @@ class ScintillaGTK : public ScintillaBase {
bool repaintFullWindow;
guint styleIdleID;
+ int accessibilityEnabled;
AtkObject *accessible;
// Private so ScintillaGTK objects can not be copied
diff --git a/gtk/ScintillaGTKAccessible.cxx b/gtk/ScintillaGTKAccessible.cxx
index 4fcfcda99..001f2703f 100644
--- a/gtk/ScintillaGTKAccessible.cxx
+++ b/gtk/ScintillaGTKAccessible.cxx
@@ -788,6 +788,10 @@ void ScintillaGTKAccessible::AtkEditableTextIface::init(::AtkEditableTextIface *
//~ iface->set_run_attributes = SetRunAttributes;
}
+bool ScintillaGTKAccessible::Enabled() const {
+ return sci->accessibilityEnabled == SC_ACCESSIBILITY_ENABLED;
+}
+
// Callbacks
void ScintillaGTKAccessible::UpdateCursor() {
@@ -820,6 +824,10 @@ void ScintillaGTKAccessible::UpdateCursor() {
}
void ScintillaGTKAccessible::ChangeDocument(Document *oldDoc, Document *newDoc) {
+ if (!Enabled()) {
+ return;
+ }
+
if (oldDoc == newDoc) {
return;
}
@@ -854,7 +862,15 @@ void ScintillaGTKAccessible::NotifyReadOnly() {
#endif
}
+void ScintillaGTKAccessible::SetAccessibility() {
+ // Called by ScintillaGTK when application has enabled or disabled accessibility
+ character_offsets.resize(0);
+ character_offsets.push_back(0);
+}
+
void ScintillaGTKAccessible::Notify(GtkWidget *, gint, SCNotification *nt) {
+ if (!Enabled())
+ return;
switch (nt->nmhdr.code) {
case SCN_MODIFIED: {
if (nt->modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) {
@@ -864,6 +880,13 @@ void ScintillaGTKAccessible::Notify(GtkWidget *, gint, SCNotification *nt) {
character_offsets.resize(line + 1);
}
}
+ if (nt->modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) {
+ // invalidate character offset cache if applicable
+ const Position line = sci->pdoc->LineFromPosition(nt->position);
+ if (character_offsets.size() > static_cast<size_t>(line + 1)) {
+ character_offsets.resize(line + 1);
+ }
+ }
if (nt->modificationType & SC_MOD_INSERTTEXT) {
int startChar = CharacterOffsetFromByteOffset(nt->position);
int lengthChar = sci->pdoc->CountCharacters(nt->position, nt->position + nt->length);
diff --git a/gtk/ScintillaGTKAccessible.h b/gtk/ScintillaGTKAccessible.h
index 88256e0ca..1905c0619 100644
--- a/gtk/ScintillaGTKAccessible.h
+++ b/gtk/ScintillaGTKAccessible.h
@@ -23,12 +23,16 @@ private:
// cache holding character offset for each line start, see CharacterOffsetFromByteOffset()
std::vector<Position> character_offsets;
+ // cache holding character offset for each line start, see CharacterOffsetFromByteOffset()
+ std::vector<Position> character_offsets;
+
// cached length of the deletion, in characters (see Notify())
int deletionLengthChar;
// local state for comparing
Position old_pos;
std::vector<SelectionRange> old_sels;
+ bool Enabled() const;
void UpdateCursor();
void Notify(GtkWidget *widget, gint code, SCNotification *nt);
static void SciNotify(GtkWidget *widget, gint code, SCNotification *nt, gpointer data) {
@@ -136,6 +140,7 @@ public:
// So ScintillaGTK can notify us
void ChangeDocument(Document *oldDoc, Document *newDoc);
void NotifyReadOnly();
+ void SetAccessibility();
// Helper GtkWidget methods
static AtkObject *WidgetGetAccessibleImpl(GtkWidget *widget, AtkObject **cache, gpointer widget_parent_class);
diff --git a/include/Scintilla.h b/include/Scintilla.h
index 6a36d24f4..b997c0a5b 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -593,6 +593,10 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_LINESSPLIT 2289
#define SCI_SETFOLDMARGINCOLOUR 2290
#define SCI_SETFOLDMARGINHICOLOUR 2291
+#define SC_ACCESSIBILITY_DISABLED 0
+#define SC_ACCESSIBILITY_ENABLED 1
+#define SCI_SETACCESSIBILITY 2702
+#define SCI_GETACCESSIBILITY 2703
#define SCI_LINEDOWN 2300
#define SCI_LINEDOWNEXTEND 2301
#define SCI_LINEUP 2302
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 4c964e3fd..5aa5f8ee3 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1476,6 +1476,16 @@ fun void SetFoldMarginColour=2290(bool useSetting, colour back)
# Set the other colour used as a chequerboard pattern in the fold margin
fun void SetFoldMarginHiColour=2291(bool useSetting, colour fore)
+enu Accessibility=SC_ACCESSIBILITY_
+val SC_ACCESSIBILITY_DISABLED=0
+val SC_ACCESSIBILITY_ENABLED=1
+
+# Enable or disable accessibility.
+set void SetAccessibility=2702(int accessibility,)
+
+# Report accessibility status.
+get int GetAccessibility=2703(,)
+
## New messages go here
## Start of key messages
diff --git a/src/Editor.cxx b/src/Editor.cxx
index e5fbc69be..35bbc10fe 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -7554,6 +7554,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
std::vector<EdgeProperties>().swap(vs.theMultiEdge); // Free vector and memory, C++03 compatible
InvalidateStyleRedraw();
break;
+
+ case SCI_GETACCESSIBILITY:
+ return SC_ACCESSIBILITY_DISABLED;
+
+ case SCI_SETACCESSIBILITY:
+ // May be implemented by platform code.
+ break;
case SCI_GETDOCPOINTER:
return reinterpret_cast<sptr_t>(pdoc);