aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2018-10-11 09:29:05 +1100
committerNeil <nyamatongwe@gmail.com>2018-10-11 09:29:05 +1100
commitc5dedff99f306588a7217d40a4281db7d1baffaa (patch)
treec1d9cda99aa3920b0a0dacdddec296ec893854c7
parent7cb8abba8c1b026f3b9450f3e163e09357b49906 (diff)
downloadscintilla-mirror-c5dedff99f306588a7217d40a4281db7d1baffaa.tar.gz
Add SCI_SETCOMMANDEVENTS API to allow turning off command events.
This can reduce the time taken to fold a document by half.
-rw-r--r--cocoa/ScintillaCocoa.mm2
-rw-r--r--doc/ScintillaDoc.html14
-rw-r--r--doc/ScintillaHistory.html4
-rw-r--r--gtk/ScintillaGTK.cxx7
-rw-r--r--include/Scintilla.h2
-rw-r--r--include/Scintilla.iface6
-rw-r--r--qt/ScintillaEditBase/ScintillaQt.cpp10
-rw-r--r--src/Editor.cxx16
-rw-r--r--src/Editor.h1
-rw-r--r--win32/ScintillaWin.cxx8
10 files changed, 55 insertions, 15 deletions
diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm
index d88e0e3ed..1338a66fa 100644
--- a/cocoa/ScintillaCocoa.mm
+++ b/cocoa/ScintillaCocoa.mm
@@ -1969,7 +1969,7 @@ void ScintillaCocoa::NotifyChange() {
//--------------------------------------------------------------------------------------------------
void ScintillaCocoa::NotifyFocus(bool focus) {
- if (notifyProc != NULL)
+ if (commandEvents && notifyProc)
notifyProc(notifyObj, WM_COMMAND, Platform::LongFromTwoShorts(static_cast<short>(GetCtrlID()),
(focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS)),
(uintptr_t) this);
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index bfda8622a..891b4ce7d 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -7263,6 +7263,8 @@ struct SCNotification {
<p>The following <code>SCI_*</code> messages are associated with these notifications:</p>
<code><a class="message" href="#SCI_SETMODEVENTMASK">SCI_SETMODEVENTMASK(int eventMask)</a><br />
<a class="message" href="#SCI_GETMODEVENTMASK">SCI_GETMODEVENTMASK &rarr; int</a><br />
+ <a class="message" href="#SCI_SETCOMMANDEVENTS">SCI_SETCOMMANDEVENTS(bool commandEvents)</a><br />
+ <a class="message" href="#SCI_GETCOMMANDEVENTS">SCI_GETCOMMANDEVENTS &rarr; bool</a><br />
<a class="message" href="#SCI_SETMOUSEDWELLTIME">SCI_SETMOUSEDWELLTIME(int periodMilliseconds)</a><br />
<a class="message" href="#SCI_GETMOUSEDWELLTIME">SCI_GETMOUSEDWELLTIME &rarr; int</a><br />
<a class="message" href="#SCI_SETIDENTIFIER">SCI_SETIDENTIFIER(int identifier)</a><br />
@@ -7749,7 +7751,9 @@ href="#SCI_POSITIONFROMLINE">SCI_POSITIONFROMLINE</a>(lineNumber);
<code>EN_CHANGE</code>). No other information is sent. If you need more detailed information
use <a class="message" href="#SCN_MODIFIED"><code>SCN_MODIFIED</code></a>. You can filter the
types of changes you are notified about with <a class="message"
- href="#SCI_SETMODEVENTMASK"><code>SCI_SETMODEVENTMASK</code></a>.</p>
+ href="#SCI_SETMODEVENTMASK"><code>SCI_SETMODEVENTMASK</code></a> and
+ <a class="message"
+ href="#SCI_SETCOMMANDEVENTS"><code>SCI_SETCOMMANDEVENTS</code></a>.</p>
<p><b id="SCI_SETMODEVENTMASK">SCI_SETMODEVENTMASK(int eventMask)</b><br />
<b id="SCI_GETMODEVENTMASK">SCI_GETMODEVENTMASK &rarr; int</b><br />
@@ -7769,6 +7773,14 @@ href="#SCI_POSITIONFROMLINE">SCI_POSITIONFROMLINE</a>(lineNumber);
<code>SC_MOD_BEFOREINSERT</code>, <code>SC_MOD_BEFOREDELETE</code>,
<code>SC_MULTILINEUNDOREDO</code>, and <code>SC_MODEVENTMASKALL</code>.</p>
+ <p><b id="SCI_SETCOMMANDEVENTS">SCI_SETCOMMANDEVENTS(bool commandEvents)</b><br />
+ <b id="SCI_GETCOMMANDEVENTS">SCI_GETCOMMANDEVENTS &rarr; bool</b><br />
+ These messages set and get whether <code>SCEN_*</code> command events are
+ sent to the container. For <code>SCEN_CHANGE</code> this acts as an additional filter over
+ <a class="message" href="#SCI_SETMODEVENTMASK"><code>SCI_SETMODEVENTMASK</code></a>.
+ Most applications should set this off to avoid overhead and only use
+ <a class="message" href="#SCN_MODIFIED"><code>SCN_MODIFIED</code></a>.</p>
+
<p><b id="SCEN_SETFOCUS">SCEN_SETFOCUS</b><br />
<b id="SCEN_KILLFOCUS">SCEN_KILLFOCUS</b><br />
<code>SCEN_SETFOCUS</code> (512) is fired when Scintilla receives focus and
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index 4b6b8926d..7e2fc7e2e 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -552,6 +552,10 @@
</h3>
<ul>
<li>
+ Add SCI_SETCOMMANDEVENTS API to allow turning off command events as they
+ can be a significant performance cost.
+ </li>
+ <li>
Fixed a crash on Cocoa in bidirectional mode where some patterns of invalid UTF-8
caused failures to create Unicode strings.
</li>
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx
index 6bcb1ae29..1df3ed4b9 100644
--- a/gtk/ScintillaGTK.cxx
+++ b/gtk/ScintillaGTK.cxx
@@ -1076,9 +1076,10 @@ void ScintillaGTK::NotifyChange() {
}
void ScintillaGTK::NotifyFocus(bool focus) {
- g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0,
- Platform::LongFromTwoShorts
- (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain));
+ if (commandEvents)
+ g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0,
+ Platform::LongFromTwoShorts
+ (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain));
Editor::NotifyFocus(focus);
}
diff --git a/include/Scintilla.h b/include/Scintilla.h
index ccbeef99e..ea8654ce8 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -697,6 +697,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_RELEASEDOCUMENT 2377
#define SCI_GETDOCUMENTOPTIONS 2379
#define SCI_GETMODEVENTMASK 2378
+#define SCI_SETCOMMANDEVENTS 2717
+#define SCI_GETCOMMANDEVENTS 2718
#define SCI_SETFOCUS 2380
#define SCI_GETFOCUS 2381
#define SC_STATUS_OK 0
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 00a4c4ac1..57a2c3b11 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1799,6 +1799,12 @@ get int GetDocumentOptions=2379(,)
# Get which document modification events are sent to the container.
get int GetModEventMask=2378(,)
+# Set whether command events are sent to the container.
+set void SetCommandEvents=2717(bool commandEvents,)
+
+# Get whether command events are sent to the container.
+get bool GetCommandEvents=2718(,)
+
# Change internal focus flag.
set void SetFocus=2380(bool focus,)
# Get internal focus flag.
diff --git a/qt/ScintillaEditBase/ScintillaQt.cpp b/qt/ScintillaEditBase/ScintillaQt.cpp
index cf4709a0e..8aebb9521 100644
--- a/qt/ScintillaEditBase/ScintillaQt.cpp
+++ b/qt/ScintillaEditBase/ScintillaQt.cpp
@@ -380,10 +380,12 @@ void ScintillaQt::NotifyChange()
void ScintillaQt::NotifyFocus(bool focus)
{
- emit command(
- Platform::LongFromTwoShorts
- (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS),
- reinterpret_cast<sptr_t>(wMain.GetID()));
+ if (commandEvents) {
+ emit command(
+ Platform::LongFromTwoShorts
+ (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS),
+ reinterpret_cast<sptr_t>(wMain.GetID()));
+ }
Editor::NotifyFocus(focus);
}
diff --git a/src/Editor.cxx b/src/Editor.cxx
index ad26a62d8..83cb6fec6 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -181,6 +181,7 @@ Editor::Editor() {
needIdleStyling = false;
modEventMask = SC_MODEVENTMASKALL;
+ commandEvents = true;
pdoc->AddWatcher(this, 0);
@@ -2677,9 +2678,11 @@ void Editor::NotifyModified(Document *, DocModification mh, void *) {
// If client wants to see this modification
if (mh.modificationType & modEventMask) {
- if ((mh.modificationType & (SC_MOD_CHANGESTYLE | SC_MOD_CHANGEINDICATOR)) == 0) {
- // Real modification made to text of document.
- NotifyChange(); // Send EN_CHANGE
+ if (commandEvents) {
+ if ((mh.modificationType & (SC_MOD_CHANGESTYLE | SC_MOD_CHANGEINDICATOR)) == 0) {
+ // Real modification made to text of document.
+ NotifyChange(); // Send EN_CHANGE
+ }
}
SCNotification scn = {};
@@ -7651,6 +7654,13 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_GETMODEVENTMASK:
return modEventMask;
+ case SCI_SETCOMMANDEVENTS:
+ commandEvents = static_cast<bool>(wParam);
+ return 0;
+
+ case SCI_GETCOMMANDEVENTS:
+ return commandEvents;
+
case SCI_CONVERTEOLS:
pdoc->ConvertLineEnds(static_cast<int>(wParam));
SetSelection(sel.MainCaret(), sel.MainAnchor()); // Ensure selection inside document
diff --git a/src/Editor.h b/src/Editor.h
index fb892bdcb..a75461afe 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -229,6 +229,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
bool needIdleStyling;
int modEventMask;
+ bool commandEvents;
SelectionText drag;
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index f7f1f7e2c..71b6d9e5e 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -2001,9 +2001,11 @@ void ScintillaWin::NotifyChange() {
}
void ScintillaWin::NotifyFocus(bool focus) {
- ::SendMessage(::GetParent(MainHWND()), WM_COMMAND,
- MAKELONG(GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS),
- reinterpret_cast<LPARAM>(MainHWND()));
+ if (commandEvents) {
+ ::SendMessage(::GetParent(MainHWND()), WM_COMMAND,
+ MAKELONG(GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS),
+ reinterpret_cast<LPARAM>(MainHWND()));
+ }
Editor::NotifyFocus(focus);
}