geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

ScintillaGTK.h
Go to the documentation of this file.
1// Scintilla source code edit control
2// ScintillaGTK.h - GTK+ specific subclass of ScintillaBase
3// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
4// The License.txt file describes the conditions under which this software may be distributed.
5
6#ifndef SCINTILLAGTK_H
7#define SCINTILLAGTK_H
8
9namespace Scintilla {
10
11class ScintillaGTKAccessible;
12
13#define OBJECT_CLASS GObjectClass
14
17
18 _ScintillaObject *sci;
22 GtkAdjustment *adjustmentv;
23 GtkAdjustment *adjustmenth;
27
29
30 GdkEvent *evbtn;
36
37 GtkWidgetClass *parentClass;
38
39 static GdkAtom atomUTF8;
40 static GdkAtom atomUTF8Mime;
41 static GdkAtom atomString;
42 static GdkAtom atomUriList;
43 static GdkAtom atomDROPFILES_DND;
44 GdkAtom atomSought;
45
46#if PLAT_GTK_WIN32
47 CLIPFORMAT cfColumnSelect;
48#endif
49
53 GtkIMContext *im_context;
54 GUnicodeScript lastNonCommonScript;
55
56 // Wheel mouse support
57 unsigned int linesPerScroll;
63
64#if GTK_CHECK_VERSION(3,0,0)
65 cairo_rectangle_list_t *rgnUpdate;
66#else
67 GdkRegion *rgnUpdate;
68#endif
70
73 AtkObject *accessible;
74
75public:
76 explicit ScintillaGTK(_ScintillaObject *sci_);
77 // Deleted so ScintillaGTK objects can not be copied.
78 ScintillaGTK(const ScintillaGTK &) = delete;
82 virtual ~ScintillaGTK();
83 static ScintillaGTK *FromWidget(GtkWidget *widget) noexcept;
84 static void ClassInit(OBJECT_CLASS *object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class);
85private:
86 void Init();
87 void Finalise() override;
88 bool AbandonPaint() override;
89 void DisplayCursor(Window::Cursor c) override;
90 bool DragThreshold(Point ptStart, Point ptNow) override;
91 void StartDrag() override;
92 Sci::Position TargetAsUTF8(char *text) const;
93 Sci::Position EncodedFromUTF8(const char *utf8, char *encoded) const;
94 bool ValidCodePage(int codePage) const override;
95public: // Public for scintilla_send_message
96 sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override;
97private:
98 sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override;
99 struct TimeThunk {
102 guint timer;
103 TimeThunk() noexcept : reason(tickCaret), scintilla(nullptr), timer(0) {}
104 };
106 bool FineTickerRunning(TickReason reason) override;
107 void FineTickerStart(TickReason reason, int millis, int tolerance) override;
108 void FineTickerCancel(TickReason reason) override;
109 bool SetIdle(bool on) override;
110 void SetMouseCapture(bool on) override;
111 bool HaveMouseCapture() override;
112 bool PaintContains(PRectangle rc) override;
113 void FullPaint();
114 PRectangle GetClientRectangle() const override;
115 void ScrollText(Sci::Line linesToMove) override;
116 void SetVerticalScrollPos() override;
117 void SetHorizontalScrollPos() override;
118 bool ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) override;
119 void ReconfigureScrollBars() override;
120 void NotifyChange() override;
121 void NotifyFocus(bool focus) override;
122 void NotifyParent(SCNotification scn) override;
123 void NotifyKey(int key, int modifiers);
124 void NotifyURIDropped(const char *list);
125 const char *CharacterSetID() const;
127 std::string CaseMapString(const std::string &s, int caseMapping) override;
128 int KeyDefault(int key, int modifiers) override;
129 void CopyToClipboard(const SelectionText &selectedText) override;
130 void Copy() override;
131 void RequestSelection(GdkAtom atomSelection);
132 void Paste() override;
133 void CreateCallTipWindow(PRectangle rc) override;
134 void AddToPopUp(const char *label, int cmd = 0, bool enabled = true) override;
135 bool OwnPrimarySelection();
136 void ClaimSelection() override;
137 static bool IsStringAtom(GdkAtom type);
138 void GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText);
139 void InsertSelection(GtkClipboard *clipBoard, GtkSelectionData *selectionData);
140public: // Public for SelectionReceiver
141 GObject *MainObject() const noexcept;
142 void ReceivedClipboard(GtkClipboard *clipBoard, GtkSelectionData *selection_data) noexcept;
143private:
144 void ReceivedSelection(GtkSelectionData *selection_data);
145 void ReceivedDrop(GtkSelectionData *selection_data);
146 static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text);
147 void StoreOnClipboard(SelectionText *clipText);
148 static void ClipboardGetSelection(GtkClipboard *clip, GtkSelectionData *selection_data, guint info, void *data);
149 static void ClipboardClearSelection(GtkClipboard *clip, void *data);
150
151 void UnclaimSelection(GdkEventSelection *selection_event);
152 static void PrimarySelection(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time_stamp, ScintillaGTK *sciThis);
153 static gboolean PrimaryClear(GtkWidget *widget, GdkEventSelection *event, ScintillaGTK *sciThis);
154 void Resize(int width, int height);
155
156 // Callback functions
157 void RealizeThis(GtkWidget *widget);
158 static void Realize(GtkWidget *widget);
159 void UnRealizeThis(GtkWidget *widget);
160 static void UnRealize(GtkWidget *widget);
161 void MapThis();
162 static void Map(GtkWidget *widget);
163 void UnMapThis();
164 static void UnMap(GtkWidget *widget);
165 gint FocusInThis(GtkWidget *widget);
166 static gint FocusIn(GtkWidget *widget, GdkEventFocus *event);
167 gint FocusOutThis(GtkWidget *widget);
168 static gint FocusOut(GtkWidget *widget, GdkEventFocus *event);
169 static void SizeRequest(GtkWidget *widget, GtkRequisition *requisition);
170#if GTK_CHECK_VERSION(3,0,0)
171 static void GetPreferredWidth(GtkWidget *widget, gint *minimalWidth, gint *naturalWidth);
172 static void GetPreferredHeight(GtkWidget *widget, gint *minimalHeight, gint *naturalHeight);
173#endif
174 static void SizeAllocate(GtkWidget *widget, GtkAllocation *allocation);
175#if GTK_CHECK_VERSION(3,0,0)
176 gboolean DrawTextThis(cairo_t *cr);
177 static gboolean DrawText(GtkWidget *widget, cairo_t *cr, ScintillaGTK *sciThis);
178 gboolean DrawThis(cairo_t *cr);
179 static gboolean DrawMain(GtkWidget *widget, cairo_t *cr);
180#else
181 gboolean ExposeTextThis(GtkWidget *widget, GdkEventExpose *ose);
182 static gboolean ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis);
183 gboolean Expose(GtkWidget *widget, GdkEventExpose *ose);
184 static gboolean ExposeMain(GtkWidget *widget, GdkEventExpose *ose);
185#endif
186 void ForAll(GtkCallback callback, gpointer callback_data);
187 static void MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data);
188
189 static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis);
190 static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis);
191 gint PressThis(GdkEventButton *event);
192 static gint Press(GtkWidget *widget, GdkEventButton *event);
193 static gint MouseRelease(GtkWidget *widget, GdkEventButton *event);
194 static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event);
195 static gint Motion(GtkWidget *widget, GdkEventMotion *event);
196 gboolean KeyThis(GdkEventKey *event);
197 static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event);
198 static gboolean KeyRelease(GtkWidget *widget, GdkEventKey *event);
199#if GTK_CHECK_VERSION(3,0,0)
200 gboolean DrawPreeditThis(GtkWidget *widget, cairo_t *cr);
201 static gboolean DrawPreedit(GtkWidget *widget, cairo_t *cr, ScintillaGTK *sciThis);
202#else
203 gboolean ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose);
204 static gboolean ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis);
205#endif
206 AtkObject *GetAccessibleThis(GtkWidget *widget);
207 static AtkObject *GetAccessible(GtkWidget *widget);
208
209 bool KoreanIME();
210 void CommitThis(char *commitStr);
211 static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis);
214 static void PreeditChanged(GtkIMContext *context, ScintillaGTK *sciThis);
215 void MoveImeCarets(int pos);
216 void DrawImeIndicator(int indicator, int len);
218
219 static void StyleSetText(GtkWidget *widget, GtkStyle *previous, void *);
220 static void RealizeText(GtkWidget *widget, void *);
221 static void Dispose(GObject *object);
222 static void Destroy(GObject *object);
223 static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data,
224 guint time);
225 static void SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data,
226 guint info, guint time);
227 static gint SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event);
228 gboolean DragMotionThis(GdkDragContext *context, gint x, gint y, guint dragtime);
229 static gboolean DragMotion(GtkWidget *widget, GdkDragContext *context,
230 gint x, gint y, guint dragtime);
231 static void DragLeave(GtkWidget *widget, GdkDragContext *context,
232 guint time);
233 static void DragEnd(GtkWidget *widget, GdkDragContext *context);
234 static gboolean Drop(GtkWidget *widget, GdkDragContext *context,
235 gint x, gint y, guint time);
236 static void DragDataReceived(GtkWidget *widget, GdkDragContext *context,
237 gint x, gint y, GtkSelectionData *selection_data, guint info, guint time);
238 static void DragDataGet(GtkWidget *widget, GdkDragContext *context,
239 GtkSelectionData *selection_data, guint info, guint time);
240 static gboolean TimeOut(gpointer ptt);
241 static gboolean IdleCallback(gpointer pSci);
242 static gboolean StyleIdle(gpointer pSci);
243 void IdleWork() override;
244 void QueueIdleWork(WorkNeeded::workItems items, Sci::Position upTo) override;
245 void SetDocPointer(Document *document) override;
246 static void PopUpCB(GtkMenuItem *menuItem, ScintillaGTK *sciThis);
247
248#if GTK_CHECK_VERSION(3,0,0)
249 static gboolean DrawCT(GtkWidget *widget, cairo_t *cr, CallTip *ctip);
250#else
251 static gboolean ExposeCT(GtkWidget *widget, GdkEventExpose *ose, CallTip *ctip);
252#endif
253 static gboolean PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis);
254
256 unsigned int iMessage, uptr_t wParam, sptr_t lParam);
257};
258
259// helper class to watch a GObject lifetime and get notified when it dies
261 GObject *weakRef;
262
263 void WeakNotifyThis(GObject *obj G_GNUC_UNUSED) {
264 PLATFORM_ASSERT(obj == weakRef);
265
266 Destroyed();
267 weakRef = nullptr;
268 }
269
270 static void WeakNotify(gpointer data, GObject *obj) {
271 static_cast<GObjectWatcher *>(data)->WeakNotifyThis(obj);
272 }
273
274public:
275 GObjectWatcher(GObject *obj) :
276 weakRef(obj) {
277 g_object_weak_ref(weakRef, WeakNotify, this);
278 }
279
280 // Deleted so GObjectWatcher objects can not be copied.
285
286 virtual ~GObjectWatcher() {
287 if (weakRef) {
288 g_object_weak_unref(weakRef, WeakNotify, this);
289 }
290 }
291
292 virtual void Destroyed() {}
293
294 bool IsDestroyed() const {
295 return weakRef != nullptr;
296 }
297};
298
299std::string ConvertText(const char *s, size_t len, const char *charSetDest,
300 const char *charSetSource, bool transliterations, bool silent=false);
301
302}
303
304#endif
#define PLATFORM_ASSERT(c)
Definition: Platform.h:544
#define OBJECT_CLASS
Definition: ScintillaGTK.h:13
intptr_t sptr_t
Definition: Scintilla.h:35
uintptr_t uptr_t
Definition: Scintilla.h:33
GeanyBuildCommand ** ptr
Definition: build.c:2679
const gchar * label
Definition: build.c:2676
GObjectWatcher & operator=(const GObjectWatcher &)=delete
GObjectWatcher & operator=(GObjectWatcher &&)=delete
GObjectWatcher(GObject *obj)
Definition: ScintillaGTK.h:275
void WeakNotifyThis(GObject *obj G_GNUC_UNUSED)
Definition: ScintillaGTK.h:263
static void WeakNotify(gpointer data, GObject *obj)
Definition: ScintillaGTK.h:270
GObjectWatcher(GObjectWatcher &&)=delete
virtual void Destroyed()
Definition: ScintillaGTK.h:292
GObjectWatcher(const GObjectWatcher &)=delete
A geometric rectangle class.
Definition: Platform.h:131
A geometric point class.
Definition: Platform.h:99
static void Realize(GtkWidget *widget)
void SetVerticalScrollPos() override
static void PopUpCB(GtkMenuItem *menuItem, ScintillaGTK *sciThis)
sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override
static gboolean TimeOut(gpointer ptt)
void Finalise() override
bool ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) override
PRectangle GetClientRectangle() const override
void SetMouseCapture(bool on) override
static GdkAtom atomString
Definition: ScintillaGTK.h:41
static gint ScrollEvent(GtkWidget *widget, GdkEventScroll *event)
bool PaintContains(PRectangle rc) override
void ScrollText(Sci::Line linesToMove) override
void FineTickerCancel(TickReason reason) override
static void MainForAll(GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data)
static AtkObject * GetAccessible(GtkWidget *widget)
static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis)
ScintillaGTK & operator=(const ScintillaGTK &)=delete
static gboolean Drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time)
static gint FocusIn(GtkWidget *widget, GdkEventFocus *event)
gboolean DragMotionThis(GdkDragContext *context, gint x, gint y, guint dragtime)
static gboolean KeyRelease(GtkWidget *widget, GdkEventKey *event)
static gboolean KeyPress(GtkWidget *widget, GdkEventKey *event)
void CommitThis(char *commitStr)
static void Map(GtkWidget *widget)
gboolean ExposePreeditThis(GtkWidget *widget, GdkEventExpose *ose)
CaseFolder * CaseFolderForEncoding() override
void NotifyParent(SCNotification scn) override
static gint Press(GtkWidget *widget, GdkEventButton *event)
void ReceivedSelection(GtkSelectionData *selection_data)
gboolean Expose(GtkWidget *widget, GdkEventExpose *ose)
ScintillaGTK & operator=(ScintillaGTK &&)=delete
static void DragEnd(GtkWidget *widget, GdkDragContext *context)
bool AbandonPaint() override
If painting then abandon the painting because a wider redraw is needed.
static gint MouseRelease(GtkWidget *widget, GdkEventButton *event)
void NotifyFocus(bool focus) override
static gint FocusOut(GtkWidget *widget, GdkEventFocus *event)
GtkAdjustment * adjustmenth
Definition: ScintillaGTK.h:23
void UnclaimSelection(GdkEventSelection *selection_event)
static void UnRealize(GtkWidget *widget)
ScintillaGTK(_ScintillaObject *sci_)
void QueueIdleWork(WorkNeeded::workItems items, Sci::Position upTo) override
static void DragDataGet(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time)
gboolean ExposeTextThis(GtkWidget *widget, GdkEventExpose *ose)
GtkAdjustment * adjustmentv
Definition: ScintillaGTK.h:22
void AddToPopUp(const char *label, int cmd=0, bool enabled=true) override
static gint Motion(GtkWidget *widget, GdkEventMotion *event)
static gboolean StyleIdle(gpointer pSci)
GUnicodeScript lastNonCommonScript
Definition: ScintillaGTK.h:54
void CopyToClipboard(const SelectionText &selectedText) override
void IdleWork() override
ScintillaGTK(const ScintillaGTK &)=delete
bool ValidCodePage(int codePage) const override
static void SizeRequest(GtkWidget *widget, GtkRequisition *requisition)
static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis)
_ScintillaObject * sci
Definition: ScintillaGTK.h:18
static void DragDataReceived(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time)
bool FineTickerRunning(TickReason reason) override
int KeyDefault(int key, int modifiers) override
void ReconfigureScrollBars() override
void CreateCallTipWindow(PRectangle rc) override
void ClaimSelection() override
GtkIMContext * im_context
Definition: ScintillaGTK.h:53
static void Commit(GtkIMContext *context, char *str, ScintillaGTK *sciThis)
static void RealizeText(GtkWidget *widget, void *)
void UnRealizeThis(GtkWidget *widget)
static void ClassInit(GObjectClass *object_class, GtkWidgetClass *widget_class, GtkContainerClass *container_class)
GObject * MainObject() const noexcept
ScintillaGTK(ScintillaGTK &&)=delete
static void SelectionGet(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time)
static void ClipboardClearSelection(GtkClipboard *clip, void *data)
Sci::Position TargetAsUTF8(char *text) const
static void UnMap(GtkWidget *widget)
void Resize(int width, int height)
static void PrimarySelection(GtkWidget *widget, GtkSelectionData *selection_data, guint info, guint time_stamp, ScintillaGTK *sciThis)
static void DragLeave(GtkWidget *widget, GdkDragContext *context, guint time)
static void PreeditChanged(GtkIMContext *context, ScintillaGTK *sciThis)
void SetHorizontalScrollPos() override
gint FocusInThis(GtkWidget *widget)
bool DragThreshold(Point ptStart, Point ptNow) override
static gboolean DragMotion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint dragtime)
void StoreOnClipboard(SelectionText *clipText)
static void StyleSetText(GtkWidget *widget, GtkStyle *previous, void *)
void ReceivedClipboard(GtkClipboard *clipBoard, GtkSelectionData *selection_data) noexcept
static void ClipboardGetSelection(GtkClipboard *clip, GtkSelectionData *selection_data, guint info, void *data)
GtkWidgetClass * parentClass
Definition: ScintillaGTK.h:37
static gboolean PrimaryClear(GtkWidget *widget, GdkEventSelection *event, ScintillaGTK *sciThis)
unsigned int linesPerScroll
Definition: ScintillaGTK.h:57
static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text)
bool HaveMouseCapture() override
static GdkAtom atomUTF8
Definition: ScintillaGTK.h:39
static gboolean ExposePreedit(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis)
TimeThunk timers[tickDwell+1]
Definition: ScintillaGTK.h:105
void StartDrag() override
static gboolean IdleCallback(gpointer pSci)
void NotifyURIDropped(const char *list)
gint PressThis(GdkEventButton *event)
static void Dispose(GObject *object)
static gboolean ExposeMain(GtkWidget *widget, GdkEventExpose *ose)
gboolean KeyThis(GdkEventKey *event)
gint FocusOutThis(GtkWidget *widget)
static gint SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event)
static void Destroy(GObject *object)
static sptr_t DirectFunction(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam)
static GdkAtom atomUTF8Mime
Definition: ScintillaGTK.h:40
static ScintillaGTK * FromWidget(GtkWidget *widget) noexcept
void NotifyKey(int key, int modifiers)
static gboolean ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis)
void InsertSelection(GtkClipboard *clipBoard, GtkSelectionData *selectionData)
void GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText)
void RealizeThis(GtkWidget *widget)
sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) override
SelectionText primary
Definition: ScintillaGTK.h:28
void FineTickerStart(TickReason reason, int millis, int tolerance) override
void RequestSelection(GdkAtom atomSelection)
void DrawImeIndicator(int indicator, int len)
static bool IsStringAtom(GdkAtom type)
static void SizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
void ReceivedDrop(GtkSelectionData *selection_data)
static GdkAtom atomDROPFILES_DND
Definition: ScintillaGTK.h:43
void DisplayCursor(Window::Cursor c) override
static void SelectionReceived(GtkWidget *widget, GtkSelectionData *selection_data, guint time)
const char * CharacterSetID() const
static gboolean PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis)
std::string CaseMapString(const std::string &s, int caseMapping) override
void ForAll(GtkCallback callback, gpointer callback_data)
bool SetIdle(bool on) override
void SetDocPointer(Document *document) override
static GdkAtom atomUriList
Definition: ScintillaGTK.h:42
Sci::Position EncodedFromUTF8(const char *utf8, char *encoded) const
AtkObject * GetAccessibleThis(GtkWidget *widget)
static gboolean ExposeCT(GtkWidget *widget, GdkEventExpose *ose, CallTip *ctip)
void NotifyChange() override
Hold a piece of text selected for copying or dragging, along with encoding and selection format infor...
Definition: Editor.h:65
Class to hide the details of window manipulation.
Definition: Platform.h:396
gchar * text
Definition: editor.c:83
gint pos
Definition: editor.c:87
tokenInfo * list
ptrdiff_t Position
Definition: Position.h:19
ptrdiff_t Line
Definition: Position.h:20
Styling buffer using one element for each run rather than using a filled buffer.
Definition: Converter.h:9
std::string ConvertText(const char *s, size_t len, const char *charSetDest, const char *charSetSource, bool transliterations, bool silent)