/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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"ScreenHelperGTK.h"
#ifdef MOZ_X11 # include <gdk/gdkx.h> # include <X11/Xlib.h> # include "X11UndefineNone.h" #endif/* MOZ_X11 */ #ifdef MOZ_WAYLAND # include <gdk/gdkwayland.h> #endif/* MOZ_WAYLAND */ #include <dlfcn.h> #include <gtk/gtk.h>
GdkWindow* gdkWindow = aWindow->GetToplevelGdkWindow(); if (!gdkWindow) {
LOG_SCREEN(" failed, can't get GdkWindow"); return nullptr;
}
GdkDisplay* display = gdk_display_get_default();
GdkMonitor* monitor = s_gdk_display_get_monitor_at_window(display, gdkWindow); if (!monitor) {
LOG_SCREEN(" failed, can't get monitor for GdkWindow"); return nullptr;
}
int index = -1; while (GdkMonitor* m = GdkDisplayGetMonitor(display, ++index)) { if (m == monitor) { return ScreenManager::GetSingleton().CurrentScreenList().SafeElementAt(
index);
}
}
// gdk_screen_get_monitor_geometry / workarea returns application pixels // (desktop pixels), so we need to convert it to device pixels with // gdkScaleFactor.
gint geometryScaleFactor = gdkScaleFactor;
if (!s_gdk_monitor_get_refresh_rate) { return 0;
}
GdkMonitor* monitor =
GdkDisplayGetMonitor(gdk_display_get_default(), aMonitorNum); if (!monitor) { return 0;
} // Convert to Hz. return NSToIntRound(s_gdk_monitor_get_refresh_rate(monitor) / 1000.0f);
}();
GdkRectangle workarea;
gdk_screen_get_monitor_workarea(aScreen, aMonitorNum, &workarea);
LayoutDeviceIntRect availRect(workarea.x * geometryScaleFactor,
workarea.y * geometryScaleFactor,
workarea.width * geometryScaleFactor,
workarea.height * geometryScaleFactor);
LayoutDeviceIntRect rect;
DesktopToLayoutDeviceScale contentsScale(1.0); if (GdkIsX11Display()) {
GdkRectangle monitor;
gdk_screen_get_monitor_geometry(aScreen, aMonitorNum, &monitor);
rect = LayoutDeviceIntRect(monitor.x * geometryScaleFactor,
monitor.y * geometryScaleFactor,
monitor.width * geometryScaleFactor,
monitor.height * geometryScaleFactor);
} else { // Don't report screen shift in Wayland, see bug 1795066.
availRect.MoveTo(0, 0); // We use Gtk workarea on Wayland as it matches our needs (Bug 1732682).
rect = availRect; // Use per-monitor scaling factor in Wayland.
contentsScale.scale = gdkScaleFactor;
}
uint32_t pixelDepth = GetGTKPixelDepth(); if (pixelDepth == 32) { // If a device uses 32 bits per pixel, it's still only using 8 bits // per color component, which is what our callers want to know. // (Some devices report 32 and some devices report 24.)
pixelDepth = 24;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.