[geany/geany] 4bcedd: Update Scintilla to version 3.10.4
Colomban Wendling
git-noreply at xxxxx
Sun Apr 28 17:02:15 UTC 2019
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Sun, 28 Apr 2019 17:02:15 UTC
Commit: 4bceddb449b8727e1d8b449a5d92af5fa53a2405
https://github.com/geany/geany/commit/4bceddb449b8727e1d8b449a5d92af5fa53a2405
Log Message:
-----------
Update Scintilla to version 3.10.4
Modified Paths:
--------------
scintilla/Makefile.am
scintilla/gtk/Converter.h
scintilla/gtk/PlatGTK.cxx
scintilla/gtk/ScintillaGTK.cxx
scintilla/gtk/ScintillaGTK.h
scintilla/gtk/ScintillaGTKAccessible.cxx
scintilla/include/Platform.h
scintilla/include/SciLexer.h
scintilla/include/Scintilla.h
scintilla/include/Scintilla.iface
scintilla/lexers/LexCPP.cxx
scintilla/lexers/LexHaskell.cxx
scintilla/lexers/LexTCL.cxx
scintilla/lexlib/CharacterCategory.cxx
scintilla/lexlib/CharacterCategory.h
scintilla/lexlib/CharacterSet.h
scintilla/lexlib/StyleContext.cxx
scintilla/scintilla_changes.patch
scintilla/src/CallTip.cxx
scintilla/src/CaseConvert.cxx
scintilla/src/CaseFolder.cxx
scintilla/src/CaseFolder.h
scintilla/src/CharClassify.cxx
scintilla/src/ContractionState.cxx
scintilla/src/ContractionState.h
scintilla/src/DBCS.h
scintilla/src/Document.cxx
scintilla/src/Document.h
scintilla/src/EditModel.cxx
scintilla/src/EditModel.h
scintilla/src/EditView.cxx
scintilla/src/EditView.h
scintilla/src/Editor.cxx
scintilla/src/Editor.h
scintilla/src/ElapsedPeriod.h
scintilla/src/Indicator.cxx
scintilla/src/Indicator.h
scintilla/src/KeyMap.h
scintilla/src/LineMarker.cxx
scintilla/src/LineMarker.h
scintilla/src/MarginView.cxx
scintilla/src/MarginView.h
scintilla/src/PerLine.h
scintilla/src/PositionCache.cxx
scintilla/src/PositionCache.h
scintilla/src/RESearch.h
scintilla/src/ScintillaBase.cxx
scintilla/src/ScintillaBase.h
scintilla/src/Selection.cxx
scintilla/src/Selection.h
scintilla/src/Style.cxx
scintilla/src/Style.h
scintilla/src/UniConversion.cxx
scintilla/src/UniConversion.h
scintilla/src/UniqueString.cxx
scintilla/src/UniqueString.h
scintilla/src/ViewStyle.cxx
scintilla/src/ViewStyle.h
scintilla/src/XPM.h
scintilla/version.txt
Modified: scintilla/Makefile.am
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -148,6 +148,7 @@ src/Style.h \
src/UniConversion.cxx \
src/UniConversion.h \
src/UnicodeFromUTF8.h \
+src/UniqueString.cxx \
src/UniqueString.h \
src/ViewStyle.cxx \
src/ViewStyle.h \
Modified: scintilla/gtk/Converter.h
14 lines changed, 7 insertions(+), 7 deletions(-)
===================================================================
@@ -15,24 +15,24 @@ const gsize sizeFailure = static_cast<gsize>(-1);
*/
class Converter {
GIConv iconvh;
- void OpenHandle(const char *fullDestination, const char *charSetSource) {
+ void OpenHandle(const char *fullDestination, const char *charSetSource) noexcept {
iconvh = g_iconv_open(fullDestination, charSetSource);
}
- bool Succeeded() const {
+ bool Succeeded() const noexcept {
return iconvh != iconvhBad;
}
public:
- Converter() {
+ Converter() noexcept {
iconvh = iconvhBad;
}
Converter(const char *charSetDestination, const char *charSetSource, bool transliterations) {
iconvh = iconvhBad;
- Open(charSetDestination, charSetSource, transliterations);
+ Open(charSetDestination, charSetSource, transliterations);
}
~Converter() {
Close();
}
- operator bool() const {
+ operator bool() const noexcept {
return Succeeded();
}
void Open(const char *charSetDestination, const char *charSetSource, bool transliterations) {
@@ -50,13 +50,13 @@ class Converter {
}
}
}
- void Close() {
+ void Close() noexcept {
if (Succeeded()) {
g_iconv_close(iconvh);
iconvh = iconvhBad;
}
}
- gsize Convert(char** src, gsize *srcleft, char **dst, gsize *dstleft) const {
+ gsize Convert(char **src, gsize *srcleft, char **dst, gsize *dstleft) const noexcept {
if (!Succeeded()) {
return sizeFailure;
} else {
Modified: scintilla/gtk/PlatGTK.cxx
393 lines changed, 202 insertions(+), 191 deletions(-)
===================================================================
@@ -12,6 +12,7 @@
#include <string>
#include <vector>
#include <map>
+#include <algorithm>
#include <memory>
#include <sstream>
@@ -26,56 +27,63 @@
#include "Scintilla.h"
#include "ScintillaWidget.h"
#include "StringCopy.h"
+#include "IntegerRectangle.h"
#include "XPM.h"
#include "UniConversion.h"
#include "Converter.h"
-static const double kPi = 3.14159265358979323846;
+#ifdef _MSC_VER
+// Ignore unreferenced local functions in GTK+ headers
+#pragma warning(disable: 4505)
+#endif
+
+using namespace Scintilla;
+
+namespace {
+
+const double kPi = 3.14159265358979323846;
// The Pango version guard for pango_units_from_double and pango_units_to_double
// is more complex than simply implementing these here.
-static int pangoUnitsFromDouble(double d) {
+int pangoUnitsFromDouble(double d) noexcept {
return static_cast<int>(d * PANGO_SCALE + 0.5);
}
-static double doubleFromPangoUnits(int pu) {
- return static_cast<double>(pu) / PANGO_SCALE;
+float floatFromPangoUnits(int pu) noexcept {
+ return static_cast<float>(pu) / PANGO_SCALE;
}
-static cairo_surface_t *CreateSimilarSurface(GdkWindow *window, cairo_content_t content, int width, int height) {
+cairo_surface_t *CreateSimilarSurface(GdkWindow *window, cairo_content_t content, int width, int height) noexcept {
return gdk_window_create_similar_surface(window, content, width, height);
}
-static GdkWindow *WindowFromWidget(GtkWidget *w) {
+GdkWindow *WindowFromWidget(GtkWidget *w) noexcept {
return gtk_widget_get_window(w);
}
-#ifdef _MSC_VER
-// Ignore unreferenced local functions in GTK+ headers
-#pragma warning(disable: 4505)
-#endif
-
-using namespace Scintilla;
+GtkWidget *PWidget(WindowID wid) noexcept {
+ return static_cast<GtkWidget *>(wid);
+}
-enum encodingType { singleByte, UTF8, dbcs};
+enum encodingType { singleByte, UTF8, dbcs };
// Holds a PangoFontDescription*.
class FontHandle {
public:
PangoFontDescription *pfd;
int characterSet;
- FontHandle() : pfd(0), characterSet(-1) {
+ FontHandle() noexcept : pfd(nullptr), characterSet(-1) {
}
- FontHandle(PangoFontDescription *pfd_, int characterSet_) {
+ FontHandle(PangoFontDescription *pfd_, int characterSet_) noexcept {
pfd = pfd_;
characterSet = characterSet_;
}
~FontHandle() {
if (pfd)
pango_font_description_free(pfd);
- pfd = 0;
+ pfd = nullptr;
}
static FontHandle *CreateNewFont(const FontParameters &fp);
};
@@ -88,24 +96,22 @@ FontHandle *FontHandle::CreateNewFont(const FontParameters &fp) {
pango_font_description_set_size(pfd, pangoUnitsFromDouble(fp.size));
pango_font_description_set_weight(pfd, static_cast<PangoWeight>(fp.weight));
pango_font_description_set_style(pfd, fp.italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL);
- return new FontHandle(pfd,fp.characterSet);
+ return new FontHandle(pfd, fp.characterSet);
}
- return NULL;
+ return nullptr;
}
// X has a 16 bit coordinate space, so stop drawing here to avoid wrapping
-static const int maxCoordinate = 32000;
+const int maxCoordinate = 32000;
-static FontHandle *PFont(Font &f) {
+FontHandle *PFont(const Font &f) noexcept {
return static_cast<FontHandle *>(f.GetID());
}
-static GtkWidget *PWidget(WindowID wid) {
- return static_cast<GtkWidget *>(wid);
}
-Font::Font() noexcept : fid(0) {}
+Font::Font() noexcept : fid(nullptr) {}
Font::~Font() {}
@@ -117,7 +123,7 @@ void Font::Create(const FontParameters &fp) {
void Font::Release() {
if (fid)
delete static_cast<FontHandle *>(fid);
- fid = 0;
+ fid = nullptr;
}
// Required on OS X
@@ -138,14 +144,14 @@ class SurfaceImpl : public Surface {
int characterSet;
void SetConverter(int characterSet_);
public:
- SurfaceImpl();
+ SurfaceImpl() noexcept;
~SurfaceImpl() override;
void Init(WindowID wid) override;
void Init(SurfaceID sid, WindowID wid) override;
void InitPixMap(int width, int height, Surface *surface_, WindowID wid) override;
- void Clear();
+ void Clear() noexcept;
void Release() override;
bool Initialised() override;
void PenColour(ColourDesired fore) override;
@@ -185,7 +191,7 @@ class SurfaceImpl : public Surface {
};
}
-const char *CharacterSetID(int characterSet) {
+const char *CharacterSetID(int characterSet) noexcept {
switch (characterSet) {
case SC_CHARSET_ANSI:
return "";
@@ -243,33 +249,33 @@ void SurfaceImpl::SetConverter(int characterSet_) {
}
}
-SurfaceImpl::SurfaceImpl() : et(singleByte),
-context(0),
-psurf(0),
-x(0), y(0), inited(false), createdGC(false)
-, pcontext(0), layout(0), characterSet(-1) {
+SurfaceImpl::SurfaceImpl() noexcept : et(singleByte),
+context(nullptr),
+psurf(nullptr),
+x(0), y(0), inited(false), createdGC(false),
+pcontext(nullptr), layout(nullptr), characterSet(-1) {
}
SurfaceImpl::~SurfaceImpl() {
Clear();
}
-void SurfaceImpl::Clear() {
+void SurfaceImpl::Clear() noexcept {
et = singleByte;
if (createdGC) {
createdGC = false;
cairo_destroy(context);
}
- context = 0;
+ context = nullptr;
if (psurf)
cairo_surface_destroy(psurf);
- psurf = 0;
+ psurf = nullptr;
if (layout)
g_object_unref(layout);
- layout = 0;
+ layout = nullptr;
if (pcontext)
g_object_unref(pcontext);
- pcontext = 0;
+ pcontext = nullptr;
conv.Close();
characterSet = -1;
x = 0;
@@ -306,8 +312,8 @@ void SurfaceImpl::Init(WindowID wid) {
Release();
PLATFORM_ASSERT(wid);
// if we are only created from a window ID, we can't perform drawing
- psurf = 0;
- context = 0;
+ psurf = nullptr;
+ context = nullptr;
createdGC = false;
pcontext = gtk_widget_create_pango_context(PWidget(wid));
PLATFORM_ASSERT(pcontext);
@@ -361,7 +367,7 @@ void SurfaceImpl::InitPixMap(int width, int height, Surface *surface_, WindowID
void SurfaceImpl::PenColour(ColourDesired fore) {
if (context) {
- ColourDesired cdFore(fore.AsInteger());
+ const ColourDesired cdFore(fore.AsInteger());
cairo_set_source_rgb(context,
cdFore.GetRed() / 255.0,
cdFore.GetGreen() / 255.0,
@@ -374,7 +380,7 @@ int SurfaceImpl::LogPixelsY() {
}
int SurfaceImpl::DeviceHeightFont(int points) {
- int logPix = LogPixelsY();
+ const int logPix = LogPixelsY();
return (points * logPix + logPix / 2) / 72;
}
@@ -383,7 +389,7 @@ void SurfaceImpl::MoveTo(int x_, int y_) {
y = y_;
}
-static int Delta(int difference) {
+static int Delta(int difference) noexcept {
if (difference < 0)
return -1;
else if (difference > 0)
@@ -396,21 +402,21 @@ void SurfaceImpl::LineTo(int x_, int y_) {
// cairo_line_to draws the end position, unlike Win32 or GDK with GDK_CAP_NOT_LAST.
// For simple cases, move back one pixel from end.
if (context) {
- int xDiff = x_ - x;
- int xDelta = Delta(xDiff);
- int yDiff = y_ - y;
- int yDelta = Delta(yDiff);
+ const int xDiff = x_ - x;
+ const int xDelta = Delta(xDiff);
+ const int yDiff = y_ - y;
+ const int yDelta = Delta(yDiff);
if ((xDiff == 0) || (yDiff == 0)) {
// Horizontal or vertical lines can be more precisely drawn as a filled rectangle
- int xEnd = x_ - xDelta;
- int left = std::min(x, xEnd);
- int width = abs(x - xEnd) + 1;
- int yEnd = y_ - yDelta;
- int top = std::min(y, yEnd);
- int height = abs(y - yEnd) + 1;
+ const int xEnd = x_ - xDelta;
+ const int left = std::min(x, xEnd);
+ const int width = std::abs(x - xEnd) + 1;
+ const int yEnd = y_ - yDelta;
+ const int top = std::min(y, yEnd);
+ const int height = std::abs(y - yEnd) + 1;
cairo_rectangle(context, left, top, width, height);
cairo_fill(context);
- } else if ((abs(xDiff) == abs(yDiff))) {
+ } else if ((std::abs(xDiff) == std::abs(yDiff))) {
// 45 degree slope
cairo_move_to(context, x + 0.5, y + 0.5);
cairo_line_to(context, x_ + 0.5 - xDelta, y_ + 0.5 - yDelta);
@@ -453,8 +459,8 @@ void SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired
void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) {
PenColour(back);
if (context && (rc.left < maxCoordinate)) { // Protect against out of range
- rc.left = lround(rc.left);
- rc.right = lround(rc.right);
+ rc.left = std::round(rc.left);
+ rc.right = std::round(rc.right);
cairo_rectangle(context, rc.left, rc.top,
rc.right - rc.left, rc.bottom - rc.top);
cairo_fill(context);
@@ -463,17 +469,18 @@ void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) {
void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) {
SurfaceImpl &surfi = static_cast<SurfaceImpl &>(surfacePattern);
- bool canDraw = surfi.psurf != NULL;
+ const bool canDraw = surfi.psurf != nullptr;
if (canDraw) {
PLATFORM_ASSERT(context);
// Tile pattern over rectangle
// Currently assumes 8x8 pattern
- int widthPat = 8;
- int heightPat = 8;
- for (int xTile = rc.left; xTile < rc.right; xTile += widthPat) {
- int widthx = (xTile + widthPat > rc.right) ? rc.right - xTile : widthPat;
- for (int yTile = rc.top; yTile < rc.bottom; yTile += heightPat) {
- int heighty = (yTile + heightPat > rc.bottom) ? rc.bottom - yTile : heightPat;
+ const int widthPat = 8;
+ const int heightPat = 8;
+ const IntegerRectangle irc(rc);
+ for (int xTile = irc.left; xTile < irc.right; xTile += widthPat) {
+ const int widthx = (xTile + widthPat > irc.right) ? irc.right - xTile : widthPat;
+ for (int yTile = irc.top; yTile < irc.bottom; yTile += heightPat) {
+ const int heighty = (yTile + heightPat > irc.bottom) ? irc.bottom - yTile : heightPat;
cairo_set_source_surface(context, surfi.psurf, xTile, yTile);
cairo_rectangle(context, xTile, yTile, widthx, heighty);
cairo_fill(context);
@@ -505,8 +512,8 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesi
}
}
-static void PathRoundRectangle(cairo_t *context, double left, double top, double width, double height, int radius) {
- double degrees = kPi / 180.0;
+static void PathRoundRectangle(cairo_t *context, double left, double top, double width, double height, int radius) noexcept {
+ const double degrees = kPi / 180.0;
cairo_new_sub_path(context);
cairo_arc(context, left + width - radius, top + radius, radius, -90 * degrees, 0 * degrees);
@@ -519,7 +526,7 @@ static void PathRoundRectangle(cairo_t *context, double left, double top, double
void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
ColourDesired outline, int alphaOutline, int /*flags*/) {
if (context && rc.Width() > 0) {
- ColourDesired cdFill(fill.AsInteger());
+ const ColourDesired cdFill(fill.AsInteger());
cairo_set_source_rgba(context,
cdFill.GetRed() / 255.0,
cdFill.GetGreen() / 255.0,
@@ -531,7 +538,7 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fi
cairo_rectangle(context, rc.left + 1.0, rc.top + 1.0, rc.right - rc.left - 2.0, rc.bottom - rc.top - 2.0);
cairo_fill(context);
- ColourDesired cdOutline(outline.AsInteger());
+ const ColourDesired cdOutline(outline.AsInteger());
cairo_set_source_rgba(context,
cdOutline.GetRed() / 255.0,
cdOutline.GetGreen() / 255.0,
@@ -581,12 +588,12 @@ void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsi
rc.bottom = rc.top + height;
int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
- int ucs = stride * height;
+ const int ucs = stride * height;
std::vector<unsigned char> image(ucs);
for (int iy=0; iy<height; iy++) {
for (int ix=0; ix<width; ix++) {
unsigned char *pixel = &image[0] + iy*stride + ix * 4;
- unsigned char alpha = pixelsImage[3];
+ const unsigned char alpha = pixelsImage[3];
pixel[2] = (*pixelsImage++) * alpha / 255;
pixel[1] = (*pixelsImage++) * alpha / 255;
pixel[0] = (*pixelsImage++) * alpha / 255;
@@ -614,7 +621,7 @@ void SurfaceImpl::Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back)
void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource) {
SurfaceImpl &surfi = static_cast<SurfaceImpl &>(surfaceSource);
- bool canDraw = surfi.psurf != NULL;
+ const bool canDraw = surfi.psurf != nullptr;
if (canDraw) {
PLATFORM_ASSERT(context);
cairo_set_source_surface(context, surfi.psurf,
@@ -648,7 +655,7 @@ static std::string UTF8FromIconv(const Converter &conv, const char *s, int len)
char *putf = &utfForm[0];
char *pout = putf;
gsize outLeft = len*3+1;
- gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft);
+ const gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft);
if (conversions != sizeFailure) {
*pout = '\0';
utfForm.resize(pout - putf);
@@ -667,7 +674,7 @@ static size_t MultiByteLenFromIconv(const Converter &conv, const char *s, size_t
gsize inLeft = lenMB;
char *pout = wcForm;
gsize outLeft = 2;
- gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft);
+ const gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft);
if (conversions != sizeFailure) {
return lenMB;
}
@@ -679,7 +686,7 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, XYPOSITION ybase, con
ColourDesired fore) {
PenColour(fore);
if (context) {
- XYPOSITION xText = rc.left;
+ const XYPOSITION xText = rc.left;
if (PFont(font_)->pfd) {
std::string utfForm;
if (et == UTF8) {
@@ -694,7 +701,7 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, XYPOSITION ybase, con
}
pango_layout_set_font_description(layout, PFont(font_)->pfd);
pango_cairo_update_layout(context, layout);
- PangoLayoutLine *pll = pango_layout_get_line_readonly(layout,0);
+ PangoLayoutLine *pll = pango_layout_get_line_readonly(layout, 0);
cairo_move_to(context, xText, ybase);
pango_cairo_show_layout_line(context, pll);
}
@@ -735,24 +742,24 @@ class ClusterIterator {
XYPOSITION position;
XYPOSITION distance;
int curIndex;
- ClusterIterator(PangoLayout *layout, int len) : lenPositions(len), finished(false),
+ ClusterIterator(PangoLayout *layout, int len) noexcept : lenPositions(len), finished(false),
positionStart(0), position(0), distance(0), curIndex(0) {
iter = pango_layout_get_iter(layout);
- pango_layout_iter_get_cluster_extents(iter, NULL, &pos);
+ pango_layout_iter_get_cluster_extents(iter, nullptr, &pos);
}
~ClusterIterator() {
pango_layout_iter_free(iter);
}
- void Next() {
+ void Next() noexcept {
positionStart = position;
if (pango_layout_iter_next_cluster(iter)) {
- pango_layout_iter_get_cluster_extents(iter, NULL, &pos);
- position = doubleFromPangoUnits(pos.x);
+ pango_layout_iter_get_cluster_extents(iter, nullptr, &pos);
+ position = floatFromPangoUnits(pos.x);
curIndex = pango_layout_iter_get_index(iter);
} else {
finished = true;
- position = doubleFromPangoUnits(pos.x + pos.width);
+ position = floatFromPangoUnits(pos.x + pos.width);
curIndex = lenPositions;
}
distance = position - positionStart;
@@ -771,7 +778,7 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION
ClusterIterator iti(layout, lenPositions);
while (!iti.finished) {
iti.Next();
- int places = iti.curIndex - i;
+ const int places = iti.curIndex - i;
while (i < iti.curIndex) {
// Evenly distribute space among bytes of this cluster.
// Would be better to find number of characters and then
@@ -798,8 +805,8 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION
ClusterIterator iti(layout, strlen(utfForm.c_str()));
while (!iti.finished) {
iti.Next();
- int clusterEnd = iti.curIndex;
- int places = g_utf8_strlen(utfForm.c_str() + clusterStart, clusterEnd - clusterStart);
+ const int clusterEnd = iti.curIndex;
+ const int places = g_utf8_strlen(utfForm.c_str() + clusterStart, clusterEnd - clusterStart);
int place = 1;
while (clusterStart < clusterEnd) {
size_t lenChar = MultiByteLenFromIconv(convMeasure, s+i, len-i);
@@ -814,7 +821,7 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION
PLATFORM_ASSERT(i == lenPositions);
}
}
- if (positionsCalculated < 1 ) {
+ if (positionsCalculated < 1) {
// Either 8-bit or DBCS conversion failed so treat as 8-bit.
SetConverter(PFont(font_)->characterSet);
const bool rtlCheck = PFont(font_)->characterSet == SC_CHARSET_HEBREW ||
@@ -831,13 +838,13 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION
ClusterIterator iti(layout, utfForm.length());
while (!iti.finished) {
iti.Next();
- int clusterEnd = iti.curIndex;
- int ligatureLength = g_utf8_strlen(utfForm.c_str() + clusterStart, clusterEnd - clusterStart);
+ const int clusterEnd = iti.curIndex;
+ const int ligatureLength = g_utf8_strlen(utfForm.c_str() + clusterStart, clusterEnd - clusterStart);
if (rtlCheck && ((clusterEnd <= clusterStart) || (ligatureLength == 0) || (ligatureLength > 3))) {
// Something has gone wrong: exit quickly but pretend all the characters are equally spaced:
int widthLayout = 0;
- pango_layout_get_size(layout, &widthLayout, NULL);
- XYPOSITION widthTotal = doubleFromPangoUnits(widthLayout);
+ pango_layout_get_size(layout, &widthLayout, nullptr);
+ const XYPOSITION widthTotal = floatFromPangoUnits(widthLayout);
for (int bytePos=0; bytePos<lenPositions; bytePos++) {
positions[bytePos] = widthTotal / lenPositions * (bytePos + 1);
}
@@ -881,9 +888,9 @@ XYPOSITION SurfaceImpl::WidthText(Font &font_, const char *s, int len) {
}
pango_layout_set_text(layout, utfForm.c_str(), utfForm.length());
}
- PangoLayoutLine *pangoLine = pango_layout_get_line_readonly(layout,0);
- pango_layout_line_get_extents(pangoLine, NULL, &pos);
- return doubleFromPangoUnits(pos.width);
+ PangoLayoutLine *pangoLine = pango_layout_get_line_readonly(layout, 0);
+ pango_layout_line_get_extents(pangoLine, nullptr, &pos);
+ return floatFromPangoUnits(pos.width);
}
return 1;
} else {
@@ -896,12 +903,12 @@ XYPOSITION SurfaceImpl::WidthText(Font &font_, const char *s, int len) {
XYPOSITION SurfaceImpl::Ascent(Font &font_) {
if (!(font_.GetID()))
return 1;
- int ascent = 0;
+ XYPOSITION ascent = 0;
if (PFont(font_)->pfd) {
PangoFontMetrics *metrics = pango_context_get_metrics(pcontext,
PFont(font_)->pfd, pango_context_get_language(pcontext));
- ascent =
- doubleFromPangoUnits(pango_font_metrics_get_ascent(metrics));
+ ascent = std::floor(floatFromPangoUnits(
+ pango_font_metrics_get_ascent(metrics)));
pango_font_metrics_unref(metrics);
}
if (ascent == 0) {
@@ -916,7 +923,8 @@ XYPOSITION SurfaceImpl::Descent(Font &font_) {
if (PFont(font_)->pfd) {
PangoFontMetrics *metrics = pango_context_get_metrics(pcontext,
PFont(font_)->pfd, pango_context_get_language(pcontext));
- int descent = doubleFromPangoUnits(pango_font_metrics_get_descent(metrics));
+ const XYPOSITION descent = std::floor(floatFromPangoUnits(
+ pango_font_metrics_get_descent(metrics)));
pango_font_metrics_unref(metrics);
return descent;
}
@@ -961,7 +969,7 @@ Window::~Window() {}
void Window::Destroy() {
if (wid) {
- ListBox *listbox = dynamic_cast<ListBox*>(this);
+ ListBox *listbox = dynamic_cast<ListBox *>(this);
if (listbox) {
gtk_widget_hide(GTK_WIDGET(wid));
// clear up window content
@@ -972,7 +980,7 @@ void Window::Destroy() {
} else {
gtk_widget_destroy(GTK_WIDGET(wid));
}
- wid = 0;
+ wid = nullptr;
}
}
@@ -982,8 +990,8 @@ PRectangle Window::GetPosition() const {
if (wid) {
GtkAllocation allocation;
gtk_widget_get_allocation(PWidget(wid), &allocation);
- rc.left = allocation.x;
- rc.top = allocation.y;
+ rc.left = static_cast<XYPOSITION>(allocation.x);
+ rc.top = static_cast<XYPOSITION>(allocation.y);
if (allocation.width > 20) {
rc.right = rc.left + allocation.width;
rc.bottom = rc.top + allocation.height;
@@ -994,10 +1002,10 @@ PRectangle Window::GetPosition() const {
void Window::SetPosition(PRectangle rc) {
GtkAllocation alloc;
- alloc.x = rc.left;
- alloc.y = rc.top;
- alloc.width = rc.Width();
- alloc.height = rc.Height();
+ alloc.x = static_cast<int>(rc.left);
+ alloc.y = static_cast<int>(rc.top);
+ alloc.width = static_cast<int>(rc.Width());
+ alloc.height = static_cast<int>(rc.Height());
gtk_widget_size_allocate(PWidget(wid), &alloc);
}
@@ -1011,8 +1019,8 @@ GdkRectangle MonitorRectangleForWidget(GtkWidget *wid) {
GdkMonitor *monitor = gdk_display_get_monitor_at_window(pdisplay, wnd);
gdk_monitor_get_geometry(monitor, &rcScreen);
#else
- GdkScreen* screen = gtk_widget_get_screen(wid);
- gint monitor_num = gdk_screen_get_monitor_at_window(screen, wnd);
+ GdkScreen *screen = gtk_widget_get_screen(wid);
+ const gint monitor_num = gdk_screen_get_monitor_at_window(screen, wnd);
gdk_screen_get_monitor_geometry(screen, monitor_num, &rcScreen);
#endif
return rcScreen;
@@ -1021,18 +1029,19 @@ GdkRectangle MonitorRectangleForWidget(GtkWidget *wid) {
}
void Window::SetPositionRelative(PRectangle rc, const Window *relativeTo) {
+ const IntegerRectangle irc(rc);
int ox = 0;
int oy = 0;
GdkWindow *wndRelativeTo = WindowFromWidget(PWidget(relativeTo->wid));
gdk_window_get_origin(wndRelativeTo, &ox, &oy);
- ox += rc.left;
- oy += rc.top;
+ ox += irc.left;
+ oy += irc.top;
- GdkRectangle rcMonitor = MonitorRectangleForWidget(PWidget(relativeTo->wid));
+ const GdkRectangle rcMonitor = MonitorRectangleForWidget(PWidget(relativeTo->wid));
/* do some corrections to fit into screen */
- int sizex = rc.right - rc.left;
- int sizey = rc.bottom - rc.top;
+ const int sizex = irc.Width();
+ const int sizey = irc.Height();
if (sizex > rcMonitor.width || ox < rcMonitor.x)
ox = rcMonitor.x; /* the best we can do */
else if (ox + sizex > rcMonitor.x + rcMonitor.width)
@@ -1065,9 +1074,10 @@ void Window::InvalidateAll() {
void Window::InvalidateRectangle(PRectangle rc) {
if (wid) {
+ const IntegerRectangle irc(rc);
gtk_widget_queue_draw_area(PWidget(wid),
- rc.left, rc.top,
- rc.right - rc.left, rc.bottom - rc.top);
+ irc.left, irc.top,
+ irc.Width(), irc.Height());
}
}
@@ -1134,24 +1144,24 @@ PRectangle Window::GetMonitorRect(Point pt) {
pt.x + x_offset, pt.y + y_offset);
gdk_monitor_get_geometry(monitor, &rect);
#else
- GdkScreen* screen = gtk_widget_get_screen(PWidget(wid));
- gint monitor_num = gdk_screen_get_monitor_at_point(screen,
+ GdkScreen *screen = gtk_widget_get_screen(PWidget(wid));
+ const gint monitor_num = gdk_screen_get_monitor_at_point(screen,
pt.x + x_offset, pt.y + y_offset);
gdk_screen_get_monitor_geometry(screen, monitor_num, &rect);
#endif
rect.x -= x_offset;
rect.y -= y_offset;
- return PRectangle(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height);
+ return PRectangle::FromInts(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height);
}
-typedef std::map<int, RGBAImage*> ImageMap;
+typedef std::map<int, RGBAImage *> ImageMap;
struct ListImage {
const RGBAImage *rgba_data;
GdkPixbuf *pixbuf;
};
-static void list_image_free(gpointer, gpointer value, gpointer) {
+static void list_image_free(gpointer, gpointer value, gpointer) noexcept {
ListImage *list_image = static_cast<ListImage *>(value);
if (list_image->pixbuf)
g_object_unref(list_image->pixbuf);
@@ -1176,8 +1186,8 @@ class ListBoxX : public ListBox {
WindowID list;
WindowID scroller;
void *pixhash;
- GtkCellRenderer* pixbuf_renderer;
- GtkCellRenderer* renderer;
+ GtkCellRenderer *pixbuf_renderer;
+ GtkCellRenderer *renderer;
RGBAImageSet images;
int desiredVisibleRows;
unsigned int maxItemCharacters;
@@ -1188,28 +1198,29 @@ class ListBoxX : public ListBox {
public:
IListBoxDelegate *delegate;
- ListBoxX() : widCached(0), frame(0), list(0), scroller(0), pixhash(NULL), pixbuf_renderer(0),
- renderer(0),
+ ListBoxX() noexcept : widCached(nullptr), frame(nullptr), list(nullptr), scroller(nullptr),
+ pixhash(nullptr), pixbuf_renderer(nullptr),
+ renderer(nullptr),
desiredVisibleRows(5), maxItemCharacters(0),
aveCharWidth(1),
#if GTK_CHECK_VERSION(3,0,0)
- cssProvider(NULL),
+ cssProvider(nullptr),
#endif
delegate(nullptr) {
}
~ListBoxX() override {
if (pixhash) {
- g_hash_table_foreach((GHashTable *) pixhash, list_image_free, NULL);
+ g_hash_table_foreach((GHashTable *) pixhash, list_image_free, nullptr);
g_hash_table_destroy((GHashTable *) pixhash);
}
if (widCached) {
gtk_widget_destroy(GTK_WIDGET(widCached));
- wid = widCached = 0;
+ wid = widCached = nullptr;
}
#if GTK_CHECK_VERSION(3,0,0)
if (cssProvider) {
g_object_unref(cssProvider);
- cssProvider = NULL;
+ cssProvider = nullptr;
}
#endif
}
@@ -1247,18 +1258,18 @@ static int treeViewGetRowHeight(GtkTreeView *view) {
// version is inaccurate for GTK 3.14.
GdkRectangle rect;
GtkTreePath *path = gtk_tree_path_new_first();
- gtk_tree_view_get_background_area(view, path, NULL, &rect);
+ gtk_tree_view_get_background_area(view, path, nullptr, &rect);
gtk_tree_path_free(path);
return rect.height;
#else
int row_height=0;
int vertical_separator=0;
int expander_size=0;
GtkTreeViewColumn *column = gtk_tree_view_get_column(view, 0);
- gtk_tree_view_column_cell_get_size(column, NULL, NULL, NULL, NULL, &row_height);
+ gtk_tree_view_column_cell_get_size(column, nullptr, nullptr, nullptr, nullptr, &row_height);
gtk_widget_style_get(GTK_WIDGET(view),
"vertical-separator", &vertical_separator,
- "expander-size", &expander_size, NULL);
+ "expander-size", &expander_size, nullptr);
row_height += vertical_separator;
row_height = std::max(row_height, expander_size);
return row_height;
@@ -1292,7 +1303,7 @@ static void small_scroller_get_preferred_height(GtkWidget *widget, gint *min, gi
GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
if (GTK_IS_TREE_VIEW(child)) {
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(child));
- int n_rows = gtk_tree_model_iter_n_children(model, NULL);
+ int n_rows = gtk_tree_model_iter_n_children(model, nullptr);
int row_height = treeViewGetRowHeight(GTK_TREE_VIEW(child));
*min = MAX(1, row_height);
@@ -1318,11 +1329,11 @@ static void small_scroller_class_init(SmallScrollerClass *klass) {
#endif
}
-static void small_scroller_init(SmallScroller *){}
+static void small_scroller_init(SmallScroller *) {}
-static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) {
+static gboolean ButtonPress(GtkWidget *, GdkEventButton *ev, gpointer p) {
try {
- ListBoxX* lb = static_cast<ListBoxX*>(p);
+ ListBoxX *lb = static_cast<ListBoxX *>(p);
if (ev->type == GDK_2BUTTON_PRESS && lb->delegate) {
ListBoxEvent event(ListBoxEvent::EventType::doubleClick);
lb->delegate->ListNotify(&event);
@@ -1335,9 +1346,9 @@ static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) {
return FALSE;
}
-static gboolean ButtonRelease(GtkWidget *, GdkEventButton* ev, gpointer p) {
+static gboolean ButtonRelease(GtkWidget *, GdkEventButton *ev, gpointer p) {
try {
- ListBoxX* lb = static_cast<ListBoxX*>(p);
+ ListBoxX *lb = static_cast<ListBoxX *>(p);
if (ev->type != GDK_2BUTTON_PRESS && lb->delegate) {
ListBoxEvent event(ListBoxEvent::EventType::selectionChange);
lb->delegate->ListNotify(&event);
@@ -1351,9 +1362,9 @@ static gboolean ButtonRelease(GtkWidget *, GdkEventButton* ev, gpointer p) {
/* Change the active color to the selected color so the listbox uses the color
scheme that it would use if it had the focus. */
-static void StyleSet(GtkWidget *w, GtkStyle*, void*) {
+static void StyleSet(GtkWidget *w, GtkStyle *, void *) {
- g_return_if_fail(w != NULL);
+ g_return_if_fail(w != nullptr);
/* Copy the selected color to active. Note that the modify calls will cause
recursive calls to this function after the value is updated and w->style to
@@ -1365,7 +1376,7 @@ static void StyleSet(GtkWidget *w, GtkStyle*, void*) {
// The *override* calls are deprecated now, so only call them for older versions of GTK+.
#elif GTK_CHECK_VERSION(3,0,0)
GtkStyleContext *styleContext = gtk_widget_get_style_context(w);
- if (styleContext == NULL)
+ if (styleContext == nullptr)
return;
GdkRGBA colourForeSelected;
@@ -1376,7 +1387,7 @@ static void StyleSet(GtkWidget *w, GtkStyle*, void*) {
gtk_widget_override_color(w, GTK_STATE_FLAG_ACTIVE, &colourForeSelected);
styleContext = gtk_widget_get_style_context(w);
- if (styleContext == NULL)
+ if (styleContext == nullptr)
return;
GdkRGBA colourBaseSelected;
@@ -1387,20 +1398,20 @@ static void StyleSet(GtkWidget *w, GtkStyle*, void*) {
gtk_widget_override_background_color(w, GTK_STATE_FLAG_ACTIVE, &colourBaseSelected);
#else
GtkStyle *style = gtk_widget_get_style(w);
- if (style == NULL)
+ if (style == nullptr)
return;
if (!gdk_color_equal(&style->base[GTK_STATE_SELECTED], &style->base[GTK_STATE_ACTIVE]))
gtk_widget_modify_base(w, GTK_STATE_ACTIVE, &style->base[GTK_STATE_SELECTED]);
style = gtk_widget_get_style(w);
- if (style == NULL)
+ if (style == nullptr)
return;
if (!gdk_color_equal(&style->text[GTK_STATE_SELECTED], &style->text[GTK_STATE_ACTIVE]))
gtk_widget_modify_text(w, GTK_STATE_ACTIVE, &style->text[GTK_STATE_SELECTED]);
#endif
}
void ListBoxX::Create(Window &parent, int, Point, int, bool, int) {
- if (widCached != 0) {
+ if (widCached != nullptr) {
wid = widCached;
return;
}
@@ -1413,13 +1424,13 @@ void ListBoxX::Create(Window &parent, int, Point, int, bool, int) {
wid = widCached = gtk_window_new(GTK_WINDOW_POPUP);
- frame = gtk_frame_new(NULL);
+ frame = gtk_frame_new(nullptr);
gtk_widget_show(PWidget(frame));
gtk_container_add(GTK_CONTAINER(GetID()), PWidget(frame));
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
gtk_container_set_border_width(GTK_CONTAINER(frame), 0);
- scroller = g_object_new(small_scroller_get_type(), NULL);
+ scroller = g_object_new(small_scroller_get_type(), nullptr);
gtk_container_set_border_width(GTK_CONTAINER(scroller), 0);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
@@ -1431,7 +1442,7 @@ void ListBoxX::Create(Window &parent, int, Point, int, bool, int) {
gtk_list_store_new(N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
- g_signal_connect(G_OBJECT(list), "style-set", G_CALLBACK(StyleSet), NULL);
+ g_signal_connect(G_OBJECT(list), "style-set", G_CALLBACK(StyleSet), nullptr);
#if GTK_CHECK_VERSION(3,0,0)
GtkStyleContext *styleContext = gtk_widget_get_style_context(GTK_WIDGET(list));
@@ -1466,7 +1477,7 @@ void ListBoxX::Create(Window &parent, int, Point, int, bool, int) {
gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
if (g_object_class_find_property(G_OBJECT_GET_CLASS(list), "fixed-height-mode"))
- g_object_set(G_OBJECT(list), "fixed-height-mode", TRUE, NULL);
+ g_object_set(G_OBJECT(list), "fixed-height-mode", TRUE, nullptr);
GtkWidget *widget = PWidget(list); // No code inside the G_OBJECT macro
gtk_container_add(GTK_CONTAINER(PWidget(scroller)), widget);
@@ -1496,7 +1507,7 @@ void ListBoxX::SetFont(Font &font) {
// On GTK < 3.21.0 the units are incorrectly parsed, so a font size in points
// need to use the "px" unit. Normally we only get fonts in points here, so
// don't bother to handle the case the font is actually in pixels on < 3.21.0.
- if (gtk_check_version(3, 21, 0) != NULL || // on < 3.21.0
+ if (gtk_check_version(3, 21, 0) != nullptr || // on < 3.21.0
pango_font_description_get_size_is_absolute(pfd)) {
ssFontSetting << "px; ";
} else {
@@ -1505,7 +1516,7 @@ void ListBoxX::SetFont(Font &font) {
ssFontSetting << "font-weight:"<< pango_font_description_get_weight(pfd) << "; ";
ssFontSetting << "}";
gtk_css_provider_load_from_data(GTK_CSS_PROVIDER(cssProvider),
- ssFontSetting.str().c_str(), -1, NULL);
+ ssFontSetting.str().c_str(), -1, nullptr);
}
#else
gtk_widget_modify_font(PWidget(list), PFont(font)->pfd);
@@ -1543,7 +1554,7 @@ PRectangle ListBoxX::GetDesiredRect() {
// This, apparently unnecessary call, ensures gtk_tree_view_column_cell_get_size
// returns reasonable values.
#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(GTK_WIDGET(frame), NULL, &req);
+ gtk_widget_get_preferred_size(GTK_WIDGET(frame), nullptr, &req);
#else
gtk_widget_size_request(GTK_WIDGET(frame), &req);
#endif
@@ -1552,7 +1563,7 @@ PRectangle ListBoxX::GetDesiredRect() {
// First calculate height of the clist for our desired visible
// row count otherwise it tries to expand to the total # of rows
// Get cell height
- int row_height = GetRowHeight();
+ const int row_height = GetRowHeight();
#if GTK_CHECK_VERSION(3,0,0)
GtkStyleContext *styleContextFrame = gtk_widget_get_style_context(PWidget(frame));
GtkStateFlags stateFlagsFrame = gtk_style_context_get_state(styleContextFrame);
@@ -1573,7 +1584,7 @@ PRectangle ListBoxX::GetDesiredRect() {
gtk_style_context_get_border(styleContextFrameBorder, stateFlagsFrame, &border_border);
g_object_unref(styleContextFrameBorder);
# else // < 3.20
- if (gtk_check_version(3, 20, 0) == NULL) {
+ if (gtk_check_version(3, 20, 0) == nullptr) {
// default to 1px all around as it's likely what it is, and so we don't miss 2px height
// on GTK 3.20 when built against an earlier version.
border_border.top = border_border.bottom = border_border.left = border_border.right = 1;
@@ -1599,7 +1610,7 @@ PRectangle ListBoxX::GetDesiredRect() {
// Add horizontal padding and borders
int horizontal_separator=0;
gtk_widget_style_get(PWidget(list),
- "horizontal-separator", &horizontal_separator, NULL);
+ "horizontal-separator", &horizontal_separator, nullptr);
rc.right += horizontal_separator;
#if GTK_CHECK_VERSION(3,0,0)
rc.right += (padding.left + padding.right
@@ -1615,7 +1626,7 @@ PRectangle ListBoxX::GetDesiredRect() {
GtkWidget *vscrollbar =
gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(scroller));
#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(vscrollbar, NULL, &req);
+ gtk_widget_get_preferred_size(vscrollbar, nullptr, &req);
#else
gtk_widget_size_request(vscrollbar, &req);
#endif
@@ -1651,32 +1662,32 @@ static void init_pixmap(ListImage *list_image) {
list_image->rgba_data->GetWidth(),
list_image->rgba_data->GetHeight(),
list_image->rgba_data->GetWidth() * 4,
- NULL,
- NULL);
+ nullptr,
+ nullptr);
}
}
#define SPACING 5
void ListBoxX::Append(char *s, int type) {
- ListImage *list_image = NULL;
+ ListImage *list_image = nullptr;
if ((type >= 0) && pixhash) {
- list_image = static_cast<ListImage *>(g_hash_table_lookup((GHashTable *) pixhash
- , (gconstpointer) GINT_TO_POINTER(type)));
+ list_image = static_cast<ListImage *>(g_hash_table_lookup((GHashTable *) pixhash,
+ GINT_TO_POINTER(type)));
}
GtkTreeIter iter;
GtkListStore *store =
GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
gtk_list_store_append(GTK_LIST_STORE(store), &iter);
if (list_image) {
- if (NULL == list_image->pixbuf)
+ if (nullptr == list_image->pixbuf)
init_pixmap(list_image);
if (list_image->pixbuf) {
gtk_list_store_set(GTK_LIST_STORE(store), &iter,
PIXBUF_COLUMN, list_image->pixbuf,
TEXT_COLUMN, s, -1);
- gint pixbuf_width = gdk_pixbuf_get_width(list_image->pixbuf);
+ const gint pixbuf_width = gdk_pixbuf_get_width(list_image->pixbuf);
gint renderer_height, renderer_width;
gtk_cell_renderer_get_fixed_size(pixbuf_renderer,
&renderer_width, &renderer_height);
@@ -1691,15 +1702,15 @@ void ListBoxX::Append(char *s, int type) {
gtk_list_store_set(GTK_LIST_STORE(store), &iter,
TEXT_COLUMN, s, -1);
}
- size_t len = strlen(s);
+ const size_t len = strlen(s);
if (maxItemCharacters < len)
maxItemCharacters = len;
}
int ListBoxX::Length() {
if (wid)
return gtk_tree_model_iter_n_children(gtk_tree_view_get_model
- (GTK_TREE_VIEW(list)), NULL);
+ (GTK_TREE_VIEW(list)), nullptr);
return 0;
}
@@ -1714,31 +1725,31 @@ void ListBoxX::Select(int n) {
return;
}
- bool valid = gtk_tree_model_iter_nth_child(model, &iter, NULL, n) != FALSE;
+ const bool valid = gtk_tree_model_iter_nth_child(model, &iter, nullptr, n) != FALSE;
if (valid) {
gtk_tree_selection_select_iter(selection, &iter);
// Move the scrollbar to show the selection.
- int total = Length();
+ const int total = Length();
#if GTK_CHECK_VERSION(3,0,0)
GtkAdjustment *adj =
gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(list));
#else
GtkAdjustment *adj =
gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(list));
#endif
- gfloat value = ((gfloat)n / total) * (gtk_adjustment_get_upper(adj) - gtk_adjustment_get_lower(adj))
+ gfloat value = (static_cast<gfloat>(n) / total) * (gtk_adjustment_get_upper(adj) - gtk_adjustment_get_lower(adj))
+ gtk_adjustment_get_lower(adj) - gtk_adjustment_get_page_size(adj) / 2;
// Get cell height
- int row_height = GetRowHeight();
+ const int row_height = GetRowHeight();
int rows = Length();
if ((rows == 0) || (rows > desiredVisibleRows))
rows = desiredVisibleRows;
if (rows & 0x1) {
// Odd rows to display -- We are now in the middle.
// Align it so that we don't chop off rows.
- value += (gfloat)row_height / 2.0;
+ value += static_cast<gfloat>(row_height) / 2.0f;
}
// Clamp it.
value = (value < 0)? 0 : value;
@@ -1765,7 +1776,7 @@ int ListBoxX::GetSelection() {
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
- int *indices = gtk_tree_path_get_indices(path);
+ const int *indices = gtk_tree_path_get_indices(path);
// Don't free indices.
if (indices)
index = indices[0];
@@ -1780,7 +1791,7 @@ int ListBoxX::Find(const char *prefix) {
gtk_tree_view_get_model(GTK_TREE_VIEW(list));
bool valid = gtk_tree_model_get_iter_first(model, &iter) != FALSE;
int i = 0;
- while(valid) {
+ while (valid) {
gchar *s;
gtk_tree_model_get(model, &iter, TEXT_COLUMN, &s, -1);
if (s && (0 == strncmp(prefix, s, strlen(prefix)))) {
@@ -1795,10 +1806,10 @@ int ListBoxX::Find(const char *prefix) {
}
void ListBoxX::GetValue(int n, char *value, int len) {
- char *text = NULL;
+ char *text = nullptr;
GtkTreeIter iter;
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(list));
- bool valid = gtk_tree_model_iter_nth_child(model, &iter, NULL, n) != FALSE;
+ const bool valid = gtk_tree_model_iter_nth_child(model, &iter, nullptr, n) != FALSE;
if (valid) {
gtk_tree_model_get(model, &iter, TEXT_COLUMN, &text, -1);
}
@@ -1822,12 +1833,12 @@ void ListBoxX::RegisterRGBA(int type, RGBAImage *image) {
pixhash = g_hash_table_new(g_direct_hash, g_direct_equal);
}
ListImage *list_image = static_cast<ListImage *>(g_hash_table_lookup((GHashTable *) pixhash,
- (gconstpointer) GINT_TO_POINTER(type)));
+ GINT_TO_POINTER(type)));
if (list_image) {
// Drop icon already registered
if (list_image->pixbuf)
g_object_unref(list_image->pixbuf);
- list_image->pixbuf = NULL;
+ list_image->pixbuf = nullptr;
list_image->rgba_data = image;
} else {
list_image = g_new0(ListImage, 1);
@@ -1857,10 +1868,10 @@ void ListBoxX::SetDelegate(IListBoxDelegate *lbDelegate) {
void ListBoxX::SetList(const char *listText, char separator, char typesep) {
Clear();
- int count = strlen(listText) + 1;
+ const size_t count = strlen(listText) + 1;
std::vector<char> words(listText, listText+count);
char *startword = &words[0];
- char *numword = NULL;
+ char *numword = nullptr;
int i = 0;
for (; words[i]; i++) {
if (words[i] == separator) {
@@ -1869,7 +1880,7 @@ void ListBoxX::SetList(const char *listText, char separator, char typesep) {
*numword = '\0';
Append(startword, numword?atoi(numword + 1):-1);
startword = &words[0] + i + 1;
- numword = NULL;
+ numword = nullptr;
} else if (words[i] == typesep) {
numword = &words[0] + i;
}
@@ -1881,7 +1892,7 @@ void ListBoxX::SetList(const char *listText, char separator, char typesep) {
}
}
-Menu::Menu() noexcept : mid(0) {}
+Menu::Menu() noexcept : mid(nullptr) {}
void Menu::CreatePopUp() {
Destroy();
@@ -1892,7 +1903,7 @@ void Menu::CreatePopUp() {
void Menu::Destroy() {
if (mid)
g_object_unref(G_OBJECT(mid));
- mid = 0;
+ mid = nullptr;
}
#if !GTK_CHECK_VERSION(3,22,0)
@@ -1908,12 +1919,12 @@ void Menu::Show(Point pt, Window &w) {
gtk_widget_show_all(GTK_WIDGET(widget));
#if GTK_CHECK_VERSION(3,22,0)
// Rely on GTK+ to do the right thing with positioning
- gtk_menu_popup_at_pointer(widget, NULL);
+ gtk_menu_popup_at_pointer(widget, nullptr);
#else
- GdkRectangle rcMonitor = MonitorRectangleForWidget(PWidget(w.GetID()));
+ const GdkRectangle rcMonitor = MonitorRectangleForWidget(PWidget(w.GetID()));
GtkRequisition requisition;
#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(GTK_WIDGET(widget), NULL, &requisition);
+ gtk_widget_get_preferred_size(GTK_WIDGET(widget), nullptr, &requisition);
#else
gtk_widget_size_request(GTK_WIDGET(widget), &requisition);
#endif
@@ -1923,46 +1934,46 @@ void Menu::Show(Point pt, Window &w) {
if ((pt.y + requisition.height) > rcMonitor.y + rcMonitor.height) {
pt.y = rcMonitor.y + rcMonitor.height - requisition.height;
}
- gtk_menu_popup(widget, NULL, NULL, MenuPositionFunc,
+ gtk_menu_popup(widget, nullptr, nullptr, MenuPositionFunc,
GINT_TO_POINTER((static_cast<int>(pt.y) << 16) | static_cast<int>(pt.x)), 0,
gtk_get_current_event_time());
#endif
}
class DynamicLibraryImpl : public DynamicLibrary {
protected:
- GModule* m;
+ GModule *m;
public:
- explicit DynamicLibraryImpl(const char *modulePath) {
+ explicit DynamicLibraryImpl(const char *modulePath) noexcept {
m = g_module_open(modulePath, G_MODULE_BIND_LAZY);
}
~DynamicLibraryImpl() override {
- if (m != NULL)
+ if (m != nullptr)
g_module_close(m);
}
// Use g_module_symbol to get a pointer to the relevant function.
Function FindFunction(const char *name) override {
- if (m != NULL) {
- gpointer fn_address = NULL;
- gboolean status = g_module_symbol(m, name, &fn_address);
+ if (m != nullptr) {
+ gpointer fn_address = nullptr;
+ const gboolean status = g_module_symbol(m, name, &fn_address);
if (status)
return static_cast<Function>(fn_address);
else
- return NULL;
+ return nullptr;
} else {
- return NULL;
+ return nullptr;
}
}
bool IsValid() override {
- return m != NULL;
+ return m != nullptr;
}
};
DynamicLibrary *DynamicLibrary::Load(const char *modulePath) {
- return static_cast<DynamicLibrary *>( new DynamicLibraryImpl(modulePath) );
+ return static_cast<DynamicLibrary *>(new DynamicLibraryImpl(modulePath));
}
ColourDesired Platform::Chrome() {
@@ -2017,7 +2028,7 @@ void Platform::DebugPrintf(const char *, ...) {}
static bool assertionPopUps = true;
bool Platform::ShowAssertionPopUps(bool assertionPopUps_) {
- bool ret = assertionPopUps;
+ const bool ret = assertionPopUps;
assertionPopUps = assertionPopUps_;
return ret;
}
Modified: scintilla/gtk/ScintillaGTK.cxx
773 lines changed, 408 insertions(+), 365 deletions(-)
===================================================================
@@ -7,7 +7,6 @@
#include <cstdlib>
#include <cassert>
#include <cstring>
-#include <cctype>
#include <cstdio>
#include <ctime>
#include <cmath>
@@ -29,7 +28,10 @@
#include <gdk/gdkwayland.h>
#endif
-#if defined(__WIN32__) || defined(_MSC_VER)
+#if defined(_WIN32)
+// On Win32 use windows.h to access clipboard (rectangular format) and systems parameters
+#undef NOMINMAX
+#define NOMINMAX
#include <windows.h>
#endif
@@ -43,6 +45,7 @@
#include "SciLexer.h"
#endif
#include "StringCopy.h"
+#include "CharacterCategory.h"
#ifdef SCI_LEXER
#include "LexerModule.h"
#endif
@@ -92,7 +95,7 @@
#define SC_INDICATOR_CONVERTED INDIC_IME+2
#define SC_INDICATOR_UNKNOWN INDIC_IME_MAX
-static GdkWindow *WindowFromWidget(GtkWidget *w) {
+static GdkWindow *WindowFromWidget(GtkWidget *w) noexcept {
return gtk_widget_get_window(w);
}
@@ -105,34 +108,33 @@ static GdkWindow *WindowFromWidget(GtkWidget *w) {
using namespace Scintilla;
-static GdkWindow *PWindow(const Window &w) {
+static GdkWindow *PWindow(const Window &w) noexcept {
GtkWidget *widget = static_cast<GtkWidget *>(w.GetID());
return gtk_widget_get_window(widget);
}
extern std::string UTF8FromLatin1(const char *s, int len);
enum {
- COMMAND_SIGNAL,
- NOTIFY_SIGNAL,
- LAST_SIGNAL
+ COMMAND_SIGNAL,
+ NOTIFY_SIGNAL,
+ LAST_SIGNAL
};
static gint scintilla_signals[LAST_SIGNAL] = { 0 };
enum {
- TARGET_STRING,
- TARGET_TEXT,
- TARGET_COMPOUND_TEXT,
- TARGET_UTF8_STRING,
- TARGET_URI
+ TARGET_STRING,
+ TARGET_TEXT,
+ TARGET_COMPOUND_TEXT,
+ TARGET_UTF8_STRING,
+ TARGET_URI
};
-GdkAtom ScintillaGTK::atomClipboard = 0;
-GdkAtom ScintillaGTK::atomUTF8 = 0;
-GdkAtom ScintillaGTK::atomString = 0;
-GdkAtom ScintillaGTK::atomUriList = 0;
-GdkAtom ScintillaGTK::atomDROPFILES_DND = 0;
+GdkAtom ScintillaGTK::atomUTF8 = nullptr;
+GdkAtom ScintillaGTK::atomString = nullptr;
+GdkAtom ScintillaGTK::atomUriList = nullptr;
+GdkAtom ScintillaGTK::atomDROPFILES_DND = nullptr;
static const GtkTargetEntry clipboardCopyTargets[] = {
{ (gchar *) "UTF8_STRING", 0, TARGET_UTF8_STRING },
@@ -149,7 +151,7 @@ static const gint nClipboardPasteTargets = ELEMENTS(clipboardPasteTargets);
static const GdkDragAction actionCopyOrMove = static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE);
-static GtkWidget *PWidget(Window &w) {
+static GtkWidget *PWidget(const Window &w) noexcept {
return static_cast<GtkWidget *>(w.GetID());
}
@@ -159,20 +161,25 @@ ScintillaGTK *ScintillaGTK::FromWidget(GtkWidget *widget) {
}
ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :
- adjustmentv(0), adjustmenth(0),
- verticalScrollBarWidth(30), horizontalScrollBarHeight(30),
- evbtn(nullptr), capturedMouse(false), dragWasDropped(false),
- lastKey(0), rectangularSelectionModifier(SCMOD_CTRL), parentClass(0),
- im_context(NULL), lastNonCommonScript(PANGO_SCRIPT_INVALID_CODE),
- lastWheelMouseDirection(0),
- wheelMouseIntensity(0),
- smoothScrollY(0),
- smoothScrollX(0),
- rgnUpdate(0),
- repaintFullWindow(false),
- styleIdleID(0),
- accessibilityEnabled(SC_ACCESSIBILITY_ENABLED),
- accessible(0) {
+ adjustmentv(nullptr), adjustmenth(nullptr),
+ verticalScrollBarWidth(30), horizontalScrollBarHeight(30),
+ evbtn(nullptr),
+ buttonMouse(0),
+ capturedMouse(false), dragWasDropped(false),
+ lastKey(0), rectangularSelectionModifier(SCMOD_CTRL),
+ parentClass(nullptr),
+ atomSought(nullptr),
+ im_context(nullptr),
+ lastNonCommonScript(PANGO_SCRIPT_INVALID_CODE),
+ lastWheelMouseDirection(0),
+ wheelMouseIntensity(0),
+ smoothScrollY(0),
+ smoothScrollX(0),
+ rgnUpdate(nullptr),
+ repaintFullWindow(false),
+ styleIdleID(0),
+ accessibilityEnabled(SC_ACCESSIBILITY_ENABLED),
+ accessible(nullptr) {
sci = sci_;
wMain = GTK_WIDGET(sci);
@@ -182,7 +189,7 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :
// There does not seem to be a real standard for indicating that the clipboard
// contains a rectangular selection, so copy Developer Studio.
cfColumnSelect = static_cast<CLIPFORMAT>(
- ::RegisterClipboardFormat("MSDEVColumnSelect"));
+ ::RegisterClipboardFormat("MSDEVColumnSelect"));
// Get intellimouse parameters when running on win32; otherwise use
// reasonable default
@@ -241,21 +248,21 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) {
attrs.cursor = cursor;
#if GTK_CHECK_VERSION(3,0,0)
gtk_widget_set_window(widget, gdk_window_new(gtk_widget_get_parent_window(widget), &attrs,
- GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_CURSOR));
+ GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_CURSOR));
#if GTK_CHECK_VERSION(3,8,0)
gtk_widget_register_window(widget, gtk_widget_get_window(widget));
#else
gdk_window_set_user_data(gtk_widget_get_window(widget), widget);
#endif
#if !GTK_CHECK_VERSION(3,18,0)
gtk_style_context_set_background(gtk_widget_get_style_context(widget),
- gtk_widget_get_window(widget));
+ gtk_widget_get_window(widget));
#endif
gdk_window_show(gtk_widget_get_window(widget));
UnRefCursor(cursor);
#else
widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attrs,
- GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR);
+ GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR);
gdk_window_set_user_data(widget->window, widget);
widget->style = gtk_style_attach(widget->style, widget->window);
gdk_window_set_background(widget->window, &widget->style->bg[GTK_STATE_NORMAL]);
@@ -267,15 +274,15 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) {
im_context = gtk_im_multicontext_new();
g_signal_connect(G_OBJECT(im_context), "commit",
- G_CALLBACK(Commit), this);
+ G_CALLBACK(Commit), this);
g_signal_connect(G_OBJECT(im_context), "preedit_changed",
- G_CALLBACK(PreeditChanged), this);
+ G_CALLBACK(PreeditChanged), this);
gtk_im_context_set_client_window(im_context, WindowFromWidget(widget));
GtkWidget *widtxt = PWidget(wText); // // No code inside the G_OBJECT macro
g_signal_connect_after(G_OBJECT(widtxt), "style_set",
- G_CALLBACK(ScintillaGTK::StyleSetText), NULL);
+ G_CALLBACK(ScintillaGTK::StyleSetText), nullptr);
g_signal_connect_after(G_OBJECT(widtxt), "realize",
- G_CALLBACK(ScintillaGTK::RealizeText), NULL);
+ G_CALLBACK(ScintillaGTK::RealizeText), nullptr);
gtk_widget_realize(widtxt);
gtk_widget_realize(PWidget(scrollbarv));
gtk_widget_realize(PWidget(scrollbarh));
@@ -296,7 +303,7 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) {
g_signal_connect(PWidget(wSelection), "selection_get", G_CALLBACK(PrimarySelection), (gpointer) this);
g_signal_connect(PWidget(wSelection), "selection_clear_event", G_CALLBACK(PrimaryClear), (gpointer) this);
gtk_selection_add_targets(PWidget(wSelection), GDK_SELECTION_PRIMARY,
- clipboardCopyTargets, nClipboardCopyTargets);
+ clipboardCopyTargets, nClipboardCopyTargets);
}
void ScintillaGTK::Realize(GtkWidget *widget) {
@@ -321,7 +328,7 @@ void ScintillaGTK::UnRealizeThis(GtkWidget *widget) {
gtk_widget_unrealize(PWidget(wPreedit));
gtk_widget_unrealize(PWidget(wPreeditDraw));
g_object_unref(im_context);
- im_context = NULL;
+ im_context = nullptr;
if (GTK_WIDGET_CLASS(parentClass)->unrealize)
GTK_WIDGET_CLASS(parentClass)->unrealize(widget);
@@ -338,8 +345,8 @@ void ScintillaGTK::UnRealize(GtkWidget *widget) {
static void MapWidget(GtkWidget *widget) {
if (widget &&
- gtk_widget_get_visible(GTK_WIDGET(widget)) &&
- !IS_WIDGET_MAPPED(widget)) {
+ gtk_widget_get_visible(GTK_WIDGET(widget)) &&
+ !IS_WIDGET_MAPPED(widget)) {
gtk_widget_map(widget);
}
}
@@ -389,11 +396,11 @@ void ScintillaGTK::UnMap(GtkWidget *widget) {
void ScintillaGTK::ForAll(GtkCallback callback, gpointer callback_data) {
try {
- (*callback) (PWidget(wText), callback_data);
+ (*callback)(PWidget(wText), callback_data);
if (PWidget(scrollbarv))
- (*callback) (PWidget(scrollbarv), callback_data);
+ (*callback)(PWidget(scrollbarv), callback_data);
if (PWidget(scrollbarh))
- (*callback) (PWidget(scrollbarh), callback_data);
+ (*callback)(PWidget(scrollbarh), callback_data);
} catch (...) {
errorStatus = SC_STATUS_FAILURE;
}
@@ -402,7 +409,7 @@ void ScintillaGTK::ForAll(GtkCallback callback, gpointer callback_data) {
void ScintillaGTK::MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) {
ScintillaGTK *sciThis = FromWidget((GtkWidget *)container);
- if (callback != NULL && include_internals) {
+ if (callback && include_internals) {
sciThis->ForAll(callback, callback_data);
}
}
@@ -421,7 +428,7 @@ class PreEditString {
explicit PreEditString(GtkIMContext *im_context) {
gtk_im_context_get_preedit_string(im_context, &str, &attrs, &cursor_pos);
- validUTF8 = g_utf8_validate(str, strlen(str), NULL);
+ validUTF8 = g_utf8_validate(str, strlen(str), nullptr);
uniStr = g_utf8_to_ucs4_fast(str, strlen(str), &uniStrLen);
pscript = pango_script_for_unichar(uniStr[0]);
}
@@ -437,9 +444,9 @@ class PreEditString {
gint ScintillaGTK::FocusInThis(GtkWidget *) {
try {
SetFocusState(true);
- if (im_context != NULL) {
+ if (im_context) {
PreEditString pes(im_context);
- if (PWidget(wPreedit) != NULL) {
+ if (PWidget(wPreedit)) {
if (strlen(pes.str) > 0) {
gtk_widget_show(PWidget(wPreedit));
} else {
@@ -464,9 +471,9 @@ gint ScintillaGTK::FocusOutThis(GtkWidget *) {
try {
SetFocusState(false);
- if (PWidget(wPreedit) != NULL)
+ if (PWidget(wPreedit))
gtk_widget_hide(PWidget(wPreedit));
- if (im_context != NULL)
+ if (im_context)
gtk_im_context_focus_out(im_context);
} catch (...) {
@@ -486,8 +493,8 @@ void ScintillaGTK::SizeRequest(GtkWidget *widget, GtkRequisition *requisition) {
requisition->height = 1;
GtkRequisition child_requisition;
#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_get_preferred_size(PWidget(sciThis->scrollbarh), NULL, &child_requisition);
- gtk_widget_get_preferred_size(PWidget(sciThis->scrollbarv), NULL, &child_requisition);
+ gtk_widget_get_preferred_size(PWidget(sciThis->scrollbarh), nullptr, &child_requisition);
+ gtk_widget_get_preferred_size(PWidget(sciThis->scrollbarv), nullptr, &child_requisition);
#else
gtk_widget_size_request(PWidget(sciThis->scrollbarh), &child_requisition);
gtk_widget_size_request(PWidget(sciThis->scrollbarv), &child_requisition);
@@ -516,10 +523,10 @@ void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) {
gtk_widget_set_allocation(widget, allocation);
if (IS_WIDGET_REALIZED(widget))
gdk_window_move_resize(WindowFromWidget(widget),
- allocation->x,
- allocation->y,
- allocation->width,
- allocation->height);
+ allocation->x,
+ allocation->y,
+ allocation->width,
+ allocation->height);
sciThis->Resize(allocation->width, allocation->height);
@@ -530,7 +537,7 @@ void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) {
void ScintillaGTK::Init() {
parentClass = reinterpret_cast<GtkWidgetClass *>(
- g_type_class_ref(gtk_container_get_type()));
+ g_type_class_ref(gtk_container_get_type()));
gint maskSmooth = 0;
#if defined(GDK_WINDOWING_WAYLAND)
@@ -544,34 +551,34 @@ void ScintillaGTK::Init() {
gtk_widget_set_can_focus(PWidget(wMain), TRUE);
gtk_widget_set_sensitive(PWidget(wMain), TRUE);
gtk_widget_set_events(PWidget(wMain),
- GDK_EXPOSURE_MASK
- | GDK_SCROLL_MASK
- | maskSmooth
- | GDK_STRUCTURE_MASK
- | GDK_KEY_PRESS_MASK
- | GDK_KEY_RELEASE_MASK
- | GDK_FOCUS_CHANGE_MASK
- | GDK_LEAVE_NOTIFY_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_POINTER_MOTION_MASK
- | GDK_POINTER_MOTION_HINT_MASK);
+ GDK_EXPOSURE_MASK
+ | GDK_SCROLL_MASK
+ | maskSmooth
+ | GDK_STRUCTURE_MASK
+ | GDK_KEY_PRESS_MASK
+ | GDK_KEY_RELEASE_MASK
+ | GDK_FOCUS_CHANGE_MASK
+ | GDK_LEAVE_NOTIFY_MASK
+ | GDK_BUTTON_PRESS_MASK
+ | GDK_BUTTON_RELEASE_MASK
+ | GDK_POINTER_MOTION_MASK
+ | GDK_POINTER_MOTION_HINT_MASK);
wText = gtk_drawing_area_new();
gtk_widget_set_parent(PWidget(wText), PWidget(wMain));
GtkWidget *widtxt = PWidget(wText); // No code inside the G_OBJECT macro
gtk_widget_show(widtxt);
#if GTK_CHECK_VERSION(3,0,0)
g_signal_connect(G_OBJECT(widtxt), "draw",
- G_CALLBACK(ScintillaGTK::DrawText), this);
+ G_CALLBACK(ScintillaGTK::DrawText), this);
#else
g_signal_connect(G_OBJECT(widtxt), "expose_event",
- G_CALLBACK(ScintillaGTK::ExposeText), this);
+ G_CALLBACK(ScintillaGTK::ExposeText), this);
#endif
#if GTK_CHECK_VERSION(3,0,0)
// we need a runtime check because we don't want double buffering when
// running on >= 3.9.2
- if (gtk_check_version(3,9,2) != NULL /* on < 3.9.2 */)
+ if (gtk_check_version(3, 9, 2) != nullptr /* on < 3.9.2 */)
#endif
{
#if !GTK_CHECK_VERSION(3,14,0)
@@ -589,7 +596,7 @@ void ScintillaGTK::Init() {
#endif
gtk_widget_set_can_focus(PWidget(scrollbarv), FALSE);
g_signal_connect(G_OBJECT(adjustmentv), "value_changed",
- G_CALLBACK(ScrollSignal), this);
+ G_CALLBACK(ScrollSignal), this);
gtk_widget_set_parent(PWidget(scrollbarv), PWidget(wMain));
gtk_widget_show(PWidget(scrollbarv));
@@ -601,26 +608,26 @@ void ScintillaGTK::Init() {
#endif
gtk_widget_set_can_focus(PWidget(scrollbarh), FALSE);
g_signal_connect(G_OBJECT(adjustmenth), "value_changed",
- G_CALLBACK(ScrollHSignal), this);
+ G_CALLBACK(ScrollHSignal), this);
gtk_widget_set_parent(PWidget(scrollbarh), PWidget(wMain));
gtk_widget_show(PWidget(scrollbarh));
gtk_widget_grab_focus(PWidget(wMain));
gtk_drag_dest_set(GTK_WIDGET(PWidget(wMain)),
- GTK_DEST_DEFAULT_ALL, clipboardPasteTargets, nClipboardPasteTargets,
- actionCopyOrMove);
+ GTK_DEST_DEFAULT_ALL, clipboardPasteTargets, nClipboardPasteTargets,
+ actionCopyOrMove);
/* create pre-edit window */
wPreedit = gtk_window_new(GTK_WINDOW_POPUP);
wPreeditDraw = gtk_drawing_area_new();
GtkWidget *predrw = PWidget(wPreeditDraw); // No code inside the G_OBJECT macro
#if GTK_CHECK_VERSION(3,0,0)
g_signal_connect(G_OBJECT(predrw), "draw",
- G_CALLBACK(DrawPreedit), this);
+ G_CALLBACK(DrawPreedit), this);
#else
g_signal_connect(G_OBJECT(predrw), "expose_event",
- G_CALLBACK(ExposePreedit), this);
+ G_CALLBACK(ExposePreedit), this);
#endif
gtk_container_add(GTK_CONTAINER(PWidget(wPreedit)), predrw);
gtk_widget_show(predrw);
@@ -630,15 +637,15 @@ void ScintillaGTK::Init() {
if (g_object_class_find_property(G_OBJECT_GET_CLASS(
G_OBJECT(gtk_settings_get_default())), "gtk-cursor-blink")) {
g_object_get(G_OBJECT(
- gtk_settings_get_default()), "gtk-cursor-blink", &blinkOn, NULL);
+ gtk_settings_get_default()), "gtk-cursor-blink", &blinkOn, nullptr);
}
if (blinkOn &&
- g_object_class_find_property(G_OBJECT_GET_CLASS(
- G_OBJECT(gtk_settings_get_default())), "gtk-cursor-blink-time")) {
+ g_object_class_find_property(G_OBJECT_GET_CLASS(
+ G_OBJECT(gtk_settings_get_default())), "gtk-cursor-blink-time")) {
gint value;
g_object_get(G_OBJECT(
- gtk_settings_get_default()), "gtk-cursor-blink-time", &value, NULL);
- caret.period = gint(value / 1.75);
+ gtk_settings_get_default()), "gtk-cursor-blink-time", &value, nullptr);
+ caret.period = static_cast<int>(value / 1.75);
} else {
caret.period = 0;
}
@@ -658,9 +665,9 @@ void ScintillaGTK::Finalise() {
FineTickerCancel(tr);
}
if (accessible) {
- gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), NULL);
+ gtk_accessible_set_widget(GTK_ACCESSIBLE(accessible), nullptr);
g_object_unref(accessible);
- accessible = 0;
+ accessible = nullptr;
}
ScintillaBase::Finalise();
@@ -682,7 +689,7 @@ void ScintillaGTK::DisplayCursor(Window::Cursor c) {
bool ScintillaGTK::DragThreshold(Point ptStart, Point ptNow) {
return gtk_drag_check_threshold(GTK_WIDGET(PWidget(wMain)),
- ptStart.x, ptStart.y, ptNow.x, ptNow.y);
+ ptStart.x, ptStart.y, ptNow.x, ptNow.y);
}
void ScintillaGTK::StartDrag() {
@@ -692,23 +699,23 @@ void ScintillaGTK::StartDrag() {
GtkTargetList *tl = gtk_target_list_new(clipboardCopyTargets, nClipboardCopyTargets);
#if GTK_CHECK_VERSION(3,10,0)
gtk_drag_begin_with_coordinates(GTK_WIDGET(PWidget(wMain)),
- tl,
- actionCopyOrMove,
- buttonMouse,
- evbtn,
- -1, -1);
+ tl,
+ actionCopyOrMove,
+ buttonMouse,
+ evbtn,
+ -1, -1);
#else
gtk_drag_begin(GTK_WIDGET(PWidget(wMain)),
- tl,
- actionCopyOrMove,
- buttonMouse,
- evbtn);
+ tl,
+ actionCopyOrMove,
+ buttonMouse,
+ evbtn);
#endif
}
namespace Scintilla {
std::string ConvertText(const char *s, size_t len, const char *charSetDest,
- const char *charSetSource, bool transliterations, bool silent) {
+ const char *charSetSource, bool transliterations, bool silent) {
// s is not const because of different versions of iconv disagreeing about const
std::string destForm;
Converter conv(charSetDest, charSetSource, transliterations);
@@ -720,7 +727,7 @@ std::string ConvertText(const char *s, size_t len, const char *charSetDest,
gsize inLeft = len;
char *putf = &destForm[0];
char *pout = putf;
- gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft);
+ const gsize conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft);
if (conversions == sizeFailure) {
if (!silent) {
if (len == 1)
@@ -744,7 +751,7 @@ std::string ConvertText(const char *s, size_t len, const char *charSetDest,
// Returns the target converted to UTF8.
// Return the length in bytes.
Sci::Position ScintillaGTK::TargetAsUTF8(char *text) const {
- Sci::Position targetLength = targetEnd - targetStart;
+ const Sci::Position targetLength = targetEnd - targetStart;
if (IsUnicodeMode()) {
if (text) {
pdoc->GetCharRange(text, targetStart, targetLength);
@@ -771,7 +778,7 @@ Sci::Position ScintillaGTK::TargetAsUTF8(char *text) const {
// Translates a nul terminated UTF8 string into the document encoding.
// Return the length of the result in bytes.
Sci::Position ScintillaGTK::EncodedFromUTF8(const char *utf8, char *encoded) const {
- Sci::Position inputLength = (lengthForEncode >= 0) ? lengthForEncode : strlen(utf8);
+ const Sci::Position inputLength = (lengthForEncode >= 0) ? lengthForEncode : strlen(utf8);
if (IsUnicodeMode()) {
if (encoded) {
memcpy(encoded, utf8, inputLength);
@@ -799,12 +806,12 @@ Sci::Position ScintillaGTK::EncodedFromUTF8(const char *utf8, char *encoded) con
bool ScintillaGTK::ValidCodePage(int codePage) const {
return codePage == 0
- || codePage == SC_CP_UTF8
- || codePage == 932
- || codePage == 936
- || codePage == 949
- || codePage == 950
- || codePage == 1361;
+ || codePage == SC_CP_UTF8
+ || codePage == 932
+ || codePage == 936
+ || codePage == 949
+ || codePage == 950
+ || codePage == 1361;
}
sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
@@ -831,7 +838,7 @@ sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam
case SCI_ENCODEDFROMUTF8:
return EncodedFromUTF8(ConstCharPtrFromUPtr(wParam),
- CharPtrFromSPtr(lParam));
+ CharPtrFromSPtr(lParam));
case SCI_SETRECTANGULARSELECTIONMODIFIER:
rectangularSelectionModifier = wParam;
@@ -841,15 +848,15 @@ sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam
return rectangularSelectionModifier;
case SCI_SETREADONLY: {
- sptr_t ret = ScintillaBase::WndProc(iMessage, wParam, lParam);
- if (accessible) {
- ScintillaGTKAccessible *sciAccessible = ScintillaGTKAccessible::FromAccessible(accessible);
- if (sciAccessible) {
- sciAccessible->NotifyReadOnly();
+ const sptr_t ret = ScintillaBase::WndProc(iMessage, wParam, lParam);
+ if (accessible) {
+ ScintillaGTKAccessible *sciAccessible = ScintillaGTKAccessible::FromAccessible(accessible);
+ if (sciAccessible) {
+ sciAccessible->NotifyReadOnly();
+ }
}
+ return ret;
}
- return ret;
- }
case SCI_GETACCESSIBILITY:
return accessibilityEnabled;
@@ -867,7 +874,7 @@ sptr_t ScintillaGTK::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam
default:
return ScintillaBase::WndProc(iMessage, wParam, lParam);
}
- } catch (std::bad_alloc&) {
+ } catch (std::bad_alloc &) {
errorStatus = SC_STATUS_BADALLOC;
} catch (...) {
errorStatus = SC_STATUS_FAILURE;
@@ -901,7 +908,7 @@ bool ScintillaGTK::SetIdle(bool on) {
if (!idler.state) {
idler.state = true;
idler.idlerID = GUINT_TO_POINTER(
- gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE, IdleCallback, this, NULL));
+ gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE, IdleCallback, this, nullptr));
}
} else {
// Stop idler, if it's running
@@ -959,11 +966,13 @@ bool ScintillaGTK::PaintContains(PRectangle rc) {
} else if (rgnUpdate) {
#if GTK_CHECK_VERSION(3,0,0)
cairo_rectangle_t grc = {rc.left, rc.top,
- rc.right - rc.left, rc.bottom - rc.top};
+ rc.right - rc.left, rc.bottom - rc.top
+ };
contains = CRectListContains(rgnUpdate, grc);
#else
GdkRectangle grc = {static_cast<gint>(rc.left), static_cast<gint>(rc.top),
- static_cast<gint>(rc.right - rc.left), static_cast<gint>(rc.bottom - rc.top)};
+ static_cast<gint>(rc.right - rc.left), static_cast<gint>(rc.bottom - rc.top)
+ };
if (gdk_region_rect_in(rgnUpdate, &grc) != GDK_OVERLAP_RECTANGLE_IN) {
contains = false;
}
@@ -1023,35 +1032,35 @@ void ScintillaGTK::SetHorizontalScrollPos() {
bool ScintillaGTK::ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) {
bool modified = false;
- int pageScroll = LinesToScroll();
+ const int pageScroll = LinesToScroll();
if (gtk_adjustment_get_upper(adjustmentv) != (nMax + 1) ||
- gtk_adjustment_get_page_size(adjustmentv) != nPage ||
- gtk_adjustment_get_page_increment(adjustmentv) != pageScroll) {
+ gtk_adjustment_get_page_size(adjustmentv) != nPage ||
+ gtk_adjustment_get_page_increment(adjustmentv) != pageScroll) {
gtk_adjustment_set_upper(adjustmentv, nMax + 1);
- gtk_adjustment_set_page_size(adjustmentv, nPage);
- gtk_adjustment_set_page_increment(adjustmentv, pageScroll);
+ gtk_adjustment_set_page_size(adjustmentv, nPage);
+ gtk_adjustment_set_page_increment(adjustmentv, pageScroll);
#if !GTK_CHECK_VERSION(3,18,0)
gtk_adjustment_changed(GTK_ADJUSTMENT(adjustmentv));
#endif
modified = true;
}
- PRectangle rcText = GetTextRectangle();
+ const PRectangle rcText = GetTextRectangle();
int horizEndPreferred = scrollWidth;
if (horizEndPreferred < 0)
horizEndPreferred = 0;
- unsigned int pageWidth = rcText.Width();
- unsigned int pageIncrement = pageWidth / 3;
- unsigned int charWidth = vs.styles[STYLE_DEFAULT].aveCharWidth;
+ const unsigned int pageWidth = static_cast<unsigned int>(rcText.Width());
+ const unsigned int pageIncrement = pageWidth / 3;
+ const unsigned int charWidth = vs.styles[STYLE_DEFAULT].aveCharWidth;
if (gtk_adjustment_get_upper(adjustmenth) != horizEndPreferred ||
- gtk_adjustment_get_page_size(adjustmenth) != pageWidth ||
- gtk_adjustment_get_page_increment(adjustmenth) != pageIncrement ||
- gtk_adjustment_get_step_increment(adjustmenth) != charWidth) {
+ gtk_adjustment_get_page_size(adjustmenth) != pageWidth ||
+ gtk_adjustment_get_page_increment(adjustmenth) != pageIncrement ||
+ gtk_adjustment_get_step_increment(adjustmenth) != charWidth) {
gtk_adjustment_set_upper(adjustmenth, horizEndPreferred);
- gtk_adjustment_set_page_size(adjustmenth, pageWidth);
- gtk_adjustment_set_page_increment(adjustmenth, pageIncrement);
- gtk_adjustment_set_step_increment(adjustmenth, charWidth);
+ gtk_adjustment_set_page_size(adjustmenth, pageWidth);
+ gtk_adjustment_set_page_increment(adjustmenth, pageIncrement);
+ gtk_adjustment_set_step_increment(adjustmenth, charWidth);
#if !GTK_CHECK_VERSION(3,18,0)
gtk_adjustment_changed(GTK_ADJUSTMENT(adjustmenth));
#endif
@@ -1065,28 +1074,28 @@ bool ScintillaGTK::ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) {
}
void ScintillaGTK::ReconfigureScrollBars() {
- PRectangle rc = wMain.GetClientPosition();
- Resize(rc.Width(), rc.Height());
+ const PRectangle rc = wMain.GetClientPosition();
+ Resize(static_cast<int>(rc.Width()), static_cast<int>(rc.Height()));
}
void ScintillaGTK::NotifyChange() {
g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0,
- Platform::LongFromTwoShorts(GetCtrlID(), SCEN_CHANGE), PWidget(wMain));
+ Platform::LongFromTwoShorts(GetCtrlID(), SCEN_CHANGE), PWidget(wMain));
}
void ScintillaGTK::NotifyFocus(bool focus) {
if (commandEvents)
g_signal_emit(G_OBJECT(sci), scintilla_signals[COMMAND_SIGNAL], 0,
- Platform::LongFromTwoShorts
- (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain));
+ Platform::LongFromTwoShorts
+ (GetCtrlID(), focus ? SCEN_SETFOCUS : SCEN_KILLFOCUS), PWidget(wMain));
Editor::NotifyFocus(focus);
}
void ScintillaGTK::NotifyParent(SCNotification scn) {
scn.nmhdr.hwndFrom = PWidget(wMain);
scn.nmhdr.idFrom = GetCtrlID();
g_signal_emit(G_OBJECT(sci), scintilla_signals[NOTIFY_SIGNAL], 0,
- GetCtrlID(), &scn);
+ GetCtrlID(), &scn);
}
void ScintillaGTK::NotifyKey(int key, int modifiers) {
@@ -1124,7 +1133,7 @@ class CaseFolderDBCS : public CaseFolderTable {
return 1;
} else if (*charSet) {
std::string sUTF8 = ConvertText(mixed, lenMixed,
- "UTF-8", charSet, false);
+ "UTF-8", charSet, false);
if (!sUTF8.empty()) {
gchar *mapped = g_utf8_casefold(sUTF8.c_str(), sUTF8.length());
size_t lenMapped = strlen(mapped);
@@ -1159,12 +1168,12 @@ CaseFolder *ScintillaGTK::CaseFolderForEncoding() {
sCharacter[0] = i;
// Silent as some bytes have no assigned character
std::string sUTF8 = ConvertText(sCharacter, 1,
- "UTF-8", charSetBuffer, false, true);
+ "UTF-8", charSetBuffer, false, true);
if (!sUTF8.empty()) {
gchar *mapped = g_utf8_casefold(sUTF8.c_str(), sUTF8.length());
if (mapped) {
std::string mappedBack = ConvertText(mapped, strlen(mapped),
- charSetBuffer, "UTF-8", false, true);
+ charSetBuffer, "UTF-8", false, true);
if ((mappedBack.length() == 1) && (mappedBack[0] != sCharacter[0])) {
pcf->SetTranslation(sCharacter[0], mappedBack[0]);
}
@@ -1177,7 +1186,7 @@ CaseFolder *ScintillaGTK::CaseFolderForEncoding() {
return new CaseFolderDBCS(charSetBuffer);
}
}
- return 0;
+ return nullptr;
}
}
@@ -1205,8 +1214,8 @@ std::string ScintillaGTK::CaseMapString(const std::string &s, int caseMapping) {
if (IsUnicodeMode()) {
std::string retMapped(s.length() * maxExpansionCaseConversion, 0);
- size_t lenMapped = CaseConvertString(&retMapped[0], retMapped.length(), s.c_str(), s.length(),
- (caseMapping == cmUpper) ? CaseConversionUpper : CaseConversionLower);
+ const size_t lenMapped = CaseConvertString(&retMapped[0], retMapped.length(), s.c_str(), s.length(),
+ (caseMapping == cmUpper) ? CaseConversionUpper : CaseConversionLower);
retMapped.resize(lenMapped);
return retMapped;
}
@@ -1219,7 +1228,7 @@ std::string ScintillaGTK::CaseMapString(const std::string &s, int caseMapping) {
} else {
// Change text to UTF-8
std::string sUTF8 = ConvertText(s.c_str(), s.length(),
- "UTF-8", charSetBuffer, false);
+ "UTF-8", charSetBuffer, false);
CaseMapper mapper(sUTF8, caseMapping == cmUpper);
return ConvertText(mapper.mapped, strlen(mapper.mapped), charSetBuffer, "UTF-8", false);
}
@@ -1252,37 +1261,47 @@ void ScintillaGTK::Copy() {
}
}
-void ScintillaGTK::Paste() {
- atomSought = atomUTF8;
- GtkClipboard *clipBoard =
- gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), atomClipboard);
- if (clipBoard == NULL)
- return;
+namespace {
- // helper class for the asynchronous paste not to risk calling in a destroyed ScintillaGTK
- class Helper : GObjectWatcher {
- ScintillaGTK *sci;
+// Helper class for the asynchronous paste not to risk calling in a destroyed ScintillaGTK
- void Destroyed() override {
- sci = 0;
- }
+class SelectionReceiver : GObjectWatcher {
+ ScintillaGTK *sci;
- public:
- Helper(ScintillaGTK *sci_) :
- GObjectWatcher(G_OBJECT(PWidget(sci_->wMain))),
- sci(sci_) {
- }
+ void Destroyed() override {
+ sci = nullptr;
+ }
- static void ClipboardReceived(GtkClipboard *, GtkSelectionData *selection_data, gpointer data) {
- Helper *self = static_cast<Helper*>(data);
- if (self->sci != 0) {
- self->sci->ReceivedSelection(selection_data);
- }
- delete self;
+public:
+ SelectionReceiver(ScintillaGTK *sci_) :
+ GObjectWatcher(G_OBJECT(sci_->MainObject())),
+ sci(sci_) {
+ }
+
+ static void ClipboardReceived(GtkClipboard *, GtkSelectionData *selection_data, gpointer data) {
+ SelectionReceiver *self = static_cast<SelectionReceiver *>(data);
+ if (self->sci) {
+ self->sci->ReceivedClipboard(selection_data);
}
- };
+ delete self;
+ }
+};
- gtk_clipboard_request_contents(clipBoard, atomSought, Helper::ClipboardReceived, new Helper(this));
+}
+
+void ScintillaGTK::RequestSelection(GdkAtom atomSelection) {
+ atomSought = atomUTF8;
+ GtkClipboard *clipBoard =
+ gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), atomSelection);
+ if (clipBoard) {
+ gtk_clipboard_request_contents(clipBoard, atomSought,
+ SelectionReceiver::ClipboardReceived,
+ new SelectionReceiver(this));
+ }
+}
+
+void ScintillaGTK::Paste() {
+ RequestSelection(GDK_SELECTION_CLIPBOARD);
}
void ScintillaGTK::CreateCallTipWindow(PRectangle rc) {
@@ -1293,23 +1312,25 @@ void ScintillaGTK::CreateCallTipWindow(PRectangle rc) {
gtk_container_add(GTK_CONTAINER(PWidget(ct.wCallTip)), widcdrw);
#if GTK_CHECK_VERSION(3,0,0)
g_signal_connect(G_OBJECT(widcdrw), "draw",
- G_CALLBACK(ScintillaGTK::DrawCT), &ct);
+ G_CALLBACK(ScintillaGTK::DrawCT), &ct);
#else
g_signal_connect(G_OBJECT(widcdrw), "expose_event",
- G_CALLBACK(ScintillaGTK::ExposeCT), &ct);
+ G_CALLBACK(ScintillaGTK::ExposeCT), &ct);
#endif
g_signal_connect(G_OBJECT(widcdrw), "button_press_event",
- G_CALLBACK(ScintillaGTK::PressCT), this);
+ G_CALLBACK(ScintillaGTK::PressCT), this);
gtk_widget_set_events(widcdrw,
- GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
+ GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
GtkWidget *top = gtk_widget_get_toplevel(static_cast<GtkWidget *>(wMain.GetID()));
gtk_window_set_transient_for(GTK_WINDOW(static_cast<GtkWidget *>(PWidget(ct.wCallTip))),
- GTK_WINDOW(top));
+ GTK_WINDOW(top));
}
- gtk_widget_set_size_request(PWidget(ct.wDraw), rc.Width(), rc.Height());
+ const int width = static_cast<int>(rc.Width());
+ const int height = static_cast<int>(rc.Height());
+ gtk_widget_set_size_request(PWidget(ct.wDraw), width, height);
ct.wDraw.Show();
if (PWindow(ct.wCallTip)) {
- gdk_window_resize(PWindow(ct.wCallTip), rc.Width(), rc.Height());
+ gdk_window_resize(PWindow(ct.wCallTip), width, height);
}
}
@@ -1321,7 +1342,7 @@ void ScintillaGTK::AddToPopUp(const char *label, int cmd, bool enabled) {
menuItem = gtk_separator_menu_item_new();
gtk_menu_shell_append(GTK_MENU_SHELL(popup.GetID()), menuItem);
g_object_set_data(G_OBJECT(menuItem), "CmdNum", GINT_TO_POINTER(cmd));
- g_signal_connect(G_OBJECT(menuItem),"activate", G_CALLBACK(PopUpCB), this);
+ g_signal_connect(G_OBJECT(menuItem), "activate", G_CALLBACK(PopUpCB), this);
if (cmd) {
if (menuItem)
@@ -1332,7 +1353,7 @@ void ScintillaGTK::AddToPopUp(const char *label, int cmd, bool enabled) {
bool ScintillaGTK::OwnPrimarySelection() {
return (wSelection.Created() &&
(gdk_selection_owner_get(GDK_SELECTION_PRIMARY) == PWindow(wSelection)) &&
- (PWindow(wSelection) != NULL));
+ (PWindow(wSelection) != nullptr));
}
void ScintillaGTK::ClaimSelection() {
@@ -1341,12 +1362,12 @@ void ScintillaGTK::ClaimSelection() {
if (!sel.Empty() && wSelection.Created() && IS_WIDGET_REALIZED(GTK_WIDGET(PWidget(wSelection)))) {
primarySelection = true;
gtk_selection_owner_set(GTK_WIDGET(PWidget(wSelection)),
- GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
+ GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
primary.Clear();
} else if (OwnPrimarySelection()) {
primarySelection = true;
if (primary.Empty())
- gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
+ gtk_selection_owner_set(nullptr, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);
} else {
primarySelection = false;
primary.Clear();
@@ -1396,47 +1417,67 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio
} else {
// Assume buffer is in same encoding as selection
selText.Copy(dest, pdoc->dbcsCodePage,
- vs.styles[STYLE_DEFAULT].characterSet, isRectangular, false);
+ vs.styles[STYLE_DEFAULT].characterSet, isRectangular, false);
}
} else { // UTF-8
const char *charSetBuffer = CharacterSetID();
if (!IsUnicodeMode() && *charSetBuffer) {
// Convert to locale
dest = ConvertText(dest.c_str(), dest.length(), charSetBuffer, "UTF-8", true);
selText.Copy(dest, pdoc->dbcsCodePage,
- vs.styles[STYLE_DEFAULT].characterSet, isRectangular, false);
+ vs.styles[STYLE_DEFAULT].characterSet, isRectangular, false);
} else {
selText.Copy(dest, SC_CP_UTF8, 0, isRectangular, false);
}
}
}
+void ScintillaGTK::InsertSelection(GtkSelectionData *selectionData) {
+ const gint length = gtk_selection_data_get_length(selectionData);
+ if (length >= 0) {
+ GdkAtom selection = gtk_selection_data_get_selection(selectionData);
+ SelectionText selText;
+ GetGtkSelectionText(selectionData, selText);
+
+ UndoGroup ug(pdoc);
+ if (selection == GDK_SELECTION_CLIPBOARD) {
+ ClearSelection(multiPasteMode == SC_MULTIPASTE_EACH);
+ }
+
+ InsertPasteShape(selText.Data(), selText.Length(),
+ selText.rectangular ? pasteRectangular : pasteStream);
+ EnsureCaretVisible();
+ }
+ Redraw();
+}
+
+GObject *ScintillaGTK::MainObject() const noexcept {
+ return G_OBJECT(PWidget(wMain));
+}
+
+void ScintillaGTK::ReceivedClipboard(GtkSelectionData *selection_data) noexcept {
+ try {
+ InsertSelection(selection_data);
+ } catch (...) {
+ errorStatus = SC_STATUS_FAILURE;
+ }
+}
+
void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) {
try {
- if ((SelectionOfGSD(selection_data) == atomClipboard) ||
- (SelectionOfGSD(selection_data) == GDK_SELECTION_PRIMARY)) {
+ if ((SelectionOfGSD(selection_data) == GDK_SELECTION_CLIPBOARD) ||
+ (SelectionOfGSD(selection_data) == GDK_SELECTION_PRIMARY)) {
if ((atomSought == atomUTF8) && (LengthOfGSD(selection_data) <= 0)) {
atomSought = atomString;
gtk_selection_convert(GTK_WIDGET(PWidget(wMain)),
- SelectionOfGSD(selection_data), atomSought, GDK_CURRENT_TIME);
+ SelectionOfGSD(selection_data), atomSought, GDK_CURRENT_TIME);
} else if ((LengthOfGSD(selection_data) > 0) &&
- ((TypeOfGSD(selection_data) == GDK_TARGET_STRING) || (TypeOfGSD(selection_data) == atomUTF8))) {
- SelectionText selText;
- GetGtkSelectionText(selection_data, selText);
-
- UndoGroup ug(pdoc);
- if (SelectionOfGSD(selection_data) != GDK_SELECTION_PRIMARY) {
- ClearSelection(multiPasteMode == SC_MULTIPASTE_EACH);
- }
-
- InsertPasteShape(selText.Data(), selText.Length(),
- selText.rectangular ? pasteRectangular : pasteStream);
- EnsureCaretVisible();
+ ((TypeOfGSD(selection_data) == GDK_TARGET_STRING) || (TypeOfGSD(selection_data) == atomUTF8))) {
+ InsertSelection(selection_data);
}
}
// else fprintf(stderr, "Target non string %d %d\n", (int)(selection_data->type),
// (int)(atomUTF8));
- Redraw();
} catch (...) {
errorStatus = SC_STATUS_FAILURE;
}
@@ -1507,29 +1548,29 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se
gtk_selection_data_set_text(selection_data, textData, len);
} else {
gtk_selection_data_set(selection_data,
- static_cast<GdkAtom>(GDK_SELECTION_TYPE_STRING),
- 8, reinterpret_cast<const guchar *>(textData), len);
+ static_cast<GdkAtom>(GDK_SELECTION_TYPE_STRING),
+ 8, reinterpret_cast<const guchar *>(textData), len);
}
}
void ScintillaGTK::StoreOnClipboard(SelectionText *clipText) {
GtkClipboard *clipBoard =
- gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), atomClipboard);
- if (clipBoard == NULL) // Occurs if widget isn't in a toplevel
+ gtk_widget_get_clipboard(GTK_WIDGET(PWidget(wMain)), GDK_SELECTION_CLIPBOARD);
+ if (clipBoard == nullptr) // Occurs if widget isn't in a toplevel
return;
if (gtk_clipboard_set_with_data(clipBoard, clipboardCopyTargets, nClipboardCopyTargets,
- ClipboardGetSelection, ClipboardClearSelection, clipText)) {
+ ClipboardGetSelection, ClipboardClearSelection, clipText)) {
gtk_clipboard_set_can_store(clipBoard, clipboardCopyTargets, nClipboardCopyTargets);
}
}
void ScintillaGTK::ClipboardGetSelection(GtkClipboard *, GtkSelectionData *selection_data, guint info, void *data) {
- GetSelection(selection_data, info, static_cast<SelectionText*>(data));
+ GetSelection(selection_data, info, static_cast<SelectionText *>(data));
}
void ScintillaGTK::ClipboardClearSelection(GtkClipboard *, void *data) {
- SelectionText *obj = static_cast<SelectionText*>(data);
+ SelectionText *obj = static_cast<SelectionText *>(data);
delete obj;
}
@@ -1595,9 +1636,9 @@ void ScintillaGTK::Resize(int width, int height) {
// These allocations should never produce negative sizes as they would wrap around to huge
// unsigned numbers inside GTK+ causing warnings.
- bool showSBHorizontal = horizontalScrollBarVisible && !Wrapping();
+ const bool showSBHorizontal = horizontalScrollBarVisible && !Wrapping();
- GtkAllocation alloc;
+ GtkAllocation alloc = {};
if (showSBHorizontal) {
gtk_widget_show(GTK_WIDGET(PWidget(scrollbarh)));
alloc.x = 0;
@@ -1632,7 +1673,7 @@ void ScintillaGTK::Resize(int width, int height) {
#if GTK_CHECK_VERSION(3, 0, 0)
// please GTK 3.20 and ask wText what size it wants, although we know it doesn't really need
// anything special as it's ours.
- gtk_widget_get_preferred_size(PWidget(wText), &requisition, NULL);
+ gtk_widget_get_preferred_size(PWidget(wText), &requisition, nullptr);
alloc.width = requisition.width;
alloc.height = requisition.height;
#endif
@@ -1641,10 +1682,12 @@ void ScintillaGTK::Resize(int width, int height) {
gtk_widget_size_allocate(GTK_WIDGET(PWidget(wText)), &alloc);
}
-static void SetAdjustmentValue(GtkAdjustment *object, int value) {
+namespace {
+
+void SetAdjustmentValue(GtkAdjustment *object, int value) {
GtkAdjustment *adjustment = GTK_ADJUSTMENT(object);
- int maxValue = static_cast<int>(
- gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment));
+ const int maxValue = static_cast<int>(
+ gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment));
if (value > maxValue)
value = maxValue;
@@ -1653,21 +1696,29 @@ static void SetAdjustmentValue(GtkAdjustment *object, int value) {
gtk_adjustment_set_value(adjustment, value);
}
-static int modifierTranslated(int sciModifier) {
+int modifierTranslated(int sciModifier) noexcept {
switch (sciModifier) {
- case SCMOD_SHIFT:
- return GDK_SHIFT_MASK;
- case SCMOD_CTRL:
- return GDK_CONTROL_MASK;
- case SCMOD_ALT:
- return GDK_MOD1_MASK;
- case SCMOD_SUPER:
- return GDK_MOD4_MASK;
- default:
- return 0;
+ case SCMOD_SHIFT:
+ return GDK_SHIFT_MASK;
+ case SCMOD_CTRL:
+ return GDK_CONTROL_MASK;
+ case SCMOD_ALT:
+ return GDK_MOD1_MASK;
+ case SCMOD_SUPER:
+ return GDK_MOD4_MASK;
+ default:
+ return 0;
}
}
+Point PointOfEvent(const GdkEventButton *event) noexcept {
+ // Use floor as want to round in the same direction (-infinity) so
+ // there is no stickiness crossing 0.0.
+ return Point(static_cast<XYPOSITION>(std::floor(event->x)), static_cast<XYPOSITION>(std::floor(event->y)));
+}
+
+}
+
gint ScintillaGTK::PressThis(GdkEventButton *event) {
try {
//Platform::DebugPrintf("Press %x time=%d state = %x button = %x\n",this,event->time, event->state, event->button);
@@ -1680,46 +1731,42 @@ gint ScintillaGTK::PressThis(GdkEventButton *event) {
}
evbtn = gdk_event_copy(reinterpret_cast<GdkEvent *>(event));
buttonMouse = event->button;
- Point pt;
- pt.x = floor(event->x);
- pt.y = floor(event->y);
- PRectangle rcClient = GetClientRectangle();
+ const Point pt = PointOfEvent(event);
+ const PRectangle rcClient = GetClientRectangle();
//Platform::DebugPrintf("Press %0d,%0d in %0d,%0d %0d,%0d\n",
// pt.x, pt.y, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom);
if ((pt.x > rcClient.right) || (pt.y > rcClient.bottom)) {
Platform::DebugPrintf("Bad location\n");
return FALSE;
}
- bool shift = (event->state & GDK_SHIFT_MASK) != 0;
+ const bool shift = (event->state & GDK_SHIFT_MASK) != 0;
bool ctrl = (event->state & GDK_CONTROL_MASK) != 0;
// On X, instead of sending literal modifiers use the user specified
// modifier, defaulting to control instead of alt.
// This is because most X window managers grab alt + click for moving
- bool alt = (event->state & modifierTranslated(rectangularSelectionModifier)) != 0;
+ const bool alt = (event->state & modifierTranslated(rectangularSelectionModifier)) != 0;
gtk_widget_grab_focus(PWidget(wMain));
if (event->button == 1) {
#if PLAT_GTK_MACOSX
- bool meta = ctrl;
+ const bool meta = ctrl;
// GDK reports the Command modifer key as GDK_MOD2_MASK for button events,
// not GDK_META_MASK like in key events.
ctrl = (event->state & GDK_MOD2_MASK) != 0;
#else
- bool meta = false;
+ const bool meta = false;
#endif
ButtonDownWithModifiers(pt, event->time, ModifierFlags(shift, ctrl, alt, meta));
} else if (event->button == 2) {
// Grab the primary selection if it exists
- SelectionPosition pos = SPositionFromLocation(pt, false, false, UserVirtualSpace());
+ const SelectionPosition pos = SPositionFromLocation(pt, false, false, UserVirtualSpace());
if (OwnPrimarySelection() && primary.Empty())
CopySelectionRange(&primary);
sel.Clear();
SetSelection(pos, pos);
- atomSought = atomUTF8;
- gtk_selection_convert(GTK_WIDGET(PWidget(wMain)), GDK_SELECTION_PRIMARY,
- atomSought, event->time);
+ RequestSelection(GDK_SELECTION_PRIMARY);
} else if (event->button == 3) {
if (!PointInSelection(pt))
SetEmptySelection(PositionFromLocation(pt));
@@ -1732,12 +1779,12 @@ gint ScintillaGTK::PressThis(GdkEventButton *event) {
ContextMenu(Point(pt.x + ox, pt.y + oy));
} else {
#if PLAT_GTK_MACOSX
- bool meta = ctrl;
+ const bool meta = ctrl;
// GDK reports the Command modifer key as GDK_MOD2_MASK for button events,
// not GDK_META_MASK like in key events.
ctrl = (event->state & GDK_MOD2_MASK) != 0;
#else
- bool meta = false;
+ const bool meta = false;
#endif
RightButtonDownWithModifiers(pt, event->time, ModifierFlags(shift, ctrl, alt, meta));
return FALSE;
@@ -1775,19 +1822,17 @@ gint ScintillaGTK::MouseRelease(GtkWidget *widget, GdkEventButton *event) {
if (!sciThis->HaveMouseCapture())
return FALSE;
if (event->button == 1) {
- Point pt;
- pt.x = int(event->x);
- pt.y = int(event->y);
+ Point pt = PointOfEvent(event);
//Platform::DebugPrintf("Up %x %x %d %d %d\n",
// sciThis,event->window,event->time, pt.x, pt.y);
if (event->window != PWindow(sciThis->wMain))
// If mouse released on scroll bar then the position is relative to the
// scrollbar, not the drawing window so just repeat the most recent point.
pt = sciThis->ptMouseLast;
const int modifiers = ModifierFlags(
- (event->state & GDK_SHIFT_MASK) != 0,
- (event->state & GDK_CONTROL_MASK) != 0,
- (event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0);
+ (event->state & GDK_SHIFT_MASK) != 0,
+ (event->state & GDK_CONTROL_MASK) != 0,
+ (event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0);
sciThis->ButtonUpWithModifiers(pt, event->time, modifiers);
}
} catch (...) {
@@ -1802,7 +1847,7 @@ gint ScintillaGTK::ScrollEvent(GtkWidget *widget, GdkEventScroll *event) {
ScintillaGTK *sciThis = FromWidget(widget);
try {
- if (widget == NULL || event == NULL)
+ if (widget == nullptr || event == nullptr)
return FALSE;
#if defined(GDK_WINDOWING_WAYLAND)
@@ -1811,12 +1856,12 @@ gint ScintillaGTK::ScrollEvent(GtkWidget *widget, GdkEventScroll *event) {
sciThis->smoothScrollY += event->delta_y * smoothScrollFactor;
sciThis->smoothScrollX += event->delta_x * smoothScrollFactor;;
if (ABS(sciThis->smoothScrollY) >= 1.0) {
- const int scrollLines = trunc(sciThis->smoothScrollY);
+ const int scrollLines = std::trunc(sciThis->smoothScrollY);
sciThis->ScrollTo(sciThis->topLine + scrollLines);
sciThis->smoothScrollY -= scrollLines;
}
if (ABS(sciThis->smoothScrollX) >= 1.0) {
- const int scrollPixels = trunc(sciThis->smoothScrollX);
+ const int scrollPixels = std::trunc(sciThis->smoothScrollX);
sciThis->HorizontalScrollTo(sciThis->xOffset + scrollPixels);
sciThis->smoothScrollX -= scrollPixels;
}
@@ -1913,7 +1958,7 @@ gint ScintillaGTK::Motion(GtkWidget *widget, GdkEventMotion *event) {
if (event->is_hint) {
#if GTK_CHECK_VERSION(3,0,0)
gdk_window_get_device_position(event->window,
- event->device, &x, &y, &state);
+ event->device, &x, &y, &state);
#else
gdk_window_get_pointer(event->window, &x, &y, &state);
#endif
@@ -1924,11 +1969,11 @@ gint ScintillaGTK::Motion(GtkWidget *widget, GdkEventMotion *event) {
}
//Platform::DebugPrintf("Move %x %x %d %c %d %d\n",
// sciThis,event->window,event->time,event->is_hint? 'h' :'.', x, y);
- Point pt(x, y);
+ const Point pt(static_cast<XYPOSITION>(x), static_cast<XYPOSITION>(y));
const int modifiers = ModifierFlags(
- (event->state & GDK_SHIFT_MASK) != 0,
- (event->state & GDK_CONTROL_MASK) != 0,
- (event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0);
+ (event->state & GDK_SHIFT_MASK) != 0,
+ (event->state & GDK_CONTROL_MASK) != 0,
+ (event->state & modifierTranslated(sciThis->rectangularSelectionModifier)) != 0);
sciThis->ButtonMoveWithModifiers(pt, event->time, modifiers);
} catch (...) {
sciThis->errorStatus = SC_STATUS_FAILURE;
@@ -2090,10 +2135,10 @@ gboolean ScintillaGTK::KeyThis(GdkEventKey *event) {
return true;
}
- bool shift = (event->state & GDK_SHIFT_MASK) != 0;
+ const bool shift = (event->state & GDK_SHIFT_MASK) != 0;
bool ctrl = (event->state & GDK_CONTROL_MASK) != 0;
- bool alt = (event->state & GDK_MOD1_MASK) != 0;
- bool super = (event->state & GDK_MOD4_MASK) != 0;
+ const bool alt = (event->state & GDK_MOD1_MASK) != 0;
+ const bool super = (event->state & GDK_MOD4_MASK) != 0;
guint key = event->keyval;
if ((ctrl || alt) && (key < 128))
key = toupper(key);
@@ -2110,12 +2155,12 @@ gboolean ScintillaGTK::KeyThis(GdkEventKey *event) {
bool consumed = false;
#if !(PLAT_GTK_MACOSX)
- bool meta = false;
+ const bool meta = false;
#else
- bool meta = ctrl;
+ const bool meta = ctrl;
ctrl = (event->state & GDK_META_MASK) != 0;
#endif
- bool added = KeyDownWithModifiers(key, ModifierFlags(shift, ctrl, alt, meta, super), &consumed) != 0;
+ const bool added = KeyDownWithModifiers(key, ModifierFlags(shift, ctrl, alt, meta, super), &consumed) != 0;
if (!consumed)
consumed = added;
//fprintf(stderr, "SK-key: %d %x %x\n",event->keyval, event->state, consumed);
@@ -2204,7 +2249,7 @@ bool ScintillaGTK::KoreanIME() {
void ScintillaGTK::MoveImeCarets(int pos) {
// Move carets relatively by bytes
for (size_t r=0; r<sel.Count(); r++) {
- int positionInsert = sel.Range(r).Start().Position();
+ const Sci::Position positionInsert = sel.Range(r).Start().Position();
sel.Range(r).caret.SetPosition(positionInsert + pos);
sel.Range(r).anchor.SetPosition(positionInsert + pos);
}
@@ -2220,7 +2265,7 @@ void ScintillaGTK::DrawImeIndicator(int indicator, int len) {
}
pdoc->DecorationSetCurrentIndicator(indicator);
for (size_t r=0; r<sel.Count(); r++) {
- int positionInsert = sel.Range(r).Start().Position();
+ const Sci::Position positionInsert = sel.Range(r).Start().Position();
pdoc->DecorationFillRange(positionInsert - len, 1, len);
}
}
@@ -2229,17 +2274,17 @@ static std::vector<int> MapImeIndicators(PangoAttrList *attrs, const char *u8Str
// Map input style to scintilla ime indicator.
// Attrs position points between UTF-8 bytes.
// Indicator index to be returned is character based though.
- glong charactersLen = g_utf8_strlen(u8Str, strlen(u8Str));
+ const glong charactersLen = g_utf8_strlen(u8Str, strlen(u8Str));
std::vector<int> indicator(charactersLen, SC_INDICATOR_UNKNOWN);
PangoAttrIterator *iterunderline = pango_attr_list_get_iterator(attrs);
if (iterunderline) {
do {
PangoAttribute *attrunderline = pango_attr_iterator_get(iterunderline, PANGO_ATTR_UNDERLINE);
if (attrunderline) {
- glong start = g_utf8_strlen(u8Str, attrunderline->start_index);
- glong end = g_utf8_strlen(u8Str, attrunderline->end_index);
- PangoUnderline uline = (PangoUnderline)((PangoAttrInt *)attrunderline)->value;
+ const glong start = g_utf8_strlen(u8Str, attrunderline->start_index);
+ const glong end = g_utf8_strlen(u8Str, attrunderline->end_index);
+ const PangoUnderline uline = (PangoUnderline)((PangoAttrInt *)attrunderline)->value;
for (glong i=start; i < end; ++i) {
switch (uline) {
case PANGO_UNDERLINE_NONE:
@@ -2262,10 +2307,10 @@ static std::vector<int> MapImeIndicators(PangoAttrList *attrs, const char *u8Str
PangoAttrIterator *itercolor = pango_attr_list_get_iterator(attrs);
if (itercolor) {
do {
- PangoAttribute *backcolor = pango_attr_iterator_get(itercolor, PANGO_ATTR_BACKGROUND);
+ const PangoAttribute *backcolor = pango_attr_iterator_get(itercolor, PANGO_ATTR_BACKGROUND);
if (backcolor) {
- glong start = g_utf8_strlen(u8Str, backcolor->start_index);
- glong end = g_utf8_strlen(u8Str, backcolor->end_index);
+ const glong start = g_utf8_strlen(u8Str, backcolor->start_index);
+ const glong end = g_utf8_strlen(u8Str, backcolor->end_index);
for (glong i=start; i < end; ++i) {
indicator[i] = SC_INDICATOR_TARGET; // target converted
}
@@ -2278,10 +2323,10 @@ static std::vector<int> MapImeIndicators(PangoAttrList *attrs, const char *u8Str
void ScintillaGTK::SetCandidateWindowPos() {
// Composition box accompanies candidate box.
- Point pt = PointMainCaret();
+ const Point pt = PointMainCaret();
GdkRectangle imeBox = {0}; // No need to set width
- imeBox.x = pt.x; // Only need positiion
- imeBox.y = pt.y + vs.lineHeight; // underneath the first charater
+ imeBox.x = static_cast<gint>(pt.x); // Only need positiion
+ imeBox.y = static_cast<gint>(pt.y) + vs.lineHeight; // underneath the first charater
gtk_im_context_set_cursor_location(im_context, &imeBox);
}
@@ -2300,7 +2345,7 @@ void ScintillaGTK::CommitThis(char *commitStr) {
gunichar *uniStr = g_utf8_to_ucs4_fast(commitStr, strlen(commitStr), &uniStrLen);
for (glong i = 0; i < uniStrLen; i++) {
gchar u8Char[UTF8MaxBytes+2] = {0};
- gint u8CharLen = g_unichar_to_utf8(uniStr[i], u8Char);
+ const gint u8CharLen = g_unichar_to_utf8(uniStr[i], u8Char);
std::string docChar = u8Char;
if (!IsUnicodeMode())
docChar = ConvertText(u8Char, u8CharLen, charSetSource, "UTF-8", true);
@@ -2341,7 +2386,7 @@ void ScintillaGTK::PreeditChangedInlineThis() {
PreEditString preeditStr(im_context);
const char *charSetSource = CharacterSetID();
- if (!preeditStr.validUTF8 || (charSetSource == NULL)) {
+ if (!preeditStr.validUTF8 || (charSetSource == nullptr)) {
ShowCaretAtCurrentPosition();
return;
}
@@ -2358,11 +2403,11 @@ void ScintillaGTK::PreeditChangedInlineThis() {
std::vector<int> indicator = MapImeIndicators(preeditStr.attrs, preeditStr.str);
- bool tmpRecordingMacro = recordingMacro;
+ const bool tmpRecordingMacro = recordingMacro;
recordingMacro = false;
for (glong i = 0; i < preeditStr.uniStrLen; i++) {
gchar u8Char[UTF8MaxBytes+2] = {0};
- gint u8CharLen = g_unichar_to_utf8(preeditStr.uniStr[i], u8Char);
+ const gint u8CharLen = g_u@@ Diff output truncated at 100000 characters. @@
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list