Bug 1409716 - Remove DetectDisplay() and use DISPLAY env variable or Gdk display manager to detect/open it, r?glandium
For X11 only builds get display from DISPLAY env variable or from command line argument. For Wayland enabled buils use standard gdk_display_manager_open_display() path which respects GDK_BACKEND.
When command line argument --display is given pass it to child process by MOZ_GDK_DISPLAY env variable.
MozReview-Commit-ID: F9jEaJ9SU1p
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -252,16 +252,19 @@ nsString gAbsoluteArgv0Path;
#if defined(MOZ_WIDGET_GTK)
#include <glib.h>
#if defined(DEBUG) || defined(NS_BUILD_REFCNT_LOGGING)
#define CLEANUP_MEMORY 1
#define PANGO_ENABLE_BACKEND
#include <pango/pangofc-fontmap.h>
#endif
#include <gtk/gtk.h>
+#ifdef MOZ_WAYLAND
+#include <gdk/gdkwayland.h>
+#endif
#ifdef MOZ_X11
#include <gdk/gdkx.h>
#endif /* MOZ_X11 */
#include "nsGTKToolkit.h"
#include <fontconfig/fontconfig.h>
#endif
#include "BinaryPath.h"
#ifndef MOZ_BUILDID
@@ -3002,54 +3005,17 @@ static void MOZ_gdk_display_close(GdkDis
gdk_display_close(display);
}
#else // not CLEANUP_MEMORY
// Don't do anything to avoid running into driver bugs under XCloseDisplay().
// See bug 973192.
(void) display;
#endif
}
-
-const char* DetectDisplay(void)
-{
- bool tryX11 = false;
- bool tryWayland = false;
- bool tryBroadway = false;
-
- // Honor user backend selection
- const char *backend = PR_GetEnv("GDK_BACKEND");
- if (!backend || strstr(backend, "*")) {
- // Try all backends
- tryX11 = true;
- tryWayland = true;
- tryBroadway = true;
- } else if (backend) {
- if (strstr(backend, "x11"))
- tryX11 = true;
- if (strstr(backend, "wayland"))
- tryWayland = true;
- if (strstr(backend, "broadway"))
- tryBroadway = true;
- }
-
- const char *display_name;
- if (tryX11 && (display_name = PR_GetEnv("DISPLAY"))) {
- return display_name;
- }
- if (tryWayland && (display_name = PR_GetEnv("WAYLAND_DISPLAY"))) {
- return display_name;
- }
- if (tryBroadway && (display_name = PR_GetEnv("BROADWAY_DISPLAY"))) {
- return display_name;
- }
-
- PR_fprintf(PR_STDERR, "Error: GDK_BACKEND does not match available displays\n");
- return nullptr;
-}
-#endif // MOZ_WIDGET_GTK
+#endif
/**
* NSPR will search for the "nspr_use_zone_allocator" symbol throughout
* the process and use it to determine whether the application defines its own
* memory allocator or not.
*
* Since most applications (e.g. Firefox and Thunderbird) don't use any special
* allocators and therefore don't define this symbol, NSPR must search the
@@ -3915,54 +3881,77 @@ XREMain::XRE_mainStartup(bool* aExitFlag
} else {
result = 1;
printf("TEST-UNEXPECTED-FAIL | gtest | Not compiled with enable-tests\n");
}
*aExitFlag = true;
return result;
}
-#if defined(MOZ_WIDGET_GTK)
- // display_name is owned by gdk.
- const char *display_name = nullptr;
- bool saveDisplayArg = false;
- if (!gfxPlatform::IsHeadless()) {
- display_name = gdk_get_display_arg_name();
- if (display_name) {
- saveDisplayArg = true;
- } else {
- display_name = DetectDisplay();
- if (!display_name) {
- return 1;
- }
- }
- }
-#endif /* MOZ_WIDGET_GTK */
#ifdef MOZ_X11
// Init X11 in thread-safe mode. Must be called prior to the first call to XOpenDisplay
// (called inside gdk_display_open). This is a requirement for off main tread compositing.
if (!gfxPlatform::IsHeadless()) {
XInitThreads();
}
#endif
#if defined(MOZ_WIDGET_GTK)
if (!gfxPlatform::IsHeadless()) {
- mGdkDisplay = gdk_display_open(display_name);
- if (!mGdkDisplay) {
- PR_fprintf(PR_STDERR, "Error: cannot open display: %s\n", display_name);
- return 1;
+ const char *display_name = nullptr;
+ bool saveDisplayArg = false;
+
+ // display_name is owned by gdk.
+ display_name = gdk_get_display_arg_name();
+ // if --display argument is given make sure it's
+ // also passed to ContentChild::Init() by MOZ_GDK_DISPLAY.
+ if (display_name) {
+ SaveWordToEnv("MOZ_GDK_DISPLAY", nsDependentCString(display_name));
+ saveDisplayArg = true;
+ }
+
+ // On Wayland disabled builds read X11 DISPLAY env exclusively
+ // and don't care about different displays.
+#if !defined(MOZ_WAYLAND)
+ if (!display_name) {
+ display_name = PR_GetEnv("DISPLAY");
+ if (!display_name) {
+ PR_fprintf(PR_STDERR,
+ "Error: no DISPLAY environment variable specified\n");
+ return 1;
+ }
}
- gdk_display_manager_set_default_display (gdk_display_manager_get(),
- mGdkDisplay);
- }
- if (!gfxPlatform::IsHeadless() && GDK_IS_X11_DISPLAY(mGdkDisplay)) {
- if (saveDisplayArg) {
- SaveWordToEnv("DISPLAY", nsDependentCString(display_name));
+#endif
+
+ if (display_name) {
+ mGdkDisplay = gdk_display_open(display_name);
+ if (!mGdkDisplay) {
+ PR_fprintf(PR_STDERR, "Error: cannot open display: %s\n", display_name);
+ return 1;
+ }
+ gdk_display_manager_set_default_display(gdk_display_manager_get(),
+ mGdkDisplay);
+ if (saveDisplayArg) {
+ if (GDK_IS_X11_DISPLAY(mGdkDisplay)) {
+ SaveWordToEnv("DISPLAY", nsDependentCString(display_name));
+ }
+#ifdef MOZ_WAYLAND
+ else if (GDK_IS_WAYLAND_DISPLAY(mGdkDisplay)) {
+ SaveWordToEnv("WAYLAND_DISPLAY", nsDependentCString(display_name));
+ }
+#endif
+ }
}
- } else {
+#if (MOZ_WIDGET_GTK == 3)
+ else {
+ mGdkDisplay = gdk_display_manager_open_display(gdk_display_manager_get(),
+ nullptr);
+ }
+#endif
+ }
+ else {
mDisableRemote = true;
}
#endif
#ifdef MOZ_ENABLE_XREMOTE
// handle --remote now that xpcom is fired up
bool newInstance;
{
char *e = PR_GetEnv("MOZ_NO_REMOTE");
--- a/toolkit/xre/nsAppRunner.h
+++ b/toolkit/xre/nsAppRunner.h
@@ -124,13 +124,9 @@ const char* PlatformBuildID();
} // namespace mozilla
/**
* Set up platform specific error handling such as suppressing DLL load dialog
* and the JIT debugger on Windows, and install unix signal handlers.
*/
void SetupErrorHandling(const char* progname);
-#ifdef MOZ_WIDGET_GTK
-const char* DetectDisplay();
-#endif
-
#endif // nsAppRunner_h__
--- a/widget/gtk/mozgtk/mozgtk.c
+++ b/widget/gtk/mozgtk/mozgtk.c
@@ -512,16 +512,17 @@ STUB(gtk_window_unmaximize)
#endif
#ifdef GTK3_SYMBOLS
STUB(gdk_device_get_source)
STUB(gdk_device_manager_get_client_pointer)
STUB(gdk_disable_multidevice)
STUB(gdk_device_manager_list_devices)
STUB(gdk_display_get_device_manager)
+STUB(gdk_display_manager_open_display)
STUB(gdk_error_trap_pop_ignored)
STUB(gdk_event_get_source_device)
STUB(gdk_screen_get_monitor_workarea)
STUB(gdk_window_get_type)
STUB(gdk_x11_window_get_xid)
STUB(gdk_x11_display_get_type)
STUB(gdk_wayland_display_get_type)
STUB(gtk_box_new)