aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/view.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/view.c')
-rw-r--r--src/view.c64
1 files changed, 52 insertions, 12 deletions
diff --git a/src/view.c b/src/view.c
index 7a9e0cc..43cdd3f 100644
--- a/src/view.c
+++ b/src/view.c
@@ -47,13 +47,24 @@
#include "eol.h"
#include "memory.h"
#include "lexer.h"
+#include "ring.h"
+#include "lsp.h"
#include "view.h"
+//#define DEBUG
+
/** @memberof teco_view_t */
void
teco_view_setup(teco_view_t *ctx)
{
/*
+ * Avoid unnecessary notifications.
+ */
+ teco_view_ssm(ctx, SCI_SETCOMMANDEVENTS, FALSE, 0);
+ teco_view_ssm(ctx, SCI_SETMODEVENTMASK,
+ SC_MOD_INSERTTEXT | SC_MOD_BEFOREDELETE, 0);
+
+ /*
* Start with or without undo collection,
* depending on teco_undo_enabled.
*/
@@ -825,20 +836,49 @@ teco_view_get_character(teco_view_t *ctx, gsize pos, gsize len)
}
void
-teco_view_process_notify(teco_view_t *ctx, SCNotification *notify)
+teco_view_process_notify(teco_view_t *ctx, const SCNotification *notify)
{
#ifdef DEBUG
- g_printf("SCINTILLA NOTIFY: code=%d\n", notify->nmhdr.code);
+ g_printf("SCINTILLA NOTIFY: code=%u\n", notify->nmhdr.code);
#endif
- /*
- * Lexing in the container: only used for SciTECO.
- *
- * The "identifier" is abused to enable/disable lexing.
- * It could be extended later on for several internal lexers.
- * The alternative would be an ILexer5 wrapper, written in C++.
- */
- if (notify->nmhdr.code == SCN_STYLENEEDED &&
- teco_view_ssm(ctx, SCI_GETIDENTIFIER, 0, 0) != 0)
- teco_lexer_style(ctx, notify->position);
+ switch (notify->nmhdr.code) {
+ case SCN_STYLENEEDED:
+ /*
+ * Lexing in the container: only used for SciTECO.
+ *
+ * The "identifier" is abused to enable/disable lexing.
+ * It could be extended later on for several internal lexers.
+ * The alternative would be an ILexer5 wrapper, written in C++.
+ */
+ if (teco_view_ssm(ctx, SCI_GETIDENTIFIER, 0, 0) != 0)
+ teco_lexer_style(ctx, notify->position);
+ break;
+
+ case SCN_MODIFIED:
+#ifdef DEBUG
+ g_printf("SCINTILLA NOTIFY: modification=0x%02X\n", notify->modificationType);
+#endif
+
+ if (!teco_ring_current || ctx != teco_ring_current->view)
+ break;
+
+ if (notify->modificationType & SC_MOD_INSERTTEXT) {
+#ifdef DEBUG
+ g_printf("SCINTILLA NOTIFY: INSERT: pos=%ld, text=\"%.*s\"\n",
+ notify->position, (gint)notify->length, notify->text);
+#endif
+ teco_lsp_didchange_insert(teco_ring_current, notify->position,
+ notify->length, notify->text, NULL);
+ }
+ if (notify->modificationType & SC_MOD_BEFOREDELETE) {
+#ifdef DEBUG
+ g_printf("SCINTILLA NOTIFY: BEFORE DELETE: pos=%ld, len=%ld\n",
+ notify->position, notify->length);
+#endif
+ teco_lsp_didchange_delete(teco_ring_current, notify->position,
+ notify->length, NULL);
+ }
+ break;
+ }
}