26#include <gdk/gdkkeysyms.h>
27#if defined(GDK_WINDOWING_WAYLAND)
28#include <gdk/gdkwayland.h>
80#define IS_WIDGET_REALIZED(w) (gtk_widget_get_realized(GTK_WIDGET(w)))
81#define IS_WIDGET_MAPPED(w) (gtk_widget_get_mapped(GTK_WIDGET(w)))
83#define SC_INDICATOR_INPUT INDICATOR_IME
84#define SC_INDICATOR_TARGET INDICATOR_IME+1
85#define SC_INDICATOR_CONVERTED INDICATOR_IME+2
86#define SC_INDICATOR_UNKNOWN INDICATOR_IME_MAX
89 return gtk_widget_get_window(w);
94#pragma warning(disable: 4127)
96#pragma warning(disable: 4505)
102 GtkWidget *widget =
static_cast<GtkWidget *
>(w.GetID());
103 return gtk_widget_get_window(widget);
124GdkAtom ScintillaGTK::atomUTF8 =
nullptr;
125GdkAtom ScintillaGTK::atomUTF8Mime =
nullptr;
126GdkAtom ScintillaGTK::atomString =
nullptr;
127GdkAtom ScintillaGTK::atomUriList =
nullptr;
128GdkAtom ScintillaGTK::atomDROPFILES_DND =
nullptr;
143static const GdkDragAction
actionCopyOrMove =
static_cast<GdkDragAction
>(GDK_ACTION_COPY | GDK_ACTION_MOVE);
146 return static_cast<GtkWidget *
>(w.GetID());
150 ScintillaObject *scio = SCINTILLA(widget);
154ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :
155 adjustmentv(nullptr), adjustmenth(nullptr),
156 verticalScrollBarWidth(30), horizontalScrollBarHeight(30),
159 capturedMouse(false), dragWasDropped(false),
160 lastKey(0), rectangularSelectionModifier(
SCMOD_CTRL),
161 parentClass(nullptr),
163 preeditInitialized(false),
165 lastNonCommonScript(G_UNICODE_SCRIPT_INVALID_CODE),
166 lastWheelMouseTime(0),
167 lastWheelMouseDirection(0),
168 wheelMouseIntensity(0),
172 repaintFullWindow(false),
175 accessible(nullptr) {
184 cfColumnSelect =
static_cast<CLIPFORMAT
>(
185 ::RegisterClipboardFormat(
"MSDEVColumnSelect"));
189#ifndef SPI_GETWHEELSCROLLLINES
190#define SPI_GETWHEELSCROLLLINES 104
192 ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &
linesPerScroll, 0);
206 gdk_event_free(
evbtn);
213#if GTK_CHECK_VERSION(3,0,0)
214 g_object_unref(cursor);
216 gdk_cursor_unref(cursor);
222 gtk_widget_set_realized(widget, TRUE);
224 attrs.window_type = GDK_WINDOW_CHILD;
225 GtkAllocation allocation;
226 gtk_widget_get_allocation(widget, &allocation);
227 attrs.x = allocation.x;
228 attrs.y = allocation.y;
229 attrs.width = allocation.width;
230 attrs.height = allocation.height;
231 attrs.wclass = GDK_INPUT_OUTPUT;
232 attrs.visual = gtk_widget_get_visual(widget);
233#if !GTK_CHECK_VERSION(3,0,0)
234 attrs.colormap = gtk_widget_get_colormap(widget);
236 attrs.event_mask = gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK;
237 GdkDisplay *pdisplay = gtk_widget_get_display(widget);
238 GdkCursor *cursor = gdk_cursor_new_for_display(pdisplay, GDK_XTERM);
239 attrs.cursor = cursor;
240#if GTK_CHECK_VERSION(3,0,0)
241 gtk_widget_set_window(widget, gdk_window_new(gtk_widget_get_parent_window(widget), &attrs,
242 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_CURSOR));
243#if GTK_CHECK_VERSION(3,8,0)
244 gtk_widget_register_window(widget, gtk_widget_get_window(widget));
246 gdk_window_set_user_data(gtk_widget_get_window(widget), widget);
248#if !GTK_CHECK_VERSION(3,18,0)
249 gtk_style_context_set_background(gtk_widget_get_style_context(widget),
250 gtk_widget_get_window(widget));
252 gdk_window_show(gtk_widget_get_window(widget));
255 widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attrs,
256 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR);
257 gdk_window_set_user_data(widget->window, widget);
258 widget->style = gtk_style_attach(widget->style, widget->window);
259 gdk_window_set_background(widget->window, &widget->style->bg[GTK_STATE_NORMAL]);
260 gdk_window_show(widget->window);
269 g_signal_connect(G_OBJECT(
im_context),
"commit",
270 G_CALLBACK(
Commit),
this);
271 g_signal_connect(G_OBJECT(
im_context),
"preedit_changed",
276 g_signal_connect_after(G_OBJECT(widtxt),
"style_set",
278 g_signal_connect_after(G_OBJECT(widtxt),
"realize",
280 gtk_widget_realize(widtxt);
284 cursor = gdk_cursor_new_for_display(pdisplay, GDK_XTERM);
288 cursor = gdk_cursor_new_for_display(pdisplay, GDK_LEFT_PTR);
292 cursor = gdk_cursor_new_for_display(pdisplay, GDK_LEFT_PTR);
314 gtk_widget_unmap(widget);
316 gtk_widget_set_realized(widget, FALSE);
342 gtk_widget_get_visible(GTK_WIDGET(widget)) &&
344 gtk_widget_map(widget);
406 if (callback && include_internals) {
407 sciThis->
ForAll(callback, callback_data);
417 PangoAttrList *attrs;
421 GUnicodeScript pscript;
423 explicit PreEditString(GtkIMContext *im_context)
noexcept {
424 gtk_im_context_get_preedit_string(im_context, &str, &attrs, &cursor_pos);
425 validUTF8 = g_utf8_validate(str, strlen(str),
nullptr);
426 uniStr = g_utf8_to_ucs4_fast(str, strlen(str), &uniStrLen);
427 pscript = g_unichar_get_script(uniStr[0]);
430 PreEditString(
const PreEditString&) =
delete;
431 PreEditString(PreEditString&&) =
delete;
432 PreEditString&operator=(
const PreEditString&) =
delete;
433 PreEditString&operator=(PreEditString&&) =
delete;
437 pango_attr_list_unref(attrs);
452 GtkWidget *top = gtk_widget_get_toplevel(
PWidget(
wMain));
453 gtk_window_set_transient_for(GTK_WINDOW(
PWidget(
wPreedit)), GTK_WINDOW(top));
457 if (strlen(pes.str) > 0) {
497 requisition->width = 1;
498 requisition->height = 1;
499 GtkRequisition child_requisition;
500#if GTK_CHECK_VERSION(3,0,0)
501 gtk_widget_get_preferred_size(
PWidget(sciThis->
scrollbarh),
nullptr, &child_requisition);
502 gtk_widget_get_preferred_size(
PWidget(sciThis->
scrollbarv),
nullptr, &child_requisition);
509#if GTK_CHECK_VERSION(3,0,0)
511void ScintillaGTK::GetPreferredWidth(GtkWidget *widget, gint *minimalWidth, gint *naturalWidth) {
512 GtkRequisition requisition;
514 *minimalWidth = *naturalWidth = requisition.width;
517void ScintillaGTK::GetPreferredHeight(GtkWidget *widget, gint *minimalHeight, gint *naturalHeight) {
518 GtkRequisition requisition;
520 *minimalHeight = *naturalHeight = requisition.height;
528 gtk_widget_set_allocation(widget, allocation);
536 sciThis->
Resize(allocation->width, allocation->height);
545 g_type_class_ref(gtk_container_get_type()));
548#if defined(GDK_WINDOWING_WAYLAND)
549 GdkDisplay *pdisplay = gdk_display_get_default();
550 if (GDK_IS_WAYLAND_DISPLAY(pdisplay)) {
552 maskSmooth = GDK_SMOOTH_SCROLL_MASK;
564 | GDK_KEY_RELEASE_MASK
565 | GDK_FOCUS_CHANGE_MASK
566 | GDK_LEAVE_NOTIFY_MASK
567 | GDK_BUTTON_PRESS_MASK
568 | GDK_BUTTON_RELEASE_MASK
569 | GDK_POINTER_MOTION_MASK
570 | GDK_POINTER_MOTION_HINT_MASK);
572 wText = gtk_drawing_area_new();
575 gtk_widget_show(widtxt);
576#if GTK_CHECK_VERSION(3,0,0)
577 g_signal_connect(G_OBJECT(widtxt),
"draw",
578 G_CALLBACK(ScintillaGTK::DrawText),
this);
580 g_signal_connect(G_OBJECT(widtxt),
"expose_event",
583#if GTK_CHECK_VERSION(3,0,0)
586 if (gtk_check_version(3, 9, 2) !=
nullptr )
589#if !GTK_CHECK_VERSION(3,14,0)
591 gtk_widget_set_double_buffered(widtxt, FALSE);
594 gtk_widget_set_events(widtxt, GDK_EXPOSURE_MASK);
595 gtk_widget_set_size_request(widtxt, 100, 100);
596 adjustmentv = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 201.0, 1.0, 20.0, 20.0));
597#if GTK_CHECK_VERSION(3,0,0)
603 g_signal_connect(G_OBJECT(
adjustmentv),
"value_changed",
608 adjustmenth = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 101.0, 1.0, 20.0, 20.0));
609#if GTK_CHECK_VERSION(3,0,0)
615 g_signal_connect(G_OBJECT(
adjustmenth),
"value_changed",
627 wPreedit = gtk_window_new(GTK_WINDOW_POPUP);
630#if GTK_CHECK_VERSION(3,0,0)
631 g_signal_connect(G_OBJECT(predrw),
"draw",
632 G_CALLBACK(DrawPreedit),
this);
634 g_signal_connect(G_OBJECT(predrw),
"expose_event",
638 gtk_widget_show(predrw);
641 gboolean blinkOn =
false;
642 if (g_object_class_find_property(G_OBJECT_GET_CLASS(
643 G_OBJECT(gtk_settings_get_default())),
"gtk-cursor-blink")) {
644 g_object_get(G_OBJECT(
645 gtk_settings_get_default()),
"gtk-cursor-blink", &blinkOn,
nullptr);
648 g_object_class_find_property(G_OBJECT_GET_CLASS(
649 G_OBJECT(gtk_settings_get_default())),
"gtk-cursor-blink-time")) {
651 g_object_get(G_OBJECT(
652 gtk_settings_get_default()),
"gtk-cursor-blink-time", &value,
nullptr);
673 gtk_accessible_set_widget(GTK_ACCESSIBLE(
accessible),
nullptr);
696 return gtk_drag_check_threshold(GTK_WIDGET(
PWidget(
wMain)),
697 ptStart.
x, ptStart.
y, ptNow.
x, ptNow.
y);
705#if GTK_CHECK_VERSION(3,10,0)
706 gtk_drag_begin_with_coordinates(GTK_WIDGET(
PWidget(
wMain)),
722std::string
ConvertText(
const char *s,
size_t len,
const char *charSetDest,
723 const char *charSetSource,
bool transliterations,
bool silent) {
725 std::string destForm;
726 Converter conv(charSetDest, charSetSource, transliterations);
728 gsize outLeft = len*3+1;
729 destForm = std::string(outLeft,
'\0');
731 char *pin =
const_cast<char *
>(s);
733 char *putf = &destForm[0];
735 const gsize conversions = conv.
Convert(&pin, &inLeft, &pout, &outLeft);
739 fprintf(stderr,
"iconv %s->%s failed for %0x '%s'\n",
740 charSetSource, charSetDest, (
unsigned char)(*s), s);
742 fprintf(stderr,
"iconv %s->%s failed for %s\n",
743 charSetSource, charSetDest, s);
745 destForm = std::string();
747 destForm.resize(pout - putf);
750 fprintf(stderr,
"Can not iconv %s %s\n", charSetDest, charSetSource);
767 if (*charSetBuffer) {
769 std::string tmputf =
ConvertText(&s[0], targetLength,
"UTF-8", charSetBuffer,
false);
771 memcpy(
text, tmputf.c_str(), tmputf.length());
773 return tmputf.length();
789 memcpy(encoded, utf8, inputLength);
795 if (*charSetBuffer) {
796 std::string tmpEncoded =
ConvertText(utf8, inputLength, charSetBuffer,
"UTF-8",
true);
798 memcpy(encoded, tmpEncoded.c_str(), tmpEncoded.length());
800 return tmpEncoded.length();
803 memcpy(encoded, utf8, inputLength);
834 return reinterpret_cast<sptr_t>(
this);
877 }
catch (std::bad_alloc &) {
911 gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE,
IdleCallback,
this,
nullptr));
938#if GTK_CHECK_VERSION(3,0,0)
941static bool CRectContains(
const cairo_rectangle_t &crcContainer,
const cairo_rectangle_t &crcTest) {
943 (crcTest.x >= crcContainer.x) && ((crcTest.x + crcTest.width) <= (crcContainer.x + crcContainer.width)) &&
944 (crcTest.y >= crcContainer.y) && ((crcTest.y + crcTest.height) <= (crcContainer.y + crcContainer.height));
949static bool CRectListContains(
const cairo_rectangle_list_t *crcListContainer,
const cairo_rectangle_t &crcTest) {
950 for (
int r=0; r<crcListContainer->num_rectangles; r++) {
951 if (CRectContains(crcListContainer->rectangles[r], crcTest))
962 bool contains =
true;
967#if GTK_CHECK_VERSION(3,0,0)
968 cairo_rectangle_t grc = {rc.
left, rc.
top,
971 contains = CRectListContains(
rgnUpdate, grc);
973 GdkRectangle grc = {
static_cast<gint
>(rc.
left),
static_cast<gint
>(rc.
top),
976 if (gdk_region_rect_in(
rgnUpdate, &grc) != GDK_OVERLAP_RECTANGLE_IN) {
1011#if GTK_CHECK_VERSION(3,22,0)
1034 bool modified =
false;
1037 if (gtk_adjustment_get_upper(
adjustmentv) != (nMax + 1) ||
1038 gtk_adjustment_get_page_size(
adjustmentv) != nPage ||
1039 gtk_adjustment_get_page_increment(
adjustmentv) != pageScroll) {
1042 gtk_adjustment_set_page_increment(
adjustmentv, pageScroll);
1043#if !GTK_CHECK_VERSION(3,18,0)
1044 gtk_adjustment_changed(GTK_ADJUSTMENT(
adjustmentv));
1051 if (horizEndPreferred < 0)
1052 horizEndPreferred = 0;
1053 const unsigned int pageWidth =
static_cast<unsigned int>(rcText.
Width());
1054 const unsigned int pageIncrement = pageWidth / 3;
1056 if (gtk_adjustment_get_upper(
adjustmenth) != horizEndPreferred ||
1057 gtk_adjustment_get_page_size(
adjustmenth) != pageWidth ||
1058 gtk_adjustment_get_page_increment(
adjustmenth) != pageIncrement ||
1059 gtk_adjustment_get_step_increment(
adjustmenth) != charWidth) {
1060 gtk_adjustment_set_upper(
adjustmenth, horizEndPreferred);
1061 gtk_adjustment_set_page_size(
adjustmenth, pageWidth);
1062 gtk_adjustment_set_page_increment(
adjustmenth, pageIncrement);
1063 gtk_adjustment_set_step_increment(
adjustmenth, charWidth);
1064#if !GTK_CHECK_VERSION(3,18,0)
1065 gtk_adjustment_changed(GTK_ADJUSTMENT(
adjustmenth));
1130 size_t Fold(
char *folded,
size_t sizeFolded,
const char *mixed,
size_t lenMixed)
override {
1131 if ((lenMixed == 1) && (sizeFolded > 0)) {
1132 folded[0] = mapping[
static_cast<unsigned char>(mixed[0])];
1134 }
else if (*charSet) {
1136 "UTF-8", charSet,
false);
1137 if (!sUTF8.empty()) {
1138 gchar *mapped = g_utf8_casefold(sUTF8.c_str(), sUTF8.length());
1139 size_t lenMapped = strlen(mapped);
1140 if (lenMapped < sizeFolded) {
1141 memcpy(folded, mapped, lenMapped);
1161 if (charSetBuffer) {
1166 for (
int i=0x80; i<0x100; i++) {
1167 char sCharacter[2] =
"A";
1171 "UTF-8", charSetBuffer,
false,
true);
1172 if (!sUTF8.empty()) {
1173 gchar *mapped = g_utf8_casefold(sUTF8.c_str(), sUTF8.length());
1175 std::string mappedBack =
ConvertText(mapped, strlen(mapped),
1176 charSetBuffer,
"UTF-8",
false,
true);
1177 if ((mappedBack.length() == 1) && (mappedBack[0] != sCharacter[0])) {
1197 CaseMapper(
const std::string &sUTF8,
bool toUpperCase) {
1199 mapped = g_utf8_strup(sUTF8.c_str(), sUTF8.length());
1201 mapped = g_utf8_strdown(sUTF8.c_str(), sUTF8.length());
1205 CaseMapper(
const CaseMapper&) =
delete;
1206 CaseMapper(CaseMapper&&) =
delete;
1207 CaseMapper&operator=(
const CaseMapper&) =
delete;
1208 CaseMapper&operator=(CaseMapper&&) =
delete;
1217 if ((s.size() == 0) || (caseMapping ==
cmSame))
1222 const size_t lenMapped =
CaseConvertString(&retMapped[0], retMapped.length(), s.c_str(), s.length(),
1224 retMapped.resize(lenMapped);
1230 if (!*charSetBuffer) {
1231 CaseMapper mapper(s, caseMapping ==
cmUpper);
1232 return std::string(mapper.mapped, strlen(mapper.mapped));
1235 std::string sUTF8 =
ConvertText(s.c_str(), s.length(),
1236 "UTF-8", charSetBuffer,
false);
1237 CaseMapper mapper(sUTF8, caseMapping ==
cmUpper);
1238 return ConvertText(mapper.mapped, strlen(mapper.mapped), charSetBuffer,
"UTF-8",
false);
1250 clipText->
Copy(selectedText);
1261 ::OpenClipboard(
NULL);
1262 ::SetClipboardData(cfColumnSelect, 0);
1276 void Destroyed() noexcept
override {
1286 static void ClipboardReceived(GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer data) {
1287 SelectionReceiver *self =
static_cast<SelectionReceiver *
>(data);
1289 self->sci->ReceivedClipboard(clipboard, selection_data);
1299 GtkClipboard *clipBoard =
1300 gtk_widget_get_clipboard(GTK_WIDGET(
PWidget(
wMain)), atomSelection);
1302 gtk_clipboard_request_contents(clipBoard,
atomSought,
1303 SelectionReceiver::ClipboardReceived,
1304 new SelectionReceiver(
this));
1314 ct.
wCallTip = gtk_window_new(GTK_WINDOW_POPUP);
1315 ct.
wDraw = gtk_drawing_area_new();
1318#if GTK_CHECK_VERSION(3,0,0)
1319 g_signal_connect(G_OBJECT(widcdrw),
"draw",
1320 G_CALLBACK(ScintillaGTK::DrawCT), &
ct);
1322 g_signal_connect(G_OBJECT(widcdrw),
"expose_event",
1325 g_signal_connect(G_OBJECT(widcdrw),
"button_press_event",
1327 gtk_widget_set_events(widcdrw,
1328 GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
1329 GtkWidget *top = gtk_widget_get_toplevel(
PWidget(
wMain));
1330 gtk_window_set_transient_for(GTK_WINDOW(
PWidget(
ct.
wCallTip)), GTK_WINDOW(top));
1332 const int width =
static_cast<int>(rc.
Width());
1333 const int height =
static_cast<int>(rc.
Height());
1342 GtkWidget *menuItem;
1344 menuItem = gtk_menu_item_new_with_label(
label);
1346 menuItem = gtk_separator_menu_item_new();
1347 gtk_menu_shell_append(GTK_MENU_SHELL(
popup.
GetID()), menuItem);
1348 g_object_set_data(G_OBJECT(menuItem),
"CmdNum", GINT_TO_POINTER(cmd));
1349 g_signal_connect(G_OBJECT(menuItem),
"activate", G_CALLBACK(
PopUpCB),
this);
1353 gtk_widget_set_sensitive(menuItem, enabled);
1369 GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
1374 gtk_selection_owner_set(
nullptr, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
1385static const guchar *
DataOfGSD(GtkSelectionData *sd)
noexcept {
return gtk_selection_data_get_data(sd); }
1386static gint
LengthOfGSD(GtkSelectionData *sd)
noexcept {
return gtk_selection_data_get_length(sd); }
1387static GdkAtom
TypeOfGSD(GtkSelectionData *sd)
noexcept {
return gtk_selection_data_get_data_type(sd); }
1388static GdkAtom
SelectionOfGSD(GtkSelectionData *sd)
noexcept {
return gtk_selection_data_get_selection(sd); }
1392 const char *data =
reinterpret_cast<const char *
>(
DataOfGSD(selectionData));
1394 GdkAtom selectionTypeData =
TypeOfGSD(selectionData);
1405 isRectangular = ::IsClipboardFormatAvailable(cfColumnSelect) != 0;
1407 isRectangular = ((len > 2) && (data[len - 1] == 0 && data[len - 2] ==
'\n'));
1415 if ((len > 0) && (data[len - 1] ==
'\0'))
1419 std::string dest(data, len);
1420 if (selectionTypeData == GDK_TARGET_STRING) {
1434 dest =
ConvertText(dest.c_str(), dest.length(), charSetBuffer,
"UTF-8",
true);
1444 const gint length = gtk_selection_data_get_length(selectionData);
1446 GdkAtom selection = gtk_selection_data_get_selection(selectionData);
1451 if (selection == GDK_SELECTION_CLIPBOARD) {
1459 GdkAtom target = gtk_selection_data_get_target(selectionData);
1462 gtk_clipboard_request_contents(clipBoard,
atomUTF8Mime,
1463 SelectionReceiver::ClipboardReceived,
1464 new SelectionReceiver(
this)
1477 InsertSelection(clipBoard, selection_data);
1485 if ((
SelectionOfGSD(selection_data) == GDK_SELECTION_CLIPBOARD) ||
1506 const char *data =
reinterpret_cast<const char *
>(
DataOfGSD(selection_data));
1507 std::vector<char> drop(data, data +
LengthOfGSD(selection_data));
1508 drop.push_back(
'\0');
1529 std::unique_ptr<SelectionText> newline_normalized;
1533 newline_normalized->Copy(tmpstr,
SC_CP_UTF8, 0,
text->rectangular,
false);
1534 text = newline_normalized.get();
1539 std::unique_ptr<SelectionText> converted;
1544 converted = Sci::make_unique<SelectionText>();
1545 converted->Copy(tmputf,
SC_CP_UTF8, 0,
text->rectangular,
false);
1546 text = converted.get();
1557 const char *textData =
text->Data();
1558 int len =
text->Length();
1559#if PLAT_GTK_WIN32 == 0
1560 if (
text->rectangular)
1565 gtk_selection_data_set_text(selection_data, textData, len);
1567 gtk_selection_data_set(selection_data,
1568 static_cast<GdkAtom
>(GDK_SELECTION_TYPE_STRING),
1569 8,
reinterpret_cast<const guchar *
>(textData), len);
1574 GtkClipboard *clipBoard =
1575 gtk_widget_get_clipboard(GTK_WIDGET(
PWidget(
wMain)), GDK_SELECTION_CLIPBOARD);
1576 if (clipBoard ==
nullptr)
1597 if (selection_event->selection == GDK_SELECTION_PRIMARY) {
1625 if (GTK_WIDGET_CLASS(sciThis->
parentClass)->selection_clear_event) {
1626 return GTK_WIDGET_CLASS(sciThis->
parentClass)->selection_clear_event(widget, event);
1637 int minVScrollBarHeight, minHScrollBarWidth;
1640#if GTK_CHECK_VERSION(3,0,0)
1641 GtkRequisition minimum, requisition;
1643 minVScrollBarHeight = minimum.height;
1646 minHScrollBarWidth = minimum.width;
1649 minVScrollBarHeight = minHScrollBarWidth = 1;
1658 GtkAllocation alloc = {};
1659 if (showSBHorizontal) {
1690#if GTK_CHECK_VERSION(3, 0, 0)
1693 gtk_widget_get_preferred_size(
PWidget(
wText), &requisition,
nullptr);
1694 alloc.width = requisition.width;
1695 alloc.height = requisition.height;
1699 gtk_widget_size_allocate(GTK_WIDGET(
PWidget(
wText)), &alloc);
1704void SetAdjustmentValue(GtkAdjustment *
object,
int value)
noexcept {
1705 GtkAdjustment *adjustment = GTK_ADJUSTMENT(
object);
1706 const int maxValue =
static_cast<int>(
1707 gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment));
1709 if (value > maxValue)
1713 gtk_adjustment_set_value(adjustment, value);
1716int modifierTranslated(
int sciModifier)
noexcept {
1717 switch (sciModifier) {
1719 return GDK_SHIFT_MASK;
1721 return GDK_CONTROL_MASK;
1723 return GDK_MOD1_MASK;
1725 return GDK_MOD4_MASK;
1731Point PointOfEvent(
const GdkEventButton *event)
noexcept {
1743 if (event->type != GDK_BUTTON_PRESS)
1747 gdk_event_free(
evbtn);
1749 evbtn = gdk_event_copy(
reinterpret_cast<GdkEvent *
>(event));
1751 const Point pt = PointOfEvent(event);
1760 const bool shift = (
event->state & GDK_SHIFT_MASK) != 0;
1761 bool ctrl = (
event->state & GDK_CONTROL_MASK) != 0;
1768 if (event->button == 1) {
1770 const bool meta = ctrl;
1773 ctrl = (
event->state & GDK_MOD2_MASK) != 0;
1775 const bool meta =
false;
1778 }
else if (event->button == 2) {
1787 }
else if (event->button == 3) {
1799 const bool meta = ctrl;
1802 ctrl = (
event->state & GDK_MOD2_MASK) != 0;
1804 const bool meta =
false;
1809 }
else if (event->button == 4) {
1815 }
else if (event->button == 5) {
1841 if (event->button == 1) {
1842 Point pt = PointOfEvent(event);
1850 (event->state & GDK_SHIFT_MASK) != 0,
1851 (event->state & GDK_CONTROL_MASK) != 0,
1867 if (widget ==
nullptr || event ==
nullptr)
1870#if defined(GDK_WINDOWING_WAYLAND)
1871 if (event->direction == GDK_SCROLL_SMOOTH && GDK_IS_WAYLAND_WINDOW(event->window)) {
1872 const int smoothScrollFactor = 4;
1873 sciThis->
smoothScrollY +=
event->delta_y * smoothScrollFactor;
1874 sciThis->
smoothScrollX +=
event->delta_x * smoothScrollFactor;;
1881 const int scrollPixels = std::trunc(sciThis->
smoothScrollX);
1896#if defined(__APPLE__) && !defined(GDK_WINDOWING_QUARTZ)
1898 if (cLineScroll == 0)
1902 const gint64 curTime = g_get_monotonic_time();
1910 if (cLineScroll == 0)
1916 if (event->direction == GDK_SCROLL_UP || event->direction == GDK_SCROLL_LEFT) {
1927 if (event->state & GDK_SHIFT_MASK) {
1931#if GTK_CHECK_VERSION(3,4,0)
1933 if (event->direction == GDK_SCROLL_SMOOTH) {
1939 if (event->direction == GDK_SCROLL_LEFT || event->direction == GDK_SCROLL_RIGHT) {
1943 }
else if (event->state & GDK_CONTROL_MASK) {
1944 if (cLineScroll < 0) {
1969 GdkModifierType state {};
1970 if (event->is_hint) {
1971#if GTK_CHECK_VERSION(3,0,0)
1972 gdk_window_get_device_position(event->window,
1973 event->device, &x, &y, &state);
1975 gdk_window_get_pointer(event->window, &x, &y, &state);
1978 x =
static_cast<int>(
event->x);
1979 y =
static_cast<int>(
event->y);
1980 state =
static_cast<GdkModifierType
>(
event->state);
1986 (event->state & GDK_SHIFT_MASK) != 0,
1987 (event->state & GDK_CONTROL_MASK) != 0,
1999#if GTK_CHECK_VERSION(3,0,0)
2000 case GDK_KEY_ISO_Left_Tab:
2002 case GDK_KEY_KP_Down:
2006 case GDK_KEY_KP_Left:
2008 case GDK_KEY_KP_Right:
2010 case GDK_KEY_KP_Home:
2012 case GDK_KEY_KP_End:
2014 case GDK_KEY_KP_Page_Up:
2016 case GDK_KEY_KP_Page_Down:
2018 case GDK_KEY_KP_Delete:
2020 case GDK_KEY_KP_Insert:
2022 case GDK_KEY_KP_Enter:
2037 case GDK_KEY_Page_Up:
2039 case GDK_KEY_Page_Down:
2041 case GDK_KEY_Delete:
2043 case GDK_KEY_Insert:
2045 case GDK_KEY_Escape:
2047 case GDK_KEY_BackSpace:
2051 case GDK_KEY_Return:
2053 case GDK_KEY_KP_Add:
2055 case GDK_KEY_KP_Subtract:
2057 case GDK_KEY_KP_Divide:
2059 case GDK_KEY_Super_L:
2061 case GDK_KEY_Super_R:
2068 case GDK_ISO_Left_Tab:
2082 case GDK_KP_Page_Up:
2084 case GDK_KP_Page_Down:
2123 case GDK_KP_Subtract:
2143 if (gtk_im_context_filter_keypress(
im_context, event)) {
2146 if (!event->keyval) {
2150 const bool shift = (
event->state & GDK_SHIFT_MASK) != 0;
2151 bool ctrl = (
event->state & GDK_CONTROL_MASK) != 0;
2152 const bool alt = (
event->state & GDK_MOD1_MASK) != 0;
2153 const bool super = (
event->state & GDK_MOD4_MASK) != 0;
2154 guint key =
event->keyval;
2155 if ((ctrl || alt) && (key < 128))
2157#if GTK_CHECK_VERSION(3,0,0)
2158 else if (!ctrl && (key >= GDK_KEY_KP_Multiply && key <= GDK_KEY_KP_9))
2160 else if (!ctrl && (key >= GDK_KP_Multiply && key <= GDK_KP_9))
2165 else if (key >= 0xFE00)
2168 bool consumed =
false;
2169#if !(PLAT_GTK_MACOSX)
2170 const bool meta =
false;
2172 const bool meta = ctrl;
2173 ctrl = (
event->state & GDK_META_MASK) != 0;
2179 if (event->keyval == 0xffffff && event->length > 0) {
2182 if (lengthInserted > 0) {
2195 return sciThis->
KeyThis(event);
2201 if (gtk_im_context_filter_keypress(sciThis->
im_context, event)) {
2207#if GTK_CHECK_VERSION(3,0,0)
2209gboolean ScintillaGTK::DrawPreeditThis(GtkWidget *, cairo_t *cr) {
2212 PangoLayout *layout = gtk_widget_create_pango_layout(
PWidget(
wText), pes.str);
2213 pango_layout_set_attributes(layout, pes.attrs);
2215 cairo_move_to(cr, 0, 0);
2216 pango_cairo_show_layout(cr, layout);
2218 g_object_unref(layout);
2225gboolean ScintillaGTK::DrawPreedit(GtkWidget *widget, cairo_t *cr,
ScintillaGTK *sciThis) {
2226 return sciThis->DrawPreeditThis(widget, cr);
2234 PangoLayout *layout = gtk_widget_create_pango_layout(
PWidget(
wText), pes.str);
2235 pango_layout_set_attributes(layout, pes.attrs);
2237 cairo_t *context = gdk_cairo_create(
reinterpret_cast<GdkDrawable *
>(
WindowFromWidget(widget)));
2238 cairo_move_to(context, 0, 0);
2239 pango_cairo_show_layout(context, layout);
2240 cairo_destroy(context);
2241 g_object_unref(layout);
2256 if (pes.pscript != G_UNICODE_SCRIPT_COMMON)
2263 for (
size_t r=0; r<
sel.
Count(); r++) {
2279 for (
size_t r=0; r<
sel.
Count(); r++) {
2289 const glong charactersLen = g_utf8_strlen(u8Str, strlen(u8Str));
2292 PangoAttrIterator *iterunderline = pango_attr_list_get_iterator(attrs);
2293 if (iterunderline) {
2295 PangoAttribute *attrunderline = pango_attr_iterator_get(iterunderline, PANGO_ATTR_UNDERLINE);
2296 if (attrunderline) {
2297 const glong start = g_utf8_strlen(u8Str, attrunderline->start_index);
2298 const glong end = g_utf8_strlen(u8Str, attrunderline->end_index);
2299 const PangoUnderline uline = (PangoUnderline)((PangoAttrInt *)attrunderline)->value;
2300 for (glong i=start; i < end; ++i) {
2302 case PANGO_UNDERLINE_NONE:
2305 case PANGO_UNDERLINE_SINGLE:
2308 case PANGO_UNDERLINE_DOUBLE:
2309 case PANGO_UNDERLINE_LOW:
2310 case PANGO_UNDERLINE_ERROR:
2315 }
while (pango_attr_iterator_next(iterunderline));
2316 pango_attr_iterator_destroy(iterunderline);
2319 PangoAttrIterator *itercolor = pango_attr_list_get_iterator(attrs);
2322 const PangoAttribute *backcolor = pango_attr_iterator_get(itercolor, PANGO_ATTR_BACKGROUND);
2324 const glong start = g_utf8_strlen(u8Str, backcolor->start_index);
2325 const glong end = g_utf8_strlen(u8Str, backcolor->end_index);
2326 for (glong i=start; i < end; ++i) {
2330 }
while (pango_attr_iterator_next(itercolor));
2331 pango_attr_iterator_destroy(itercolor);
2339 GdkRectangle imeBox = {0};
2340 imeBox.x =
static_cast<gint
>(pt.
x);
2344 gtk_im_context_set_cursor_location(
im_context, &imeBox);
2358 glong uniStrLen = 0;
2359 gunichar *uniStr = g_utf8_to_ucs4_fast(commitStr, strlen(commitStr), &uniStrLen);
2360 for (glong i = 0; i < uniStrLen; i++) {
2362 const gint u8CharLen = g_unichar_to_utf8(uniStr[i], u8Char);
2363 std::string docChar = u8Char;
2365 docChar =
ConvertText(u8Char, u8CharLen, charSetSource,
"UTF-8",
true);
2391 bool initialCompose =
false;
2397 initialCompose =
true;
2403 if (!preeditStr.validUTF8 || (charSetSource ==
nullptr)) {
2408 if (preeditStr.uniStrLen == 0 || preeditStr.uniStrLen >
maxLenInputIME) {
2414 if (initialCompose) {
2421 std::vector<int> indicator =
MapImeIndicators(preeditStr.attrs, preeditStr.str);
2423 for (glong i = 0; i < preeditStr.uniStrLen; i++) {
2425 const gint u8CharLen = g_unichar_to_utf8(preeditStr.uniStr[i], u8Char);
2426 std::string docChar = u8Char;
2428 docChar =
ConvertText(u8Char, u8CharLen, charSetSource,
"UTF-8",
true);
2436 const int imeEndToImeCaretU32 = preeditStr.cursor_pos - preeditStr.uniStrLen;
2443 if (preeditStr.cursor_pos > 0) {
2461 if (strlen(pes.str) > 0) {
2464 PangoLayout *layout = gtk_widget_create_pango_layout(
PWidget(
wText), pes.str);
2465 pango_layout_set_attributes(layout, pes.attrs);
2468 pango_layout_get_pixel_size(layout, &w, &h);
2469 g_object_unref(layout);
2507#if GTK_CHECK_VERSION(3,22,0)
2509#elif GTK_CHECK_VERSION(3,0,0)
2521 ScintillaObject *scio = SCINTILLA(
object);
2542 ScintillaObject *scio = SCINTILLA(
object);
2552 scio->pscin =
nullptr;
2559#if GTK_CHECK_VERSION(3,0,0)
2561gboolean ScintillaGTK::DrawTextThis(cairo_t *cr) {
2569 rgnUpdate = cairo_copy_clip_rectangle_list(cr);
2572 fprintf(stderr,
"DrawTextThis failed to copy update region %d [%d]\n",
rgnUpdate->status,
rgnUpdate->num_rectangles);
2573 cairo_rectangle_list_destroy(
rgnUpdate);
2577 double x1, y1, x2, y2;
2578 cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
2588 surfaceWindow->Release();
2597 cairo_rectangle_list_destroy(
rgnUpdate);
2608gboolean ScintillaGTK::DrawText(GtkWidget *, cairo_t *cr,
ScintillaGTK *sciThis) {
2609 return sciThis->DrawTextThis(cr);
2612gboolean ScintillaGTK::DrawThis(cairo_t *cr) {
2614#ifdef GTK_STYLE_CLASS_SCROLLBARS_JUNCTION
2617 GtkStyleContext *styleContext = gtk_widget_get_style_context(
PWidget(
wMain));
2620 gtk_style_context_save(styleContext);
2621 gtk_style_context_add_class(styleContext, GTK_STYLE_CLASS_SCROLLBARS_JUNCTION);
2623 gtk_render_background(styleContext, cr, rc.
right, rc.
bottom,
2625 gtk_render_frame(styleContext, cr, rc.
right, rc.
bottom,
2628 gtk_style_context_restore(styleContext);
2632 gtk_container_propagate_draw(
2634 gtk_container_propagate_draw(
2639#if GTK_CHECK_VERSION(3,0,0)
2641 if (gtk_check_version(3, 9, 2) ==
nullptr) {
2642 gtk_container_propagate_draw(
2652gboolean ScintillaGTK::DrawMain(GtkWidget *widget, cairo_t *cr) {
2654 return sciThis->DrawThis(cr);
2666 ose->area.x + ose->area.width,
2667 ose->area.y + ose->area.height);
2670 rgnUpdate = gdk_region_copy(ose->region);
2677 surfaceWindow->Release();
2705 return sciThis->
Expose(widget, ose);
2714 gtk_container_propagate_expose(
2716 gtk_container_propagate_expose(
2729 sciThis->
ScrollTo(
static_cast<int>(gtk_adjustment_get_value(adj)),
false);
2744 GtkSelectionData *selection_data, guint) {
2751 GtkSelectionData *selection_data, guint info, guint) {
2770 if (GTK_WIDGET_CLASS(sciThis->
parentClass)->selection_clear_event) {
2771 return GTK_WIDGET_CLASS(sciThis->
parentClass)->selection_clear_event(widget, selection_event);
2777 gint x, gint y, guint dragtime) {
2781 GdkDragAction preferredAction = gdk_drag_context_get_suggested_action(context);
2782 const GdkDragAction actions = gdk_drag_context_get_actions(context);
2787 preferredAction =
static_cast<GdkDragAction
>(0);
2789 preferredAction = GDK_ACTION_MOVE;
2791 gdk_drag_status(context, preferredAction, dragtime);
2799 gint x, gint y, guint dragtime) {
2829 gint, gint, guint) {
2841 gint, gint, GtkSelectionData *selection_data, guint , guint) {
2852 GtkSelectionData *selection_data, guint info, guint) {
2859 const GdkDragAction action = gdk_drag_context_get_selected_action(context);
2860 if (action == GDK_ACTION_MOVE) {
2861 for (
size_t r=0; r<sciThis->
sel.
Count(); r++) {
2888 const bool ret = sciThis->
Idle();
2923 if (sciAccessible &&
pdoc) {
2931 if (sciAccessible) {
2941 guint
const action = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuItem),
"CmdNum"));
2951 if (event->type != GDK_BUTTON_PRESS)
2953 const Point pt = PointOfEvent(event);
2961#if GTK_CHECK_VERSION(3,0,0)
2963gboolean ScintillaGTK::DrawCT(GtkWidget *widget, cairo_t *cr,
CallTip *ctip) {
2966 surfaceWindow->Init(cr, widget);
2968 surfaceWindow->SetDBCSMode(ctip->
codePage);
2969 ctip->
PaintCT(surfaceWindow.get());
2970 surfaceWindow->Release();
2983 surfaceWindow->Init(cr, widget);
2985 surfaceWindow->SetDBCSMode(ctip->
codePage);
2986 ctip->
PaintCT(surfaceWindow.get());
2987 surfaceWindow->Release();
3014 return psci->
WndProc(iMessage, wParam, lParam);
3031 static GType scintilla_type = 0;
3034 if (!scintilla_type) {
3035 scintilla_type = g_type_from_name(
"ScintillaObject");
3036 if (!scintilla_type) {
3037 static GTypeInfo scintilla_info = {
3038 (guint16)
sizeof(ScintillaObjectClass),
3044 (guint16)
sizeof(ScintillaObject),
3049 scintilla_type = g_type_register_static(
3050 GTK_TYPE_CONTAINER,
"ScintillaObject", &scintilla_info, (GTypeFlags) 0);
3056 return scintilla_type;
3066 atomUTF8 = gdk_atom_intern(
"UTF8_STRING", FALSE);
3067 atomUTF8Mime = gdk_atom_intern(
"text/plain;charset=utf-8", FALSE);
3069 atomUriList = gdk_atom_intern(
"text/uri-list", FALSE);
3076 object_class->dispose =
Dispose;
3077 object_class->finalize =
Destroy;
3078#if GTK_CHECK_VERSION(3,0,0)
3079 widget_class->get_preferred_width = GetPreferredWidth;
3080 widget_class->get_preferred_height = GetPreferredHeight;
3085#if GTK_CHECK_VERSION(3,0,0)
3086 widget_class->draw = DrawMain;
3090 widget_class->motion_notify_event =
Motion;
3091 widget_class->button_press_event =
Press;
3094 widget_class->key_press_event =
KeyPress;
3095 widget_class->key_release_event =
KeyRelease;
3096 widget_class->focus_in_event =
FocusIn;
3097 widget_class->focus_out_event =
FocusOut;
3105 widget_class->drag_end =
DragEnd;
3106 widget_class->drag_drop =
Drop;
3109 widget_class->realize =
Realize;
3111 widget_class->map =
Map;
3112 widget_class->unmap =
UnMap;
3122 GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
3123 GtkContainerClass *container_class = (GtkContainerClass *) klass;
3125 const GSignalFlags sigflags = GSignalFlags(G_SIGNAL_ACTION | G_SIGNAL_RUN_LAST);
3128 G_TYPE_FROM_CLASS(object_class),
3130 G_STRUCT_OFFSET(ScintillaClass,
command),
3135 2, G_TYPE_INT, GTK_TYPE_WIDGET);
3139 G_TYPE_FROM_CLASS(object_class),
3141 G_STRUCT_OFFSET(ScintillaClass, notify),
3146 2, G_TYPE_INT, SCINTILLA_TYPE_NOTIFICATION);
3148 klass->command =
nullptr;
3149 klass->notify =
nullptr;
3158 gtk_widget_set_can_focus(GTK_WIDGET(
sci), TRUE);
3168 gtk_widget_set_direction(widget, GTK_TEXT_DIR_LTR);
3193static void *
copy_(
void *src) {
return src; }
3198 static gsize type_id = 0;
3199 if (g_once_init_enter(&type_id)) {
3200 const gsize
id = (gsize) g_boxed_type_register_static(
3201 g_intern_static_string(
"SCNotification"),
3202 (GBoxedCopyFunc)
copy_,
3203 (GBoxedFreeFunc)
free_);
3204 g_once_init_leave(&type_id,
id);
3206 return (GType) type_id;
Defines the auto completion list box.
Interface to the call tip control.
Performs Unicode case conversions.
Classes for case folding.
Manages the text of the document.
Character classifications used by Document and RESearch.
Returns the Unicode general category of a character.
Manages visibility of lines for folding and wrapping.
Visual elements added over text.
Text document that handles notifications, DBCS, styling, words and end of line.
Defines the editor state that must be visible to EditorView.
Defines the appearance of the main text area of the editor window.
Defines the main editor class.
Interface between Scintilla and lexers.
Interface for loading into a Scintilla document from a background thread.
Defines the style of indicators which are text decorations such as underlining.
Defines a mapping between keystrokes and commands.
Defines the look of a line marker in the margin .
Defines the appearance of the editor margin.
Data structure used to partition an interval.
Classes for caching layout information.
Defines global type name Position in the Sci internal namespace.
Data structure used to store sparse styles.
Defines an enhanced subclass of Editor with calltips, autocomplete and context menu.
GType scnotification_get_type(void)
static constexpr gint nClipboardPasteTargets
GtkWidget * scintilla_object_new()
void scintilla_set_id(ScintillaObject *sci, uptr_t id)
const char * CharacterSetID(int characterSet)
std::string UTF8FromLatin1(const char *s, int len)
static GObjectClass * scintilla_class_parent_class
static constexpr gint nClipboardCopyTargets
GType scintilla_object_get_type()
static GdkWindow * WindowFromWidget(GtkWidget *w) noexcept
static void * copy_(void *src)
static void UnRefCursor(GdkCursor *cursor) noexcept
static void MapWidget(GtkWidget *widget) noexcept
static const GtkTargetEntry clipboardPasteTargets[]
static GdkAtom SelectionOfGSD(GtkSelectionData *sd) noexcept
gintptr scintilla_object_send_message(ScintillaObject *sci, unsigned int iMessage, uptr_t wParam, sptr_t lParam)
#define IS_WIDGET_MAPPED(w)
#define IS_WIDGET_REALIZED(w)
void Platform_Initialise()
static const GdkDragAction actionCopyOrMove
#define SC_INDICATOR_UNKNOWN
static std::vector< int > MapImeIndicators(PangoAttrList *attrs, const char *u8Str)
#define SC_INDICATOR_TARGET
static gint LengthOfGSD(GtkSelectionData *sd) noexcept
#define SC_INDICATOR_INPUT
static GtkWidget * PWidget(const Window &w) noexcept
sptr_t scintilla_send_message(ScintillaObject *sci, unsigned int iMessage, uptr_t wParam, sptr_t lParam)
GType scintilla_get_type()
static gint scintilla_signals[LAST_SIGNAL]
static const GtkTargetEntry clipboardCopyTargets[]
static const guchar * DataOfGSD(GtkSelectionData *sd) noexcept
#define SC_INDICATOR_CONVERTED
GtkWidget * scintilla_new()
static GdkWindow * PWindow(const Window &w) noexcept
static void free_(void *)
static GdkAtom TypeOfGSD(GtkSelectionData *sd) noexcept
static void scintilla_class_init(ScintillaClass *klass)
static int KeyTranslate(int keyIn) noexcept
static void scintilla_init(ScintillaObject *sci)
void scintilla_release_resources(void)
Interface to the edit control.
#define SCI_GETDIRECTPOINTER
#define SCI_SETACCESSIBILITY
#define SCI_SETRECTANGULARSELECTIONMODIFIER
#define INDIC_COMPOSITIONTHICK
#define SC_ACCESSIBILITY_ENABLED
#define SC_STATUS_BADALLOC
#define SC_TECHNOLOGY_DEFAULT
#define INDIC_STRAIGHTBOX
#define SC_STATUS_FAILURE
#define SCI_GETRECTANGULARSELECTIONMODIFIER
#define SCI_GETDIRECTFUNCTION
#define SCI_GETACCESSIBILITY
#define SCI_ENCODEDFROMUTF8
#define SC_MULTIPASTE_EACH
Classes maintaining the selection.
Main data structure for holding arrays that handle insertions and deletions efficiently.
Safe string copy function which always NUL terminates.
Defines the font and colour style for a class of text.
Functions to handle UTF-8 and UTF-16 strings.
Define UniqueString, a unique_ptr based string type for storage in containers and an allocator for Un...
Store information on how the document is to be viewed.
size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) override
CaseFolderDBCS(const char *charSet_)
void PaintCT(Surface *surfaceWindow)
void MouseClick(Point pt) noexcept
void SetTranslation(char ch, char chTranslation) noexcept
void StandardASCII() noexcept
Encapsulate g_iconv safely.
gsize Convert(char **src, gsize *srcleft, char **dst, gsize *dstleft) const noexcept
int dbcsCodePage
Can also be SC_CP_UTF8 to enable UTF-8 mode.
Sci::Position InsertString(Sci::Position position, const char *s, Sci::Position insertLength)
Insert a string with a length.
int SCI_METHOD Release() override
void SCI_METHOD DecorationFillRange(Sci_Position position, int value, Sci_Position fillLength) override
void SCI_METHOD DecorationSetCurrentIndicator(int indicator) override
static std::string TransformLineEnds(const char *s, size_t len, int eolModeWanted)
bool TentativeActive() const noexcept
bool IsReadOnly() const noexcept
Sci_Position SCI_METHOD GetRelativePosition(Sci_Position positionStart, Sci_Position characterOffset) const override
void SCI_METHOD GetCharRange(char *buffer, Sci_Position position, Sci_Position lengthRetrieve) const override
int xOffset
Horizontal scrolled amount in pixels.
enum Scintilla::EditModel::IMEInteraction imeInteraction
SelectionPosition posDrag
bool imeCaretBlockOverride
void ClearBeforeTentativeStart()
static int ModifierFlags(bool shift, bool ctrl, bool alt, bool meta=false, bool super=false) noexcept
bool horizontalScrollBarVisible
enum Scintilla::Editor::@65 paintState
void DwellEnd(bool mouseMoved)
bool IsUnicodeMode() const noexcept
Sci::Position PositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false)
void ScrollTo(Sci::Line line, bool moveThumb=true)
SelectionPosition SPositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false, bool virtualSpace=true)
void InsertPasteShape(const char *text, Sci::Position len, PasteShape shape)
PRectangle GetTextRectangle() const
int KeyDownWithModifiers(int key, int modifiers, bool *consumed)
virtual void QueueIdleWork(WorkNeeded::workItems items, Sci::Position upTo=0)
void ShowCaretAtCurrentPosition()
void SetEmptySelection(SelectionPosition currentPos_)
void ButtonMoveWithModifiers(Point pt, unsigned int curTime, int modifiers)
SelectionPosition posDrop
void SetDragPosition(SelectionPosition newPos)
SelectionSegment targetRange
static const char * ConstCharPtrFromUPtr(uptr_t wParam) noexcept
void ClearSelection(bool retainMultipleSelections=false)
void SetSelection(SelectionPosition currentPos_, SelectionPosition anchor_)
void EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true)
virtual void NotifyFocus(bool focus)
bool PositionInSelection(Sci::Position pos)
PositionInSelection returns true if position in selection.
bool UserVirtualSpace() const noexcept
virtual void TickFor(TickReason reason)
std::string RangeText(Sci::Position start, Sci::Position end) const
void DropAt(SelectionPosition position, const char *value, size_t lengthValue, bool moving, bool rectangular)
void MovePositionTo(SelectionPosition newPos, Selection::selTypes selt=Selection::noSel, bool ensureVisible=true)
void SetFocusState(bool focusState)
Sci::Line LinesToScroll() const
void CopySelectionRange(SelectionText *ss, bool allowLineCopy=false)
void HorizontalScrollTo(int xPos)
Window wMain
On GTK+, Scintilla is a container widget holding two scroll bars whereas on Windows there is just one...
bool SelectionContainsProtected() const
void DropGraphics(bool freeObjects)
bool Wrapping() const noexcept
void Paint(Surface *surfaceWindow, PRectangle rcArea)
static char * CharPtrFromSPtr(sptr_t lParam) noexcept
Sci::Position CurrentPosition() const
Sci::Position lengthForEncode
bool PointInSelection(Point pt)
void ButtonUpWithModifiers(Point pt, unsigned int curTime, int modifiers)
bool verticalScrollBarVisible
enum Scintilla::Editor::@64 inDragDrop
virtual void SetDocPointer(Document *document)
A geometric rectangle class.
static constexpr PRectangle FromInts(int left_, int top_, int right_, int bottom_) noexcept
constexpr XYPOSITION Height() const noexcept
constexpr XYPOSITION Width() const noexcept
constexpr bool Contains(Point pt) const noexcept
static constexpr Point FromInts(int x_, int y_) noexcept
sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override
void ContextMenu(Point pt)
bool ShouldDisplayPopup(Point ptInWindowCoordinates) const
void RightButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) override
int KeyCommand(unsigned int iMessage) override
void InsertCharacter(const char *s, unsigned int len, CharacterSource charSource) override
void ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) override
void ChangeDocument(Document *oldDoc, Document *newDoc)
static ScintillaGTKAccessible * FromAccessible(GtkAccessible *accessible)
void SetAccessibility(bool enabled)
static AtkObject * WidgetGetAccessibleImpl(GtkWidget *widget, AtkObject **cache, gpointer widget_parent_class)
static void Realize(GtkWidget *widget)
void SetVerticalScrollPos() override
static void PopUpCB(GtkMenuItem *menuItem, ScintillaGTK *sciThis)
sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override
static gboolean TimeOut(gpointer ptt)
bool ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) override
PRectangle GetClientRectangle() const override
void SetMouseCapture(bool on) override
static GdkAtom atomString
static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event)
bool PaintContains(PRectangle rc) override
void ScrollText(Sci::Line linesToMove) override
void FineTickerCancel(TickReason reason) override
static void MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data)
static AtkObject * GetAccessible(GtkWidget *widget)
static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis)
static gboolean Drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time)
static gint FocusIn(GtkWidget *widget, GdkEventFocus *event)
void PreeditChangedWindowedThis()
gboolean DragMotionThis(GdkDragContext *context, gint x, gint y, guint dragtime)
static gboolean KeyRelease(GtkWidget *widget, GdkEventKey *event)
static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event)
void CommitThis(char *commitStr)
static void Map(GtkWidget *widget)
gboolean ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose)
CaseFolder * CaseFolderForEncoding() override
void NotifyParent(SCNotification scn) override
static gint Press(GtkWidget *widget, GdkEventButton *event)
int horizontalScrollBarHeight
void ReceivedSelection(GtkSelectionData *selection_data)
gboolean Expose(GtkWidget *widget, GdkEventExpose *ose)
static void DragEnd(GtkWidget *widget, GdkDragContext *context)
bool AbandonPaint() override
If painting then abandon the painting because a wider redraw is needed.
int rectangularSelectionModifier
static gint MouseRelease(GtkWidget *widget, GdkEventButton *event)
void NotifyFocus(bool focus) override
static gint FocusOut(GtkWidget *widget, GdkEventFocus *event)
GtkAdjustment * adjustmenth
void UnclaimSelection(GdkEventSelection *selection_event)
static void UnRealize(GtkWidget *widget)
void QueueIdleWork(WorkNeeded::workItems items, Sci::Position upTo) override
static void DragDataGet(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time)
gboolean ExposeTextThis(GtkWidget *widget, GdkEventExpose *ose)
GtkAdjustment * adjustmentv
void AddToPopUp(const char *label, int cmd=0, bool enabled=true) override
static gint Motion(GtkWidget *widget, GdkEventMotion *event)
static gboolean StyleIdle(gpointer pSci)
GUnicodeScript lastNonCommonScript
void CopyToClipboard(const SelectionText &selectedText) override
bool ValidCodePage(int codePage) const override
static void SizeRequest(GtkWidget *widget, GtkRequisition *requisition)
static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis)
static void DragDataReceived(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time)
bool FineTickerRunning(TickReason reason) override
int KeyDefault(int key, int modifiers) override
void ReconfigureScrollBars() override
void CreateCallTipWindow(PRectangle rc) override
void ClaimSelection() override
GtkIMContext * im_context
static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis)
static void RealizeText(GtkWidget *widget, void *)
void UnRealizeThis(GtkWidget *widget)
int verticalScrollBarWidth
gint64 lastWheelMouseTime
static void ClassInit(GObjectClass *object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class)
GObject * MainObject() const noexcept
static void SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time)
static void ClipboardClearSelection(GtkClipboard *clip, void *data)
Sci::Position TargetAsUTF8(char *text) const
static void UnMap(GtkWidget *widget)
void Resize(int width, int height)
static void PrimarySelection(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time_stamp, ScintillaGTK *sciThis)
static void DragLeave(GtkWidget *widget, GdkDragContext *context, guint time)
static void PreeditChanged(GtkIMContext *context, ScintillaGTK *sciThis)
void SetHorizontalScrollPos() override
gint FocusInThis(GtkWidget *widget)
bool DragThreshold(Point ptStart, Point ptNow) override
static gboolean DragMotion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint dragtime)
void StoreOnClipboard(SelectionText *clipText)
static void StyleSetText(GtkWidget *widget, GtkStyle *previous, void *)
void ReceivedClipboard(GtkClipboard *clipBoard, GtkSelectionData *selection_data) noexcept
static void ClipboardGetSelection(GtkClipboard *clip, GtkSelectionData *selection_data, guint info, void *data)
GtkWidgetClass * parentClass
void SetCandidateWindowPos()
static gboolean PrimaryClear(GtkWidget *widget, GdkEventSelection *event, ScintillaGTK *sciThis)
unsigned int linesPerScroll
static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text)
bool HaveMouseCapture() override
static gboolean ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis)
TimeThunk timers[tickDwell+1]
void StartDrag() override
static gboolean IdleCallback(gpointer pSci)
void NotifyURIDropped(const char *list)
gint PressThis(GdkEventButton *event)
static void Dispose(GObject *object)
static gboolean ExposeMain(GtkWidget *widget, GdkEventExpose *ose)
gboolean KeyThis(GdkEventKey *event)
gint FocusOutThis(GtkWidget *widget)
static gint SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event)
static void Destroy(GObject *object)
static sptr_t DirectFunction(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam)
static GdkAtom atomUTF8Mime
static ScintillaGTK * FromWidget(GtkWidget *widget) noexcept
void NotifyKey(int key, int modifiers)
static gboolean ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis)
void InsertSelection(GtkClipboard *clipBoard, GtkSelectionData *selectionData)
void GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText)
void RealizeThis(GtkWidget *widget)
sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override
gint lastWheelMouseDirection
void FineTickerStart(TickReason reason, int millis, int tolerance) override
void RequestSelection(GdkAtom atomSelection)
void DrawImeIndicator(int indicator, int len)
static bool IsStringAtom(GdkAtom type)
static void SizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
void PreeditChangedInlineThis()
void ReceivedDrop(GtkSelectionData *selection_data)
static GdkAtom atomDROPFILES_DND
void DisplayCursor(Window::Cursor c) override
static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data, guint time)
const char * CharacterSetID() const
static gboolean PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis)
void MoveImeCarets(int pos)
std::string CaseMapString(const std::string &s, int caseMapping) override
void ForAll(GtkCallback callback, gpointer callback_data)
bool SetIdle(bool on) override
void SetDocPointer(Document *document) override
static GdkAtom atomUriList
Sci::Position EncodedFromUTF8(const char *utf8, char *encoded) const
bool OwnPrimarySelection()
AtkObject * GetAccessibleThis(GtkWidget *widget)
static gboolean ExposeCT(GtkWidget *widget, GdkEventExpose *ose, CallTip *ctip)
void NotifyChange() override
Sci::Position Position() const noexcept
void Add(Sci::Position increment) noexcept
void SetPosition(Sci::Position position_) noexcept
Hold a piece of text selected for copying or dragging, along with encoding and selection format infor...
void Copy(const std::string &s_, int codePage_, int characterSet_, bool rectangular_, bool lineCopy_)
size_t Length() const noexcept
bool Empty() const noexcept
const char * Data() const noexcept
bool IsRectangular() const noexcept
size_t Count() const noexcept
SelectionRange & Range(size_t r) noexcept
bool Empty() const noexcept
static Surface * Allocate(int technology)
std::vector< Style > styles
std::vector< Indicator > indicators
Class to hide the details of window manipulation.
bool Created() const noexcept
PRectangle GetClientPosition() const
void SetCursor(Cursor curs)
void Show(bool show=true)
const Position invalidPosition
Styling buffer using one element for each run rather than using a filled buffer.
constexpr int UTF8MaxBytes
std::string ConvertText(const char *s, size_t len, const char *charSetDest, const char *charSetSource, bool transliterations, bool silent)
size_t CaseConvertString(char *converted, size_t sizeConverted, const char *mixed, size_t lenMixed, enum CaseConversion conversion)
constexpr size_t maxExpansionCaseConversion
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)
void 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)
gtk_container_add(GTK_CONTAINER(dialog->vbox), check_button)
SelectionPosition Start() const noexcept
SelectionPosition End() const noexcept
Sci::Position Length() const noexcept
Sci::Position Length() const noexcept