Kaydet (Commit) a31a43ef authored tarafından Colomban Wendling's avatar Colomban Wendling

GTK: Fix reporting deletion length in the accessible

We cannot compute the length in characters after the text has been
deleted, so we need to compute it in BEFOREDELETE.  However, we need to
emit the signal once the buffer has actually changed, so we need to
cache the value in-between those events.
üst 745d15de
...@@ -156,6 +156,7 @@ ScintillaGTKAccessible *ScintillaGTKAccessible::FromAccessible(GtkAccessible *ac ...@@ -156,6 +156,7 @@ ScintillaGTKAccessible *ScintillaGTKAccessible::FromAccessible(GtkAccessible *ac
ScintillaGTKAccessible::ScintillaGTKAccessible(GtkAccessible *accessible_, GtkWidget *widget_) : ScintillaGTKAccessible::ScintillaGTKAccessible(GtkAccessible *accessible_, GtkWidget *widget_) :
accessible(accessible_), accessible(accessible_),
sci(ScintillaGTK::FromWidget(widget_)), sci(ScintillaGTK::FromWidget(widget_)),
deletionLengthChar(0),
old_pos(-1) { old_pos(-1) {
g_signal_connect(widget_, "sci-notify", G_CALLBACK(SciNotify), this); g_signal_connect(widget_, "sci-notify", G_CALLBACK(SciNotify), this);
} }
...@@ -857,10 +858,15 @@ void ScintillaGTKAccessible::Notify(GtkWidget *, gint, SCNotification *nt) { ...@@ -857,10 +858,15 @@ void ScintillaGTKAccessible::Notify(GtkWidget *, gint, SCNotification *nt) {
g_signal_emit_by_name(accessible, "text-changed::insert", startChar, lengthChar); g_signal_emit_by_name(accessible, "text-changed::insert", startChar, lengthChar);
UpdateCursor(); UpdateCursor();
} }
if (nt->modificationType & SC_MOD_BEFOREDELETE) {
// We cannot compute the deletion length in DELETETEXT as it requires accessing the
// buffer, so that the character are still present. So, we cache the value here,
// and use it in DELETETEXT that fires quickly after.
deletionLengthChar = sci->pdoc->CountCharacters(nt->position, nt->position + nt->length);
}
if (nt->modificationType & SC_MOD_DELETETEXT) { if (nt->modificationType & SC_MOD_DELETETEXT) {
int startChar = CharacterOffsetFromByteOffset(nt->position); int startChar = CharacterOffsetFromByteOffset(nt->position);
int lengthChar = sci->pdoc->CountCharacters(nt->position, nt->position + nt->length); g_signal_emit_by_name(accessible, "text-changed::delete", startChar, deletionLengthChar);
g_signal_emit_by_name(accessible, "text-changed::delete", startChar, lengthChar);
UpdateCursor(); UpdateCursor();
} }
if (nt->modificationType & SC_MOD_CHANGESTYLE) { if (nt->modificationType & SC_MOD_CHANGESTYLE) {
......
...@@ -20,6 +20,8 @@ private: ...@@ -20,6 +20,8 @@ private:
GtkAccessible *accessible; GtkAccessible *accessible;
ScintillaGTK *sci; ScintillaGTK *sci;
// cached length of the deletion, in characters (see Notify())
int deletionLengthChar;
// local state for comparing // local state for comparing
Position old_pos; Position old_pos;
std::vector<SelectionRange> old_sels; std::vector<SelectionRange> old_sels;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment