Skip to content

Commit a1506ad

Browse files
committed
Bug 1848599 Allow to place kiosk mode browser to selected monitor r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D186163
1 parent 2bc7cb8 commit a1506ad

File tree

7 files changed

+65
-2
lines changed

7 files changed

+65
-2
lines changed

browser/components/BrowserContentHandler.sys.mjs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ nsBrowserContentHandler.prototype = {
399399

400400
/* nsICommandLineHandler */
401401
handle: function bch_handle(cmdLine) {
402-
if (cmdLine.handleFlag("kiosk", false)) {
402+
if (cmdLine.handleFlag("kiosk", false) ||
403+
cmdLine.handleFlagWithParam("kiosk-monitor", false)) {
403404
gKiosk = true;
404405
}
405406
if (cmdLine.handleFlag("disable-pinch", false)) {
@@ -632,6 +633,7 @@ nsBrowserContentHandler.prototype = {
632633
info +=
633634
" --first-startup Run post-install actions before opening a new window.\n";
634635
info += " --kiosk Start the browser in kiosk mode.\n";
636+
info += " --kiosk-monitor <num> Place kiosk browser window on given monitor.\n";
635637
info +=
636638
" --disable-pinch Disable touch-screen and touch-pad pinch gestures.\n";
637639
return info;

toolkit/xre/nsAppRunner.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ bool gRestartedByOS = false;
320320

321321
bool gIsGtest = false;
322322

323+
bool gKioskMode = false;
324+
int gKioskMonitor = -1;
325+
323326
nsString gAbsoluteArgv0Path;
324327

325328
#if defined(XP_WIN)
@@ -3988,6 +3991,13 @@ int XREMain::XRE_mainInit(bool* aExitFlag) {
39883991
#endif
39893992
}
39903993

3994+
gKioskMode = CheckArg("kiosk");
3995+
const char* kioskMonitorNumber = nullptr;
3996+
if (CheckArg("kiosk-monitor", &kioskMonitorNumber, CheckArgFlag::None)) {
3997+
gKioskMode = true;
3998+
gKioskMonitor = atoi(kioskMonitorNumber);
3999+
}
4000+
39914001
nsresult rv;
39924002
ArgResult ar;
39934003

toolkit/xre/nsAppRunner.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ extern nsString gAbsoluteArgv0Path;
5454

5555
extern bool gIsGtest;
5656

57+
extern bool gKioskMode;
58+
extern int gKioskMonitor;
59+
5760
namespace mozilla {
5861
nsresult AppInfoConstructor(const nsID& aIID, void** aResult);
5962
} // namespace mozilla

widget/gtk/ScreenHelperGTK.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,10 @@ ScreenHelperGTK::ScreenHelperGTK() {
294294
gScreenGetter->Init();
295295
}
296296

297+
int ScreenHelperGTK::GetMonitorCount() {
298+
return gdk_screen_get_n_monitors(gdk_screen_get_default());
299+
}
300+
297301
ScreenHelperGTK::~ScreenHelperGTK() { gScreenGetter = nullptr; }
298302

299303
} // namespace mozilla::widget

widget/gtk/ScreenHelperGTK.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ScreenHelperGTK final : public ScreenManager::Helper {
2020
ScreenHelperGTK();
2121
~ScreenHelperGTK();
2222

23+
static int GetMonitorCount();
2324
static gint GetGTKMonitorScaleFactor(gint aMonitorNum = 0);
2425
static RefPtr<widget::Screen> GetScreenForWindow(nsWindow* aWindow);
2526
};

widget/gtk/nsWindow.cpp

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6184,6 +6184,15 @@ nsresult nsWindow::Create(nsIWidget* aParent, nsNativeWidget aNativeParent,
61846184
}
61856185
#endif
61866186

6187+
if (mWindowType == WindowType::TopLevel && gKioskMode) {
6188+
if (gKioskMonitor != -1) {
6189+
mKioskMonitor = Some(gKioskMonitor);
6190+
LOG(" set kiosk mode monitor %d", mKioskMonitor.value());
6191+
} else {
6192+
LOG(" set kiosk mode");
6193+
}
6194+
}
6195+
61876196
if (mWindowType == WindowType::Popup) {
61886197
MOZ_ASSERT(aInitData);
61896198
// gdk does not automatically set the cursor for "temporary"
@@ -7389,6 +7398,26 @@ bool nsWindow::SynchronouslyRepaintOnResize() {
73897398
return true;
73907399
}
73917400

7401+
void nsWindow::KioskLockOnMonitor() {
7402+
// Available as of GTK 3.18+
7403+
static auto sGdkWindowFullscreenOnMonitor =
7404+
(void (*)(GdkWindow* window, gint monitor))dlsym(
7405+
RTLD_DEFAULT, "gdk_window_fullscreen_on_monitor");
7406+
7407+
if (!sGdkWindowFullscreenOnMonitor) {
7408+
return;
7409+
}
7410+
7411+
int monitor = mKioskMonitor.value();
7412+
if (monitor < 0 || monitor >= ScreenHelperGTK::GetMonitorCount()) {
7413+
LOG("nsWindow::KioskLockOnMonitor() wrong monitor number! (%d)\n", monitor);
7414+
return;
7415+
}
7416+
7417+
LOG("nsWindow::KioskLockOnMonitor() locked on %d\n", monitor);
7418+
sGdkWindowFullscreenOnMonitor(gtk_widget_get_window(mShell), monitor);
7419+
}
7420+
73927421
static bool IsFullscreenSupported(GtkWidget* aShell) {
73937422
#ifdef MOZ_X11
73947423
GdkScreen* screen = gtk_widget_get_screen(aShell);
@@ -7420,8 +7449,17 @@ nsresult nsWindow::MakeFullScreen(bool aFullScreen) {
74207449
}
74217450
}
74227451

7423-
gtk_window_fullscreen(GTK_WINDOW(mShell));
7452+
if (mKioskMonitor.isSome()) {
7453+
KioskLockOnMonitor();
7454+
} else {
7455+
gtk_window_fullscreen(GTK_WINDOW(mShell));
7456+
}
74247457
} else {
7458+
// Kiosk mode always use fullscreen mode.
7459+
if (gKioskMode) {
7460+
return NS_ERROR_NOT_AVAILABLE;
7461+
}
7462+
74257463
gtk_window_unfullscreen(GTK_WINDOW(mShell));
74267464

74277465
if (mIsPIPWindow) {

widget/gtk/nsWindow.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,8 @@ class nsWindow final : public nsBaseWidget {
980980

981981
void SetUserTimeAndStartupTokenForActivatedWindow();
982982

983+
void KioskLockOnMonitor();
984+
983985
#ifdef MOZ_X11
984986
typedef enum {GTK_WIDGET_COMPOSIDED_DEFAULT = 0,
985987
GTK_WIDGET_COMPOSIDED_DISABLED = 1,
@@ -1003,6 +1005,9 @@ class nsWindow final : public nsBaseWidget {
10031005
LayoutDeviceIntRect mLastLoggedBoundSize;
10041006
int mLastLoggedScale = -1;
10051007
#endif
1008+
// Running in kiosk mode and requested to stay on specified monitor.
1009+
// If monitor is removed minimize the window.
1010+
mozilla::Maybe<int> mKioskMonitor;
10061011
};
10071012

10081013
#endif /* __nsWindow_h__ */

0 commit comments

Comments
 (0)