[gnome-flashback] backends: make GfOutput a GObject
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] backends: make GfOutput a GObject
- Date: Wed, 24 Jan 2018 14:48:13 +0000 (UTC)
commit 63163777a205447105369e195e2ceda1a64ee613
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Wed Jan 24 16:19:24 2018 +0200
backends: make GfOutput a GObject
Based on mutter commit:
https://gitlab.gnome.org/GNOME/mutter/commit/9817a6aa47b4
backends/gf-monitor-manager-private.h | 8 +---
backends/gf-monitor-manager-xrandr.c | 43 +++++++++---------
backends/gf-monitor-manager.c | 78 +++++++++++----------------------
backends/gf-monitor-tiled.c | 8 ++-
backends/gf-output-private.h | 7 +++
backends/gf-output.c | 39 ++++++++++++++++
6 files changed, 101 insertions(+), 82 deletions(-)
---
diff --git a/backends/gf-monitor-manager-private.h b/backends/gf-monitor-manager-private.h
index 0e457b7..7803c6c 100644
--- a/backends/gf-monitor-manager-private.h
+++ b/backends/gf-monitor-manager-private.h
@@ -64,8 +64,7 @@ struct _GfMonitorManager
* (like encoders, but less tied to the HW),
* while logical_monitors refer to logical ones.
*/
- GfOutput *outputs;
- guint n_outputs;
+ GList *outputs;
GfCrtcMode *modes;
guint n_modes;
@@ -175,8 +174,7 @@ GfMonitor *gf_monitor_manager_get_monitor_from_spec (GfM
GList *gf_monitor_manager_get_monitors (GfMonitorManager
*manager);
-GfOutput *gf_monitor_manager_get_outputs (GfMonitorManager
*manager,
- guint
*n_outputs);
+GList *gf_monitor_manager_get_outputs (GfMonitorManager
*manager);
gboolean gf_monitor_manager_has_hotplug_mode_update (GfMonitorManager
*manager);
void gf_monitor_manager_read_current_state (GfMonitorManager
*manager);
@@ -229,8 +227,6 @@ GfLogicalMonitorLayoutMode gf_monitor_manager_get_default_layout_mode (GfM
GfMonitorConfigManager *gf_monitor_manager_get_config_manager (GfMonitorManager
*manager);
-void gf_monitor_manager_clear_output (GfOutput
*output);
-
void gf_monitor_manager_clear_mode (GfCrtcMode
*mode);
void gf_monitor_manager_clear_crtc (GfCrtc
*crtc);
diff --git a/backends/gf-monitor-manager-xrandr.c b/backends/gf-monitor-manager-xrandr.c
index ff79a25..c99af60 100644
--- a/backends/gf-monitor-manager-xrandr.c
+++ b/backends/gf-monitor-manager-xrandr.c
@@ -383,6 +383,7 @@ is_assignments_changed (GfMonitorManager *manager,
guint n_output_infos)
{
guint i;
+ GList *l;
for (i = 0; i < manager->n_crtcs; i++)
{
@@ -392,9 +393,9 @@ is_assignments_changed (GfMonitorManager *manager,
return TRUE;
}
- for (i = 0; i < manager->n_outputs; i++)
+ for (l = manager->outputs; l; l = l->next)
{
- GfOutput *output = &manager->outputs[i];
+ GfOutput *output = l->data;
if (is_output_assignment_changed (output,
crtc_infos,
@@ -1144,6 +1145,7 @@ apply_crtc_assignments (GfMonitorManager *manager,
GfMonitorManagerXrandr *xrandr;
gint width, height, width_mm, height_mm;
guint i;
+ GList *l;
xrandr = GF_MONITOR_MANAGER_XRANDR (manager);
@@ -1338,9 +1340,9 @@ apply_crtc_assignments (GfMonitorManager *manager,
}
/* Disable outputs not mentioned in the list */
- for (i = 0; i < manager->n_outputs; i++)
+ for (l = manager->outputs; l; l = l->next)
{
- GfOutput *output = &manager->outputs[i];
+ GfOutput *output = l->data;
if (output->is_dirty)
{
@@ -1529,9 +1531,9 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
gint min_width;
gint min_height;
Screen *screen;
- guint i, j, k;
+ guint i, j;
+ GList *l;
RROutput primary_output;
- guint n_actual_outputs;
xrandr = GF_MONITOR_MANAGER_XRANDR (manager);
@@ -1584,10 +1586,9 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
return;
xrandr->resources = resources;
- manager->n_outputs = resources->noutput;
manager->n_crtcs = resources->ncrtc;
manager->n_modes = resources->nmode;
- manager->outputs = g_new0 (GfOutput, manager->n_outputs);
+ manager->outputs = NULL;
manager->modes = g_new0 (GfCrtcMode, manager->n_modes);
manager->crtcs = g_new0 (GfCrtc, manager->n_crtcs);
@@ -1638,7 +1639,6 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
primary_output = XRRGetOutputPrimary (xrandr->xdisplay, xrandr->xroot);
- n_actual_outputs = 0;
for (i = 0; i < (guint) resources->noutput; i++)
{
XRROutputInfo *xrandr_output;
@@ -1650,12 +1650,12 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
if (!xrandr_output)
continue;
- output = &manager->outputs[n_actual_outputs];
-
if (xrandr_output->connection != RR_Disconnected)
{
GBytes *edid;
+ output = g_object_new (GF_TYPE_OUTPUT, NULL);
+
output->winsys_id = resources->outputs[i];
output->name = g_strdup (xrandr_output->name);
@@ -1699,35 +1699,36 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
output->backlight = -1;
if (output->n_modes == 0 || output->n_possible_crtcs == 0)
- gf_monitor_manager_clear_output (output);
+ g_object_unref (output);
else
- n_actual_outputs++;
+ manager->outputs = g_list_prepend (manager->outputs, output);
}
XRRFreeOutputInfo (xrandr_output);
}
- manager->n_outputs = n_actual_outputs;
-
/* Sort the outputs for easier handling in GfMonitorConfig */
- qsort (manager->outputs, manager->n_outputs, sizeof (GfOutput), compare_outputs);
+ manager->outputs = g_list_sort (manager->outputs, compare_outputs);
/* Now fix the clones */
- for (i = 0; i < manager->n_outputs; i++)
+ for (l = manager->outputs; l; l = l->next)
{
GfOutput *output;
+ GList *k;
- output = &manager->outputs[i];
+ output = l->data;
for (j = 0; j < output->n_possible_clones; j++)
{
RROutput clone = GPOINTER_TO_INT (output->possible_clones[j]);
- for (k = 0; k < manager->n_outputs; k++)
+ for (k = manager->outputs; k; k = k->next)
{
- if (clone == (XID) manager->outputs[k].winsys_id)
+ GfOutput *possible_clone = k->data;
+
+ if (clone == (XID) possible_clone->winsys_id)
{
- output->possible_clones[j] = &manager->outputs[k];
+ output->possible_clones[j] = possible_clone;
break;
}
}
diff --git a/backends/gf-monitor-manager.c b/backends/gf-monitor-manager.c
index 1b3549f..cdb2afb 100644
--- a/backends/gf-monitor-manager.c
+++ b/backends/gf-monitor-manager.c
@@ -1059,7 +1059,7 @@ is_main_tiled_monitor_output (GfOutput *output)
static void
rebuild_monitors (GfMonitorManager *manager)
{
- guint i;
+ GList *l;
if (manager->monitors)
{
@@ -1067,9 +1067,9 @@ rebuild_monitors (GfMonitorManager *manager)
manager->monitors = NULL;
}
- for (i = 0; i < manager->n_outputs; i++)
+ for (l = manager->outputs; l; l = l->next)
{
- GfOutput *output = &manager->outputs[i];
+ GfOutput *output = l->data;
if (output->tile_info.group_id)
{
@@ -1092,18 +1092,6 @@ rebuild_monitors (GfMonitorManager *manager)
}
static void
-free_output_array (GfOutput *old_outputs,
- gint n_old_outputs)
-{
- gint i;
-
- for (i = 0; i < n_old_outputs; i++)
- gf_monitor_manager_clear_output (&old_outputs[i]);
-
- g_free (old_outputs);
-}
-
-static void
free_mode_array (GfCrtcMode *old_modes,
gint n_old_modes)
{
@@ -1136,6 +1124,7 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
GVariantBuilder crtc_builder;
GVariantBuilder output_builder;
GVariantBuilder mode_builder;
+ GList *l;
guint i, j;
gint max_screen_width;
gint max_screen_height;
@@ -1170,9 +1159,9 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
NULL /* properties */);
}
- for (i = 0; i < manager->n_outputs; i++)
+ for (l = manager->outputs; l; l = l->next)
{
- GfOutput *output = &manager->outputs[i];
+ GfOutput *output = l->data;
GVariantBuilder crtcs, modes, clones, properties;
GBytes *edid;
gchar *edid_file;
@@ -1189,8 +1178,14 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
g_variant_builder_init (&clones, G_VARIANT_TYPE ("au"));
for (j = 0; j < output->n_possible_clones; j++)
- g_variant_builder_add (&clones, "u",
- (guint) (output->possible_clones[j] - manager->outputs));
+ {
+ guint possible_clone_index;
+
+ possible_clone_index = g_list_index (manager->outputs,
+ output->possible_clones[j]);
+
+ g_variant_builder_add (&clones, "u", possible_clone_index);
+ }
g_variant_builder_init (&properties, G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (&properties, "{sv}", "vendor",
@@ -1318,7 +1313,7 @@ gf_monitor_manager_handle_change_backlight (GfDBusDisplayConfig *skeleton,
return TRUE;
}
- if (output_index >= manager->n_outputs)
+ if (output_index >= g_list_length (manager->outputs))
{
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
G_DBUS_ERROR_INVALID_ARGS,
@@ -1326,7 +1321,7 @@ gf_monitor_manager_handle_change_backlight (GfDBusDisplayConfig *skeleton,
return TRUE;
}
- output = &manager->outputs[output_index];
+ output = g_list_nth_data (manager->outputs, output_index);
if (value < 0 || value > 100)
{
@@ -2018,7 +2013,7 @@ gf_monitor_manager_finalize (GObject *object)
manager = GF_MONITOR_MANAGER (object);
- free_output_array (manager->outputs, manager->n_outputs);
+ g_list_free_full (manager->outputs, g_object_unref);
free_mode_array (manager->modes, manager->n_modes);
free_crtc_array (manager->crtcs, manager->n_crtcs);
@@ -2204,22 +2199,20 @@ gf_monitor_manager_get_monitors (GfMonitorManager *manager)
return manager->monitors;
}
-GfOutput *
-gf_monitor_manager_get_outputs (GfMonitorManager *manager,
- guint *n_outputs)
+GList *
+gf_monitor_manager_get_outputs (GfMonitorManager *manager)
{
- *n_outputs = manager->n_outputs;
return manager->outputs;
}
gboolean
gf_monitor_manager_has_hotplug_mode_update (GfMonitorManager *manager)
{
- guint i;
+ GList *l;
- for (i = 0; i < manager->n_outputs; i++)
+ for (l = manager->outputs; l; l = l->next)
{
- GfOutput *output = &manager->outputs[i];
+ GfOutput *output = l->data;
if (output->hotplug_mode_update)
return TRUE;
@@ -2231,10 +2224,9 @@ gf_monitor_manager_has_hotplug_mode_update (GfMonitorManager *manager)
void
gf_monitor_manager_read_current_state (GfMonitorManager *manager)
{
- GfOutput *old_outputs;
+ GList *old_outputs;
GfCrtc *old_crtcs;
GfCrtcMode *old_modes;
- guint n_old_outputs;
guint n_old_crtcs;
guint n_old_modes;
@@ -2243,7 +2235,6 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
* read_current finishes.
*/
old_outputs = manager->outputs;
- n_old_outputs = manager->n_outputs;
old_crtcs = manager->crtcs;
n_old_crtcs = manager->n_crtcs;
old_modes = manager->modes;
@@ -2254,7 +2245,7 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
rebuild_monitors (manager);
- free_output_array (old_outputs, n_old_outputs);
+ g_list_free_full (old_outputs, g_object_unref);
free_mode_array (old_modes, n_old_modes);
free_crtc_array (old_crtcs, n_old_crtcs);
}
@@ -2558,23 +2549,6 @@ gf_monitor_manager_get_config_manager (GfMonitorManager *manager)
}
void
-gf_monitor_manager_clear_output (GfOutput *output)
-{
- g_free (output->name);
- g_free (output->vendor);
- g_free (output->product);
- g_free (output->serial);
- g_free (output->modes);
- g_free (output->possible_crtcs);
- g_free (output->possible_clones);
-
- if (output->driver_notify)
- output->driver_notify (output);
-
- memset (output, 0, sizeof (*output));
-}
-
-void
gf_monitor_manager_clear_mode (GfCrtcMode *mode)
{
g_free (mode->name);
@@ -2602,9 +2576,9 @@ gf_monitor_manager_get_monitor_for_output (GfMonitorManager *manager,
GList *l;
g_return_val_if_fail (GF_IS_MONITOR_MANAGER (manager), -1);
- g_return_val_if_fail (id < manager->n_outputs, -1);
+ g_return_val_if_fail (id < g_list_length (manager->outputs), -1);
- output = &manager->outputs[id];
+ output = g_list_nth_data (manager->outputs, id);
if (!output || !output->crtc)
return -1;
diff --git a/backends/gf-monitor-tiled.c b/backends/gf-monitor-tiled.c
index 61334be..d11115c 100644
--- a/backends/gf-monitor-tiled.c
+++ b/backends/gf-monitor-tiled.c
@@ -498,15 +498,17 @@ add_tiled_monitor_outputs (GfMonitorManager *monitor_manager,
GfMonitorTiled *tiled)
{
GfMonitor *monitor;
- guint i;
+ GList *outputs;
+ GList *l;
monitor = GF_MONITOR (tiled);
- for (i = 0; i < monitor_manager->n_outputs; i++)
+ outputs = monitor_manager->outputs;
+ for (l = outputs; l; l = l->next)
{
GfOutput *output;
- output = &monitor_manager->outputs[i];
+ output = l->data;
if (output->tile_info.group_id != tiled->tile_group_id)
continue;
diff --git a/backends/gf-output-private.h b/backends/gf-output-private.h
index ed55d1e..bd2bcd3 100644
--- a/backends/gf-output-private.h
+++ b/backends/gf-output-private.h
@@ -25,6 +25,8 @@
#ifndef GF_OUTPUT_PRIVATE_H
#define GF_OUTPUT_PRIVATE_H
+#include <glib-object.h>
+
#include "gf-monitor-manager-enums-private.h"
#include "gf-monitor-manager-types-private.h"
@@ -52,6 +54,8 @@ typedef struct
struct _GfOutput
{
+ GObject parent;
+
/* The CRTC driving this output, NULL if the output is not enabled */
GfCrtc *crtc;
@@ -102,6 +106,9 @@ struct _GfOutput
GfTileInfo tile_info;
};
+#define GF_TYPE_OUTPUT (gf_output_get_type ())
+G_DECLARE_FINAL_TYPE (GfOutput, gf_output, GF, OUTPUT, GObject)
+
void gf_output_parse_edid (GfOutput *output,
GBytes *edid);
diff --git a/backends/gf-output.c b/backends/gf-output.c
index 6332606..70c9910 100644
--- a/backends/gf-output.c
+++ b/backends/gf-output.c
@@ -7,6 +7,7 @@
* Copyright (C) 2004-2006 Elijah Newren
* Copyright (C) 2013 Red Hat Inc.
* Copyright (C) 2017 Alberts Muktupāvels
+ * Copyright (C) 2017 Red Hat
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,6 +30,44 @@
#include "gf-edid-private.h"
#include "gf-output-private.h"
+G_DEFINE_TYPE (GfOutput, gf_output, G_TYPE_OBJECT)
+
+static void
+gf_output_finalize (GObject *object)
+{
+ GfOutput *output;
+
+ output = GF_OUTPUT (object);
+
+ g_free (output->name);
+ g_free (output->vendor);
+ g_free (output->product);
+ g_free (output->serial);
+ g_free (output->modes);
+ g_free (output->possible_crtcs);
+ g_free (output->possible_clones);
+
+ if (output->driver_notify)
+ output->driver_notify (output);
+
+ G_OBJECT_CLASS (gf_output_parent_class)->finalize (object);
+}
+
+static void
+gf_output_class_init (GfOutputClass *output_class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (output_class);
+
+ object_class->finalize = gf_output_finalize;
+}
+
+static void
+gf_output_init (GfOutput *output)
+{
+}
+
void
gf_output_parse_edid (GfOutput *output,
GBytes *edid)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]