[gnome-flashback] backends: make GfCrtc a GObject
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] backends: make GfCrtc a GObject
- Date: Wed, 24 Jan 2018 16:19:37 +0000 (UTC)
commit 2c0bd78ce6aaeabfcbf2a54336b77ee21ebee9f6
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Wed Jan 24 17:31:10 2018 +0200
backends: make GfCrtc a GObject
Based on mutter commit:
https://gitlab.gnome.org/GNOME/mutter/commit/f64fab1d2d19
backends/Makefile.am | 1 +
backends/gf-crtc-private.h | 8 ++++
backends/gf-crtc.c | 50 ++++++++++++++++++++++++++
backends/gf-monitor-manager-private.h | 8 ++---
backends/gf-monitor-manager-xrandr.c | 34 ++++++++++--------
backends/gf-monitor-manager.c | 63 ++++++++++++++------------------
6 files changed, 109 insertions(+), 55 deletions(-)
---
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 3714a4c..96dcd69 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -30,6 +30,7 @@ libbackends_la_SOURCES = \
gf-backend.c \
gf-backend.h \
gf-crtc-private.h \
+ gf-crtc.c \
gf-direction.h \
gf-display-config-shared.h \
gf-edid-parse.c \
diff --git a/backends/gf-crtc-private.h b/backends/gf-crtc-private.h
index a4629c2..c77e656 100644
--- a/backends/gf-crtc-private.h
+++ b/backends/gf-crtc-private.h
@@ -25,6 +25,8 @@
#ifndef GF_CRTC_MODE_PRIVATE_H
#define GF_CRTC_MODE_PRIVATE_H
+#include <glib-object.h>
+
#include "gf-monitor-manager-enums-private.h"
#include "gf-monitor-manager-types-private.h"
#include "gf-rectangle.h"
@@ -33,6 +35,8 @@ G_BEGIN_DECLS
struct _GfCrtc
{
+ GObject parent;
+
glong crtc_id;
GfRectangle rect;
GfCrtcMode *current_mode;
@@ -76,6 +80,10 @@ typedef struct
GPtrArray *outputs;
} GfCrtcInfo;
+
+#define GF_TYPE_CRTC (gf_crtc_get_type ())
+G_DECLARE_FINAL_TYPE (GfCrtc, gf_crtc, GF, CRTC, GObject)
+
G_END_DECLS
#endif
diff --git a/backends/gf-crtc.c b/backends/gf-crtc.c
new file mode 100644
index 0000000..a826a23
--- /dev/null
+++ b/backends/gf-crtc.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2017 Red Hat
+ * Copyright (C) 2018 Alberts Muktupāvels
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include "gf-crtc-private.h"
+
+G_DEFINE_TYPE (GfCrtc, gf_crtc, G_TYPE_OBJECT)
+
+static void
+gf_crtc_finalize (GObject *object)
+{
+ GfCrtc *crtc;
+
+ crtc = GF_CRTC (object);
+
+ if (crtc->driver_notify)
+ crtc->driver_notify (crtc);
+
+ G_OBJECT_CLASS (gf_crtc_parent_class)->finalize (object);
+}
+
+static void
+gf_crtc_class_init (GfCrtcClass *crtc_class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (crtc_class);
+
+ object_class->finalize = gf_crtc_finalize;
+}
+
+static void
+gf_crtc_init (GfCrtc *crtc)
+{
+}
diff --git a/backends/gf-monitor-manager-private.h b/backends/gf-monitor-manager-private.h
index 7803c6c..b2e2ddf 100644
--- a/backends/gf-monitor-manager-private.h
+++ b/backends/gf-monitor-manager-private.h
@@ -65,13 +65,11 @@ struct _GfMonitorManager
* while logical_monitors refer to logical ones.
*/
GList *outputs;
+ GList *crtcs;
GfCrtcMode *modes;
guint n_modes;
- GfCrtc *crtcs;
- guint n_crtcs;
-
GList *monitors;
GList *logical_monitors;
@@ -176,6 +174,8 @@ GList *gf_monitor_manager_get_monitors (GfM
GList *gf_monitor_manager_get_outputs (GfMonitorManager
*manager);
+GList *gf_monitor_manager_get_crtcs (GfMonitorManager
*manager);
+
gboolean gf_monitor_manager_has_hotplug_mode_update (GfMonitorManager
*manager);
void gf_monitor_manager_read_current_state (GfMonitorManager
*manager);
void gf_monitor_manager_on_hotplug (GfMonitorManager
*manager);
@@ -229,8 +229,6 @@ GfMonitorConfigManager *gf_monitor_manager_get_config_manager (GfM
void gf_monitor_manager_clear_mode (GfCrtcMode
*mode);
-void gf_monitor_manager_clear_crtc (GfCrtc
*crtc);
-
static inline gboolean
gf_monitor_transform_is_rotated (GfMonitorTransform transform)
{
diff --git a/backends/gf-monitor-manager-xrandr.c b/backends/gf-monitor-manager-xrandr.c
index 2d8c0f7..55cf767 100644
--- a/backends/gf-monitor-manager-xrandr.c
+++ b/backends/gf-monitor-manager-xrandr.c
@@ -382,12 +382,11 @@ is_assignments_changed (GfMonitorManager *manager,
GfOutputInfo **output_infos,
guint n_output_infos)
{
- guint i;
GList *l;
- for (i = 0; i < manager->n_crtcs; i++)
+ for (l = manager->crtcs; l; l = l->next)
{
- GfCrtc *crtc = &manager->crtcs[i];
+ GfCrtc *crtc = l->data;
if (is_crtc_assignment_changed (crtc, crtc_infos, n_crtc_infos))
return TRUE;
@@ -895,19 +894,22 @@ output_get_crtcs (GfMonitorManager *manager,
GfOutput *output,
XRROutputInfo *xrandr_output)
{
- guint j, k;
+ guint j;
guint n_actual_crtcs;
+ GList *l;
output->possible_crtcs = g_new0 (GfCrtc *, xrandr_output->ncrtc);
n_actual_crtcs = 0;
for (j = 0; j < (guint) xrandr_output->ncrtc; j++)
{
- for (k = 0; k < manager->n_crtcs; k++)
+ for (l = manager->crtcs; l; l = l->next)
{
- if ((XID) manager->crtcs[k].crtc_id == xrandr_output->crtcs[j])
+ GfCrtc *crtc = l->data;
+
+ if ((XID) crtc->crtc_id == xrandr_output->crtcs[j])
{
- output->possible_crtcs[n_actual_crtcs] = &manager->crtcs[k];
+ output->possible_crtcs[n_actual_crtcs] = crtc;
n_actual_crtcs += 1;
break;
}
@@ -916,11 +918,13 @@ output_get_crtcs (GfMonitorManager *manager,
output->n_possible_crtcs = n_actual_crtcs;
output->crtc = NULL;
- for (j = 0; j < manager->n_crtcs; j++)
+ for (l = manager->crtcs; l; l = l->next)
{
- if ((XID) manager->crtcs[j].crtc_id == xrandr_output->crtc)
+ GfCrtc *crtc = l->data;
+
+ if ((XID) crtc->crtc_id == xrandr_output->crtc)
{
- output->crtc = &manager->crtcs[j];
+ output->crtc = crtc;
break;
}
}
@@ -1206,9 +1210,9 @@ apply_crtc_assignments (GfMonitorManager *manager,
}
/* Disable CRTCs not mentioned in the list */
- for (i = 0; i < manager->n_crtcs; i++)
+ for (l = manager->crtcs; l; l = l->next)
{
- GfCrtc *crtc = &manager->crtcs[i];
+ GfCrtc *crtc = l->data;
if (crtc->is_dirty)
{
@@ -1586,11 +1590,10 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
return;
xrandr->resources = resources;
- manager->n_crtcs = resources->ncrtc;
manager->n_modes = resources->nmode;
manager->outputs = NULL;
manager->modes = g_new0 (GfCrtcMode, manager->n_modes);
- manager->crtcs = g_new0 (GfCrtc, manager->n_crtcs);
+ manager->crtcs = NULL;
for (i = 0; i < (guint) resources->nmode; i++)
{
@@ -1614,7 +1617,7 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
GfCrtc *crtc;
xrandr_crtc = XRRGetCrtcInfo (xrandr->xdisplay, resources, resources->crtcs[i]);
- crtc = &manager->crtcs[i];
+ crtc = g_object_new (GF_TYPE_CRTC, NULL);
crtc->crtc_id = resources->crtcs[i];
crtc->rect.x = xrandr_crtc->x;
@@ -1634,6 +1637,7 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
}
}
+ manager->crtcs = g_list_append (manager->crtcs, crtc);
XRRFreeCrtcInfo (xrandr_crtc);
}
diff --git a/backends/gf-monitor-manager.c b/backends/gf-monitor-manager.c
index cdb2afb..07a7e02 100644
--- a/backends/gf-monitor-manager.c
+++ b/backends/gf-monitor-manager.c
@@ -1103,18 +1103,6 @@ free_mode_array (GfCrtcMode *old_modes,
g_free (old_modes);
}
-static void
-free_crtc_array (GfCrtc *old_crtcs,
- gint n_old_crtcs)
-{
- gint i;
-
- for (i = 0; i < n_old_crtcs; i++)
- gf_monitor_manager_clear_crtc (&old_crtcs[i]);
-
- g_free (old_crtcs);
-}
-
static gboolean
gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation)
@@ -1136,9 +1124,9 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
g_variant_builder_init (&output_builder, G_VARIANT_TYPE ("a(uxiausauaua{sv})"));
g_variant_builder_init (&mode_builder, G_VARIANT_TYPE ("a(uxuudu)"));
- for (i = 0; i < manager->n_crtcs; i++)
+ for (l = manager->crtcs, i = 0; l; l = l->next, i++)
{
- GfCrtc *crtc = &manager->crtcs[i];
+ GfCrtc *crtc = l->data;
GVariantBuilder transforms;
g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au"));
@@ -1165,11 +1153,19 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
GVariantBuilder crtcs, modes, clones, properties;
GBytes *edid;
gchar *edid_file;
+ gint crtc_index;
g_variant_builder_init (&crtcs, G_VARIANT_TYPE ("au"));
for (j = 0; j < output->n_possible_crtcs; j++)
- g_variant_builder_add (&crtcs, "u",
- (guint) (output->possible_crtcs[j] - manager->crtcs));
+ {
+ GfCrtc *possible_crtc;
+ guint possible_crtc_index;
+
+ possible_crtc = output->possible_crtcs[j];
+ possible_crtc_index = g_list_index (manager->crtcs, possible_crtc);
+
+ g_variant_builder_add (&crtcs, "u", possible_crtc_index);
+ }
g_variant_builder_init (&modes, G_VARIANT_TYPE ("au"));
for (j = 0; j < output->n_modes; j++)
@@ -1249,10 +1245,12 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
output->tile_info.tile_h));
}
+ crtc_index = output->crtc ? g_list_index (manager->crtcs, output->crtc) : -1;
+
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
i, /* ID */
(gint64) output->winsys_id,
- (gint) (output->crtc ? output->crtc - manager->crtcs : -1),
+ crtc_index,
&crtcs,
output->name,
&modes,
@@ -1379,7 +1377,7 @@ gf_monitor_manager_handle_get_crtc_gamma (GfDBusDisplayConfig *skeleton,
return TRUE;
}
- if (crtc_id >= manager->n_crtcs)
+ if (crtc_id >= g_list_length (manager->crtcs))
{
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
G_DBUS_ERROR_INVALID_ARGS,
@@ -1387,7 +1385,7 @@ gf_monitor_manager_handle_get_crtc_gamma (GfDBusDisplayConfig *skeleton,
return TRUE;
}
- crtc = &manager->crtcs[crtc_id];
+ crtc = g_list_nth_data (manager->crtcs, crtc_id);
if (manager_class->get_crtc_gamma)
{
@@ -1448,7 +1446,7 @@ gf_monitor_manager_handle_set_crtc_gamma (GfDBusDisplayConfig *skeleton,
return TRUE;
}
- if (crtc_id >= manager->n_crtcs)
+ if (crtc_id >= g_list_length (manager->crtcs))
{
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
G_DBUS_ERROR_INVALID_ARGS,
@@ -1456,7 +1454,7 @@ gf_monitor_manager_handle_set_crtc_gamma (GfDBusDisplayConfig *skeleton,
return TRUE;
}
- crtc = &manager->crtcs[crtc_id];
+ crtc = g_list_nth_data (manager->crtcs, crtc_id);
red_bytes = g_variant_get_data_as_bytes (red_v);
green_bytes = g_variant_get_data_as_bytes (green_v);
@@ -2015,7 +2013,7 @@ gf_monitor_manager_finalize (GObject *object)
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);
+ g_list_free_full (manager->crtcs, g_object_unref);
g_list_free_full (manager->logical_monitors, g_object_unref);
@@ -2205,6 +2203,12 @@ gf_monitor_manager_get_outputs (GfMonitorManager *manager)
return manager->outputs;
}
+GList *
+gf_monitor_manager_get_crtcs (GfMonitorManager *manager)
+{
+ return manager->crtcs;
+}
+
gboolean
gf_monitor_manager_has_hotplug_mode_update (GfMonitorManager *manager)
{
@@ -2225,9 +2229,8 @@ void
gf_monitor_manager_read_current_state (GfMonitorManager *manager)
{
GList *old_outputs;
- GfCrtc *old_crtcs;
+ GList *old_crtcs;
GfCrtcMode *old_modes;
- guint n_old_crtcs;
guint n_old_modes;
/* Some implementations of read_current use the existing information
@@ -2236,7 +2239,6 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
*/
old_outputs = manager->outputs;
old_crtcs = manager->crtcs;
- n_old_crtcs = manager->n_crtcs;
old_modes = manager->modes;
n_old_modes = manager->n_modes;
@@ -2247,7 +2249,7 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
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);
+ g_list_free_full (old_crtcs, g_object_unref);
}
void
@@ -2559,15 +2561,6 @@ gf_monitor_manager_clear_mode (GfCrtcMode *mode)
memset (mode, 0, sizeof (*mode));
}
-void
-gf_monitor_manager_clear_crtc (GfCrtc *crtc)
-{
- if (crtc->driver_notify)
- crtc->driver_notify (crtc);
-
- memset (crtc, 0, sizeof (*crtc));
-}
-
gint
gf_monitor_manager_get_monitor_for_output (GfMonitorManager *manager,
guint id)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]