Browse Source

fix: respect setAlwaysOnTop before showInactive on Linux under X11 (#44325)

fix: respect setAlwaysOnTop before showInactive on Linux under X11 (#44078)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: John Beutner <[email protected]>
trop[bot] 6 months ago
parent
commit
15486ec73d
2 changed files with 21 additions and 0 deletions
  1. 5 0
      shell/browser/native_window_views.cc
  2. 16 0
      spec/api-browser-window-spec.ts

+ 5 - 0
shell/browser/native_window_views.cc

@@ -543,6 +543,11 @@ void NativeWindowViews::ShowInactive() {
 #if BUILDFLAG(IS_LINUX)
   if (global_menu_bar_)
     global_menu_bar_->OnWindowMapped();
+
+  // On X11, setting Z order before showing the window doesn't take effect,
+  // so we have to call it again.
+  if (IsX11())
+    widget()->SetZOrderLevel(widget()->GetZOrderLevel());
 #endif
 }
 

+ 16 - 0
spec/api-browser-window-spec.ts

@@ -2508,6 +2508,22 @@ describe('BrowserWindow module', () => {
       expect(c.isAlwaysOnTop()).to.be.true('child is not always on top');
       expect(c._getAlwaysOnTopLevel()).to.equal('screen-saver');
     });
+
+    it('works when called prior to show', async () => {
+      w = new BrowserWindow({ show: false });
+      w.setAlwaysOnTop(true, 'screen-saver');
+      w.show();
+      await setTimeout(1000);
+      expect(w.isAlwaysOnTop()).to.be.true('is not alwaysOnTop');
+    });
+
+    it('works when called prior to showInactive', async () => {
+      w = new BrowserWindow({ show: false });
+      w.setAlwaysOnTop(true, 'screen-saver');
+      w.showInactive();
+      await setTimeout(1000);
+      expect(w.isAlwaysOnTop()).to.be.true('is not alwaysOnTop');
+    });
   });
 
   describe('preconnect feature', () => {