diff options
-rw-r--r-- | gtk/ScintillaGTK.cxx | 123 |
1 files changed, 85 insertions, 38 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 4e7b62bb9..e8f1626b3 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -67,6 +67,7 @@ class ScintillaGTK : public ScintillaBase { _ScintillaObject *sci; + Window wText; Window scrollbarv; Window scrollbarh; GtkObject *adjustmentv; @@ -113,6 +114,7 @@ public: private: virtual void Initialise(); virtual void Finalise(); + virtual void DisplayCursor(Window::Cursor c); virtual void StartDrag(); public: // Public for scintilla_send_message virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); @@ -162,9 +164,6 @@ private: static gint FocusOut(GtkWidget *widget, GdkEventFocus *event); static void SizeRequest(GtkWidget *widget, GtkRequisition *requisition); static void SizeAllocate(GtkWidget *widget, GtkAllocation *allocation); -#if GTK_MAJOR_VERSION >= 2 - static gint ScrollOver(GtkWidget *widget, GdkEventMotion *event); -#endif gint Expose(GtkWidget *widget, GdkEventExpose *ose); static gint ExposeMain(GtkWidget *widget, GdkEventExpose *ose); static void Draw(GtkWidget *widget, GdkRectangle *area); @@ -205,6 +204,9 @@ private: static gint TimeOut(ScintillaGTK *sciThis); static void PopUpCB(ScintillaGTK *sciThis, guint action, GtkWidget *widget); + gint ExposeTextThis(GtkWidget *widget, GdkEventExpose *ose); + static gint ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis); + static gint ExposeCT(GtkWidget *widget, GdkEventExpose *ose, CallTip *ct); static gint PressCT(GtkWidget *widget, GdkEventButton *event, ScintillaGTK *sciThis); @@ -355,6 +357,7 @@ void ScintillaGTK::RealizeThis(GtkWidget *widget) { } } #endif + gtk_widget_realize(PWidget(wText)); gtk_widget_realize(PWidget(scrollbarv)); gtk_widget_realize(PWidget(scrollbarh)); } @@ -369,6 +372,7 @@ void ScintillaGTK::UnRealizeThis(GtkWidget *widget) { gtk_widget_unmap(widget); } GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED); + gtk_widget_unrealize(PWidget(wText)); gtk_widget_unrealize(PWidget(scrollbarv)); gtk_widget_unrealize(PWidget(scrollbarh)); #ifdef INTERNATIONAL_INPUT @@ -403,8 +407,10 @@ static void MapWidget(GtkWidget *widget) { void ScintillaGTK::MapThis() { //Platform::DebugPrintf("ScintillaGTK::map this\n"); GTK_WIDGET_SET_FLAGS(PWidget(wMain), GTK_MAPPED); + MapWidget(PWidget(wText)); MapWidget(PWidget(scrollbarh)); MapWidget(PWidget(scrollbarv)); + wMain.SetCursor(Window::cursorArrow); scrollbarv.SetCursor(Window::cursorArrow); scrollbarh.SetCursor(Window::cursorArrow); gdk_window_show(PWidget(wMain)->window); @@ -419,6 +425,7 @@ void ScintillaGTK::UnMapThis() { //Platform::DebugPrintf("ScintillaGTK::unmap this\n"); GTK_WIDGET_UNSET_FLAGS(PWidget(wMain), GTK_MAPPED); gdk_window_hide(PWidget(wMain)->window); + gtk_widget_unmap(PWidget(wText)); gtk_widget_unmap(PWidget(scrollbarh)); gtk_widget_unmap(PWidget(scrollbarv)); } @@ -505,24 +512,11 @@ void ScintillaGTK::SizeAllocate(GtkWidget *widget, GtkAllocation *allocation) { #endif } -#if GTK_MAJOR_VERSION >= 2 -gint ScintillaGTK::ScrollOver(GtkWidget *widget, GdkEventMotion */*event*/) { - // Ensure cursor goes back to arrow over scroll bar. - GtkWidget *parent = gtk_widget_get_parent(widget); - ScintillaGTK *sciThis = ScintillaFromWidget(parent); - sciThis->wMain.SetCursor(Window::cursorArrow); - return FALSE; -} -#endif - void ScintillaGTK::Initialise() { //Platform::DebugPrintf("ScintillaGTK::Initialise\n"); parentClass = reinterpret_cast<GtkWidgetClass *>( gtk_type_class(gtk_container_get_type())); -#if GTK_MAJOR_VERSION >= 2 - gtk_widget_set_double_buffered(PWidget(wMain), FALSE); -#endif GTK_WIDGET_SET_FLAGS(PWidget(wMain), GTK_CAN_FOCUS); GTK_WIDGET_SET_FLAGS(GTK_WIDGET(PWidget(wMain)), GTK_SENSITIVE); gtk_widget_set_events(PWidget(wMain), @@ -537,6 +531,19 @@ void ScintillaGTK::Initialise() { | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); + wText = gtk_drawing_area_new(); + gtk_widget_set_parent(PWidget(wText), PWidget(wMain)); + gtk_widget_show(PWidget(wText)); + gtk_signal_connect(GTK_OBJECT(PWidget(wText)), "expose_event", + GtkSignalFunc(ScintillaGTK::ExposeText), this); + gtk_widget_set_events(PWidget(wText), GDK_EXPOSURE_MASK); +#if GTK_MAJOR_VERSION >= 2 + // Avoid background drawing flash + gtk_widget_set_double_buffered(PWidget(wText), FALSE); +#endif + gtk_drawing_area_size(GTK_DRAWING_AREA(PWidget(wText)), + 100,100); + adjustmentv = gtk_adjustment_new(0.0, 0.0, 201.0, 1.0, 20.0, 20.0); scrollbarv = gtk_vscrollbar_new(GTK_ADJUSTMENT(adjustmentv)); GTK_WIDGET_UNSET_FLAGS(PWidget(scrollbarv), GTK_CAN_FOCUS); @@ -577,12 +584,6 @@ void ScintillaGTK::Initialise() { static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE)); SetTicking(true); -#if GTK_MAJOR_VERSION >= 2 - gtk_signal_connect(GTK_OBJECT(scrollbarv.GetID()),"motion-notify-event", - GTK_SIGNAL_FUNC(ScrollOver), NULL); - gtk_signal_connect(GTK_OBJECT(scrollbarh.GetID()),"motion-notify-event", - GTK_SIGNAL_FUNC(ScrollOver), NULL); -#endif } void ScintillaGTK::Finalise() { @@ -590,6 +591,13 @@ void ScintillaGTK::Finalise() { ScintillaBase::Finalise(); } +void ScintillaGTK::DisplayCursor(Window::Cursor c) { + if (cursorMode == SC_CURSORNORMAL) + wText.SetCursor(c); + else + wText.SetCursor(static_cast<Window::Cursor>(cursorMode)); +} + void ScintillaGTK::StartDrag() { dragWasDropped = false; static const GtkTargetEntry targets[] = { @@ -670,10 +678,10 @@ void ScintillaGTK::FullPaint() { //Platform::DebugPrintf("ScintillaGTK::FullPaint %0d,%0d %0d,%0d\n", // rcPaint.left, rcPaint.top, rcPaint.right, rcPaint.bottom); paintingAllText = true; - if ((PWidget(wMain))->window) { + if ((PWidget(wText))->window) { Surface *sw = Surface::Allocate(); if (sw) { - sw->Init(PWidget(wMain)->window, PWidget(wMain)); + sw->Init(PWidget(wText)->window, PWidget(wText)); Paint(sw, rcPaint); sw->Release(); delete sw; @@ -681,9 +689,7 @@ void ScintillaGTK::FullPaint() { } paintState = notPainting; #else - rcPaint = GetClientRectangle(); - wMain.InvalidateRectangle(rcPaint); - //wMain.InvalidateAll(); + wText.InvalidateAll(); #endif } @@ -707,12 +713,10 @@ void ScintillaGTK::SyncPaint(PRectangle rc) { rcPaint = rc; PRectangle rcClient = GetClientRectangle(); paintingAllText = rcPaint.Contains(rcClient); - //Platform::DebugPrintf("ScintillaGTK::SyncPaint %0d,%0d %0d,%0d\n", - // rcPaint.left, rcPaint.top, rcPaint.right, rcPaint.bottom); - if ((PWidget(wMain))->window) { + if ((PWidget(wText))->window) { Surface *sw = Surface::Allocate(); if (sw) { - sw->Init(PWidget(wMain)->window, PWidget(wMain)); + sw->Init(PWidget(wText)->window, PWidget(wText)); Paint(sw, rc); sw->Release(); delete sw; @@ -726,11 +730,13 @@ void ScintillaGTK::SyncPaint(PRectangle rc) { } void ScintillaGTK::ScrollText(int linesToMove) { - PRectangle rc = GetClientRectangle(); int diff = vs.lineHeight * -linesToMove; //Platform::DebugPrintf("ScintillaGTK::ScrollText %d %d %0d,%0d %0d,%0d\n", linesToMove, diff, // rc.left, rc.top, rc.right, rc.bottom); - GtkWidget *wi = PWidget(wMain); + GtkWidget *wi = PWidget(wText); + +#if GTK_MAJOR_VERSION < 2 + PRectangle rc = GetClientRectangle(); GdkGC *gc = gdk_gc_new(wi->window); // Set up gc so we get GraphicsExposures from gdk_draw_pixmap @@ -757,7 +763,6 @@ void ScintillaGTK::ScrollText(int linesToMove) { SyncPaint(PRectangle(0, 0, rc.Width(), -diff)); } -#if GTK_MAJOR_VERSION < 2 // Look for any graphics expose GdkEvent* event; while ((event = gdk_event_get_graphics_expose(wi->window)) != NULL) { @@ -768,9 +773,11 @@ void ScintillaGTK::ScrollText(int linesToMove) { } gdk_event_free(event); } -#endif gdk_gc_unref(gc); +#else + gdk_window_scroll(wi->window, 0, -diff); +#endif } void ScintillaGTK::SetVerticalScrollPos() { @@ -1213,7 +1220,7 @@ void ScintillaGTK::Resize(int width, int height) { alloc.width = scrollBarWidth; alloc.height = Platform::Maximum(1, height - scrollBarHeight) + 1; if (!showSBHorizontal) - alloc.height += scrollBarWidth-2; + alloc.height += scrollBarWidth-1; } else { alloc.x = -scrollBarWidth; alloc.width = 0; @@ -1223,6 +1230,14 @@ void ScintillaGTK::Resize(int width, int height) { if (GTK_WIDGET_MAPPED(PWidget(wMain))) { ChangeSize(); } + + alloc.x = 0; + alloc.y = 0; + alloc.width = Platform::Maximum(1, width - scrollBarWidth); + alloc.height = Platform::Maximum(1, height - scrollBarHeight); + if (!showSBHorizontal) + alloc.height += scrollBarWidth; + gtk_widget_size_allocate(GTK_WIDGET(PWidget(wText)), &alloc); } static void SetAdjustmentValue(GtkObject *object, int value) { @@ -1577,6 +1592,35 @@ void ScintillaGTK::Draw(GtkWidget *widget, GdkRectangle *area) { #endif } +gint ScintillaGTK::ExposeTextThis(GtkWidget * /*widget*/, GdkEventExpose *ose) { + paintState = painting; + + rcPaint.left = ose->area.x; + rcPaint.top = ose->area.y; + rcPaint.right = ose->area.x + ose->area.width; + rcPaint.bottom = ose->area.y + ose->area.height; + + PRectangle rcClient = GetClientRectangle(); + paintingAllText = rcPaint.Contains(rcClient); + Surface *surfaceWindow = Surface::Allocate(); + if (surfaceWindow) { + surfaceWindow->Init(PWidget(wText)->window, PWidget(wText)); + Paint(surfaceWindow, rcPaint); + surfaceWindow->Release(); + delete surfaceWindow; + } + if (paintState == paintAbandoned) { + // Painting area was insufficient to cover new styling or brace highlight positions + FullPaint(); + } + paintState = notPainting; + return FALSE; +} + +gint ScintillaGTK::ExposeText(GtkWidget *widget, GdkEventExpose *ose, ScintillaGTK *sciThis) { + return sciThis->ExposeTextThis(widget, ose); +} + gint ScintillaGTK::ExposeMain(GtkWidget *widget, GdkEventExpose *ose) { ScintillaGTK *sciThis = ScintillaFromWidget(widget); //Platform::DebugPrintf("Expose Main %0d,%0d %0d,%0d\n", @@ -1588,6 +1632,8 @@ gint ScintillaGTK::Expose(GtkWidget *, GdkEventExpose *ose) { //fprintf(stderr, "Expose %0d,%0d %0d,%0d\n", //ose->area.x, ose->area.y, ose->area.width, ose->area.height); +#if GTK_MAJOR_VERSION < 2 + paintState = painting; rcPaint.left = ose->area.x; @@ -1614,7 +1660,7 @@ gint ScintillaGTK::Expose(GtkWidget *, GdkEventExpose *ose) { } } - Paint(surfaceWindow, rcPaint); + //Paint(surfaceWindow, rcPaint); surfaceWindow->Release(); delete surfaceWindow; } @@ -1624,7 +1670,8 @@ gint ScintillaGTK::Expose(GtkWidget *, GdkEventExpose *ose) { } paintState = notPainting; -#if GTK_MAJOR_VERSION >= 2 +#else + // For GTK+ 2, the text is painted in ExposeText gtk_container_propagate_expose( GTK_CONTAINER(PWidget(wMain)), PWidget(scrollbarh), ose); gtk_container_propagate_expose( |