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.
This commit is contained in:
parent
745d15de2e
commit
a31a43efe1
@ -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) {
|
|||||||
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:
|
|||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user