From 8be99d3863a305046f0133116782734e87be0822 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Fri, 14 Nov 2014 02:43:23 +0100 Subject: first working version of the one-view-per-buffer design The user interface provides a Scintilla view abstraction and every buffer is based on a view. All Q-Register strings use a single dedicated view to save memory and initialization time when using many string registers. * this means we can finally implement a working lexer configuration and it only has to be done once when the buffer is first added to the ring. It is unnecessary to magically restore the lexer styles upon rubout of EB (very hard to implement anyway). It is also not necessary to rerun the lexer configuration macro upon rubout which would be hard to reconcile with SciTECO's basic design since every side-effect should be attached to a character. * this means that opening buffers is slightly slower now because of the view initialization * on the other hand, macros with many string q-reg operations are faster now, since the document must no longer be changed on the buffer's view and restored later on. * also now we can make a difference between editing a document in a view and changing the current view, which reduces UI calls * the Document class has been retained as an abstraction about Scintilla documents, used by QRegister Strings. It had to be made virtual, so the view on which the document is created can be specified by a virtual function. There is no additional space overhead for Documents. --- src/interface.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/interface.cpp (limited to 'src/interface.cpp') diff --git a/src/interface.cpp b/src/interface.cpp new file mode 100644 index 0000000..aecba4e --- /dev/null +++ b/src/interface.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2012-2014 Robin Haberkorn + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include +#include +#include + +#include +#include + +#include "sciteco.h" +#include "interface.h" + +namespace SciTECO { + +void +View::set_representations(void) +{ + static const char *reps[] = { + "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", + "^H", "TAB" /* ^I */, "LF" /* ^J */, "^K", "^L", "CR" /* ^M */, "^N", "^O", + "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", + "^X", "^Y", "^Z", "$" /* ^[ */, "^\\", "^]", "^^", "^_" + }; + + for (guint cc = 0; cc < G_N_ELEMENTS(reps); cc++) { + gchar buf[] = {(gchar)cc, '\0'}; + ssm(SCI_SETREPRESENTATION, (uptr_t)buf, (sptr_t)reps[cc]); + } +} + +void +View::initialize(void) +{ + ssm(SCI_SETFOCUS, TRUE); + + ssm(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK); + ssm(SCI_SETCARETFORE, 0xFFFFFF); + + /* + * FIXME: Default styles should probably be set interface-based + * (system defaults) + */ + ssm(SCI_STYLESETFORE, STYLE_DEFAULT, 0xFFFFFF); + ssm(SCI_STYLESETBACK, STYLE_DEFAULT, 0x000000); + ssm(SCI_STYLESETFONT, STYLE_DEFAULT, (sptr_t)"Courier"); + ssm(SCI_STYLECLEARALL); + + ssm(SCI_STYLESETBACK, STYLE_LINENUMBER, 0x000000); +} + +void +Interface::UndoTokenShowView::run(void) +{ + /* + * Implementing this here allows us to reference + * `interface` + */ + interface.show_view(view); +} + +void +Interface::stdio_vmsg(MessageType type, const gchar *fmt, va_list ap) +{ + gchar buf[255]; + + g_vsnprintf(buf, sizeof(buf), fmt, ap); + + switch (type) { + case MSG_USER: + g_printf("%s\n", buf); + break; + case MSG_INFO: + g_printf("Info: %s\n", buf); + break; + case MSG_WARNING: + g_fprintf(stderr, "Warning: %s\n", buf); + break; + case MSG_ERROR: + g_fprintf(stderr, "Error: %s\n", buf); + break; + } +} + +void +Interface::process_notify(SCNotification *notify) +{ +#ifdef DEBUG + g_printf("SCINTILLA NOTIFY: code=%d\n", notify->nmhdr.code); +#endif +} + +} /* namespace SciTECO */ -- cgit v1.2.3