[mutter] backends/native: Calculate the output scale in here
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] backends/native: Calculate the output scale in here
- Date: Thu, 26 Feb 2015 08:14:11 +0000 (UTC)
commit 78d85256994edc99ed1880ea209586994de52b61
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Sun Feb 22 11:21:37 2015 -0800
backends/native: Calculate the output scale in here
It makes more sense as a backend thing, not a frontend thing.
src/backends/native/meta-monitor-manager-kms.c | 69 ++++++++++++++++++++++++
src/wayland/meta-wayland-outputs.c | 65 ----------------------
2 files changed, 69 insertions(+), 65 deletions(-)
---
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 9efba75..29c8e24 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -72,6 +72,8 @@ struct _MetaMonitorManagerKms
drmModeEncoder *current_encoder;
GUdevClient *udev;
+
+ GSettings *desktop_settings;
};
struct _MetaMonitorManagerKmsClass
@@ -269,6 +271,68 @@ find_output_by_id (MetaOutput *outputs,
return NULL;
}
+/* The minimum resolution at which we turn on a window-scale of 2 */
+#define HIDPI_LIMIT 192
+
+/* The minimum screen height at which we turn on a window-scale of 2;
+ * below this there just isn't enough vertical real estate for GNOME
+ * apps to work, and it's better to just be tiny */
+#define HIDPI_MIN_HEIGHT 1200
+
+/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
+#define SMALLEST_4K_WIDTH 3656
+
+/* Based on code from gnome-settings-daemon */
+static int
+compute_scale (MetaOutput *output)
+{
+ int scale = 1;
+
+ /* Scaling makes no sense */
+ if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
+ goto out;
+
+ /* 4K TV */
+ if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
+ output->crtc->rect.width >= SMALLEST_4K_WIDTH)
+ goto out;
+
+ /* Somebody encoded the aspect ratio (16/9 or 16/10)
+ * instead of the physical size */
+ if ((output->width_mm == 160 && output->height_mm == 90) ||
+ (output->width_mm == 160 && output->height_mm == 100) ||
+ (output->width_mm == 16 && output->height_mm == 9) ||
+ (output->width_mm == 16 && output->height_mm == 10))
+ goto out;
+
+ if (output->width_mm > 0 && output->height_mm > 0)
+ {
+ double dpi_x, dpi_y;
+ dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
+ dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
+ /* We don't completely trust these values so both
+ must be high, and never pick higher ratio than
+ 2 automatically */
+ if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
+ scale = 2;
+ }
+
+out:
+ return scale;
+}
+
+static int
+get_output_scale (MetaMonitorManager *manager,
+ MetaOutput *output)
+{
+ MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
+ int scale = g_settings_get_uint (manager_kms->desktop_settings, "scaling-factor");
+ if (scale > 0)
+ return scale;
+ else
+ return compute_scale (output);
+}
+
static void
meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
{
@@ -518,6 +582,8 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
/* MetaConnectorType matches DRM's connector types */
meta_output->connector_type = (MetaConnectorType) connector->connector_type;
+ meta_output->scale = get_output_scale (manager, meta_output);
+
/* FIXME: backlight is a very driver specific thing unfortunately,
every DDX does its own thing, and the dumb KMS API does not include it.
@@ -919,6 +985,8 @@ meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
manager_kms->udev = g_udev_client_new (subsystems);
g_signal_connect (manager_kms->udev, "uevent",
G_CALLBACK (on_uevent), manager_kms);
+
+ manager_kms->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
}
static void
@@ -927,6 +995,7 @@ meta_monitor_manager_kms_dispose (GObject *object)
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (object);
g_clear_object (&manager_kms->udev);
+ g_clear_object (&manager_kms->desktop_settings);
G_OBJECT_CLASS (meta_monitor_manager_kms_parent_class)->dispose (object);
}
diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
index c019a58..47fc8f5 100644
--- a/src/wayland/meta-wayland-outputs.c
+++ b/src/wayland/meta-wayland-outputs.c
@@ -40,17 +40,6 @@ typedef struct {
GList *resources;
} MetaWaylandOutput;
-/* The minimum resolution at which we turn on a window-scale of 2 */
-#define HIDPI_LIMIT 192
-
-/* The minimum screen height at which we turn on a window-scale of 2;
- * below this there just isn't enough vertical real estate for GNOME
- * apps to work, and it's better to just be tiny */
-#define HIDPI_MIN_HEIGHT 1200
-
-/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
-#define SMALLEST_4K_WIDTH 3656
-
static void
output_resource_destroy (struct wl_resource *res)
{
@@ -60,57 +49,6 @@ output_resource_destroy (struct wl_resource *res)
wayland_output->resources = g_list_remove (wayland_output->resources, res);
}
-/* Based on code from gnome-settings-daemon */
-static int
-compute_scale (MetaOutput *output)
-{
- int scale = 1;
-
- /* Scaling makes no sense */
- if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
- goto out;
-
- /* 4K TV */
- if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
- output->crtc->rect.width >= SMALLEST_4K_WIDTH)
- goto out;
-
- /* Somebody encoded the aspect ratio (16/9 or 16/10)
- * instead of the physical size */
- if ((output->width_mm == 160 && output->height_mm == 90) ||
- (output->width_mm == 160 && output->height_mm == 100) ||
- (output->width_mm == 16 && output->height_mm == 9) ||
- (output->width_mm == 16 && output->height_mm == 10))
- goto out;
-
- if (output->width_mm > 0 && output->height_mm > 0)
- {
- double dpi_x, dpi_y;
- dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
- dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
- /* We don't completely trust these values so both
- must be high, and never pick higher ratio than
- 2 automatically */
- if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
- scale = 2;
- }
-
-out:
- return scale;
-}
-
-static GSettings *desktop_settings;
-
-static int
-get_output_scale (MetaOutput *output)
-{
- int scale = g_settings_get_uint (desktop_settings, "scaling-factor");
- if (scale > 0)
- return scale;
- else
- return compute_scale (output);
-}
-
static void
bind_output (struct wl_client *client,
void *data,
@@ -158,7 +96,6 @@ bind_output (struct wl_client *client,
(int)output->crtc->current_mode->height,
(int)output->crtc->current_mode->refresh_rate);
- output->scale = get_output_scale (output);
if (version >= WL_OUTPUT_SCALE_SINCE_VERSION)
wl_output_send_scale (resource, output->scale);
@@ -295,8 +232,6 @@ meta_wayland_outputs_init (MetaWaylandCompositor *compositor)
{
MetaMonitorManager *monitors;
- desktop_settings = g_settings_new ("org.gnome.desktop.interface");
-
monitors = meta_monitor_manager_get ();
g_signal_connect (monitors, "monitors-changed",
G_CALLBACK (on_monitors_changed), compositor);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]