diff --git a/scintilla/gtk/Converter.h b/scintilla/gtk/Converter.h index be530341..f17949d9 100644 --- a/scintilla/gtk/Converter.h +++ b/scintilla/gtk/Converter.h @@ -10,21 +10,13 @@ namespace Scintilla { #endif -typedef GIConv ConverterHandle; -const ConverterHandle iconvhBad = (ConverterHandle)(-1); -// Since various versions of iconv can not agree on whether the src argument -// is char ** or const char ** provide a templatised adaptor. -template -size_t iconv_adaptor(size_t(*f_iconv)(ConverterHandle, T, size_t *, char **, size_t *), - ConverterHandle cd, char** src, size_t *srcleft, - char **dst, size_t *dstleft) { - return f_iconv(cd, (T)src, srcleft, dst, dstleft); -} +const GIConv iconvhBad = (GIConv)(-1); +const gsize sizeFailure = static_cast(-1); /** - * Encapsulate iconv safely and avoid iconv_adaptor complexity in client code. + * Encapsulate g_iconv safely. */ class Converter { - ConverterHandle iconvh; + GIConv iconvh; void OpenHandle(const char *fullDestination, const char *charSetSource) { iconvh = g_iconv_open(fullDestination, charSetSource); } @@ -45,15 +37,14 @@ public: operator bool() const { return Succeeded(); } - void Open(const char *charSetDestination, const char *charSetSource, bool transliterations=true) { + void Open(const char *charSetDestination, const char *charSetSource, bool transliterations) { Close(); if (*charSetSource) { // Try allowing approximate transliterations if (transliterations) { - char fullDest[200]; - g_strlcpy(fullDest, charSetDestination, sizeof(fullDest)); - g_strlcat(fullDest, "//TRANSLIT", sizeof(fullDest)); - OpenHandle(fullDest, charSetSource); + std::string fullDest(charSetDestination); + fullDest.append("//TRANSLIT"); + OpenHandle(fullDest.c_str(), charSetSource); } if (!Succeeded()) { // Transliterations failed so try basic name @@ -67,11 +58,11 @@ public: iconvh = iconvhBad; } } - size_t Convert(char** src, size_t *srcleft, char **dst, size_t *dstleft) const { + gsize Convert(char** src, gsize *srcleft, char **dst, gsize *dstleft) const { if (!Succeeded()) { - return (size_t)(-1); + return sizeFailure; } else { - return iconv_adaptor(g_iconv, iconvh, src, srcleft, dst, dstleft); + return g_iconv(iconvh, src, srcleft, dst, dstleft); } } }; diff --git a/scintilla/gtk/PlatGTK.cxx b/scintilla/gtk/PlatGTK.cxx index 700e8816..74f095bc 100644 --- a/scintilla/gtk/PlatGTK.cxx +++ b/scintilla/gtk/PlatGTK.cxx @@ -655,12 +655,12 @@ static std::string UTF8FromIconv(const Converter &conv, const char *s, int len) if (conv) { std::string utfForm(len*3+1, '\0'); char *pin = const_cast(s); - size_t inLeft = len; + gsize inLeft = len; char *putf = &utfForm[0]; char *pout = putf; - size_t outLeft = len*3+1; - size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); - if (conversions != ((size_t)(-1))) { + gsize outLeft = len*3+1; + gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions != sizeFailure) { *pout = '\0'; utfForm.resize(pout - putf); return utfForm; @@ -675,11 +675,11 @@ static size_t MultiByteLenFromIconv(const Converter &conv, const char *s, size_t for (size_t lenMB=1; (lenMB<4) && (lenMB <= len); lenMB++) { char wcForm[2]; char *pin = const_cast(s); - size_t inLeft = lenMB; + gsize inLeft = lenMB; char *pout = wcForm; - size_t outLeft = 2; - size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); - if (conversions != ((size_t)(-1))) { + gsize outLeft = 2; + gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions != sizeFailure) { return lenMB; } } diff --git a/scintilla/gtk/ScintillaGTK.cxx b/scintilla/gtk/ScintillaGTK.cxx index 8e1c7a4c..1e8d5692 100644 --- a/scintilla/gtk/ScintillaGTK.cxx +++ b/scintilla/gtk/ScintillaGTK.cxx @@ -933,15 +933,15 @@ static std::string ConvertText(const char *s, size_t len, const char *charSetDes std::string destForm; Converter conv(charSetDest, charSetSource, transliterations); if (conv) { - size_t outLeft = len*3+1; + gsize outLeft = len*3+1; destForm = std::string(outLeft, '\0'); // g_iconv does not actually write to its input argument so safe to cast away const char *pin = const_cast(s); - size_t inLeft = len; + gsize inLeft = len; char *putf = &destForm[0]; char *pout = putf; - size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); - if (conversions == ((size_t)(-1))) { + gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); + if (conversions == sizeFailure) { if (!silent) { if (len == 1) fprintf(stderr, "iconv %s->%s failed for %0x '%s'\n", @@ -1181,7 +1181,7 @@ void ScintillaGTK::FullPaint() { } PRectangle ScintillaGTK::GetClientRectangle() const { - Window &win = const_cast(wMain); + Window win = wMain; PRectangle rc = win.GetClientPosition(); if (verticalScrollBarVisible) rc.right -= verticalScrollBarWidth; @@ -1736,14 +1736,21 @@ void ScintillaGTK::Resize(int width, int height) { //Platform::DebugPrintf("Resize %d %d\n", width, height); //printf("Resize %d %d\n", width, height); + // GTK+ 3 warns when we allocate smaller than the minimum allocation, + // so we use these variables to store the minimum scrollbar lengths. + int minVScrollBarHeight, minHScrollBarWidth; + // Not always needed, but some themes can have different sizes of scrollbars #if GTK_CHECK_VERSION(3,0,0) - GtkRequisition requisition; - gtk_widget_get_preferred_size(PWidget(scrollbarv), NULL, &requisition); + GtkRequisition minimum, requisition; + gtk_widget_get_preferred_size(PWidget(scrollbarv), &minimum, &requisition); + minVScrollBarHeight = minimum.height; verticalScrollBarWidth = requisition.width; - gtk_widget_get_preferred_size(PWidget(scrollbarh), NULL, &requisition); + gtk_widget_get_preferred_size(PWidget(scrollbarh), &minimum, &requisition); + minHScrollBarWidth = minimum.height; horizontalScrollBarHeight = requisition.height; #else + minVScrollBarHeight = minHScrollBarWidth = 1; verticalScrollBarWidth = GTK_WIDGET(PWidget(scrollbarv))->requisition.width; horizontalScrollBarHeight = GTK_WIDGET(PWidget(scrollbarh))->requisition.height; #endif @@ -1757,7 +1764,7 @@ void ScintillaGTK::Resize(int width, int height) { gtk_widget_show(GTK_WIDGET(PWidget(scrollbarh))); alloc.x = 0; alloc.y = height - horizontalScrollBarHeight; - alloc.width = Platform::Maximum(1, width - verticalScrollBarWidth); + alloc.width = Platform::Maximum(minHScrollBarWidth, width - verticalScrollBarWidth); alloc.height = horizontalScrollBarHeight; gtk_widget_size_allocate(GTK_WIDGET(PWidget(scrollbarh)), &alloc); } else { @@ -1770,7 +1777,7 @@ void ScintillaGTK::Resize(int width, int height) { alloc.x = width - verticalScrollBarWidth; alloc.y = 0; alloc.width = verticalScrollBarWidth; - alloc.height = Platform::Maximum(1, height - horizontalScrollBarHeight); + alloc.height = Platform::Maximum(minVScrollBarHeight, height - horizontalScrollBarHeight); gtk_widget_size_allocate(GTK_WIDGET(PWidget(scrollbarv)), &alloc); } else { gtk_widget_hide(GTK_WIDGET(PWidget(scrollbarv))); @@ -3166,9 +3173,6 @@ void ScintillaGTK::ClassInit(OBJECT_CLASS* object_class, GtkWidgetClass *widget_ container_class->forall = MainForAll; } -#define SIG_MARSHAL scintilla_marshal_NONE__INT_POINTER -#define MARSHAL_ARGUMENTS G_TYPE_INT, G_TYPE_POINTER - static void scintilla_class_init(ScintillaClass *klass) { try { OBJECT_CLASS *object_class = (OBJECT_CLASS*) klass; @@ -3183,20 +3187,20 @@ static void scintilla_class_init(ScintillaClass *klass) { G_STRUCT_OFFSET(ScintillaClass, command), NULL, //(GSignalAccumulator) NULL, //(gpointer) - SIG_MARSHAL, + scintilla_marshal_VOID__INT_OBJECT, G_TYPE_NONE, - 2, MARSHAL_ARGUMENTS); + 2, G_TYPE_INT, GTK_TYPE_WIDGET); scintilla_signals[NOTIFY_SIGNAL] = g_signal_new( SCINTILLA_NOTIFY, G_TYPE_FROM_CLASS(object_class), sigflags, G_STRUCT_OFFSET(ScintillaClass, notify), - NULL, - NULL, - SIG_MARSHAL, + NULL, //(GSignalAccumulator) + NULL, //(gpointer) + scintilla_marshal_VOID__INT_BOXED, G_TYPE_NONE, - 2, MARSHAL_ARGUMENTS); + 2, G_TYPE_INT, SCINTILLA_TYPE_NOTIFICATION); klass->command = NULL; klass->notify = NULL; @@ -3239,3 +3243,21 @@ void scintilla_release_resources(void) { } catch (...) { } } + +/* Define a dummy boxed type because g-ir-scanner is unable to + * recognize gpointer-derived types. Note that SCNotificaiton + * is always allocated on stack so copying is not appropriate. */ +static void *copy_(void *src) { return src; } +static void free_(void *doc) { } + +GType scnotification_get_type(void) { + static gsize type_id = 0; + if (g_once_init_enter(&type_id)) { + gsize id = (gsize) g_boxed_type_register_static( + g_intern_static_string("SCNotification"), + (GBoxedCopyFunc) copy_, + (GBoxedFreeFunc) free_); + g_once_init_leave(&type_id, id); + } + return (GType) type_id; +} diff --git a/scintilla/gtk/scintilla-marshal.c b/scintilla/gtk/scintilla-marshal.c index cee3e731..c91bd0bc 100644 --- a/scintilla/gtk/scintilla-marshal.c +++ b/scintilla/gtk/scintilla-marshal.c @@ -4,7 +4,7 @@ #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) -#define g_marshal_value_peek_char(v) g_value_get_char (v) +#define g_marshal_value_peek_char(v) g_value_get_schar (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) @@ -21,6 +21,7 @@ #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) +#define g_marshal_value_peek_variant(v) g_value_get_variant (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the @@ -44,25 +45,26 @@ #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer +#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ -/* NONE:INT,POINTER (scintilla-marshal.list:1) */ +/* NONE:INT,OBJECT (scintilla-marshal.list:1) */ void -scintilla_marshal_VOID__INT_POINTER (GClosure *closure, - GValue *return_value G_GNUC_UNUSED, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint G_GNUC_UNUSED, - gpointer marshal_data) +scintilla_marshal_VOID__INT_OBJECT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) { - typedef void (*GMarshalFunc_VOID__INT_POINTER) (gpointer data1, - gint arg_1, - gpointer arg_2, - gpointer data2); - register GMarshalFunc_VOID__INT_POINTER callback; - register GCClosure *cc = (GCClosure*) closure; - register gpointer data1, data2; + typedef void (*GMarshalFunc_VOID__INT_OBJECT) (gpointer data1, + gint arg_1, + gpointer arg_2, + gpointer data2); + GMarshalFunc_VOID__INT_OBJECT callback; + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; g_return_if_fail (n_param_values == 3); @@ -76,11 +78,48 @@ scintilla_marshal_VOID__INT_POINTER (GClosure *closure, data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } - callback = (GMarshalFunc_VOID__INT_POINTER) (marshal_data ? marshal_data : cc->callback); + callback = (GMarshalFunc_VOID__INT_OBJECT) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_int (param_values + 1), - g_marshal_value_peek_pointer (param_values + 2), + g_marshal_value_peek_object (param_values + 2), + data2); +} + +/* NONE:INT,BOXED (scintilla-marshal.list:2) */ +void +scintilla_marshal_VOID__INT_BOXED (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__INT_BOXED) (gpointer data1, + gint arg_1, + gpointer arg_2, + gpointer data2); + GMarshalFunc_VOID__INT_BOXED callback; + GCClosure *cc = (GCClosure*) closure; + gpointer data1, data2; + + g_return_if_fail (n_param_values == 3); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_VOID__INT_BOXED) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_int (param_values + 1), + g_marshal_value_peek_boxed (param_values + 2), data2); } diff --git a/scintilla/gtk/scintilla-marshal.h b/scintilla/gtk/scintilla-marshal.h index 9116a56c..7d5e17bb 100644 --- a/scintilla/gtk/scintilla-marshal.h +++ b/scintilla/gtk/scintilla-marshal.h @@ -6,14 +6,23 @@ G_BEGIN_DECLS -/* NONE:INT,POINTER (scintilla-marshal.list:1) */ -extern void scintilla_marshal_VOID__INT_POINTER (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); -#define scintilla_marshal_NONE__INT_POINTER scintilla_marshal_VOID__INT_POINTER +/* NONE:INT,OBJECT (scintilla-marshal.list:1) */ +extern void scintilla_marshal_VOID__INT_OBJECT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +#define scintilla_marshal_NONE__INT_OBJECT scintilla_marshal_VOID__INT_OBJECT + +/* NONE:INT,BOXED (scintilla-marshal.list:2) */ +extern void scintilla_marshal_VOID__INT_BOXED (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data); +#define scintilla_marshal_NONE__INT_BOXED scintilla_marshal_VOID__INT_BOXED G_END_DECLS diff --git a/scintilla/gtk/scintilla-marshal.list b/scintilla/gtk/scintilla-marshal.list index e5750ecb..ddc8ae87 100644 --- a/scintilla/gtk/scintilla-marshal.list +++ b/scintilla/gtk/scintilla-marshal.list @@ -1 +1,2 @@ -NONE:INT,POINTER +NONE:INT,OBJECT +NONE:INT,BOXED diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h index c985cea7..99bc6e7b 100644 --- a/scintilla/include/Scintilla.h +++ b/scintilla/include/Scintilla.h @@ -1121,6 +1121,13 @@ struct Sci_RangeToFormat { #define RangeToFormat Sci_RangeToFormat +#ifndef __cplusplus +/* For the GTK+ platform, g-ir-scanner needs to have these typedefs. This + * is not required in C++ code and actually seems to break ScintillaEditPy */ +typedef struct Sci_NotifyHeader Sci_NotifyHeader; +typedef struct SCNotification SCNotification; +#endif + struct Sci_NotifyHeader { /* Compatible with Windows NMHDR. * hwndFrom is really an environment specific window handle or pointer @@ -1133,7 +1140,7 @@ struct Sci_NotifyHeader { #define NotifyHeader Sci_NotifyHeader struct SCNotification { - struct Sci_NotifyHeader nmhdr; + Sci_NotifyHeader nmhdr; Sci_Position position; /* SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK, */ /* SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK, */ diff --git a/scintilla/include/Scintilla.iface b/scintilla/include/Scintilla.iface index 71defe09..310d877a 100644 --- a/scintilla/include/Scintilla.iface +++ b/scintilla/include/Scintilla.iface @@ -4729,7 +4729,7 @@ evt void FocusIn=2028(void) evt void FocusOut=2029(void) evt void AutoCCompleted=2030(string text, int position, int ch, CompletionMethods listCompletionMethod) -# There are no provisional features currently +# There are no provisional APIs currently, but some arguments to SCI_SETTECHNOLOGY are provisional. cat Provisional diff --git a/scintilla/include/ScintillaWidget.h b/scintilla/include/ScintillaWidget.h index f4ae1820..1721f65d 100644 --- a/scintilla/include/ScintillaWidget.h +++ b/scintilla/include/ScintillaWidget.h @@ -38,14 +38,18 @@ struct _ScintillaObject { struct _ScintillaClass { GtkContainerClass parent_class; - void (* command) (ScintillaObject *ttt); - void (* notify) (ScintillaObject *ttt); + void (* command) (ScintillaObject *sci, int cmd, GtkWidget *window); + void (* notify) (ScintillaObject *sci, int id, SCNotification *scn); }; GType scintilla_object_get_type (void); GtkWidget* scintilla_object_new (void); gintptr scintilla_object_send_message (ScintillaObject *sci, unsigned int iMessage, guintptr wParam, gintptr lParam); + +GType scnotification_get_type (void); +#define SCINTILLA_TYPE_NOTIFICATION (scnotification_get_type()) + #ifndef G_IR_SCANNING /* The legacy names confuse the g-ir-scanner program */ typedef struct _ScintillaClass ScintillaClass; diff --git a/scintilla/scintilla_changes.patch b/scintilla/scintilla_changes.patch index aa04574d..5eb509c8 100644 --- a/scintilla/scintilla_changes.patch +++ b/scintilla/scintilla_changes.patch @@ -50,34 +50,6 @@ index 0871ca2..49dc278 100644 GtkWidget *scintilla_object_new() { return scintilla_new(); } -diff --git scintilla/gtk/scintilla-marshal.c scintilla/gtk/scintilla-marshal.c -index be57b7c..cee3e73 100644 ---- scintilla/gtk/scintilla-marshal.c -+++ scintilla/gtk/scintilla-marshal.c -@@ -35,8 +35,8 @@ - #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong - #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 - #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 --#define g_marshal_value_peek_enum(v) (v)->data[0].v_int --#define g_marshal_value_peek_flags(v) (v)->data[0].v_uint -+#define g_marshal_value_peek_enum(v) (v)->data[0].v_long -+#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong - #define g_marshal_value_peek_float(v) (v)->data[0].v_float - #define g_marshal_value_peek_double(v) (v)->data[0].v_double - #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer -@@ -50,10 +50,10 @@ - /* NONE:INT,POINTER (scintilla-marshal.list:1) */ - void - scintilla_marshal_VOID__INT_POINTER (GClosure *closure, -- GValue *return_value, -+ GValue *return_value G_GNUC_UNUSED, - guint n_param_values, - const GValue *param_values, -- gpointer invocation_hint, -+ gpointer invocation_hint G_GNUC_UNUSED, - gpointer marshal_data) - { - typedef void (*GMarshalFunc_VOID__INT_POINTER) (gpointer data1, diff --git scintilla/src/Catalogue.cxx scintilla/src/Catalogue.cxx index ed47aa8..e58f1ab 100644 --- scintilla/src/Catalogue.cxx diff --git a/scintilla/src/Document.cxx b/scintilla/src/Document.cxx index 5e58f26e..d96a889b 100644 --- a/scintilla/src/Document.cxx +++ b/scintilla/src/Document.cxx @@ -16,7 +16,7 @@ #include #include -#ifdef CXX11_REGEX +#ifndef NO_CXX11_REGEX #include #endif @@ -2336,7 +2336,7 @@ public: } }; -#ifdef CXX11_REGEX +#ifndef NO_CXX11_REGEX class ByteIterator : public std::iterator { public: @@ -2696,7 +2696,7 @@ long BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s bool caseSensitive, bool, bool, int flags, int *length) { -#ifdef CXX11_REGEX +#ifndef NO_CXX11_REGEX if (flags & SCFIND_CXX11REGEX) { return Cxx11RegexFindText(doc, minPos, maxPos, s, caseSensitive, length, search); diff --git a/scintilla/src/Editor.cxx b/scintilla/src/Editor.cxx index eddc0e62..12539962 100644 --- a/scintilla/src/Editor.cxx +++ b/scintilla/src/Editor.cxx @@ -303,7 +303,7 @@ int Editor::TopLineOfMain() const { } PRectangle Editor::GetClientRectangle() const { - Window &win = const_cast(wMain); + Window win = wMain; return win.GetClientPosition(); } @@ -828,6 +828,7 @@ void Editor::MovedCaret(SelectionPosition newPos, SelectionPosition previousPos, } ShowCaretAtCurrentPosition(); + NotifyCaretMove(); ClaimSelection(); SetHoverIndicatorPosition(sel.MainCaret()); @@ -1437,6 +1438,9 @@ void Editor::InvalidateCaret() { UpdateSystemCaret(); } +void Editor::NotifyCaretMove() { +} + void Editor::UpdateSystemCaret() { } diff --git a/scintilla/src/Editor.h b/scintilla/src/Editor.h index c1545d34..93a86fa3 100644 --- a/scintilla/src/Editor.h +++ b/scintilla/src/Editor.h @@ -365,6 +365,7 @@ protected: // ScintillaBase subclass needs access to much of Editor void DropCaret(); void CaretSetPeriod(int period); void InvalidateCaret(); + virtual void NotifyCaretMove(); virtual void UpdateSystemCaret(); bool Wrapping() const; diff --git a/scintilla/version.txt b/scintilla/version.txt index 47531021..4203007d 100644 --- a/scintilla/version.txt +++ b/scintilla/version.txt @@ -1 +1 @@ -365 +366