diff options
| author | nyamatongwe <nyamatongwe@gmail.com> | 2013-11-03 14:34:21 +1100 | 
|---|---|---|
| committer | nyamatongwe <nyamatongwe@gmail.com> | 2013-11-03 14:34:21 +1100 | 
| commit | edabc90ae2ee00c465d9326027e82c293900a864 (patch) | |
| tree | 649db40f260d2d7a7977d4b7507c321cdf70b941 | |
| parent | ad86456bdec4429bee3d198baf4ec35cf3b50ae4 (diff) | |
| download | scintilla-mirror-edabc90ae2ee00c465d9326027e82c293900a864.tar.gz | |
Report control key as SCI_META for mouse down events for GTK+ on OS X.
Also enables more flexibility with modifier keys.
| -rw-r--r-- | gtk/ScintillaGTK.cxx | 20 | ||||
| -rw-r--r-- | src/Editor.cxx | 90 | ||||
| -rw-r--r-- | src/Editor.h | 8 | ||||
| -rw-r--r-- | src/ScintillaBase.cxx | 8 | ||||
| -rw-r--r-- | src/ScintillaBase.h | 1 | 
5 files changed, 90 insertions, 37 deletions
| diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 91c1250fc..94c207c47 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -1769,17 +1769,23 @@ gint ScintillaGTK::PressThis(GdkEventButton *event) {  			return FALSE;  		} +		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; +		bool meta = false;  		gtk_widget_grab_focus(PWidget(wMain));  		if (event->button == 1) { -			// 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 -			ButtonDown(pt, event->time, -			        (event->state & GDK_SHIFT_MASK) != 0, -			        (event->state & GDK_CONTROL_MASK) != 0, -			        (event->state & modifierTranslated(rectangularSelectionModifier)) != 0); +#if PLAT_GTK_MACOSX +			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; +#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()); diff --git a/src/Editor.cxx b/src/Editor.cxx index 504c85b41..0c100252d 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -4419,6 +4419,14 @@ void Editor::DelCharBack(bool allowLineStartDeletion) {  	ShowCaretAtCurrentPosition();  } +int Editor::ModifierFlags(bool shift, bool ctrl, bool alt, bool meta) { +	return +		(shift ? SCI_SHIFT : 0) | +		(ctrl ? SCI_CTRL : 0) | +		(alt ? SCI_ALT : 0) | +		(meta ? SCI_META : 0); +} +  void Editor::NotifyFocus(bool focus) {  	SCNotification scn = {};  	scn.nmhdr.code = focus ? SCN_FOCUSIN : SCN_FOCUSOUT; @@ -4470,43 +4478,55 @@ void Editor::NotifyModifyAttempt() {  	NotifyParent(scn);  } -void Editor::NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt) { +void Editor::NotifyDoubleClick(Point pt, int modifiers) {  	SCNotification scn = {};  	scn.nmhdr.code = SCN_DOUBLECLICK;  	scn.line = LineFromLocation(pt);  	scn.position = PositionFromLocation(pt, true); -	scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | -	        (alt ? SCI_ALT : 0); +	scn.modifiers = modifiers;  	NotifyParent(scn);  } -void Editor::NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt) { +void Editor::NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt) { +	NotifyDoubleClick(pt, ModifierFlags(shift, ctrl, alt)); +} + +void Editor::NotifyHotSpotDoubleClicked(int position, int modifiers) {  	SCNotification scn = {};  	scn.nmhdr.code = SCN_HOTSPOTDOUBLECLICK;  	scn.position = position; -	scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | -	        (alt ? SCI_ALT : 0); +	scn.modifiers = modifiers;  	NotifyParent(scn);  } -void Editor::NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt) { +void Editor::NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt) { +	NotifyHotSpotDoubleClicked(position, ModifierFlags(shift, ctrl, alt)); +} + +void Editor::NotifyHotSpotClicked(int position, int modifiers) {  	SCNotification scn = {};  	scn.nmhdr.code = SCN_HOTSPOTCLICK;  	scn.position = position; -	scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | -	        (alt ? SCI_ALT : 0); +	scn.modifiers = modifiers;  	NotifyParent(scn);  } -void Editor::NotifyHotSpotReleaseClick(int position, bool shift, bool ctrl, bool alt) { +void Editor::NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt) { +	NotifyHotSpotClicked(position, ModifierFlags(shift, ctrl, alt)); +} + +void Editor::NotifyHotSpotReleaseClick(int position, int modifiers) {  	SCNotification scn = {};  	scn.nmhdr.code = SCN_HOTSPOTRELEASECLICK;  	scn.position = position; -	scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | -	        (alt ? SCI_ALT : 0); +	scn.modifiers = modifiers;  	NotifyParent(scn);  } +void Editor::NotifyHotSpotReleaseClick(int position, bool shift, bool ctrl, bool alt) { +	NotifyHotSpotReleaseClick(position, ModifierFlags(shift, ctrl, alt)); +} +  bool Editor::NotifyUpdateUI() {  	if (needUpdateUI) {  		SCNotification scn = {}; @@ -4525,19 +4545,23 @@ void Editor::NotifyPainted() {  	NotifyParent(scn);  } -void Editor::NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt) { +void Editor::NotifyIndicatorClick(bool click, int position, int modifiers) {  	int mask = pdoc->decorations.AllOnFor(position);  	if ((click && mask) || pdoc->decorations.clickNotified) {  		SCNotification scn = {};  		pdoc->decorations.clickNotified = click;  		scn.nmhdr.code = click ? SCN_INDICATORCLICK : SCN_INDICATORRELEASE; -		scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | (alt ? SCI_ALT : 0); +		scn.modifiers = modifiers;  		scn.position = position;  		NotifyParent(scn);  	}  } -bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) { +void Editor::NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt) { +	NotifyIndicatorClick(click, position, ModifierFlags(shift, ctrl, alt)); +} + +bool Editor::NotifyMarginClick(Point pt, int modifiers) {  	int marginClicked = -1;  	int x = vs.textStart - vs.fixedColumnWidth;  	for (int margin = 0; margin <= SC_MAX_MARGIN; margin++) { @@ -4548,6 +4572,8 @@ bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {  	if ((marginClicked >= 0) && vs.ms[marginClicked].sensitive) {  		int position = pdoc->LineStart(LineFromLocation(pt));  		if ((vs.ms[marginClicked].mask & SC_MASK_FOLDERS) && (foldAutomatic & SC_AUTOMATICFOLD_CLICK)) { +			const bool ctrl = (modifiers & SCI_CTRL) != 0; +			const bool shift = (modifiers & SCI_SHIFT) != 0;  			int lineClick = pdoc->LineFromPosition(position);  			if (shift && ctrl) {  				FoldAll(SC_FOLDACTION_TOGGLE); @@ -4569,8 +4595,7 @@ bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {  		}  		SCNotification scn = {};  		scn.nmhdr.code = SCN_MARGINCLICK; -		scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | -		        (alt ? SCI_ALT : 0); +		scn.modifiers = modifiers;  		scn.position = position;  		scn.margin = marginClicked;  		NotifyParent(scn); @@ -4580,6 +4605,10 @@ bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) {  	}  } +bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) { +	return NotifyMarginClick(pt, ModifierFlags(shift, ctrl, alt)); +} +  void Editor::NotifyNeedShown(int pos, int len) {  	SCNotification scn = {};  	scn.nmhdr.code = SCN_NEEDSHOWN; @@ -5752,9 +5781,7 @@ int Editor::KeyDownWithModifiers(int key, int modifiers, bool *consumed) {  }  int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) { -	int modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | -	        (alt ? SCI_ALT : 0); -	return KeyDownWithModifiers(key, modifiers, consumed); +	return KeyDownWithModifiers(key, ModifierFlags(shift, ctrl, alt), consumed);  }  void Editor::Indent(bool forwards) { @@ -6291,18 +6318,21 @@ static bool AllowVirtualSpace(int virtualSpaceOptions, bool rectangular) {  		|| (rectangular && ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) != 0));  } -void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { +void Editor::ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) {  	//Platform::DebugPrintf("ButtonDown %d %d = %d alt=%d %d\n", curTime, lastClickTime, curTime - lastClickTime, alt, inDragDrop);  	ptMouseLast = pt; +	const bool ctrl = (modifiers & SCI_CTRL) != 0; +	const bool shift = (modifiers & SCI_SHIFT) != 0; +	const bool alt = (modifiers & SCI_ALT) != 0;  	SelectionPosition newPos = SPositionFromLocation(pt, false, false, AllowVirtualSpace(virtualSpaceOptions, alt));  	newPos = MovePositionOutsideChar(newPos, sel.MainCaret() - newPos.Position());  	inDragDrop = ddNone;  	sel.SetMoveExtends(false); -	if (NotifyMarginClick(pt, shift, ctrl, alt)) +	if (NotifyMarginClick(pt, modifiers))  		return; -	NotifyIndicatorClick(true, newPos.Position(), shift, ctrl, alt); +	NotifyIndicatorClick(true, newPos.Position(), modifiers);  	bool inSelMargin = PointInSelMargin(pt);  	// In margin ctrl+(double)click should always select everything @@ -6385,9 +6415,9 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b  		}  		//Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos);  		if (doubleClick) { -			NotifyDoubleClick(pt, shift, ctrl, alt); +			NotifyDoubleClick(pt, modifiers);  			if (PositionIsHotspot(newPos.Position())) -				NotifyHotSpotDoubleClicked(newPos.Position(), shift, ctrl, alt); +				NotifyHotSpotDoubleClicked(newPos.Position(), modifiers);  		}  	} else {	// Single click  		if (inSelMargin) { @@ -6416,7 +6446,7 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b  			SetMouseCapture(true);  		} else {  			if (PointIsHotspot(pt)) { -				NotifyHotSpotClicked(newPos.Position(), shift, ctrl, alt); +				NotifyHotSpotClicked(newPos.Position(), modifiers);  				hotSpotClickPos = PositionFromLocation(pt,true,false);  			}  			if (!shift) { @@ -6461,6 +6491,10 @@ void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, b  	ShowCaretAtCurrentPosition();  } +void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { +	return ButtonDownWithModifiers(pt, curTime, ModifierFlags(shift, ctrl, alt)); +} +  bool Editor::PositionIsHotspot(int position) const {  	return vs.styles[pdoc->StyleAt(position) & pdoc->stylingBitsMask].hotspot;  } @@ -6642,7 +6676,7 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {  	}  	if (hotSpotClickPos != INVALID_POSITION && PointIsHotspot(pt)) {  		hotSpotClickPos = INVALID_POSITION; -		NotifyHotSpotReleaseClick(newPos.Position(), false, ctrl, false); +		NotifyHotSpotReleaseClick(newPos.Position(), ctrl ? SCI_CTRL : 0);  	}  	if (HaveMouseCapture()) {  		if (PointInSelMargin(pt)) { @@ -6653,7 +6687,7 @@ void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {  		}  		ptMouseLast = pt;  		SetMouseCapture(false); -		NotifyIndicatorClick(false, newPos.Position(), false, false, false); +		NotifyIndicatorClick(false, newPos.Position(), 0);  		if (inDragDrop == ddDragging) {  			SelectionPosition selStart = SelectionStart();  			SelectionPosition selEnd = SelectionEnd(); diff --git a/src/Editor.h b/src/Editor.h index 20877b29e..388053777 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -488,6 +488,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	void DelCharBack(bool allowLineStartDeletion);  	virtual void ClaimSelection() = 0; +	static int ModifierFlags(bool shift, bool ctrl, bool alt, bool meta=false);  	virtual void NotifyChange() = 0;  	virtual void NotifyFocus(bool focus);  	virtual void SetCtrlID(int identifier); @@ -497,13 +498,19 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	void NotifyChar(int ch);  	void NotifySavePoint(bool isSavePoint);  	void NotifyModifyAttempt(); +	virtual void NotifyDoubleClick(Point pt, int modifiers);  	virtual void NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt); +	void NotifyHotSpotClicked(int position, int modifiers);  	void NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt); +	void NotifyHotSpotDoubleClicked(int position, int modifiers);  	void NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt); +	void NotifyHotSpotReleaseClick(int position, int modifiers);  	void NotifyHotSpotReleaseClick(int position, bool shift, bool ctrl, bool alt);  	bool NotifyUpdateUI();  	void NotifyPainted(); +	void NotifyIndicatorClick(bool click, int position, int modifiers);  	void NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt); +	bool NotifyMarginClick(Point pt, int modifiers);  	bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt);  	void NotifyNeedShown(int pos, int len);  	void NotifyDwelling(Point pt, bool state); @@ -566,6 +573,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	void WordSelection(int pos);  	void DwellEnd(bool mouseMoved);  	void MouseLeave(); +	virtual void ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers);  	virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);  	void ButtonMoveWithModifiers(Point pt, int modifiers);  	void ButtonMove(Point pt); diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index b06f72836..9190cd6d5 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -463,9 +463,13 @@ void ScintillaBase::CancelModes() {  	Editor::CancelModes();  } -void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { +void ScintillaBase::ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers) {  	CancelModes(); -	Editor::ButtonDown(pt, curTime, shift, ctrl, alt); +	Editor::ButtonDownWithModifiers(pt, curTime, modifiers); +} + +void ScintillaBase::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { +	ButtonDownWithModifiers(pt, curTime, ModifierFlags(shift, ctrl, alt));  }  #ifdef SCI_LEXER diff --git a/src/ScintillaBase.h b/src/ScintillaBase.h index 6ec06d443..59ffea41e 100644 --- a/src/ScintillaBase.h +++ b/src/ScintillaBase.h @@ -83,6 +83,7 @@ protected:  	virtual void AddToPopUp(const char *label, int cmd=0, bool enabled=true) = 0;  	void ContextMenu(Point pt); +	virtual void ButtonDownWithModifiers(Point pt, unsigned int curTime, int modifiers);  	virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt);  	void NotifyStyleToNeeded(int endStyleNeeded); | 
