From: Brendan Shanks bshanks@codeweavers.com
Ensures that OpenGL content is correctly sized when DPI scaling is active (either because of a non-DPI-aware app, or display mode emulation). --- dlls/winemac.drv/cocoa_opengl.m | 6 ------ dlls/winemac.drv/cocoa_window.m | 7 +------ dlls/winemac.drv/opengl.c | 25 ++++++++++++++++++------- 3 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_opengl.m b/dlls/winemac.drv/cocoa_opengl.m index 6a88519e5db..ea00f95ff68 100644 --- a/dlls/winemac.drv/cocoa_opengl.m +++ b/dlls/winemac.drv/cocoa_opengl.m @@ -73,9 +73,6 @@ + (NSView*) dummyView // need to destroy and recreate the surface or we get weird behavior. - (void) resetSurfaceIfBackingSizeChanged { - if (!retina_enabled) - return; - int view_backing[2]; if (macdrv_get_view_backing_size((macdrv_view)self.view, view_backing) && (view_backing[0] != backing_size[0] || view_backing[1] != backing_size[1])) @@ -101,9 +98,6 @@ - (void) wine_updateBackingSize:(const CGSize*)size { GLint enabled;
- if (!retina_enabled) - return; - if (size) { if (CGLIsEnabled(self.CGLContextObj, kCGLCESurfaceBackingSize, &enabled) != kCGLNoError) diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 71d5c96aa1a..4dac9a3bfd2 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -3751,12 +3751,7 @@ void macdrv_set_view_frame(macdrv_view v, CGRect rect) else [view setFrame:newFrame]; [view setNeedsDisplay:YES]; - - if (retina_enabled) - { - int backing_size[2] = { 0 }; - [view wine_setBackingSize:backing_size]; - } + [view wine_setBackingSize:(int[2]){ 0 }]; [(WineWindow*)[view window] updateForGLSubviews]; } }); diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c index da748777055..c7a6d0fcfaf 100644 --- a/dlls/winemac.drv/opengl.c +++ b/dlls/winemac.drv/opengl.c @@ -67,6 +67,7 @@ struct macdrv_context HWND draw_hwnd; macdrv_view draw_view; RECT draw_rect; + RECT draw_rect_win_dpi; CGLPBufferObj draw_pbuffer; GLenum draw_pbuffer_face; GLint draw_pbuffer_level; @@ -1506,13 +1507,14 @@ static void mark_contexts_for_moved_view(macdrv_view view) static BOOL sync_context_rect(struct macdrv_context *context) { BOOL ret = FALSE; - if (InterlockedCompareExchange(&context->view_moved, FALSE, TRUE)) - { - struct macdrv_win_data *data = get_win_data(context->draw_hwnd); + RECT rect; + struct macdrv_win_data *data = get_win_data(context->draw_hwnd);
- if (data && data->client_cocoa_view == context->draw_view) + if (data && data->client_cocoa_view == context->draw_view) + { + if (InterlockedCompareExchange(&context->view_moved, FALSE, TRUE)) { - RECT rect = data->rects.client; + rect = data->rects.client; OffsetRect(&rect, -data->rects.visible.left, -data->rects.visible.top); if (!EqualRect(&context->draw_rect, &rect)) { @@ -1520,8 +1522,16 @@ static BOOL sync_context_rect(struct macdrv_context *context) ret = TRUE; } } - release_win_data(data); + + NtUserGetClientRect(context->draw_hwnd, &rect, NtUserGetDpiForWindow(context->draw_hwnd)); + if (!EqualRect(&context->draw_rect_win_dpi, &rect)) + { + context->draw_rect_win_dpi = rect; + ret = TRUE; + } } + + release_win_data(data); return ret; }
@@ -1546,7 +1556,7 @@ static void make_context_current(struct macdrv_context *context, BOOL read) sync_context_rect(context);
view = context->draw_view; - view_rect = context->draw_rect; + view_rect = context->draw_rect_win_dpi; pbuffer = context->draw_pbuffer; }
@@ -2420,6 +2430,7 @@ static BOOL macdrv_context_make_current(HDC draw_hdc, HDC read_hdc, void *privat context->draw_view = data->client_cocoa_view; context->draw_rect = data->rects.client; OffsetRect(&context->draw_rect, -data->rects.visible.left, -data->rects.visible.top); + NtUserGetClientRect(hwnd, &context->draw_rect_win_dpi, NtUserGetDpiForWindow(hwnd)); context->draw_pbuffer = NULL; release_win_data(data); }