diff --git a/gfx/angle/moz.build.common b/gfx/angle/moz.build.common index 8769a2fe96..6976853b35 100644 --- a/gfx/angle/moz.build.common +++ b/gfx/angle/moz.build.common @@ -12,6 +12,9 @@ CXXFLAGS += CONFIG['MOZ_X11_CFLAGS'] if CONFIG['INTEL_ARCHITECTURE']: CXXFLAGS += CONFIG['SSE2_FLAGS'] +if not CONFIG['MOZ_X11']: + DEFINES['EGL_NO_X11'] = True + if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DEFINES['ANGLE_IS_WIN'] = True diff --git a/gfx/cairo/cairo/src/cairo-features.h b/gfx/cairo/cairo/src/cairo-features.h index cfed9d9a2f..ad9abeaab1 100644 --- a/gfx/cairo/cairo/src/cairo-features.h +++ b/gfx/cairo/cairo/src/cairo-features.h @@ -56,7 +56,6 @@ #endif #ifdef MOZ_X11 -#define CAIRO_HAS_PS_SURFACE 1 #define CAIRO_HAS_XLIB_XRENDER_SURFACE 0 #define CAIRO_HAS_XLIB_SURFACE 1 #endif @@ -78,6 +77,7 @@ #endif #define CAIRO_HAS_TEE_SURFACE 1 +#define CAIRO_HAS_PS_SURFACE 1 #ifdef USE_FC_FREETYPE #define CAIRO_HAS_FC_FONT 1 diff --git a/gfx/gl/moz.build b/gfx/gl/moz.build index 03434957cc..c4727d79a1 100644 --- a/gfx/gl/moz.build +++ b/gfx/gl/moz.build @@ -13,10 +13,10 @@ elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa": elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "uikit": gl_provider = "EAGL" elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": - if CONFIG["MOZ_EGL_XRENDER_COMPOSITE"]: - gl_provider = "EGL" - else: + if CONFIG["MOZ_X11"]: gl_provider = "GLX" + else: + gl_provider = "EGL" elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "android": gl_provider = "EGL" @@ -117,7 +117,10 @@ elif gl_provider == "GLX": EXPORTS += ["GLContextGLX.h", "GLXLibrary.h"] if CONFIG["MOZ_WAYLAND"]: - SOURCES += ["GLContextProviderWayland.cpp", "SharedSurfaceDMABUF.cpp"] + SOURCES += ["SharedSurfaceDMABUF.cpp"] + +if CONFIG["MOZ_X11"] and CONFIG["MOZ_WAYLAND"]: + SOURCES += ["GLContextProviderWayland.cpp"] UNIFIED_SOURCES += [ "AndroidSurfaceTexture.cpp", diff --git a/gfx/layers/client/TextureClient.cpp b/gfx/layers/client/TextureClient.cpp index 3861d3a..8dcad53 100644 --- a/gfx/layers/client/TextureClient.cpp +++ b/gfx/layers/client/TextureClient.cpp @@ -48,8 +48,6 @@ # include "mozilla/layers/TextureD3D11.h" #endif #ifdef MOZ_WAYLAND -# include - # include "gfxPlatformGtk.h" # include "mozilla/layers/DMABUFTextureClientOGL.h" # include "mozilla/widget/nsWaylandDisplay.h" diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp index 1b46a2aab8..4a487e0b78 100644 --- a/gfx/thebes/gfxPlatformGtk.cpp +++ b/gfx/thebes/gfxPlatformGtk.cpp @@ -31,12 +31,12 @@ #include "mozilla/FontPropertyTypes.h" #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Logging.h" -#include "mozilla/gfx/XlibDisplay.h" #include "mozilla/Monitor.h" #include "mozilla/Preferences.h" #include "mozilla/StaticPrefs_gfx.h" #include "mozilla/StaticPrefs_layers.h" #include "mozilla/StaticPrefs_media.h" +#include "mozilla/WidgetUtilsGtk.h" #include "nsAppRunner.h" #include "nsIGfxInfo.h" #include "nsMathUtils.h" @@ -53,6 +53,7 @@ # include "GLXLibrary.h" # include "mozilla/X11Util.h" # include "SoftwareVsyncSource.h" +# include "mozilla/gfx/XlibDisplay.h" /* Undefine the Status from Xlib since it will conflict with system headers on * OSX */ diff --git a/gfx/webrender_bindings/RenderCompositorOGLSWGL.cpp b/gfx/webrender_bindings/RenderCompositorOGLSWGL.cpp index 00a6c3ef6d..78c4235268 100644 --- a/gfx/webrender_bindings/RenderCompositorOGLSWGL.cpp +++ b/gfx/webrender_bindings/RenderCompositorOGLSWGL.cpp @@ -27,7 +27,6 @@ #ifdef MOZ_WIDGET_GTK # include "mozilla/widget/GtkCompositorWidget.h" # include -# include #endif namespace mozilla { diff --git a/python/mozboot/mozboot/gentoo.py b/python/mozboot/mozboot/gentoo.py index a33677a0a1..cb9e3dd338 100644 --- a/python/mozboot/mozboot/gentoo.py +++ b/python/mozboot/mozboot/gentoo.py @@ -33,7 +33,6 @@ class GentooBootstrapper(LinuxBootstrapper, BaseBootstrapper): "dev-libs/dbus-glib", "media-sound/pulseaudio", "x11-libs/gtk+:3", - "x11-libs/libXt", ] ) diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build index a5cf9234d1..ddce223c19 100644 --- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build +++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build @@ -93,11 +93,9 @@ if CONFIG["OS_TARGET"] == "Linux": DEFINES["USE_NSS_CERTS"] = "1" DEFINES["USE_OZONE"] = "1" DEFINES["USE_UDEV"] = True - DEFINES["USE_X11"] = "1" DEFINES["WEBRTC_LINUX"] = True DEFINES["WEBRTC_POSIX"] = True DEFINES["WEBRTC_USE_PIPEWIRE"] = True - DEFINES["WEBRTC_USE_X11"] = True DEFINES["_FILE_OFFSET_BITS"] = "64" DEFINES["_GNU_SOURCE"] = True DEFINES["_LARGEFILE64_SOURCE"] = True @@ -115,14 +113,6 @@ if CONFIG["OS_TARGET"] == "Linux": OS_LIBS += [ "dl", "rt", - "X11", - "Xcomposite", - "Xdamage", - "Xext", - "Xfixes", - "Xrandr", - "Xrender", - "Xtst" ] SOURCES += [ @@ -130,22 +120,26 @@ if CONFIG["OS_TARGET"] == "Linux": ] UNIFIED_SOURCES += [ - "/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc", "/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_x11.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/shared_x_display.cc", "/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_x11.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/window_finder_x11.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/window_list_utils.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/x_atom_cache.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/x_error_trap.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/x_server_pixel_buffer.cc", - "/third_party/libwebrtc/modules/desktop_capture/linux/x_window_property.cc", "/third_party/libwebrtc/modules/desktop_capture/mouse_cursor_monitor_linux.cc", "/third_party/libwebrtc/modules/desktop_capture/screen_capturer_linux.cc", "/third_party/libwebrtc/modules/desktop_capture/window_capturer_linux.cc" ] + + if CONFIG["MOZ_X11"]: + UNIFIED_SOURCES += [ + "/third_party/libwebrtc/modules/desktop_capture/linux/mouse_cursor_monitor_x11.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/screen_capturer_x11.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/shared_x_display.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/window_capturer_x11.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/window_finder_x11.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/window_list_utils.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/x_atom_cache.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/x_error_trap.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/x_server_pixel_buffer.cc", + "/third_party/libwebrtc/modules/desktop_capture/linux/x_window_property.cc" + ] if CONFIG["OS_TARGET"] == "OpenBSD": diff --git a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build index 4cf85ddfa7..e5873468ca 100644 --- a/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build +++ b/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn/moz.build @@ -53,10 +53,8 @@ if CONFIG["OS_TARGET"] == "Linux": DEFINES["USE_NSS_CERTS"] = "1" DEFINES["USE_OZONE"] = "1" DEFINES["USE_UDEV"] = True - DEFINES["USE_X11"] = "1" DEFINES["WEBRTC_LINUX"] = True DEFINES["WEBRTC_POSIX"] = True - DEFINES["WEBRTC_USE_X11"] = True DEFINES["_FILE_OFFSET_BITS"] = "64" DEFINES["_GNU_SOURCE"] = True DEFINES["_LARGEFILE64_SOURCE"] = True @@ -67,14 +65,6 @@ if CONFIG["OS_TARGET"] == "Linux": OS_LIBS += [ "dl", "rt", - "X11", - "Xcomposite", - "Xdamage", - "Xext", - "Xfixes", - "Xrandr", - "Xrender", - "Xtst" ] if CONFIG["OS_TARGET"] == "OpenBSD": diff --git a/third_party/libwebrtc/webrtc_gn/moz.build b/third_party/libwebrtc/webrtc_gn/moz.build index 625bd0b5dd..2b0e2276c6 100644 --- a/third_party/libwebrtc/webrtc_gn/moz.build +++ b/third_party/libwebrtc/webrtc_gn/moz.build @@ -71,7 +71,6 @@ if CONFIG["OS_TARGET"] == "Linux": DEFINES["USE_NSS_CERTS"] = "1" DEFINES["USE_OZONE"] = "1" DEFINES["USE_UDEV"] = True - DEFINES["USE_X11"] = "1" DEFINES["WEBRTC_LINUX"] = True DEFINES["WEBRTC_POSIX"] = True DEFINES["_FILE_OFFSET_BITS"] = "64" @@ -85,14 +84,6 @@ if CONFIG["OS_TARGET"] == "Linux": "dl", "m", "rt", - "X11", - "Xcomposite", - "Xdamage", - "Xext", - "Xfixes", - "Xrandr", - "Xrender", - "Xtst" ] if CONFIG["OS_TARGET"] == "OpenBSD": diff --git a/toolkit/components/remote/moz.build b/toolkit/components/remote/moz.build index d3bab6cf9a..656b32c7fa 100644 --- a/toolkit/components/remote/moz.build +++ b/toolkit/components/remote/moz.build @@ -26,7 +26,7 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": "nsUnixRemoteServer.h", "RemoteUtils.h", ] - else: + elif CONFIG["MOZ_X11"]: SOURCES += [ "nsGTKRemoteServer.cpp", "nsXRemoteClient.cpp", diff --git a/toolkit/components/remote/nsRemoteService.cpp b/toolkit/components/remote/nsRemoteService.cpp index b2499d8191..1d1dc42e9f 100644 --- a/toolkit/components/remote/nsRemoteService.cpp +++ b/toolkit/components/remote/nsRemoteService.cpp @@ -12,12 +12,14 @@ #ifdef MOZ_WIDGET_GTK # include "mozilla/WidgetUtilsGtk.h" -# include "nsGTKRemoteServer.h" -# ifdef MOZ_ENABLE_DBUS +# if defined(MOZ_ENABLE_DBUS) # include "nsDBusRemoteServer.h" # include "nsDBusRemoteClient.h" -# else +# elif defined(MOZ_X11) # include "nsXRemoteClient.h" +# include "nsGTKRemoteServer.h" +# else +# include "nsRemoteClient.h" # endif #elif defined(XP_WIN) # include "nsWinRemoteServer.h" @@ -102,8 +104,10 @@ RemoteResult nsRemoteService::StartClient(const char* aDesktopStartupID) { #ifdef MOZ_WIDGET_GTK # if defined(MOZ_ENABLE_DBUS) client = MakeUnique(); -# else +# elif defined(MOZ_X11) client = MakeUnique(); +# else + return REMOTE_NOT_FOUND; # endif #elif defined(XP_WIN) client = MakeUnique(); @@ -146,8 +150,10 @@ void nsRemoteService::StartupServer() { #ifdef MOZ_WIDGET_GTK # if defined(MOZ_ENABLE_DBUS) mRemoteServer = MakeUnique(); -# else +# elif defined(MOZ_X11) mRemoteServer = MakeUnique(); +# else + return; # endif #elif defined(XP_WIN) mRemoteServer = MakeUnique(); diff --git a/toolkit/moz.configure b/toolkit/moz.configure index 539433a6ef..8599a3b838 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -286,7 +286,7 @@ def toolkit_choices(target): elif target.os == "Android": return ("cairo-android",) else: - return ("cairo-gtk3", "cairo-gtk3-wayland") + return ("cairo-gtk3",) @depends(toolkit_choices) @@ -338,23 +338,24 @@ def toolkit_gtk(toolkit): # Wayland support # ============================================================== -wayland_headers = pkg_check_modules( - "MOZ_WAYLAND", - "gtk+-wayland-3.0 >= 3.14 xkbcommon >= 0.4.1 libdrm >= 2.4", - allow_missing=depends(full_toolkit)(lambda t: t == "cairo-gtk3"), - when=depends(full_toolkit)(lambda t: t in ("cairo-gtk3", "cairo-gtk3-wayland")), +option( + "--with-wayland", + help="{Enable wayland support|Disable wayland support}", ) - -@depends(wayland_headers, toolkit_gtk, artifact_builds) -def wayland_headers(wayland, toolkit_gtk, artifacts): - if toolkit_gtk and artifacts: +@depends("--with-wayland", toolkit_gtk, artifact_builds) +def with_wayland(value, toolkit_gtk, artifacts): + if value and toolkit_gtk or artifacts: return True - return wayland +wayland_headers = pkg_check_modules( + "MOZ_WAYLAND", + "gtk+-wayland-3.0 >= 3.14 xkbcommon >= 0.4.1 libdrm >= 2.4", + when=with_wayland, +) -set_config("MOZ_WAYLAND", depends_if(wayland_headers)(lambda _: True)) -set_define("MOZ_WAYLAND", depends_if(wayland_headers)(lambda _: True)) +set_config("MOZ_WAYLAND", True, when=with_wayland) +set_define("MOZ_WAYLAND", True, when=with_wayland) # GL Provider # ============================================================== @@ -376,7 +377,7 @@ def gl_provider_define(provider): set_define("MOZ_GL_PROVIDER", gl_provider_define) -@depends(gl_provider, wayland_headers, toolkit_gtk) +@depends(gl_provider, with_wayland, toolkit_gtk) def gl_default_provider(value, wayland, toolkit_gtk): if value: return value @@ -1197,11 +1198,20 @@ set_define("MOZ_RAW", depends_if("--enable-raw")(lambda _: True)) # X11 # ============================================================== -set_config("MOZ_X11", True, when=toolkit_gtk) -set_define("MOZ_X11", True, when=toolkit_gtk) +option( + "--with-x", + help="{Enable X11 support|Disable X11 support}", +) + +@depends("--with-x", toolkit_gtk) +def with_x(value, toolkit_gtk): + if value and toolkit_gtk: + return True +set_config("MOZ_X11", True, when=with_x) +set_define("MOZ_X11", True, when=with_x) -@depends(webrtc, when=toolkit_gtk) +@depends(webrtc, when=with_x) def x11_libs(webrtc): libs = [ "x11", @@ -1225,8 +1235,8 @@ def x11_libs(webrtc): return libs -pkg_check_modules("MOZ_X11", x11_libs, when=toolkit_gtk) -pkg_check_modules("MOZ_X11_SM", ["ice", "sm"], cflags_only=True, when=toolkit_gtk) +pkg_check_modules("MOZ_X11", x11_libs, when=with_x) +pkg_check_modules("MOZ_X11_SM", ["ice", "sm"], cflags_only=True, when=with_x) # ASan Reporter Addon diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build index b1e2b58621..576ec91669 100644 --- a/toolkit/xre/moz.build +++ b/toolkit/xre/moz.build @@ -156,7 +156,7 @@ SOURCES += [ "ProfileReset.cpp", ] -if CONFIG["MOZ_X11"]: +if CONFIG["MOZ_X11"] or CONFIG["MOZ_WAYLAND"]: UNIFIED_SOURCES += [ "glxtest.cpp", ] @@ -187,7 +187,7 @@ include("/ipc/chromium/chromium-config.mozbuild") FINAL_LIBRARY = "xul" -if CONFIG["MOZ_X11"]: +if CONFIG["MOZ_X11"] or CONFIG["MOZ_WAYLAND"]: DEFINES["USE_GLX_TEST"] = True for var in ( diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index d997493..a6cef19 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -4493,6 +4493,7 @@ static void PR_CALLBACK ReadAheadDlls_ThreadStart(void* arg) { #if defined(MOZ_WAYLAND) bool IsWaylandEnabled() { +# ifdef MOZ_X11 const char* waylandDisplay = PR_GetEnv("WAYLAND_DISPLAY"); if (!waylandDisplay) { return false; @@ -4513,6 +4514,9 @@ bool IsWaylandEnabled() { return true; } } +# else + return true; +# endif # ifdef EARLY_BETA_OR_EARLIER // Enable by default when we're running on a recent enough GTK version. We'd // like to check further details like compositor version and so on ideally diff --git a/toolkit/xre/nsGDKErrorHandler.cpp b/toolkit/xre/nsGDKErrorHandler.cpp index 421abdf12f..c7803cf973 100644 --- a/toolkit/xre/nsGDKErrorHandler.cpp +++ b/toolkit/xre/nsGDKErrorHandler.cpp @@ -6,14 +6,18 @@ #include "nsGDKErrorHandler.h" #include -#include +#ifdef MOZ_X11 +# include +#endif #include #include #include #include "nsDebug.h" #include "nsString.h" -#include "nsX11ErrorHandler.h" +#ifdef MOZ_X11 +# include "nsX11ErrorHandler.h" +#endif #include "prenv.h" @@ -26,6 +30,7 @@ */ static void GdkErrorHandler(const gchar* log_domain, GLogLevelFlags log_level, const gchar* message, gpointer user_data) { +#ifdef MOZ_X11 if (strstr(message, "X Window System error")) { XErrorEvent event; nsDependentCString buffer(message); @@ -96,6 +101,10 @@ static void GdkErrorHandler(const gchar* log_domain, GLogLevelFlags log_level, g_log_default_handler(log_domain, log_level, message, user_data); MOZ_CRASH_UNSAFE(message); } +#else + g_log_default_handler(log_domain, log_level, message, user_data); + MOZ_CRASH_UNSAFE(message); +#endif } void InstallGdkErrorHandler() { @@ -103,7 +112,9 @@ void InstallGdkErrorHandler() { (GLogLevelFlags)(G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), GdkErrorHandler, nullptr); +#ifdef MOZ_X11 if (PR_GetEnv("MOZ_X_SYNC")) { XSynchronize(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), X11True); } +#endif } diff --git a/widget/CompositorWidget.h b/widget/CompositorWidget.h index 4d38bc6220..09e19945a9 100644 --- a/widget/CompositorWidget.h +++ b/widget/CompositorWidget.h @@ -62,7 +62,7 @@ class CompositorWidgetDelegate { }; // Platforms that support out-of-process widgets. -#if defined(XP_WIN) || defined(MOZ_X11) || defined(MOZ_WIDGET_ANDROID) +#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_ANDROID) // CompositorWidgetParent should implement CompositorWidget and // PCompositorWidgetParent. class CompositorWidgetParent; diff --git a/widget/gtk/GtkCompositorWidget.cpp b/widget/gtk/GtkCompositorWidget.cpp index 89a8248bc0..2454006d0d 100644 --- a/widget/gtk/GtkCompositorWidget.cpp +++ b/widget/gtk/GtkCompositorWidget.cpp @@ -49,9 +49,9 @@ GtkCompositorWidget::GtkCompositorWidget( auto size = mClientSize.Lock(); *size = aInitData.InitialClientSize(); - LOG("GtkCompositorWidget::GtkCompositorWidget() [%p] mXWindow %p " + LOG("GtkCompositorWidget::GtkCompositorWidget() [%p] aWindow %p " "mIsRenderingSuspended %d\n", - (void*)mWidget.get(), (void*)mXWindow, !!mIsRenderingSuspended); + (void*)mWidget.get(), (void*)aWindow, !!mIsRenderingSuspended); } GtkCompositorWidget::~GtkCompositorWidget() { diff --git a/widget/gtk/MozContainer.cpp b/widget/gtk/MozContainer.cpp index 95832dc03d..0d6585c2d4 100644 --- a/widget/gtk/MozContainer.cpp +++ b/widget/gtk/MozContainer.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include "mozilla/WidgetUtilsGtk.h" diff --git a/widget/gtk/TaskbarProgress.cpp b/widget/gtk/TaskbarProgress.cpp index 2aad109eab..396f39b5e7 100644 --- a/widget/gtk/TaskbarProgress.cpp +++ b/widget/gtk/TaskbarProgress.cpp @@ -33,7 +33,6 @@ TaskbarProgress::~TaskbarProgress() { NS_IMETHODIMP TaskbarProgress::SetProgressState(nsTaskbarProgressState aState, uint64_t aCurrentValue, uint64_t aMaxValue) { -#ifdef MOZ_X11 NS_ENSURE_ARG_RANGE(aState, 0, STATE_PAUSED); if (aState == STATE_NO_PROGRESS || aState == STATE_INDETERMINATE) { @@ -72,7 +71,6 @@ TaskbarProgress::SetProgressState(nsTaskbarProgressState aState, ("GtkTaskbarProgress::SetProgressState progress: %lu", progress)); mPrimaryWindow->SetProgress(progress); -#endif return NS_OK; } diff --git a/widget/gtk/WindowSurfaceProvider.cpp b/widget/gtk/WindowSurfaceProvider.cpp index 403af8e445..94ba1be0ff 100644 --- a/widget/gtk/WindowSurfaceProvider.cpp +++ b/widget/gtk/WindowSurfaceProvider.cpp @@ -10,6 +10,7 @@ #include "mozilla/gfx/Logging.h" #include "mozilla/layers/LayersTypes.h" #include "nsWindow.h" +#include "WidgetUtilsGtk.h" #ifdef MOZ_WAYLAND # include "mozilla/StaticPrefs_widget.h" diff --git a/widget/gtk/components.conf b/widget/gtk/components.conf index 38c07bd812..8f2c10894a 100644 --- a/widget/gtk/components.conf +++ b/widget/gtk/components.conf @@ -76,53 +76,49 @@ Classes = [ 'headers': ['/widget/gtk/nsApplicationChooser.h'], 'processes': ProcessSelector.MAIN_PROCESS_ONLY, }, + { + 'name': 'GfxInfo', + 'cid': '{d755a760-9f27-11df-0800-200c9a664242}', + 'contract_ids': ['@mozilla.org/gfx/info;1'], + 'type': 'mozilla::widget::GfxInfo', + 'headers': ['/widget/gtk/GfxInfo.h'], + 'init_method': 'Init', + 'processes': ProcessSelector.ALLOW_IN_GPU_PROCESS, + }, + { + 'js_name': 'clipboard', + 'cid': '{8b5314ba-db01-11d2-96ce-0060b0fb9956}', + 'contract_ids': ['@mozilla.org/widget/clipboard;1'], + 'interfaces': ['nsIClipboard'], + 'type': 'nsIClipboard', + 'processes': ProcessSelector.MAIN_PROCESS_ONLY, + 'overridable': True, + }, + { + 'cid': '{77221d5a-1dd2-11b2-8c69-c710f15d2ed5}', + 'contract_ids': ['@mozilla.org/widget/clipboardhelper;1'], + 'type': 'nsClipboardHelper', + 'headers': ['/widget/nsClipboardHelper.h'], + }, + { + 'cid': '{8b5314bb-db01-11d2-96ce-0060b0fb9956}', + 'contract_ids': ['@mozilla.org/widget/dragservice;1'], + 'singleton': True, + 'type': 'nsDragService', + 'headers': ['/widget/gtk/nsDragService.h'], + 'constructor': 'nsDragService::GetInstance', + 'processes': ProcessSelector.MAIN_PROCESS_ONLY, + }, + { + 'cid': '{6987230e-0098-4e78-bc5f-1493ee7519fa}', + 'contract_ids': ['@mozilla.org/widget/useridleservice;1'], + 'singleton': True, + 'type': 'nsUserIdleService', + 'headers': ['/widget/gtk/nsUserIdleServiceGTK.h'], + 'constructor': 'nsUserIdleServiceGTK::GetInstance', + }, ] -if defined('MOZ_X11'): - Classes += [ - { - 'js_name': 'clipboard', - 'cid': '{8b5314ba-db01-11d2-96ce-0060b0fb9956}', - 'contract_ids': ['@mozilla.org/widget/clipboard;1'], - 'interfaces': ['nsIClipboard'], - 'type': 'nsIClipboard', - 'processes': ProcessSelector.MAIN_PROCESS_ONLY, - 'overridable': True, - }, - { - 'cid': '{77221d5a-1dd2-11b2-8c69-c710f15d2ed5}', - 'contract_ids': ['@mozilla.org/widget/clipboardhelper;1'], - 'type': 'nsClipboardHelper', - 'headers': ['/widget/nsClipboardHelper.h'], - }, - { - 'cid': '{8b5314bb-db01-11d2-96ce-0060b0fb9956}', - 'contract_ids': ['@mozilla.org/widget/dragservice;1'], - 'singleton': True, - 'type': 'nsDragService', - 'headers': ['/widget/gtk/nsDragService.h'], - 'constructor': 'nsDragService::GetInstance', - 'processes': ProcessSelector.MAIN_PROCESS_ONLY, - }, - { - 'name': 'GfxInfo', - 'cid': '{d755a760-9f27-11df-0800-200c9a664242}', - 'contract_ids': ['@mozilla.org/gfx/info;1'], - 'type': 'mozilla::widget::GfxInfo', - 'headers': ['/widget/gtk/GfxInfo.h'], - 'init_method': 'Init', - 'processes': ProcessSelector.ALLOW_IN_GPU_PROCESS, - }, - { - 'cid': '{6987230e-0098-4e78-bc5f-1493ee7519fa}', - 'contract_ids': ['@mozilla.org/widget/useridleservice;1'], - 'singleton': True, - 'type': 'nsUserIdleService', - 'headers': ['/widget/gtk/nsUserIdleServiceGTK.h'], - 'constructor': 'nsUserIdleServiceGTK::GetInstance', - }, - ] - if defined('NS_PRINTING'): Classes += [ { diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build index 4832cac..dfe7adb 100644 --- a/widget/gtk/moz.build +++ b/widget/gtk/moz.build @@ -38,16 +38,24 @@ EXPORTS.mozilla += [ ] EXPORTS.mozilla.widget += [ + "CompositorWidgetChild.h", + "CompositorWidgetParent.h", + "GtkCompositorWidget.h", + "InProcessGtkCompositorWidget.h", "WindowSurface.h", "WindowSurfaceProvider.h", ] UNIFIED_SOURCES += [ "AsyncGtkClipboardRequest.cpp", + "CompositorWidgetChild.cpp", + "CompositorWidgetParent.cpp", "GfxInfo.cpp", "gtk3drawing.cpp", "GtkCompositorWidget.cpp", "IMContextWrapper.cpp", + "InProcessGtkCompositorWidget.cpp", + "keysym2ucs.c", "MozContainer.cpp", "MPRISServiceHandler.cpp", "NativeKeyBindings.cpp", @@ -65,6 +73,7 @@ UNIFIED_SOURCES += [ "nsLookAndFeel.cpp", "nsSound.cpp", "nsToolkit.cpp", + "nsUserIdleServiceGTK.cpp", "nsWidgetFactory.cpp", "ScreenHelperGTK.cpp", "TaskbarProgress.cpp", @@ -115,22 +124,12 @@ if CONFIG["MOZ_WAYLAND"]: if CONFIG["MOZ_X11"]: UNIFIED_SOURCES += [ - "CompositorWidgetChild.cpp", - "CompositorWidgetParent.cpp", - "InProcessGtkCompositorWidget.cpp", "nsClipboardX11.cpp", "nsShmImage.cpp", - "nsUserIdleServiceGTK.cpp", "WindowSurfaceX11.cpp", "WindowSurfaceX11Image.cpp", "WindowSurfaceX11SHM.cpp", ] - EXPORTS.mozilla.widget += [ - "CompositorWidgetChild.h", - "CompositorWidgetParent.h", - "GtkCompositorWidget.h", - "InProcessGtkCompositorWidget.h", - ] if CONFIG["NS_PRINTING"]: UNIFIED_SOURCES += [ diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c index 677f9b3561..e375cab31f 100644 --- a/widget/gtk/mozgtk/mozgtk.c +++ b/widget/gtk/mozgtk/mozgtk.c @@ -6,16 +6,4 @@ #include "mozilla/Types.h" -#include -// Bug 1271100 -// We need to trick system Cairo into not using the XShm extension due to -// a race condition in it that results in frequent BadAccess errors. Cairo -// relies upon XShmQueryExtension to initially detect if XShm is available. -// So we define our own stub that always indicates XShm not being present. -// mozgtk loads before libXext/libcairo and so this stub will take priority. -// Our tree usage goes through xcb and remains unaffected by this. -// -// This is also used to force libxul to depend on the mozgtk library. If we -// ever can remove this workaround for system Cairo, we'll need something -// to replace it for that purpose. -MOZ_EXPORT Bool XShmQueryExtension(Display* aDisplay) { return False; } +MOZ_EXPORT void PleaseLinkWithMe() {} diff --git a/widget/gtk/mozwayland/mozwayland.c b/widget/gtk/mozwayland/mozwayland.c index 1a86468b4f..eee67ed3a9 100644 --- a/widget/gtk/mozwayland/mozwayland.c +++ b/widget/gtk/mozwayland/mozwayland.c @@ -8,7 +8,6 @@ #include #include "mozilla/Types.h" #include -#include #include union wl_argument; diff --git a/widget/gtk/nsClipboard.cpp b/widget/gtk/nsClipboard.cpp index 800fde7..f5e9ef7 100644 --- a/widget/gtk/nsClipboard.cpp +++ b/widget/gtk/nsClipboard.cpp @@ -9,7 +9,9 @@ #include "nsArrayUtils.h" #include "nsClipboard.h" -#include "nsClipboardX11.h" +#if defined(MOZ_X11) +# include "nsClipboardX11.h" +#endif #if defined(MOZ_WAYLAND) # include "nsClipboardWayland.h" #endif @@ -36,7 +38,6 @@ #include "imgIContainer.h" #include -#include #include "mozilla/Encoding.h" @@ -134,13 +135,17 @@ nsClipboard::~nsClipboard() { NS_IMPL_ISUPPORTS(nsClipboard, nsIClipboard, nsIObserver) nsresult nsClipboard::Init(void) { +#if defined(MOZ_X11) if (widget::GdkIsX11Display()) { mContext = new nsRetrievalContextX11(); + } +#endif #if defined(MOZ_WAYLAND) - } else if (widget::GdkIsWaylandDisplay()) { + if (widget::GdkIsWaylandDisplay()) { mContext = new nsRetrievalContextWayland(); + } #endif - } else { + if (!mContext) { NS_WARNING("Missing nsRetrievalContext for nsClipboard!"); return NS_OK; } diff --git a/widget/gtk/nsDragService.cpp b/widget/gtk/nsDragService.cpp index ea57c4f3c0..5355fbe467 100644 --- a/widget/gtk/nsDragService.cpp +++ b/widget/gtk/nsDragService.cpp @@ -23,7 +23,6 @@ #include "prthread.h" #include #include -#include #include "nsCRT.h" #include "mozilla/BasicEvents.h" #include "mozilla/Services.h" @@ -34,7 +33,6 @@ #include "mozilla/WidgetUtilsGtk.h" #include "GRefPtr.h" -#include "gfxXlibSurface.h" #include "gfxContext.h" #include "nsImageToPixbuf.h" #include "nsPresContext.h" diff --git a/widget/gtk/nsGtkKeyUtils.cpp b/widget/gtk/nsGtkKeyUtils.cpp index 5f971b721a..d948ae58bf 100644 --- a/widget/gtk/nsGtkKeyUtils.cpp +++ b/widget/gtk/nsGtkKeyUtils.cpp @@ -12,15 +12,16 @@ #include #include #include -#include +#ifdef MOZ_X11 +# include +# include +# include "X11UndefineNone.h" +#endif #include #include -#include -#include "X11UndefineNone.h" #include "IMContextWrapper.h" #include "WidgetUtils.h" #include "WidgetUtilsGtk.h" -#include "keysym2ucs.h" #include "nsContentUtils.h" #include "nsGtkUtils.h" #include "nsIBidiKeyboard.h" @@ -28,6 +29,7 @@ #include "nsReadableUtils.h" #include "nsServiceManagerUtils.h" #include "nsWindow.h" +#include "keysym2ucs.h" #include "mozilla/ArrayUtils.h" #include "mozilla/MouseEvents.h" @@ -55,7 +57,9 @@ namespace widget { KeymapWrapper* KeymapWrapper::sInstance = nullptr; guint KeymapWrapper::sLastRepeatableHardwareKeyCode = 0; +#ifdef MOZ_X11 Time KeymapWrapper::sLastRepeatableKeyTime = 0; +#endif KeymapWrapper::RepeatState KeymapWrapper::sRepeatState = KeymapWrapper::NOT_PRESSED; @@ -354,9 +358,11 @@ KeymapWrapper::KeymapWrapper() g_object_ref(mGdkKeymap); +#ifdef MOZ_X11 if (GdkIsX11Display()) { InitXKBExtension(); } +#endif Init(); } @@ -373,17 +379,18 @@ void KeymapWrapper::Init() { mModifierKeys.Clear(); memset(mModifierMasks, 0, sizeof(mModifierMasks)); +#ifdef MOZ_X11 if (GdkIsX11Display()) { InitBySystemSettingsX11(); } + gdk_window_add_filter(nullptr, FilterEvents, this); +#endif #ifdef MOZ_WAYLAND - else { + if (GdkIsWaylandDisplay()) { InitBySystemSettingsWayland(); } #endif - gdk_window_add_filter(nullptr, FilterEvents, this); - MOZ_LOG(gKeyLog, LogLevel::Info, ("%p Init, CapsLock=0x%X, NumLock=0x%X, " "ScrollLock=0x%X, Level3=0x%X, Level5=0x%X, " @@ -395,6 +402,7 @@ void KeymapWrapper::Init() { GetModifierMask(SUPER), GetModifierMask(HYPER))); } +#ifdef MOZ_X11 void KeymapWrapper::InitXKBExtension() { PodZero(&mKeyboardState); @@ -626,6 +634,7 @@ void KeymapWrapper::InitBySystemSettingsX11() { XFreeModifiermap(xmodmap); XFree(xkeymap); } +#endif #ifdef MOZ_WAYLAND void KeymapWrapper::SetModifierMask(xkb_keymap* aKeymap, @@ -789,7 +798,9 @@ void KeymapWrapper::InitBySystemSettingsWayland() { #endif KeymapWrapper::~KeymapWrapper() { +#ifdef MOZ_X11 gdk_window_remove_filter(nullptr, FilterEvents, this); +#endif if (mOnKeysChangedSignalHandle) { g_signal_handler_disconnect(mGdkKeymap, mOnKeysChangedSignalHandle); } @@ -800,6 +811,7 @@ KeymapWrapper::~KeymapWrapper() { MOZ_LOG(gKeyLog, LogLevel::Info, ("%p Destructor", this)); } +#ifdef MOZ_X11 /* static */ GdkFilterReturn KeymapWrapper::FilterEvents(GdkXEvent* aXEvent, GdkEvent* aGdkEvent, @@ -913,6 +925,7 @@ GdkFilterReturn KeymapWrapper::FilterEvents(GdkXEvent* aXEvent, return GDK_FILTER_CONTINUE; } +#endif static void ResetBidiKeyboard() { // Reset the bidi keyboard settings for the new GdkKeymap @@ -1773,6 +1786,7 @@ void KeymapWrapper::InitKeyEvent(WidgetKeyboardEvent& aKeyEvent, // state. It means if there're some pending modifier key press or // key release events, the result isn't what we want. guint modifierState = aGdkKeyEvent->state; +#ifdef MOZ_X11 GdkDisplay* gdkDisplay = gdk_display_get_default(); if (aGdkKeyEvent->is_modifier && GdkIsX11Display(gdkDisplay)) { Display* display = gdk_x11_display_get_xdisplay(gdkDisplay); @@ -1790,6 +1804,7 @@ void KeymapWrapper::InitKeyEvent(WidgetKeyboardEvent& aKeyEvent, } } } +#endif InitInputEvent(aKeyEvent, modifierState); switch (aGdkKeyEvent->keyval) { @@ -2036,6 +2051,7 @@ bool KeymapWrapper::IsLatinGroup(guint8 aGroup) { return result; } +#ifdef MOZ_X11 bool KeymapWrapper::IsAutoRepeatableKey(guint aHardwareKeyCode) { uint8_t indexOfArray = aHardwareKeyCode / 8; MOZ_ASSERT(indexOfArray < ArrayLength(mKeyboardState.auto_repeats), @@ -2043,6 +2059,7 @@ bool KeymapWrapper::IsAutoRepeatableKey(guint aHardwareKeyCode) { char bitMask = 1 << (aHardwareKeyCode % 8); return (mKeyboardState.auto_repeats[indexOfArray] & bitMask) != 0; } +#endif /* static */ bool KeymapWrapper::IsBasicLatinLetterOrNumeral(uint32_t aCharCode) { diff --git a/widget/gtk/nsGtkKeyUtils.h b/widget/gtk/nsGtkKeyUtils.h index 18188c9b00..59a61752bb 100644 --- a/widget/gtk/nsGtkKeyUtils.h +++ b/widget/gtk/nsGtkKeyUtils.h @@ -12,8 +12,10 @@ #include "nsIWidget.h" #include "nsTArray.h" -#include -#include +#ifdef MOZ_X11 +# include +# include +#endif #ifdef MOZ_WAYLAND # include # include @@ -248,8 +250,10 @@ class KeymapWrapper { * Initializing methods. */ void Init(); +#ifdef MOZ_X11 void InitXKBExtension(); void InitBySystemSettingsX11(); +#endif #ifdef MOZ_WAYLAND void InitBySystemSettingsWayland(); #endif @@ -325,6 +329,7 @@ class KeymapWrapper { */ int mXKBBaseEventCode; +#ifdef MOZ_X11 /** * Only auto_repeats[] stores valid value. If you need to use other * members, you need to listen notification events for them. @@ -332,6 +337,7 @@ class KeymapWrapper { * InitXKBExtension(). */ XKeyboardState mKeyboardState; +#endif /** * Pointer of the singleton instance. @@ -342,15 +348,19 @@ class KeymapWrapper { * Auto key repeat management. */ static guint sLastRepeatableHardwareKeyCode; +#ifdef MOZ_X11 static Time sLastRepeatableKeyTime; +#endif enum RepeatState { NOT_PRESSED, FIRST_PRESS, REPEATING }; static RepeatState sRepeatState; +#ifdef MOZ_X11 /** * IsAutoRepeatableKey() returns true if the key supports auto repeat. * Otherwise, false. */ bool IsAutoRepeatableKey(guint aHardwareKeyCode); +#endif /** * Signal handlers. diff --git a/widget/gtk/nsPrintDialogGTK.cpp b/widget/gtk/nsPrintDialogGTK.cpp index 8fb56543b7..9a562eb124 100644 --- a/widget/gtk/nsPrintDialogGTK.cpp +++ b/widget/gtk/nsPrintDialogGTK.cpp @@ -5,6 +5,9 @@ #include #include +#ifdef MOZ_X11 +# include +#endif #include #include "mozilla/ArrayUtils.h" @@ -27,8 +30,6 @@ #include "WidgetUtilsGtk.h" #include "nsIObserverService.h" -// for gdk_x11_window_get_xid -#include #include #include #include diff --git a/widget/gtk/nsUserIdleServiceGTK.cpp b/widget/gtk/nsUserIdleServiceGTK.cpp index 884d52a6ca..4b2b04f09a 100644 --- a/widget/gtk/nsUserIdleServiceGTK.cpp +++ b/widget/gtk/nsUserIdleServiceGTK.cpp @@ -17,6 +17,8 @@ using mozilla::LogLevel; static mozilla::LazyLogModule sIdleLog("nsIUserIdleService"); +#ifdef MOZ_X11 + typedef bool (*_XScreenSaverQueryExtension_fn)(Display* dpy, int* event_base, int* error_base); @@ -25,16 +27,20 @@ typedef XScreenSaverInfo* (*_XScreenSaverAllocInfo_fn)(void); typedef void (*_XScreenSaverQueryInfo_fn)(Display* dpy, Drawable drw, XScreenSaverInfo* info); -static bool sInitialized = false; static _XScreenSaverQueryExtension_fn _XSSQueryExtension = nullptr; static _XScreenSaverAllocInfo_fn _XSSAllocInfo = nullptr; static _XScreenSaverQueryInfo_fn _XSSQueryInfo = nullptr; +#endif + +static bool sInitialized = false; + static void Initialize() { if (!mozilla::widget::GdkIsX11Display()) { return; } +#ifdef MOZ_X11 // This will leak - See comments in ~nsUserIdleServiceGTK(). PRLibrary* xsslib = PR_LoadLibrary("libXss.so.1"); if (!xsslib) // ouch. @@ -59,14 +65,15 @@ static void Initialize() { MOZ_LOG(sIdleLog, LogLevel::Warning, ("Failed to get XSSQueryInfo!\n")); sInitialized = true; +#endif } -nsUserIdleServiceGTK::nsUserIdleServiceGTK() : mXssInfo(nullptr) { - Initialize(); -} +nsUserIdleServiceGTK::nsUserIdleServiceGTK() { Initialize(); } nsUserIdleServiceGTK::~nsUserIdleServiceGTK() { +#ifdef MOZ_X11 if (mXssInfo) XFree(mXssInfo); +#endif // It is not safe to unload libXScrnSaver until each display is closed because // the library registers callbacks through XESetCloseDisplay (Bug 397607). @@ -84,6 +91,7 @@ bool nsUserIdleServiceGTK::PollIdleTime(uint32_t* aIdleTime) { // For some reason, we could not find xscreensaver. return false; } +#ifdef MOZ_X11 // Ask xscreensaver about idle time: *aIdleTime = 0; @@ -109,6 +117,7 @@ bool nsUserIdleServiceGTK::PollIdleTime(uint32_t* aIdleTime) { } // If we get here, we couldn't get to XScreenSaver: MOZ_LOG(sIdleLog, LogLevel::Warning, ("XSSQueryExtension returned false!\n")); +#endif return false; } diff --git a/widget/gtk/nsUserIdleServiceGTK.h b/widget/gtk/nsUserIdleServiceGTK.h index 9b9ba31846..f089f3b87d 100644 --- a/widget/gtk/nsUserIdleServiceGTK.h +++ b/widget/gtk/nsUserIdleServiceGTK.h @@ -9,9 +9,11 @@ #define nsUserIdleServiceGTK_h__ #include "nsUserIdleService.h" -#include -#include -#include + +#ifdef MOZ_X11 +# include +# include +# include typedef struct { Window window; // Screen saver window @@ -21,6 +23,7 @@ typedef struct { unsigned long idle; // milliseconds idle unsigned long event_mask; // event stuff } XScreenSaverInfo; +#endif class nsUserIdleServiceGTK : public nsUserIdleService { public: @@ -40,7 +43,9 @@ class nsUserIdleServiceGTK : public nsUserIdleService { private: ~nsUserIdleServiceGTK(); - XScreenSaverInfo* mXssInfo; +#ifdef MOZ_X11 + XScreenSaverInfo* mXssInfo = nullptr; +#endif protected: nsUserIdleServiceGTK(); diff --git a/widget/gtk/nsWidgetFactory.cpp b/widget/gtk/nsWidgetFactory.cpp index d649c7e0bf..70b47d5124 100644 --- a/widget/gtk/nsWidgetFactory.cpp +++ b/widget/gtk/nsWidgetFactory.cpp @@ -20,9 +20,7 @@ #include "nsHTMLFormatConverter.h" #include "HeadlessClipboard.h" #include "IMContextWrapper.h" -#ifdef MOZ_X11 -# include "nsClipboard.h" -#endif +#include "nsClipboard.h" #include "TaskbarProgress.h" #include "nsFilePicker.h" #include "nsSound.h" @@ -36,7 +34,6 @@ using namespace mozilla; using namespace mozilla::widget; -#ifdef MOZ_X11 NS_IMPL_COMPONENT_FACTORY(nsIClipboard) { nsCOMPtr inst; if (gfxPlatform::IsHeadless()) { @@ -51,7 +48,6 @@ NS_IMPL_COMPONENT_FACTORY(nsIClipboard) { return inst.forget().downcast(); } -#endif nsresult nsWidgetGtk2ModuleCtor() { return nsAppShellInit(); } diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp index 59e01f0fea..12bdda1cd4 100644 --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -58,7 +58,6 @@ #include "mozilla/UniquePtrExtensions.h" #include "mozilla/WidgetUtils.h" #include "mozilla/WritingModes.h" -#include "mozilla/X11Util.h" #include "mozilla/XREAppData.h" #include "NativeKeyBindings.h" #include "nsAppDirectoryServiceDefs.h" @@ -90,7 +89,6 @@ #include "ScreenHelperGTK.h" #include "SystemTimeConverter.h" #include "WidgetUtilsGtk.h" -#include "mozilla/X11Util.h" #ifdef ACCESSIBILITY # include "mozilla/a11y/LocalAccessible.h" @@ -108,6 +106,9 @@ # include "GLContextEGL.h" // for GLContextEGL::FindVisual() # include "WindowSurfaceX11Image.h" # include "WindowSurfaceX11SHM.h" +# include "mozilla/X11Util.h" +using mozilla::gl::GLContextEGL; +using mozilla::gl::GLContextGLX; #endif #ifdef MOZ_WAYLAND # include "nsIClipboard.h" @@ -118,8 +119,6 @@ using namespace mozilla; using namespace mozilla::gfx; using namespace mozilla::layers; using namespace mozilla::widget; -using mozilla::gl::GLContextEGL; -using mozilla::gl::GLContextGLX; // Don't put more than this many rects in the dirty region, just fluff // out to the bounding-box if there are more @@ -267,15 +266,18 @@ static nsresult initialize_prefs(void); static guint32 sLastUserInputTime = GDK_CURRENT_TIME; static guint32 sRetryGrabTime; +#ifdef MOZ_X11 static SystemTimeConverter& TimeConverter() { static SystemTimeConverter sTimeConverterSingleton; return sTimeConverterSingleton; } +#endif bool nsWindow::sTransparentMainWindow = false; namespace mozilla { +#ifdef MOZ_X11 class CurrentX11TimeGetter { public: explicit CurrentX11TimeGetter(GdkWindow* aWindow) @@ -323,6 +325,7 @@ class CurrentX11TimeGetter { GdkWindow* mWindow; TimeStamp mAsyncUpdateStart; }; +#endif } // namespace mozilla @@ -2510,6 +2513,7 @@ void nsWindow::SetSizeMode(nsSizeMode aMode) { mSizeState = mSizeMode; } +#ifdef MOZ_X11 static bool GetWindowManagerName(GdkWindow* gdk_window, nsACString& wmName) { if (!GdkIsX11Display()) { return false; @@ -2579,10 +2583,12 @@ static bool GetWindowManagerName(GdkWindow* gdk_window, nsACString& wmName) { wmName = reinterpret_cast(prop_return); return true; } +#endif #define kDesktopMutterSchema "org.gnome.mutter" #define kDesktopDynamicWorkspacesKey "dynamic-workspaces" +#ifdef MOZ_X11 static bool WorkspaceManagementDisabled(GdkWindow* gdk_window) { if (Preferences::GetBool("widget.disable-workspace-management", false)) { return true; @@ -2627,8 +2633,10 @@ static bool WorkspaceManagementDisabled(GdkWindow* gdk_window) { return false; } +#endif void nsWindow::GetWorkspaceID(nsAString& workspaceID) { +#ifdef MOZ_X11 workspaceID.Truncate(); if (!GdkIsX11Display() || !mShell) { @@ -2669,9 +2677,11 @@ void nsWindow::GetWorkspaceID(nsAString& workspaceID) { LOG(" got workspace ID %d", (int32_t)wm_desktop[0]); workspaceID.AppendInt((int32_t)wm_desktop[0]); g_free(wm_desktop); +#endif } void nsWindow::MoveToWorkspace(const nsAString& workspaceIDStr) { +#ifdef MOZ_X11 nsresult rv = NS_OK; int32_t workspaceID = workspaceIDStr.ToInteger(&rv); @@ -2716,6 +2726,7 @@ void nsWindow::MoveToWorkspace(const nsAString& workspaceIDStr) { XFlush(xdisplay); LOG(" moved to workspace"); +#endif } using SetUserTimeFunc = void (*)(GdkWindow*, guint32); @@ -2755,10 +2766,7 @@ guint32 nsWindow::GetLastUserInputTime() { // WM_DELETE_WINDOW delete events, but not usually mouse motion nor // button and key releases. Therefore use the most recent of // gdk_x11_display_get_user_time and the last time that we have seen. - GdkDisplay* gdkDisplay = gdk_display_get_default(); - guint32 timestamp = GdkIsX11Display(gdkDisplay) - ? gdk_x11_display_get_user_time(gdkDisplay) - : gtk_get_current_event_time(); + guint32 timestamp = gtk_get_current_event_time(); if (sLastUserInputTime != GDK_CURRENT_TIME && TimestampIsNewerThan(sLastUserInputTime, timestamp)) { @@ -3013,6 +3021,7 @@ void nsWindow::UpdateClientOffsetFromFrameExtents() { return; } +#ifdef MOZ_X11 GdkAtom cardinal_atom = gdk_x11_xatom_to_atom(XA_CARDINAL); GdkAtom type_returned; @@ -3038,6 +3047,7 @@ void nsWindow::UpdateClientOffsetFromFrameExtents() { mClientOffset = nsIntPoint(left, top); } +#endif // Send a WindowMoved notification. This ensures that BrowserParent // picks up the new client offset and sends it to the child process @@ -3063,9 +3073,11 @@ gboolean nsWindow::OnPropertyNotifyEvent(GtkWidget* aWidget, if (!mGdkWindow) { return FALSE; } +#ifdef MOZ_X11 if (GetCurrentTimeGetter()->PropertyNotifyHandler(aWidget, aEvent)) { return TRUE; } +#endif return FALSE; } @@ -3203,9 +3215,11 @@ void* nsWindow::GetNativeData(uint32_t aDataType) { return GetToplevelWidget(); case NS_NATIVE_WINDOW_WEBRTC_DEVICE_ID: +#ifdef MOZ_X11 if (GdkIsX11Display()) { return (void*)GDK_WINDOW_XID(gdk_window_get_toplevel(mGdkWindow)); } +#endif NS_WARNING( "nsWindow::GetNativeData(): NS_NATIVE_WINDOW_WEBRTC_DEVICE_ID is not " "handled on Wayland!"); @@ -3226,11 +3240,13 @@ void* nsWindow::GetNativeData(uint32_t aDataType) { return nullptr; case NS_NATIVE_EGL_WINDOW: { void* eglWindow = nullptr; +#ifdef MOZ_X11 if (GdkIsX11Display()) { eglWindow = mGdkWindow ? (void*)GDK_WINDOW_XID(mGdkWindow) : nullptr; } +#endif #ifdef MOZ_WAYLAND - else { + if (GdkIsWaylandDisplay()) { eglWindow = moz_container_wayland_get_egl_window( mContainer, FractionalScaleFactor()); } @@ -3520,8 +3536,6 @@ gboolean nsWindow::OnExposeEvent(cairo_t* cr) { nsIWidgetListener* listener = GetListener(); if (!listener) return FALSE; - LOG("received expose event %p 0x%lx (rects follow):\n", mGdkWindow, - GdkIsX11Display() ? gdk_x11_window_get_xid(mGdkWindow) : 0); LayoutDeviceIntRegion exposeRegion; if (!ExtractExposeRegion(exposeRegion, cr)) { return FALSE; @@ -4068,6 +4082,7 @@ void nsWindow::OnMotionNotifyEvent(GdkEventMotion* aEvent) { MOZ_ASSERT(gdk_window, "gdk_window_get_toplevel should not return null"); bool canDrag = true; +#ifdef MOZ_X11 if (GdkIsX11Display()) { // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=789054 // To avoid crashes disable double-click on WM without _NET_WM_MOVERESIZE. @@ -4078,6 +4093,7 @@ void nsWindow::OnMotionNotifyEvent(GdkEventMotion* aEvent) { canDrag = false; } } +#endif if (canDrag) { gdk_window_begin_move_drag(gdk_window, 1, aEvent->x_root, aEvent->y_root, @@ -4519,6 +4535,7 @@ TimeStamp nsWindow::GetEventTimeStamp(guint32 aEventTime) { TimeStamp eventTimeStamp; +#ifdef MOZ_WAYLAND if (GdkIsWaylandDisplay()) { // Wayland compositors use monotonic time to set timestamps. int64_t timestampTime = g_get_monotonic_time() / 1000; @@ -4528,16 +4545,21 @@ TimeStamp nsWindow::GetEventTimeStamp(guint32 aEventTime) { int64_t tick = BaseTimeDurationPlatformUtils::TicksFromMilliseconds(timestampTime); eventTimeStamp = TimeStamp::FromSystemTime(tick); - } else { + } +#endif +#ifdef MOZ_X11 + if (GdkIsX11Display()) { CurrentX11TimeGetter* getCurrentTime = GetCurrentTimeGetter(); MOZ_ASSERT(getCurrentTime, "Null current time getter despite having a window"); eventTimeStamp = TimeConverter().GetTimeStampFromSystemTime(aEventTime, *getCurrentTime); } +#endif return eventTimeStamp; } +#ifdef MOZ_X11 mozilla::CurrentX11TimeGetter* nsWindow::GetCurrentTimeGetter() { MOZ_ASSERT(mGdkWindow, "Expected mGdkWindow to be set"); if (MOZ_UNLIKELY(!mCurrentTimeGetter)) { @@ -4545,6 +4567,7 @@ mozilla::CurrentX11TimeGetter* nsWindow::GetCurrentTimeGetter() { } return mCurrentTimeGetter.get(); } +#endif gboolean nsWindow::OnKeyPressEvent(GdkEventKey* aEvent) { LOG("OnKeyPressEvent"); @@ -5210,8 +5233,8 @@ void nsWindow::EnableRenderingToWindow() { GetShapedState()); } - if (GdkIsWaylandDisplay()) { #ifdef MOZ_WAYLAND + if (GdkIsWaylandDisplay()) { moz_container_wayland_add_initial_draw_callback( mContainer, [self = RefPtr{this}, this]() -> void { LOG("moz_container_wayland initial create " @@ -5219,11 +5242,15 @@ void nsWindow::EnableRenderingToWindow() { self->ResumeCompositorHiddenWindow(); self->WaylandStartVsync(); }); + } #endif - } else { + +#ifdef MOZ_X11 + if (GdkIsX11Display()) { ResumeCompositorHiddenWindow(); WaylandStartVsync(); } +#endif } void nsWindow::DisableRenderingToWindow() { @@ -5236,9 +5263,12 @@ void nsWindow::DisableRenderingToWindow() { } } -Window nsWindow::GetX11Window() { - return GdkIsX11Display() && mGdkWindow ? gdk_x11_window_get_xid(mGdkWindow) - : X11None; +uintptr_t nsWindow::GetX11Window() { +#ifdef MOZ_X11 + return (uintptr_t)(GdkIsX11Display() && mGdkWindow ? gdk_x11_window_get_xid(mGdkWindow) : X11None); +#else + return (uintptr_t) nullptr; +#endif } void nsWindow::EnsureGdkWindow() { @@ -5324,9 +5354,6 @@ void nsWindow::ConfigureGdkWindow() { if (mHasMappedToplevel) { EnsureGrabs(); } - - LOG(" finished, new GdkWindow %p XID 0x%lx\n", mGdkWindow, - GdkIsX11Display() ? gdk_x11_window_get_xid(mGdkWindow) : 0); } void nsWindow::ReleaseGdkWindow() { @@ -5343,11 +5370,18 @@ void nsWindow::ReleaseGdkWindow() { mSurfaceProvider.CleanupResources(); } +extern "C" { +// Make sure mozgtk gets linked +MOZ_EXPORT void PleaseLinkWithMe(); +} + nsresult nsWindow::Create(nsIWidget* aParent, nsNativeWidget aNativeParent, const LayoutDeviceIntRect& aRect, nsWidgetInitData* aInitData) { LOG("nsWindow::Create\n"); + PleaseLinkWithMe(); + // only set the base parent if we're going to be a dialog or a // toplevel nsIWidget* baseParent = @@ -5865,10 +5899,6 @@ nsresult nsWindow::Create(nsIWidget* aParent, nsNativeWidget aNativeParent, nullptr); LOG(" nsWindow type %d %s\n", mWindowType, mIsPIPWindow ? "PIP window" : ""); - LOG(" mShell %p mContainer %p mGdkWindow %p XID 0x%lx\n", mShell, mContainer, - mGdkWindow, - (GdkIsX11Display() && mGdkWindow) ? gdk_x11_window_get_xid(mGdkWindow) - : 0); // Set default application name when it's empty. if (mGtkWindowAppName.IsEmpty()) { @@ -6720,6 +6750,7 @@ void nsWindow::UpdateTitlebarTransparencyBitmap() { cairo_surface_destroy(surface); } +#ifdef MOZ_X11 if (!mNeedsShow) { Display* xDisplay = GDK_WINDOW_XDISPLAY(mGdkWindow); Window xDrawable = GDK_WINDOW_XID(mGdkWindow); @@ -6740,6 +6771,7 @@ void nsWindow::UpdateTitlebarTransparencyBitmap() { XFreePixmap(xDisplay, maskPixmap); } +#endif } void nsWindow::GrabPointer(guint32 aTime) { @@ -7013,7 +7045,7 @@ static bool IsFullscreenSupported(GtkWidget* aShell) { GdkScreen* screen = gtk_widget_get_screen(aShell); GdkAtom atom = gdk_atom_intern("_NET_WM_STATE_FULLSCREEN", FALSE); return gdk_x11_screen_supports_net_wm_hint(screen, atom); -#elif +#else return true; #endif } @@ -8297,6 +8329,7 @@ bool nsWindow::GetDragInfo(WidgetMouseEvent* aMouseEvent, GdkWindow** aWindow, return false; } +#ifdef MOZ_X11 if (GdkIsX11Display()) { // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=789054 // To avoid crashes disable double-click on WM without _NET_WM_MOVERESIZE. @@ -8312,6 +8345,7 @@ bool nsWindow::GetDragInfo(WidgetMouseEvent* aMouseEvent, GdkWindow** aWindow, } } } +#endif // FIXME: It would be nice to have the widget position at the time // of the event, but it's relatively unlikely that the widget has diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h index 48cfd89..669060f 100644 --- a/widget/gtk/nsWindow.h +++ b/widget/gtk/nsWindow.h @@ -89,7 +89,9 @@ namespace mozilla { enum class NativeKeyBindingsType : uint8_t; class TimeStamp; +#ifdef MOZ_X11 class CurrentX11TimeGetter; +#endif } // namespace mozilla class nsWindow final : public nsBaseWidget { @@ -267,7 +269,9 @@ class nsWindow final : public nsBaseWidget { WidgetEventTime GetWidgetEventTime(guint32 aEventTime); mozilla::TimeStamp GetEventTimeStamp(guint32 aEventTime); +#ifdef MOZ_X11 mozilla::CurrentX11TimeGetter* GetCurrentTimeGetter(); +#endif void SetInputContext(const InputContext& aContext, const InputContextAction& aAction) override; @@ -465,7 +469,7 @@ class nsWindow final : public nsBaseWidget { void DestroyChildWindows(); GtkWidget* GetToplevelWidget(); nsWindow* GetContainerWindow(); - Window GetX11Window(); + uintptr_t GetX11Window(); bool GetShapedState(); void EnsureGdkWindow(); void SetUrgencyHint(GtkWidget* top_window, bool state); @@ -819,7 +823,9 @@ class nsWindow final : public nsBaseWidget { */ RefPtr mIMContext; +#ifdef MOZ_X11 mozilla::UniquePtr mCurrentTimeGetter; +#endif static GtkWindowDecoration sGtkWindowDecoration; static bool sTransparentMainWindow; diff --git a/widget/moz.build b/widget/moz.build index 9cef92614b..8ad6c12c26 100644 --- a/widget/moz.build +++ b/widget/moz.build @@ -271,9 +271,6 @@ if CONFIG["MOZ_INSTRUMENT_EVENT_LOOP"]: EXPORTS.ipc = ["nsGUIEventIPC.h"] -if CONFIG["MOZ_X11"]: - DIRS += ["x11"] - if toolkit in ("cocoa", "windows"): UNIFIED_SOURCES += [ "nsBaseClipboard.cpp", @@ -318,7 +315,7 @@ if toolkit == "windows": "windows/PCompositorWidget.ipdl", "windows/PlatformWidgetTypes.ipdlh", ] -elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk" and CONFIG["MOZ_X11"]: +elif CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": IPDL_SOURCES = [ "gtk/PCompositorWidget.ipdl", "gtk/PlatformWidgetTypes.ipdlh", diff --git a/widget/x11/moz.build b/widget/x11/moz.build deleted file mode 100644 index 81d345c0af..0000000000 --- a/widget/x11/moz.build +++ /dev/null @@ -1,16 +0,0 @@ -# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- -# vim: set filetype=python: -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -with Files("**"): - BUG_COMPONENT = ("Core", "Widget: Gtk") - -SOURCES += [ - "keysym2ucs.c", -] - -FINAL_LIBRARY = "xul" - -CFLAGS += CONFIG["MOZ_X11_CFLAGS"]