summaryrefslogtreecommitdiff
path: root/indra/newview/llviewerwindow.cpp
diff options
context:
space:
mode:
authorAdam Moss <moss@lindenlab.com>2009-04-16 23:45:35 +0000
committerAdam Moss <moss@lindenlab.com>2009-04-16 23:45:35 +0000
commitb01c75cb423f07a3d3354f8bd62f265f80062b3b (patch)
treedec1b220c24a60cc220d1cb07fd3545610644f0a /indra/newview/llviewerwindow.cpp
parent868250bdd74f348557102c0d8408d9bec30331f6 (diff)
svn merge -r117314:117337
svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/mv13a-merge-1 QAR-1343 maint-viewer-13a+libcurlexploitfix-3-3 combo merge
Diffstat (limited to 'indra/newview/llviewerwindow.cpp')
-rw-r--r--indra/newview/llviewerwindow.cpp488
1 files changed, 124 insertions, 364 deletions
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 71406d268d..26ddf213d2 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -589,19 +589,46 @@ bool LLViewerWindow::shouldShowToolTipFor(LLMouseHandler *mh)
return false;
}
-BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
+BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, LLMouseHandler::EClickType clicktype, BOOL down)
{
+ std::string buttonname;
+ std::string buttonstatestr;
+ BOOL handled = FALSE;
S32 x = pos.mX;
S32 y = pos.mY;
x = llround((F32)x / mDisplayScale.mV[VX]);
y = llround((F32)y / mDisplayScale.mV[VY]);
- LLView::sMouseHandlerMessage.clear();
-
- if (gDebugClicks)
+ if (down)
+ {
+ buttonstatestr = "down" ;
+ }
+ else
{
- llinfos << "ViewerWindow left mouse down at " << x << "," << y << llendl;
+ buttonstatestr = "up" ;
}
+
+ switch (clicktype)
+ {
+ case LLMouseHandler::CLICK_LEFT:
+ mLeftMouseDown = down;
+ buttonname = "Left";
+ break;
+ case LLMouseHandler::CLICK_RIGHT:
+ mRightMouseDown = down;
+ buttonname = "Right";
+ break;
+ case LLMouseHandler::CLICK_MIDDLE:
+ mMiddleMouseDown = down;
+ buttonname = "Middle";
+ break;
+ case LLMouseHandler::CLICK_DOUBLELEFT:
+ mLeftMouseDown = down;
+ buttonname = "Left Double Click";
+ break;
+ }
+
+ LLView::sMouseHandlerMessage.clear();
if (gMenuBarView)
{
@@ -609,18 +636,24 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
gMenuBarView->resetMenuTrigger();
}
- mLeftMouseDown = TRUE;
+ if (gDebugClicks)
+ {
+ llinfos << "ViewerWindow " << buttonname << " mouse " << buttonstatestr << " at " << x << "," << y << llendl;
+ }
- // Make sure we get a coresponding mouseup event, even if the mouse leaves the window
- mWindow->captureMouse();
+ // Make sure we get a corresponding mouseup event, even if the mouse leaves the window
+ if (down)
+ mWindow->captureMouse();
+ else
+ mWindow->releaseMouse();
// Indicate mouse was active
gMouseIdleTimer.reset();
// Hide tooltips on mousedown
- mToolTipBlocked = TRUE;
+ mToolTipBlocked = down;
- // Also hide hover info on mousedown
+ // Also hide hover info on mousedown/mouseup
if (gHoverView)
{
gHoverView->cancelHover();
@@ -629,7 +662,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
// Don't let the user move the mouse out of the window until mouse up.
if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
{
- mWindow->setMouseClipping(TRUE);
+ mWindow->setMouseClipping(down);
}
LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
@@ -640,10 +673,9 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
if (LLView::sDebugMouseHandling)
{
- llinfos << "Left Mouse Down handled by captor " << mouse_captor->getName() << llendl;
+ llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl;
}
-
- return mouse_captor->handleMouseDown(local_x, local_y, mask);
+ return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down);
}
// Topmost view gets a chance before the hierarchy
@@ -652,215 +684,99 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
{
S32 local_x, local_y;
top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- if (top_ctrl->pointInView(local_x, local_y))
+ if (down)
{
- return top_ctrl->handleMouseDown(local_x, local_y, mask);
+ if (top_ctrl->pointInView(local_x, local_y))
+ {
+ return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ;
+ }
+ else
+ {
+ gFocusMgr.setTopCtrl(NULL);
+ }
}
else
{
- gFocusMgr.setTopCtrl(NULL);
+ handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask);
}
}
// Give the UI views a chance to process the click
- if( mRootView->handleMouseDown(x, y, mask) )
+ if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )
{
if (LLView::sDebugMouseHandling)
{
- llinfos << "Left Mouse Down" << LLView::sMouseHandlerMessage << llendl;
+ llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl;
}
return TRUE;
}
else if (LLView::sDebugMouseHandling)
{
- llinfos << "Left Mouse Down not handled by view" << llendl;
- }
-
- if (gDisconnected)
- {
- return FALSE;
+ llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl;
}
- if(LLToolMgr::getInstance()->getCurrentTool()->handleMouseDown( x, y, mask ) )
+ if (down)
{
- // This is necessary to force clicks in the world to cause edit
- // boxes that might have keyboard focus to relinquish it, and hence
- // cause a commit to update their value. JC
- gFocusMgr.setKeyboardFocus(NULL);
- return TRUE;
- }
-
- return FALSE;
-}
-
-BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK mask)
-{
- S32 x = pos.mX;
- S32 y = pos.mY;
- x = llround((F32)x / mDisplayScale.mV[VX]);
- y = llround((F32)y / mDisplayScale.mV[VY]);
-
- LLView::sMouseHandlerMessage.clear();
-
- if (gDebugClicks)
- {
- llinfos << "ViewerWindow left mouse double-click at " << x << "," << y << llendl;
- }
-
- mLeftMouseDown = TRUE;
-
- // Hide tooltips
- if( mToolTip )
- {
- mToolTip->setVisible( FALSE );
- }
-
- LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
- if( mouse_captor )
- {
- S32 local_x;
- S32 local_y;
- mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
- if (LLView::sDebugMouseHandling)
+ if (gDisconnected)
{
- llinfos << "Left Mouse Down handled by captor " << mouse_captor->getName() << llendl;
+ return FALSE;
+ }
+
+ if(LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
+ {
+ // This is necessary to force clicks in the world to cause edit
+ // boxes that might have keyboard focus to relinquish it, and hence
+ // cause a commit to update their value. JC
+ gFocusMgr.setKeyboardFocus(NULL);
+ return TRUE;
}
-
- return mouse_captor->handleDoubleClick(local_x, local_y, mask);
}
-
- // Check for hit on UI.
- LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
- if (top_ctrl)
+ else
{
- S32 local_x, local_y;
- top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- if (top_ctrl->pointInView(local_x, local_y))
+ if( !handled )
{
- return top_ctrl->handleDoubleClick(local_x, local_y, mask);
+ handled = mRootView->handleAnyMouseClick(x, y, mask, clicktype, down);
}
- else
+
+ if( !handled )
{
- gFocusMgr.setTopCtrl(NULL);
+ LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
+ if (tool)
+ {
+ handled = tool->handleAnyMouseClick(x, y, mask, clicktype, down);
+ }
}
}
- if (mRootView->handleDoubleClick(x, y, mask))
- {
- if (LLView::sDebugMouseHandling)
- {
- llinfos << "Left Mouse Down" << LLView::sMouseHandlerMessage << llendl;
- }
- return TRUE;
- }
- else if (LLView::sDebugMouseHandling)
- {
- llinfos << "Left Mouse Down not handled by view" << llendl;
- }
+ // If we got this far on a down-click, it wasn't handled.
+ // Up-clicks, though, are always handled as far as the OS is concerned.
+ BOOL default_rtn = !down;
+ return default_rtn;
+}
- // Why is this here? JC 9/3/2002
- if (gNoRender)
- {
- return TRUE;
- }
+BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
+{
+ BOOL down = TRUE;
+ return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
+}
- if(LLToolMgr::getInstance()->getCurrentTool()->handleDoubleClick( x, y, mask ) )
+BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK mask)
+{
+ // try handling as a double-click first, then a single-click if that
+ // wasn't handled.
+ BOOL down = TRUE;
+ if (handleAnyMouseClick(window, pos, mask,
+ LLMouseHandler::CLICK_DOUBLELEFT, down))
{
return TRUE;
}
-
- // if we got this far and nothing handled a double click, pass a normal mouse down
return handleMouseDown(window, pos, mask);
}
BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
- S32 x = pos.mX;
- S32 y = pos.mY;
- x = llround((F32)x / mDisplayScale.mV[VX]);
- y = llround((F32)y / mDisplayScale.mV[VY]);
-
- LLView::sMouseHandlerMessage.clear();
-
- if (gDebugClicks)
- {
- llinfos << "ViewerWindow left mouse up" << llendl;
- }
-
- mLeftMouseDown = FALSE;
-
- // Indicate mouse was active
- gMouseIdleTimer.reset();
-
- // Hide tooltips on mouseup
- if( mToolTip )
- {
- mToolTip->setVisible( FALSE );
- }
-
- // Also hide hover info on mouseup
- if (gHoverView) gHoverView->cancelHover();
-
- BOOL handled = FALSE;
-
- mWindow->releaseMouse();
-
- LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
-
- if( tool->clipMouseWhenDown() )
- {
- mWindow->setMouseClipping(FALSE);
- }
-
- LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
- if( mouse_captor )
- {
- S32 local_x;
- S32 local_y;
- mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
- if (LLView::sDebugMouseHandling)
- {
- llinfos << "Left Mouse Up handled by captor " << mouse_captor->getName() << llendl;
- }
-
- return mouse_captor->handleMouseUp(local_x, local_y, mask);
- }
-
- LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
- if (top_ctrl)
- {
- S32 local_x, local_y;
- top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask);
- }
-
- if( !handled )
- {
- handled = mRootView->handleMouseUp(x, y, mask);
- }
-
- if (LLView::sDebugMouseHandling)
- {
- if (handled)
- {
- llinfos << "Left Mouse Up" << LLView::sMouseHandlerMessage << llendl;
- }
- else
- {
- llinfos << "Left Mouse Up not handled by view" << llendl;
- }
- }
-
- if( !handled )
- {
- if (tool)
- {
- handled = tool->handleMouseUp(x, y, mask);
- }
- }
-
- // Always handled as far as the OS is concerned.
- return TRUE;
+ BOOL down = FALSE;
+ return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_LEFT,down);
}
@@ -871,91 +787,10 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
x = llround((F32)x / mDisplayScale.mV[VX]);
y = llround((F32)y / mDisplayScale.mV[VY]);
- LLView::sMouseHandlerMessage.clear();
-
- if (gDebugClicks)
- {
- llinfos << "ViewerWindow right mouse down at " << x << "," << y << llendl;
- }
-
- if (gMenuBarView)
- {
- // stop ALT-key access to menu
- gMenuBarView->resetMenuTrigger();
- }
-
- mRightMouseDown = TRUE;
-
- // Make sure we get a coresponding mouseup event, even if the mouse leaves the window
- mWindow->captureMouse();
-
- // Hide tooltips
- if( mToolTip )
- {
- mToolTip->setVisible( FALSE );
- }
-
- // Also hide hover info on mousedown
- if (gHoverView)
- {
- gHoverView->cancelHover();
- }
-
- // Don't let the user move the mouse out of the window until mouse up.
- if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
- {
- mWindow->setMouseClipping(TRUE);
- }
-
- LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
- if( mouse_captor )
- {
- S32 local_x;
- S32 local_y;
- mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
- if (LLView::sDebugMouseHandling)
- {
- llinfos << "Right Mouse Down handled by captor " << mouse_captor->getName() << llendl;
- }
- return mouse_captor->handleRightMouseDown(local_x, local_y, mask);
- }
-
- LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
- if (top_ctrl)
- {
- S32 local_x, local_y;
- top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- if (top_ctrl->pointInView(local_x, local_y))
- {
- return top_ctrl->handleRightMouseDown(local_x, local_y, mask);
- }
- else
- {
- gFocusMgr.setTopCtrl(NULL);
- }
- }
-
- if( mRootView->handleRightMouseDown(x, y, mask) )
- {
- if (LLView::sDebugMouseHandling)
- {
- llinfos << "Right Mouse Down" << LLView::sMouseHandlerMessage << llendl;
- }
- return TRUE;
- }
- else if (LLView::sDebugMouseHandling)
- {
- llinfos << "Right Mouse Down not handled by view" << llendl;
- }
-
- if(LLToolMgr::getInstance()->getCurrentTool()->handleRightMouseDown( x, y, mask ) )
- {
- // This is necessary to force clicks in the world to cause edit
- // boxes that might have keyboard focus to relinquish it, and hence
- // cause a commit to update their value. JC
- gFocusMgr.setKeyboardFocus(NULL);
- return TRUE;
- }
+ BOOL down = TRUE;
+ BOOL handle = handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_RIGHT,down);
+ if (handle)
+ return handle;
// *HACK: this should be rolled into the composite tool logic, not
// hardcoded at the top level.
@@ -973,107 +808,27 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
- S32 x = pos.mX;
- S32 y = pos.mY;
- x = llround((F32)x / mDisplayScale.mV[VX]);
- y = llround((F32)y / mDisplayScale.mV[VY]);
-
- LLView::sMouseHandlerMessage.clear();
-
- // Don't care about caps lock for mouse events.
- if (gDebugClicks)
- {
- llinfos << "ViewerWindow right mouse up" << llendl;
- }
-
- mRightMouseDown = FALSE;
-
- // Indicate mouse was active
- gMouseIdleTimer.reset();
-
- // Hide tooltips on mouseup
- if( mToolTip )
- {
- mToolTip->setVisible( FALSE );
- }
-
- // Also hide hover info on mouseup
- if (gHoverView) gHoverView->cancelHover();
-
- BOOL handled = FALSE;
-
- mWindow->releaseMouse();
-
- LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
-
- if( tool->clipMouseWhenDown() )
- {
- mWindow->setMouseClipping(FALSE);
- }
-
- LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
- if( mouse_captor )
- {
- S32 local_x;
- S32 local_y;
- mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
- if (LLView::sDebugMouseHandling)
- {
- llinfos << "Right Mouse Up handled by captor " << mouse_captor->getName() << llendl;
- }
- return mouse_captor->handleRightMouseUp(local_x, local_y, mask);
- }
-
- LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
- if (top_ctrl)
- {
- S32 local_x, local_y;
- top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleRightMouseUp(local_x, local_y, mask);
- }
-
- if( !handled )
- {
- handled = mRootView->handleRightMouseUp(x, y, mask);
- }
-
- if (LLView::sDebugMouseHandling)
- {
- if (handled)
- {
- llinfos << "Right Mouse Up" << LLView::sMouseHandlerMessage << llendl;
- }
- else
- {
- llinfos << "Right Mouse Up not handled by view" << llendl;
- }
- }
-
- if( !handled )
- {
- if (tool)
- {
- handled = tool->handleRightMouseUp(x, y, mask);
- }
- }
-
- // Always handled as far as the OS is concerned.
- return TRUE;
+ BOOL down = FALSE;
+ return handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_RIGHT,down);
}
BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
{
+ BOOL down = TRUE;
gVoiceClient->middleMouseState(true);
-
- // Always handled as far as the OS is concerned.
+ handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
+
+ // Always handled as far as the OS is concerned.
return TRUE;
}
-
+
BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
+ BOOL down = FALSE;
gVoiceClient->middleMouseState(false);
-
- // Always handled as far as the OS is concerned.
+ handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
+
+ // Always handled as far as the OS is concerned.
return TRUE;
}
@@ -1279,7 +1034,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
else
{
mActive = FALSE;
- if (gAllowIdleAFK)
+ if (gSavedSettings.getBOOL("AllowIdleAFK"))
{
gAgent.setAFK();
}
@@ -1447,6 +1202,7 @@ LLViewerWindow::LLViewerWindow(
mWindowRect(0, height, width, 0),
mVirtualWindowRect(0, height, width, 0),
mLeftMouseDown(FALSE),
+ mMiddleMouseDown(FALSE),
mRightMouseDown(FALSE),
mToolTip(NULL),
mToolTipBlocked(FALSE),
@@ -5288,11 +5044,15 @@ void LLPickInfo::fetchResults()
// put global position into land_pos
LLVector3d land_pos;
- if (gViewerWindow->mousePointOnLandGlobal(mPickPt.mX, mPickPt.mY, &land_pos))
+ if (!gViewerWindow->mousePointOnLandGlobal(mPickPt.mX, mPickPt.mY, &land_pos))
{
- // Fudge the land focus a little bit above ground.
- mPosGlobal = land_pos + LLVector3d::z_axis * 0.1f;
+ // The selected point is beyond the draw distance or is otherwise
+ // not selectable. Return before calling mPickCallback().
+ return;
}
+
+ // Fudge the land focus a little bit above ground.
+ mPosGlobal = land_pos + LLVector3d::z_axis * 0.1f;
}
else
{