forked from mirrors/gecko-dev
		
	 4920407bb3
			
		
	
	
		4920407bb3
		
	
	
	
	
		
			
			Using `dlsym` for `gdk_wayland_display_get_type` is a cleaner solution to bug 1696319, allowing running with a GTK that lacks the Wayland backend. Also adds a symmetric implementation for `gdk_x11_display_get_type`, which should help running without X11. Differential Revision: https://phabricator.services.mozilla.com/D107406
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* 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/. */
 | |
| 
 | |
| #include "WidgetUtilsGtk.h"
 | |
| #include "nsWindow.h"
 | |
| #include <gtk/gtk.h>
 | |
| #include <dlfcn.h>
 | |
| 
 | |
| namespace mozilla {
 | |
| 
 | |
| namespace widget {
 | |
| 
 | |
| int32_t WidgetUtilsGTK::IsTouchDeviceSupportPresent() {
 | |
|   int32_t result = 0;
 | |
|   GdkDisplay* display = gdk_display_get_default();
 | |
|   if (!display) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   GdkDeviceManager* manager = gdk_display_get_device_manager(display);
 | |
|   if (!manager) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   GList* devices =
 | |
|       gdk_device_manager_list_devices(manager, GDK_DEVICE_TYPE_SLAVE);
 | |
|   GList* list = devices;
 | |
| 
 | |
|   while (devices) {
 | |
|     GdkDevice* device = static_cast<GdkDevice*>(devices->data);
 | |
|     if (gdk_device_get_source(device) == GDK_SOURCE_TOUCHSCREEN) {
 | |
|       result = 1;
 | |
|       break;
 | |
|     }
 | |
|     devices = devices->next;
 | |
|   }
 | |
| 
 | |
|   if (list) {
 | |
|     g_list_free(list);
 | |
|   }
 | |
| 
 | |
|   return result;
 | |
| }
 | |
| 
 | |
| bool IsMainWindowTransparent() {
 | |
|   return nsWindow::IsToplevelWindowTransparent();
 | |
| }
 | |
| 
 | |
| // We avoid linking gdk_*_display_get_type directly in order to avoid a runtime
 | |
| // dependency on GTK built with both backends. Other X11- and Wayland-specific
 | |
| // functions get stubbed out by libmozgtk and crash when called, but those
 | |
| // should only be called when the matching backend is already in use.
 | |
| 
 | |
| bool GdkIsWaylandDisplay(GdkDisplay* display) {
 | |
|   static auto sGdkWaylandDisplayGetType =
 | |
|       (GType(*)())dlsym(RTLD_DEFAULT, "gdk_wayland_display_get_type");
 | |
|   return sGdkWaylandDisplayGetType &&
 | |
|          G_TYPE_CHECK_INSTANCE_TYPE(display, sGdkWaylandDisplayGetType());
 | |
| }
 | |
| 
 | |
| bool GdkIsX11Display(GdkDisplay* display) {
 | |
|   static auto sGdkX11DisplayGetType =
 | |
|       (GType(*)())dlsym(RTLD_DEFAULT, "gdk_x11_display_get_type");
 | |
|   return sGdkX11DisplayGetType &&
 | |
|          G_TYPE_CHECK_INSTANCE_TYPE(display, sGdkX11DisplayGetType());
 | |
| }
 | |
| 
 | |
| bool GdkIsWaylandDisplay() {
 | |
|   return GdkIsWaylandDisplay(gdk_display_get_default());
 | |
| }
 | |
| 
 | |
| bool GdkIsX11Display() { return GdkIsX11Display(gdk_display_get_default()); }
 | |
| 
 | |
| }  // namespace widget
 | |
| 
 | |
| }  // namespace mozilla
 |