[gnome-flashback] backends: make GfCrtcMode a GObject
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] backends: make GfCrtcMode a GObject
- Date: Wed, 24 Jan 2018 16:19:42 +0000 (UTC)
commit db1aeed6d6d636a70c6900a8ade0442e160492e0
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Wed Jan 24 17:49:26 2018 +0200
backends: make GfCrtcMode a GObject
Based on mutter commit:
https://gitlab.gnome.org/GNOME/mutter/commit/2db55052168d
backends/Makefile.am | 1 +
backends/gf-crtc-mode.c | 50 +++++++++++++++++++++++++++++++
backends/gf-crtc-private.h | 6 +++-
backends/gf-monitor-manager-private.h | 6 +---
backends/gf-monitor-manager-xrandr.c | 21 ++++++++-----
backends/gf-monitor-manager.c | 52 ++++++++++++---------------------
6 files changed, 89 insertions(+), 47 deletions(-)
---
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 96dcd69..6c7fd16 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -29,6 +29,7 @@ libbackends_la_SOURCES = \
gf-backend-x11.c \
gf-backend.c \
gf-backend.h \
+ gf-crtc-mode.c \
gf-crtc-private.h \
gf-crtc.c \
gf-direction.h \
diff --git a/backends/gf-crtc-mode.c b/backends/gf-crtc-mode.c
new file mode 100644
index 0000000..5eb9226
--- /dev/null
+++ b/backends/gf-crtc-mode.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 (GfCrtcMode, gf_crtc_mode, G_TYPE_OBJECT)
+
+static void
+gf_crtc_mode_finalize (GObject *object)
+{
+ GfCrtcMode *crtc_mode;
+
+ crtc_mode = GF_CRTC_MODE (object);
+
+ if (crtc_mode->driver_notify)
+ crtc_mode->driver_notify (crtc_mode);
+
+ G_OBJECT_CLASS (gf_crtc_mode_parent_class)->finalize (object);
+}
+
+static void
+gf_crtc_mode_class_init (GfCrtcModeClass *crtc_mode_class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (crtc_mode_class);
+
+ object_class->finalize = gf_crtc_mode_finalize;
+}
+
+static void
+gf_crtc_mode_init (GfCrtcMode *crtc_mode)
+{
+}
diff --git a/backends/gf-crtc-private.h b/backends/gf-crtc-private.h
index c77e656..5fbd4b2 100644
--- a/backends/gf-crtc-private.h
+++ b/backends/gf-crtc-private.h
@@ -57,6 +57,8 @@ struct _GfCrtc
struct _GfCrtcMode
{
+ GObject parent;
+
/* The low-level ID of this mode, used to apply back configuration */
glong mode_id;
gchar *name;
@@ -80,10 +82,12 @@ typedef struct
GPtrArray *outputs;
} GfCrtcInfo;
-
#define GF_TYPE_CRTC (gf_crtc_get_type ())
G_DECLARE_FINAL_TYPE (GfCrtc, gf_crtc, GF, CRTC, GObject)
+#define GF_TYPE_CRTC_MODE (gf_crtc_mode_get_type ())
+G_DECLARE_FINAL_TYPE (GfCrtcMode, gf_crtc_mode, GF, CRTC_MODE, GObject)
+
G_END_DECLS
#endif
diff --git a/backends/gf-monitor-manager-private.h b/backends/gf-monitor-manager-private.h
index b2e2ddf..5a3a109 100644
--- a/backends/gf-monitor-manager-private.h
+++ b/backends/gf-monitor-manager-private.h
@@ -66,9 +66,7 @@ struct _GfMonitorManager
*/
GList *outputs;
GList *crtcs;
-
- GfCrtcMode *modes;
- guint n_modes;
+ GList *modes;
GList *monitors;
@@ -227,8 +225,6 @@ GfLogicalMonitorLayoutMode gf_monitor_manager_get_default_layout_mode (GfM
GfMonitorConfigManager *gf_monitor_manager_get_config_manager (GfMonitorManager
*manager);
-void gf_monitor_manager_clear_mode (GfCrtcMode
*mode);
-
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 55cf767..3ebbc62 100644
--- a/backends/gf-monitor-manager-xrandr.c
+++ b/backends/gf-monitor-manager-xrandr.c
@@ -865,7 +865,7 @@ output_get_modes (GfMonitorManager *manager,
GfOutput *output,
XRROutputInfo *xrandr_output)
{
- guint j, k;
+ guint j;
guint n_actual_modes;
output->modes = g_new0 (GfCrtcMode *, xrandr_output->nmode);
@@ -873,11 +873,15 @@ output_get_modes (GfMonitorManager *manager,
n_actual_modes = 0;
for (j = 0; j < (guint) xrandr_output->nmode; j++)
{
- for (k = 0; k < manager->n_modes; k++)
+ GList *l;
+
+ for (l = manager->modes; l; l = l->next)
{
- if (xrandr_output->modes[j] == (XID) manager->modes[k].mode_id)
+ GfCrtcMode *mode = l->data;
+
+ if (xrandr_output->modes[j] == (XID) mode->mode_id)
{
- output->modes[n_actual_modes] = &manager->modes[k];
+ output->modes[n_actual_modes] = mode;
n_actual_modes += 1;
break;
}
@@ -1590,9 +1594,8 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
return;
xrandr->resources = resources;
- manager->n_modes = resources->nmode;
manager->outputs = NULL;
- manager->modes = g_new0 (GfCrtcMode, manager->n_modes);
+ manager->modes = NULL;
manager->crtcs = NULL;
for (i = 0; i < (guint) resources->nmode; i++)
@@ -1601,7 +1604,7 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
GfCrtcMode *mode;
xmode = &resources->modes[i];
- mode = &manager->modes[i];
+ mode = g_object_new (GF_TYPE_CRTC_MODE, NULL);
mode->mode_id = xmode->id;
mode->width = xmode->width;
@@ -1609,6 +1612,8 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
mode->refresh_rate = (xmode->dotClock / ((gfloat) xmode->hTotal * xmode->vTotal));
mode->flags = xmode->modeFlags;
mode->name = g_strdup_printf ("%dx%d", xmode->width, xmode->height);
+
+ manager->modes = g_list_append (manager->modes, mode);
}
for (i = 0; i < (guint) resources->ncrtc; i++)
@@ -1632,7 +1637,7 @@ gf_monitor_manager_xrandr_read_current (GfMonitorManager *manager)
{
if (resources->modes[j].id == xrandr_crtc->mode)
{
- crtc->current_mode = &manager->modes[j];
+ crtc->current_mode = g_list_nth_data (manager->modes, j);
break;
}
}
diff --git a/backends/gf-monitor-manager.c b/backends/gf-monitor-manager.c
index 07a7e02..916977a 100644
--- a/backends/gf-monitor-manager.c
+++ b/backends/gf-monitor-manager.c
@@ -1091,18 +1091,6 @@ rebuild_monitors (GfMonitorManager *manager)
}
}
-static void
-free_mode_array (GfCrtcMode *old_modes,
- gint n_old_modes)
-{
- gint i;
-
- for (i = 0; i < n_old_modes; i++)
- gf_monitor_manager_clear_mode (&old_modes[i]);
-
- g_free (old_modes);
-}
-
static gboolean
gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation)
@@ -1128,12 +1116,18 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
{
GfCrtc *crtc = l->data;
GVariantBuilder transforms;
+ gint current_mode_index;
g_variant_builder_init (&transforms, G_VARIANT_TYPE ("au"));
for (j = 0; j <= GF_MONITOR_TRANSFORM_FLIPPED_270; j++)
if (crtc->all_transforms & (1 << j))
g_variant_builder_add (&transforms, "u", j);
+ if (crtc->current_mode)
+ current_mode_index = g_list_index (manager->modes, crtc->current_mode);
+ else
+ current_mode_index = -1;
+
g_variant_builder_add (&crtc_builder, "(uxiiiiiuaua{sv})",
i, /* ID */
(gint64) crtc->crtc_id,
@@ -1141,7 +1135,7 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
(gint) crtc->rect.y,
(gint) crtc->rect.width,
(gint) crtc->rect.height,
- (gint) (crtc->current_mode ? crtc->current_mode - manager->modes : -1),
+ current_mode_index,
(guint32) crtc->transform,
&transforms,
NULL /* properties */);
@@ -1169,8 +1163,13 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
g_variant_builder_init (&modes, G_VARIANT_TYPE ("au"));
for (j = 0; j < output->n_modes; j++)
- g_variant_builder_add (&modes, "u",
- (guint) (output->modes[j] - manager->modes));
+ {
+ guint mode_index;
+
+ mode_index = g_list_index (manager->modes, output->modes[j]);
+ g_variant_builder_add (&modes, "u", mode_index);
+
+ }
g_variant_builder_init (&clones, G_VARIANT_TYPE ("au"));
for (j = 0; j < output->n_possible_clones; j++)
@@ -1258,9 +1257,9 @@ gf_monitor_manager_handle_get_resources (GfDBusDisplayConfig *skeleton,
&properties);
}
- for (i = 0; i < manager->n_modes; i++)
+ for (l = manager->modes, i = 0; l; l = l->next, i++)
{
- GfCrtcMode *mode = &manager->modes[i];
+ GfCrtcMode *mode = l->data;
g_variant_builder_add (&mode_builder, "(uxuudu)",
i, /* ID */
@@ -2012,7 +2011,7 @@ gf_monitor_manager_finalize (GObject *object)
manager = GF_MONITOR_MANAGER (object);
g_list_free_full (manager->outputs, g_object_unref);
- free_mode_array (manager->modes, manager->n_modes);
+ g_list_free_full (manager->modes, g_object_unref);
g_list_free_full (manager->crtcs, g_object_unref);
g_list_free_full (manager->logical_monitors, g_object_unref);
@@ -2230,8 +2229,7 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
{
GList *old_outputs;
GList *old_crtcs;
- GfCrtcMode *old_modes;
- guint n_old_modes;
+ GList *old_modes;
/* Some implementations of read_current use the existing information
* we have available, so don't free the old configuration until after
@@ -2240,7 +2238,6 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
old_outputs = manager->outputs;
old_crtcs = manager->crtcs;
old_modes = manager->modes;
- n_old_modes = manager->n_modes;
manager->serial++;
GF_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
@@ -2248,7 +2245,7 @@ gf_monitor_manager_read_current_state (GfMonitorManager *manager)
rebuild_monitors (manager);
g_list_free_full (old_outputs, g_object_unref);
- free_mode_array (old_modes, n_old_modes);
+ g_list_free_full (old_modes, g_object_unref);
g_list_free_full (old_crtcs, g_object_unref);
}
@@ -2550,17 +2547,6 @@ gf_monitor_manager_get_config_manager (GfMonitorManager *manager)
return manager->config_manager;
}
-void
-gf_monitor_manager_clear_mode (GfCrtcMode *mode)
-{
- g_free (mode->name);
-
- if (mode->driver_notify)
- mode->driver_notify (mode);
-
- memset (mode, 0, sizeof (*mode));
-}
-
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]