aboutsummaryrefslogtreecommitdiffhomepage
path: root/gtk/ScintillaGTKAccessible.cxx
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 /gtk/ScintillaGTKAccessible.cxx
parent25acad3cbc9b56dd0f006e32c94d56824f1669db (diff)
downloadscintilla-mirror-f60ab1f9516f12b5fccd81f2376f2aef42d83152.tar.gz
Bug [#1910]. Accessibility support may be queried and, on GTK+, disabled.
Diffstat (limited to 'gtk/ScintillaGTKAccessible.cxx')
-rw-r--r--gtk/ScintillaGTKAccessible.cxx23
1 files changed, 23 insertions, 0 deletions
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);