diff options
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/ScintillaGTK.cxx | 14 | ||||
-rw-r--r-- | gtk/ScintillaGTK.h | 1 | ||||
-rw-r--r-- | gtk/ScintillaGTKAccessible.cxx | 23 | ||||
-rw-r--r-- | gtk/ScintillaGTKAccessible.h | 5 |
4 files changed, 43 insertions, 0 deletions
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); |