diff options
Diffstat (limited to 'gtk')
| -rw-r--r-- | gtk/ScintillaGTK.cxx | 127 | 
1 files changed, 58 insertions, 69 deletions
| diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 254648080..271fddf88 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -52,12 +52,15 @@ class ScintillaGTK : public ScintillaBase {  	GtkObject *adjustmenth;  	int scrollBarWidth;  	int scrollBarHeight; -	char *pasteBuffer; -	bool pasteBufferIsRectangular; +	 +	// Because clipboard access is asynchronous, copyText is created by Copy +	SelectionText copyText; +	 +	SelectionText primary; +	  	GdkEventButton evbtn;  	bool capturedMouse;  	bool dragWasDropped; -	char *primarySelectionCopy;  	GtkWidgetClass *parentClass; @@ -72,6 +75,7 @@ class ScintillaGTK : public ScintillaBase {  	GdkICAttr *ic_attr;  	// Wheel mouse support +	unsigned int linesPerScroll;  	GTimeVal lastWheelMouseTime;  	gint lastWheelMouseDirection;         	gint wheelMouseIntensity; @@ -118,7 +122,7 @@ private:  	virtual void ClaimSelection();  	void ReceivedSelection(GtkSelectionData *selection_data);  	void ReceivedDrop(GtkSelectionData *selection_data); -	void GetSelection(GtkSelectionData *selection_data, guint info, char *text, bool isRectangular); +	void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *selected);  	void UnclaimSelection(GdkEventSelection *selection_event);  	void Resize(int width, int height); @@ -142,6 +146,7 @@ private:  	static void ScrollSignal(GtkAdjustment *adj, ScintillaGTK *sciThis);  	static void ScrollHSignal(GtkAdjustment *adj, ScintillaGTK *sciThis); +	gint PressThis(GdkEventButton *event);  	static gint Press(GtkWidget *widget, GdkEventButton *event);  	static gint MouseRelease(GtkWidget *widget, GdkEventButton *event);  #if PLAT_GTK_WIN32 @@ -201,9 +206,8 @@ static ScintillaGTK *ScintillaFromWidget(GtkWidget *widget) {  ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :  		adjustmentv(0), adjustmenth(0),  		scrollBarWidth(30), scrollBarHeight(30), -		pasteBuffer(0), pasteBufferIsRectangular(false),  		capturedMouse(false), dragWasDropped(false), -		primarySelectionCopy(0), parentClass(0), +		parentClass(0),  		ic(NULL), ic_attr(NULL), lastWheelMouseDirection(0),  		wheelMouseIntensity(0) {  	sci = sci_; @@ -220,7 +224,7 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :  #ifndef SPI_GETWHEELSCROLLLINES  #define SPI_GETWHEELSCROLLLINES   104  #endif -	::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &ucWheelScrollLines, 0); +	::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &linesPerScroll, 0);  #else  	ucWheelScrollLines = 4;  #endif @@ -231,7 +235,6 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) :  }  ScintillaGTK::~ScintillaGTK() { -	delete []primarySelectionCopy;  }  void ScintillaGTK::RealizeThis(GtkWidget *widget) { @@ -457,9 +460,6 @@ void ScintillaGTK::Initialise() {  	parentClass = reinterpret_cast<GtkWidgetClass *>(  	                  gtk_type_class(gtk_container_get_type())); -	pasteBuffer = 0; -	pasteBufferIsRectangular = false; -  	GTK_WIDGET_SET_FLAGS(wMain.GetID(), GTK_CAN_FOCUS);  	GTK_WIDGET_SET_FLAGS(GTK_WIDGET(wMain.GetID()), GTK_SENSITIVE);  	gtk_widget_set_events(wMain.GetID(), @@ -764,9 +764,7 @@ int ScintillaGTK::KeyDefault(int key, int modifiers) {  void ScintillaGTK::Copy() {  	if (currentPos != anchor) { -		delete []pasteBuffer; -		pasteBuffer = CopySelectionRange(); -		pasteBufferIsRectangular = selType == selRectangle; +		CopySelectionRange(©Text);  		gtk_selection_owner_set(GTK_WIDGET(wMain.GetID()),  		                        clipboard_atom,  		                        GDK_CURRENT_TIME); @@ -829,16 +827,14 @@ void ScintillaGTK::ClaimSelection() {  		primarySelection = true;  		gtk_selection_owner_set(GTK_WIDGET(wMain.GetID()),  		                        GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); -		delete []primarySelectionCopy; -		primarySelectionCopy = NULL; +		primary.Set(0, 0);  	} else if (OwnPrimarySelection()) { -		if (primarySelectionCopy == NULL) -			gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);  		primarySelection = true; +		if (primary.s == NULL) +			gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME);  	} else { -		delete []primarySelectionCopy; -		primarySelectionCopy = NULL;  		primarySelection = false; +		primary.Set(0, 0);  	}  } @@ -927,30 +923,21 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) {  	Redraw();  } -// Preprocessor used to avoid warnings here -#if PLAT_GTK_WIN32 -void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, char *text, bool)  -#else -void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, char *text, bool isRectangular)  -#endif -{ -	char *selBuffer = text; -	char *tmpBuffer = NULL; // Buffer to be freed - +void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text) {  	if (selection_data->selection == GDK_SELECTION_PRIMARY) { -		if (primarySelectionCopy != NULL) { -			selBuffer = primarySelectionCopy; -		} else { -			tmpBuffer = CopySelectionRange(); -			selBuffer = tmpBuffer; +		if (primary.s == NULL) { +			CopySelectionRange(&primary);  		} +		text = &primary;  	} +	char *selBuffer = text->s; +  #if PLAT_GTK_WIN32  	// win32gtk requires \n delimited lines and doesn't work right with  	// other line formats, so make a copy of the clip text now with   	// newlines converted -	char *tmpstr = new char[strlen(selBuffer) + 1]; +	char *tmpstr = new char[text->len + 1];  	char *sptr = selBuffer;  	char *dptr = tmpstr;  	while (*sptr != '\0') { @@ -979,7 +966,7 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, ch  		// The #if is here because on Windows cfColumnSelect clip entry is used                   // instead as standard indicator of rectangularness (so no need to kludge)  #if PLAT_GTK_WIN32 == 0 -		if (isRectangular) +		if (text->rectangular)  			len++;  #endif  		gtk_selection_data_set(selection_data, GDK_SELECTION_TYPE_STRING, @@ -997,7 +984,6 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, ch  		gdk_free_compound_text(text);  	} -	delete []tmpBuffer;  #if PLAT_GTK_WIN32  	delete []tmpstr;  #endif @@ -1008,8 +994,7 @@ void ScintillaGTK::UnclaimSelection(GdkEventSelection *selection_event) {  	if (selection_event->selection == GDK_SELECTION_PRIMARY) {  		//Platform::DebugPrintf("UnclaimPrimarySelection\n");  		if (!OwnPrimarySelection()) { -			delete []primarySelectionCopy; -			primarySelectionCopy = NULL; +			primary.Set(0, 0);  			primarySelection = false;  			FullPaint();  		} @@ -1053,20 +1038,17 @@ void ScintillaGTK::Resize(int width, int height) {  	SetScrollBars();  } -gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { -	ScintillaGTK *sciThis = ScintillaFromWidget(widget); -	//Platform::DebugPrintf("Press %x time=%d state = %x button = %x\n",sciThis,event->time, event->state, event->button); +gint ScintillaGTK::PressThis(GdkEventButton *event) { +	//Platform::DebugPrintf("Press %x time=%d state = %x button = %x\n",this,event->time, event->state, event->button);  	// Do not use GTK+ double click events as Scintilla has its own double click detection  	if (event->type != GDK_BUTTON_PRESS)  		return FALSE; -	sciThis->evbtn = *event; +	evbtn = *event;  	Point pt;  	pt.x = int(event->x);  	pt.y = int(event->y); -	if (event->window != widget->window) -		return FALSE; -	PRectangle rcClient = sciThis->GetClientRectangle(); +	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)) { @@ -1076,54 +1058,61 @@ gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) {  	bool ctrl = event->state & GDK_CONTROL_MASK; -	gtk_widget_grab_focus(sciThis->wMain.GetID()); +	gtk_widget_grab_focus(wMain.GetID());  	if (event->button == 1) { -		//sciThis->ButtonDown(pt, event->time, +		//ButtonDown(pt, event->time,  		//	event->state & GDK_SHIFT_MASK,  		//	event->state & GDK_CONTROL_MASK,  		//	event->state & GDK_MOD1_MASK);  		// Instead of sending literal modifiers use control instead of alt  		// This is because all the window managers seem to grab alt + click for moving -		sciThis->ButtonDown(pt, event->time, +		ButtonDown(pt, event->time,  		                    event->state & GDK_SHIFT_MASK,  		                    event->state & GDK_CONTROL_MASK,  		                    event->state & GDK_CONTROL_MASK);  	} else if (event->button == 2) {  		// Grab the primary selection if it exists -		Position pos = sciThis->PositionFromLocation(pt); -		if (sciThis->OwnPrimarySelection() && sciThis->primarySelectionCopy == NULL) -			sciThis->primarySelectionCopy = sciThis->CopySelectionRange(); +		Position pos = PositionFromLocation(pt); +		if (OwnPrimarySelection() && primary.s == NULL) +			CopySelectionRange(&primary); -		sciThis->SetSelection(pos, pos); -		gtk_selection_convert(GTK_WIDGET(sciThis->wMain.GetID()), GDK_SELECTION_PRIMARY, +		SetSelection(pos, pos); +		gtk_selection_convert(GTK_WIDGET(wMain.GetID()), GDK_SELECTION_PRIMARY,  		                      gdk_atom_intern("STRING", FALSE), event->time); -	} else if (event->button == 3 && sciThis->displayPopupMenu) { +	} else if (event->button == 3 && displayPopupMenu) {  		// PopUp menu  		// Convert to screen  		int ox = 0;  		int oy = 0; -		gdk_window_get_origin(sciThis->wMain.GetID()->window, &ox, &oy); -		sciThis->ContextMenu(Point(pt.x + ox, pt.y + oy)); +		gdk_window_get_origin(wMain.GetID()->window, &ox, &oy); +		ContextMenu(Point(pt.x + ox, pt.y + oy));  	} else if (event->button == 4) {  		// Wheel scrolling up (only xwin gtk does it this way)  		if (ctrl) -			gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmenth), ( -			                             (sciThis->xOffset) / 2 ) - 6); +			gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmenth), ( +			                             (xOffset) / 2 ) - 6);  		else -			gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmentv), -			                         sciThis->topLine - 3); +			gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmentv), +			                         topLine - 3);  	} else if ( event->button == 5 ) {  		// Wheel scrolling down (only xwin gtk does it this way)  		if (ctrl) -			gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmenth), ( -			                             (sciThis->xOffset) / 2 ) + 6); +			gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmenth), ( +			                             (xOffset) / 2 ) + 6);  		else -			gtk_adjustment_set_value(GTK_ADJUSTMENT(sciThis->adjustmentv), -			                         sciThis->topLine + 3); +			gtk_adjustment_set_value(GTK_ADJUSTMENT(adjustmentv), +			                         topLine + 3);  	}  	return FALSE;  } +gint ScintillaGTK::Press(GtkWidget *widget, GdkEventButton *event) { +	if (event->window != widget->window) +		return FALSE; +	ScintillaGTK *sciThis = ScintillaFromWidget(widget); +	return sciThis->PressThis(event); +} +  gint ScintillaGTK::MouseRelease(GtkWidget *widget, GdkEventButton *event) {  	ScintillaGTK *sciThis = ScintillaFromWidget(widget);  	//Platform::DebugPrintf("Release %x %d %d\n",sciThis,event->time,event->state); @@ -1170,7 +1159,7 @@ gint ScintillaGTK::ScrollEvent(GtkWidget *widget,  			sciThis->wheelMouseIntensity++;  		cLineScroll = sciThis->wheelMouseIntensity;  	} else { -		cLineScroll = sciThis->ucWheelScrollLines; +		cLineScroll = sciThis->linesPerScroll;  		if (cLineScroll == 0)  			cLineScroll = 4;  		sciThis->wheelMouseIntensity = cLineScroll; @@ -1420,7 +1409,7 @@ void ScintillaGTK::SelectionGet(GtkWidget *widget,                                  GtkSelectionData *selection_data, guint info, guint) {  	ScintillaGTK *sciThis = ScintillaFromWidget(widget);  	//Platform::DebugPrintf("Selection get\n"); -	sciThis->GetSelection(selection_data, info, sciThis->pasteBuffer, sciThis->pasteBufferIsRectangular); +	sciThis->GetSelection(selection_data, info, &sciThis->copyText);  }  gint ScintillaGTK::SelectionClear(GtkWidget *widget, GdkEventSelection *selection_event) { @@ -1486,7 +1475,7 @@ void ScintillaGTK::DragDataGet(GtkWidget *widget, GdkDragContext *context,  	ScintillaGTK *sciThis = ScintillaFromWidget(widget);  	sciThis->dragWasDropped = true;  	if (sciThis->currentPos != sciThis->anchor) { -		sciThis->GetSelection(selection_data, info, sciThis->dragChars, sciThis->dragIsRectangle); +		sciThis->GetSelection(selection_data, info, &sciThis->drag);  	}  	if (context->action == GDK_ACTION_MOVE) {  		int selStart = sciThis->SelectionStart(); | 
