Rework macOS retina support to remove deprecated code and fix scaled input issues in multimonitor

master
Rye 2025-08-20 17:57:06 -04:00
parent 77514ebddd
commit f0db568bf8
5 changed files with 38 additions and 87 deletions

View File

@ -213,13 +213,8 @@ void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& rem
void LLUI::setMousePositionScreen(S32 x, S32 y)
{
#if defined(LL_DARWIN)
S32 screen_x = ll_round(((F32)x * getScaleFactor().mV[VX]) / LLView::getWindow()->getSystemUISize());
S32 screen_y = ll_round(((F32)y * getScaleFactor().mV[VY]) / LLView::getWindow()->getSystemUISize());
#else
S32 screen_x = ll_round((F32)x * getScaleFactor().mV[VX]);
S32 screen_y = ll_round((F32)y * getScaleFactor().mV[VY]);
#endif
LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());
}

View File

@ -184,7 +184,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
{
if (!mOldResize) //Maint-3288
{
NSSize dev_sz = gHiDPISupport ? [self convertSizeToBacking:[self frame].size] : [self frame].size;
NSSize dev_sz = [self convertSizeToBacking:[self frame].size];
callResize(dev_sz.width, dev_sz.height);
}
}
@ -338,10 +338,6 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) mouseDown:(NSEvent *)theEvent
{
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
// Apparently people still use this?
if ([theEvent modifierFlags] & NSEventModifierFlagCommand &&
!([theEvent modifierFlags] & NSEventModifierFlagControl) &&
@ -370,7 +366,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
callRightMouseUp(mMousePos, [theEvent modifierFlags]);
mSimulatedRightClick = false;
} else {
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callLeftMouseUp(mMousePos, [theEvent modifierFlags]);
@ -379,32 +375,26 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) rightMouseDown:(NSEvent *)theEvent
{
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callRightMouseDown(mMousePos, [theEvent modifierFlags]);
}
- (void) rightMouseUp:(NSEvent *)theEvent
{
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callRightMouseUp(mMousePos, [theEvent modifierFlags]);
}
- (void)mouseMoved:(NSEvent *)theEvent
{
NSPoint dev_delta = gHiDPISupport ? [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])] : NSMakePoint([theEvent deltaX], [theEvent deltaY]);
NSPoint dev_delta = [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])];
float mouseDeltas[] = {
float(dev_delta.x),
float(dev_delta.y)
};
callDeltaUpdate(mouseDeltas, 0);
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callMouseMoved(mMousePos, 0);
@ -419,7 +409,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
// The old CoreGraphics APIs we previously relied on are now flagged as obsolete.
// NSEvent isn't obsolete, and provides us with the correct deltas.
NSPoint dev_delta = gHiDPISupport ? [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])] : NSMakePoint([theEvent deltaX], [theEvent deltaY]);
NSPoint dev_delta = [self convertPointToBacking:NSMakePoint([theEvent deltaX], [theEvent deltaY])];
float mouseDeltas[] = {
float(dev_delta.x),
@ -428,7 +418,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
callDeltaUpdate(mouseDeltas, 0);
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callMouseDragged(mMousePos, 0);
@ -436,17 +426,11 @@ attributedStringInfo getSegments(NSAttributedString *str)
- (void) otherMouseDown:(NSEvent *)theEvent
{
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callOtherMouseDown(mMousePos, [theEvent modifierFlags], [theEvent buttonNumber]);
}
- (void) otherMouseUp:(NSEvent *)theEvent
{
NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow];
mMousePos[0] = mPoint.x;
mMousePos[1] = mPoint.y;
callOtherMouseUp(mMousePos, [theEvent modifierFlags], [theEvent buttonNumber]);
}

View File

@ -111,16 +111,14 @@ void glSwapBuffers(void* context);
CGLContextObj getCGLContextObj(GLViewRef view);
unsigned long getVramSize(GLViewRef view);
float getDeviceUnitSize(GLViewRef view);
CGPoint getContentViewBoundsPosition(NSWindowRef window);
CGSize getContentViewBoundsSize(NSWindowRef window);
CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view);
CGRect getContentViewRect(NSWindowRef window);
CGRect getBackingViewRect(NSWindowRef window, GLViewRef view);
void getWindowSize(NSWindowRef window, float* size);
void setWindowSize(NSWindowRef window, int width, int height);
void getCursorPos(NSWindowRef window, float* pos);
void makeWindowOrderFront(NSWindowRef window);
void convertScreenToWindow(NSWindowRef window, float *coord);
void convertWindowToScreen(NSWindowRef window, float *coord);
void convertScreenToView(NSWindowRef window, float *coord);
void convertRectToScreen(NSWindowRef window, float *coord);
void convertRectFromScreen(NSWindowRef window, float *coord);
void setWindowPos(NSWindowRef window, float* pos);

View File

@ -259,19 +259,14 @@ float getDeviceUnitSize(GLViewRef view)
return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width;
}
CGPoint getContentViewBoundsPosition(NSWindowRef window)
CGRect getContentViewRect(NSWindowRef window)
{
return [[(LLNSWindow*)window contentView] bounds].origin;
return [[(LLNSWindow*)window contentView] bounds];
}
CGSize getContentViewBoundsSize(NSWindowRef window)
CGRect getBackingViewRect(NSWindowRef window, GLViewRef view)
{
return [[(LLNSWindow*)window contentView] bounds].size;
}
CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view)
{
return [(NSOpenGLView*)view convertRectToBacking:[[(LLNSWindow*)window contentView] bounds]].size;
return [(NSOpenGLView*)view convertRectToBacking:[[(LLNSWindow*)window contentView] bounds]];
}
void getWindowSize(NSWindowRef window, float* size)
@ -314,9 +309,7 @@ void makeWindowOrderFront(NSWindowRef window)
void convertScreenToWindow(NSWindowRef window, float *coord)
{
NSRect point;
point.origin.x = coord[0];
point.origin.y = coord[1];
NSRect point = NSMakeRect(coord[0], coord[1], 0,0);
point = [(LLNSWindow*)window convertRectFromScreen:point];
coord[0] = point.origin.x;
coord[1] = point.origin.y;
@ -324,28 +317,18 @@ void convertScreenToWindow(NSWindowRef window, float *coord)
void convertRectToScreen(NSWindowRef window, float *coord)
{
NSRect point;
point.origin.x = coord[0];
point.origin.y = coord[1];
point.size.width = coord[2];
point.size.height = coord[3];
point = [(LLNSWindow*)window convertRectToScreen:point];
coord[0] = point.origin.x;
coord[1] = point.origin.y;
coord[2] = point.size.width;
coord[3] = point.size.height;
NSRect rect = NSMakeRect(coord[0], coord[1], coord[2], coord[3]);;
rect = [(LLNSWindow*)window convertRectToScreen:rect];
coord[0] = rect.origin.x;
coord[1] = rect.origin.y;
coord[2] = rect.size.width;
coord[3] = rect.size.height;
}
void convertRectFromScreen(NSWindowRef window, float *coord)
{
NSRect point;
point.origin.x = coord[0];
point.origin.y = coord[1];
point.size.width = coord[2];
point.size.height = coord[3];
NSRect point = NSMakeRect(coord[0], coord[1], coord[2], coord[3]);
point = [(LLNSWindow*)window convertRectFromScreen:point];
coord[0] = point.origin.x;
@ -354,23 +337,13 @@ void convertRectFromScreen(NSWindowRef window, float *coord)
coord[3] = point.size.height;
}
void convertScreenToView(NSWindowRef window, float *coord)
{
NSRect point;
point.origin.x = coord[0];
point.origin.y = coord[1];
point.origin = [(LLNSWindow*)window convertScreenToBase:point.origin];
point.origin = [[(LLNSWindow*)window contentView] convertPoint:point.origin fromView:nil];
}
void convertWindowToScreen(NSWindowRef window, float *coord)
{
NSPoint point;
point.x = coord[0];
point.y = coord[1];
point = [(LLNSWindow*)window convertToScreenFromLocalPoint:point relativeToView:[(LLNSWindow*)window contentView]];
coord[0] = point.x;
coord[1] = point.y;
NSRect rect = NSMakeRect(coord[0], coord[1], 0, 0);
rect = [(LLNSWindow*)window convertRectToScreen:rect];
coord[0] = rect.origin.x;
coord[1] = [[NSScreen screens][0] frame].size.height - rect.origin.y;
}
void closeWindow(NSWindowRef window)

View File

@ -985,7 +985,7 @@ bool LLWindowMacOSX::getPosition(LLCoordScreen *position)
}
else if(mWindow)
{
const CGPoint & pos = getContentViewBoundsPosition(mWindow);
CGPoint pos = getContentViewRect(mWindow).origin;
position->mX = pos.x;
position->mY = pos.y;
@ -1012,7 +1012,7 @@ bool LLWindowMacOSX::getSize(LLCoordScreen *size)
}
else if(mWindow)
{
const CGSize & sz = gHiDPISupport ? getDeviceContentViewSize(mWindow, mGLView) : getContentViewBoundsSize(mWindow);
CGSize sz = getBackingViewRect(mWindow, mGLView).size;
size->mX = sz.width;
size->mY = sz.height;
@ -1038,7 +1038,7 @@ bool LLWindowMacOSX::getSize(LLCoordWindow *size)
}
else if(mWindow)
{
const CGSize & sz = gHiDPISupport ? getDeviceContentViewSize(mWindow, mGLView) : getContentViewBoundsSize(mWindow);
CGSize sz = getBackingViewRect(mWindow, mGLView).size;
size->mX = sz.width;
size->mY = sz.height;
@ -1485,8 +1485,9 @@ bool LLWindowMacOSX::convertCoords(LLCoordScreen from, LLCoordWindow* to)
convertScreenToWindow(mWindow, mouse_point);
to->mX = mouse_point[0];
to->mY = mouse_point[1];
float scale_factor = getSystemUISize();
to->mX = mouse_point[0] * scale_factor;
to->mY = mouse_point[1] * scale_factor;
return true;
}
@ -1498,9 +1499,9 @@ bool LLWindowMacOSX::convertCoords(LLCoordWindow from, LLCoordScreen *to)
if(mWindow)
{
float mouse_point[2];
mouse_point[0] = from.mX;
mouse_point[1] = from.mY;
float scale_factor = getSystemUISize();
mouse_point[0] = from.mX / scale_factor;
mouse_point[1] = from.mY / scale_factor;
convertWindowToScreen(mWindow, mouse_point);
@ -2637,7 +2638,7 @@ MASK LLWindowMacOSX::modifiersToMask(S16 modifiers)
F32 LLWindowMacOSX::getSystemUISize()
{
return gHiDPISupport ? ::getDeviceUnitSize(mGLView) : LLWindow::getSystemUISize();
return ::getDeviceUnitSize(mGLView);
}
#if LL_OS_DRAGDROP_ENABLED