fix: recalibrate simpleFullscreen when display metrics change (#28150)
* fix: recalibrate simpleFullscreen when display metrics change * Address review feedback * fix: compilation issues * Address feedback from review
This commit is contained in:
		
					parent
					
						
							
								b045d42b0e
							
						
					
				
			
			
				commit
				
					
						fdc2e2bc57
					
				
			
		
					 3 changed files with 31 additions and 1 deletions
				
			
		|  | @ -207,6 +207,7 @@ class NativeWindow : public base::SupportsUserData, | |||
|   virtual void SetTrafficLightPosition(base::Optional<gfx::Point> position) = 0; | ||||
|   virtual base::Optional<gfx::Point> GetTrafficLightPosition() const = 0; | ||||
|   virtual void RedrawTrafficLights() = 0; | ||||
|   virtual void UpdateFrame() = 0; | ||||
| #endif | ||||
| 
 | ||||
|   // Touchbar API
 | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ | |||
| 
 | ||||
| #include "base/mac/scoped_nsobject.h" | ||||
| #include "shell/browser/native_window.h" | ||||
| #include "ui/display/display_observer.h" | ||||
| #include "ui/native_theme/native_theme_observer.h" | ||||
| #include "ui/views/controls/native/native_view_host.h" | ||||
| 
 | ||||
|  | @ -27,7 +28,9 @@ namespace electron { | |||
| 
 | ||||
| class RootViewMac; | ||||
| 
 | ||||
| class NativeWindowMac : public NativeWindow, public ui::NativeThemeObserver { | ||||
| class NativeWindowMac : public NativeWindow, | ||||
|                         public ui::NativeThemeObserver, | ||||
|                         public display::DisplayObserver { | ||||
|  public: | ||||
|   NativeWindowMac(const gin_helper::Dictionary& options, NativeWindow* parent); | ||||
|   ~NativeWindowMac() override; | ||||
|  | @ -124,6 +127,7 @@ class NativeWindowMac : public NativeWindow, public ui::NativeThemeObserver { | |||
|   void SetTrafficLightPosition(base::Optional<gfx::Point> position) override; | ||||
|   base::Optional<gfx::Point> GetTrafficLightPosition() const override; | ||||
|   void RedrawTrafficLights() override; | ||||
|   void UpdateFrame() override; | ||||
|   void SetTouchBar( | ||||
|       std::vector<gin_helper::PersistentDictionary> items) override; | ||||
|   void RefreshTouchBarItem(const std::string& item_id) override; | ||||
|  | @ -188,6 +192,10 @@ class NativeWindowMac : public NativeWindow, public ui::NativeThemeObserver { | |||
|   // ui::NativeThemeObserver:
 | ||||
|   void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override; | ||||
| 
 | ||||
|   // display::DisplayObserver:
 | ||||
|   void OnDisplayMetricsChanged(const display::Display& display, | ||||
|                                uint32_t changed_metrics) override; | ||||
| 
 | ||||
|  private: | ||||
|   // Add custom layers to the content view.
 | ||||
|   void AddContentViewLayers(); | ||||
|  |  | |||
|  | @ -39,6 +39,7 @@ | |||
| #include "shell/common/process_util.h" | ||||
| #include "skia/ext/skia_utils_mac.h" | ||||
| #include "third_party/webrtc/modules/desktop_capture/mac/window_list_utils.h" | ||||
| #include "ui/display/screen.h" | ||||
| #include "ui/gfx/skia_util.h" | ||||
| #include "ui/gl/gpu_switching_manager.h" | ||||
| #include "ui/views/background.h" | ||||
|  | @ -258,6 +259,7 @@ NativeWindowMac::NativeWindowMac(const gin_helper::Dictionary& options, | |||
|                                  NativeWindow* parent) | ||||
|     : NativeWindow(options, parent), root_view_(new RootViewMac(this)) { | ||||
|   ui::NativeTheme::GetInstanceForNativeUi()->AddObserver(this); | ||||
|   display::Screen::GetScreen()->AddObserver(this); | ||||
| 
 | ||||
|   int width = 800, height = 600; | ||||
|   options.Get(options::kWidth, &width); | ||||
|  | @ -882,6 +884,17 @@ void NativeWindowMac::SetExcludedFromShownWindowsMenu(bool excluded) { | |||
|   [window setExcludedFromWindowsMenu:excluded]; | ||||
| } | ||||
| 
 | ||||
| void NativeWindowMac::OnDisplayMetricsChanged(const display::Display& display, | ||||
|                                               uint32_t changed_metrics) { | ||||
|   // We only want to force screen recalibration if we're in simpleFullscreen | ||||
|   // mode. | ||||
|   if (!is_simple_fullscreen_) | ||||
|     return; | ||||
| 
 | ||||
|   base::PostTask(FROM_HERE, {content::BrowserThread::UI}, | ||||
|                  base::BindOnce(&NativeWindow::UpdateFrame, GetWeakPtr())); | ||||
| } | ||||
| 
 | ||||
| void NativeWindowMac::SetSimpleFullScreen(bool simple_fullscreen) { | ||||
|   NSWindow* window = GetNativeWindow().GetNativeNSWindow(); | ||||
| 
 | ||||
|  | @ -1396,6 +1409,13 @@ void NativeWindowMac::RedrawTrafficLights() { | |||
|     [buttons_view_ setNeedsDisplayForButtons]; | ||||
| } | ||||
| 
 | ||||
| // In simpleFullScreen mode, update the frame for new bounds. | ||||
| void NativeWindowMac::UpdateFrame() { | ||||
|   NSWindow* window = GetNativeWindow().GetNativeNSWindow(); | ||||
|   NSRect fullscreenFrame = [window.screen frame]; | ||||
|   [window setFrame:fullscreenFrame display:YES animate:YES]; | ||||
| } | ||||
| 
 | ||||
| void NativeWindowMac::SetTouchBar( | ||||
|     std::vector<gin_helper::PersistentDictionary> items) { | ||||
|   if (@available(macOS 10.12.2, *)) { | ||||
|  | @ -1551,6 +1571,7 @@ void NativeWindowMac::NotifyWindowWillLeaveFullScreen() { | |||
| void NativeWindowMac::Cleanup() { | ||||
|   DCHECK(!IsClosed()); | ||||
|   ui::NativeTheme::GetInstanceForNativeUi()->RemoveObserver(this); | ||||
|   display::Screen::GetScreen()->RemoveObserver(this); | ||||
|   [NSEvent removeMonitor:wheel_event_monitor_]; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Shelley Vohr
				Shelley Vohr