diff options
| -rw-r--r-- | gtk/PlatGTK.cxx | 27 | ||||
| -rw-r--r-- | include/Platform.h | 1 | ||||
| -rw-r--r-- | macosx/PlatMacOSX.cxx | 4 | ||||
| -rw-r--r-- | src/ScintillaBase.cxx | 19 | ||||
| -rw-r--r-- | win32/PlatWin.cxx | 28 | 
5 files changed, 71 insertions, 8 deletions
| diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index 72e6eff83..4a7b2ed8d 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -1874,6 +1874,33 @@ void Window::SetTitle(const char *s) {  	gtk_window_set_title(GTK_WINDOW(id), s);  } +/* Returns rectangle of monitor pt is on, both rect and pt are in Window's  +   gdk window coordinates */ +PRectangle Window::GetMonitorRect(Point pt) { +	gint x_offset, y_offset; + +	gdk_window_get_origin(PWidget(id)->window, &x_offset, &y_offset); + +// gtk 2.2+ +#if GTK_MAJOR_VERSION > 2 || (GTK_MAJOR_VERSION == 2 && GTK_MINOR_VERSION >= 2) +	{ +		GdkScreen* screen; +		gint monitor_num; +		GdkRectangle rect; + +		screen = gtk_widget_get_screen(PWidget(id)); +		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); +		rect.x -= x_offset; +		rect.y -= y_offset; +		return PRectangle(rect.x, rect.y, rect.x + rect.width, rect.y + rect.height); +	} +#else +	return PRectangle(-x_offset, -y_offset, (-x_offset) + gdk_screen_width(), +	                  (-y_offset) + gdk_screen_height()); +#endif +} +  struct ListImage {  	const char *xpm_data;  #if GTK_MAJOR_VERSION < 2 diff --git a/include/Platform.h b/include/Platform.h index 08d71e975..6e6540007 100644 --- a/include/Platform.h +++ b/include/Platform.h @@ -405,6 +405,7 @@ public:  	enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand };  	void SetCursor(Cursor curs);  	void SetTitle(const char *s); +	PRectangle GetMonitorRect(Point pt);  #if PLAT_MACOSX  	void SetWindow(void *ref) { windowRef = ref; };  	void SetControl(void *_control) { control = _control; }; diff --git a/macosx/PlatMacOSX.cxx b/macosx/PlatMacOSX.cxx index dc80d7036..631e0d95e 100644 --- a/macosx/PlatMacOSX.cxx +++ b/macosx/PlatMacOSX.cxx @@ -1059,6 +1059,10 @@ void Window::SetTitle(const char *s) {      CFRelease(title);  } +PRectangle Window::GetMonitorRect(Point) { +	return PRectangle(); +} +  ListBox::ListBox() {}  ListBox::~ListBox() {} diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index e2dd9473e..f8571e962 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -231,6 +231,9 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {  	PRectangle rcClient = GetClientRectangle();  	Point pt = LocationFromPosition(currentPos - lenEntered); +	PRectangle rcPopupBounds = wMain.GetMonitorRect(pt); +	if (rcPopupBounds.Height() == 0) +		rcPopupBounds = rcClient;  	int heightLB = 100;  	int widthLB = 100; @@ -241,18 +244,18 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {  	}  	PRectangle rcac;  	rcac.left = pt.x - ac.lb->CaretFromEdge(); -	if (pt.y >= rcClient.bottom - heightLB &&  // Wont fit below. -	        pt.y >= (rcClient.bottom + rcClient.top) / 2) { // and there is more room above. +	if (pt.y >= rcPopupBounds.bottom - heightLB &&  // Wont fit below. +	        pt.y >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2) { // and there is more room above.  		rcac.top = pt.y - heightLB; -		if (rcac.top < 0) { -			heightLB += rcac.top; -			rcac.top = 0; +		if (rcac.top < rcPopupBounds.top) { +			heightLB -= (rcPopupBounds.top - rcac.top); +			rcac.top = rcPopupBounds.top;  		}  	} else {  		rcac.top = pt.y + vs.lineHeight;  	}  	rcac.right = rcac.left + widthLB; -	rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcClient.bottom); +	rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcPopupBounds.bottom);  	ac.lb->SetPositionRelative(rcac, wMain);  	ac.lb->SetFont(vs.styles[STYLE_DEFAULT].font);  	unsigned int aveCharWidth = vs.styles[STYLE_DEFAULT].aveCharWidth; @@ -270,8 +273,8 @@ void ScintillaBase::AutoCompleteStart(int lenEntered, const char *list) {  	// Make an allowance for large strings in list  	rcList.left = pt.x - ac.lb->CaretFromEdge();  	rcList.right = rcList.left + widthLB; -	if (((pt.y + vs.lineHeight) >= (rcClient.bottom - heightAlloced)) &&  // Wont fit below. -	        ((pt.y + vs.lineHeight / 2) >= (rcClient.bottom + rcClient.top) / 2)) { // and there is more room above. +	if (((pt.y + vs.lineHeight) >= (rcPopupBounds.bottom - heightAlloced)) &&  // Wont fit below. +	        ((pt.y + vs.lineHeight / 2) >= (rcPopupBounds.bottom + rcPopupBounds.top) / 2)) { // and there is more room above.  		rcList.top = pt.y - heightAlloced;  	} else {  		rcList.top = pt.y + vs.lineHeight; diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 36479e0f2..948e5e655 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -1052,6 +1052,34 @@ void Window::SetTitle(const char *s) {  	::SetWindowTextA(reinterpret_cast<HWND>(id), s);  } +/* Returns rectangle of monitor pt is on, both rect and pt are in Window's  +   coordinates */ +#ifdef MULTIPLE_MONITOR_SUPPORT +PRectangle Window::GetMonitorRect(Point pt) { +	// MonitorFromPoint and GetMonitorInfoare not available on Windows 95 so are not used. +	// There could be conditional code and dynamic loading in a future version  +	// so this would work on those platforms where they are available. +	PRectangle rcPosition = GetPosition(); +	POINT ptDesktop = {pt.x + rcPosition.left, pt.y + rcPosition.top}; +	HMONITOR hMonitor = ::MonitorFromPoint(ptDesktop, MONITOR_DEFAULTTONEAREST); +	MONITORINFOEX mi; +	memset(&mi, 0, sizeof(mi)); +	mi.cbSize = sizeof(mi); +	if (::GetMonitorInfo(hMonitor, &mi)) { +		PRectangle rcMonitor( +			mi.rcWork.left - rcPosition.left,  +			mi.rcWork.top - rcPosition.top,  +			mi.rcWork.right - rcPosition.left,  +			mi.rcWork.bottom - rcPosition.top); +		return rcMonitor; +	} +} +#else +PRectangle Window::GetMonitorRect(Point) { +	return PRectangle(); +} +#endif +  struct ListItemData {  	const char *text;  	int pixId; | 
