diff --git a/clutter/clutter/clutter-color-manager.c b/clutter/clutter/clutter-color-manager.c index 4a291e478136fe3eeb40b0f5f068e4bce6c6750b..6840199149ed6d51a7f84addad23fd0382de7a28 100644 --- a/clutter/clutter/clutter-color-manager.c +++ b/clutter/clutter/clutter-color-manager.c @@ -57,6 +57,8 @@ clutter_color_manager_finalize (GObject *object) { ClutterColorManager *color_manager = CLUTTER_COLOR_MANAGER (object); + g_clear_object (&color_manager->default_color_state); + g_clear_pointer (&color_manager->snippet_cache, g_hash_table_unref); G_OBJECT_CLASS (clutter_color_manager_parent_class)->finalize (object); diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c index 2e0137bba6a0294c50bb4b4e145207cac1567f3c..63e24104d5aa86cb309f759689b7b0ee6bbe3f66 100644 --- a/clutter/clutter/clutter-stage-view.c +++ b/clutter/clutter/clutter-stage-view.c @@ -1335,6 +1335,7 @@ clutter_stage_view_dispose (GObject *object) g_clear_object (&priv->color_state); g_clear_object (&priv->offscreen); g_clear_object (&priv->offscreen_pipeline); + g_clear_object (&priv->output_color_state); g_clear_pointer (&priv->redraw_clip, mtk_region_unref); g_clear_pointer (&priv->accumulated_redraw_clip, mtk_region_unref); g_clear_pointer (&priv->frame_clock, clutter_frame_clock_destroy); diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c index 45ba0242e5ddd95a212d38239caec7016047ec4c..f96f261afb81d0754dadbf50073d76ec1c42ffd6 100644 --- a/src/backends/meta-monitor-manager-dummy.c +++ b/src/backends/meta-monitor-manager-dummy.c @@ -231,7 +231,7 @@ append_monitor (MetaMonitorManager *manager, { MetaCrtcMode *mode = l->data; - output_info->modes[i] = mode; + output_info->modes[i] = g_object_ref (mode); } output_info->n_modes = n_mode_specs; output_info->possible_crtcs = g_new0 (MetaCrtc *, 1); @@ -347,7 +347,7 @@ append_tiled_monitor (MetaMonitorManager *manager, { MetaCrtcMode *mode = l->data; - output_info->modes[j] = mode; + output_info->modes[j] = g_object_ref (mode); } output_info->n_modes = G_N_ELEMENTS (mode_specs); diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index badde7cea21c84d41ae688c451c356221761c75d..4f8a43604ff6e095e052feb1af355d0f5a947f85 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -40,6 +40,7 @@ typedef struct _MetaMonitorMode { MetaMonitor *monitor; char *id; + unsigned int n_crtc_modes; MetaMonitorModeSpec spec; MetaMonitorCrtcMode *crtc_modes; } MetaMonitorMode; @@ -777,10 +778,11 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal) crtc_mode_info->height, crtc_mode); mode->id = generate_mode_id (&mode->spec); + mode->n_crtc_modes = 1; mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1); mode->crtc_modes[0] = (MetaMonitorCrtcMode) { .output = output, - .crtc_mode = crtc_mode + .crtc_mode = g_object_ref (crtc_mode) }; /* @@ -1175,8 +1177,9 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled, meta_monitor_create_spec (monitor, width, height, reference_crtc_mode); mode->parent.id = generate_mode_id (&mode->parent.spec); + mode->parent.n_crtc_modes = g_list_length (monitor_priv->outputs); mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode, - g_list_length (monitor_priv->outputs)); + mode->parent.n_crtc_modes); for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) { MetaOutput *output = l->data; @@ -1193,7 +1196,7 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled, mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) { .output = output, - .crtc_mode = tiled_crtc_mode + .crtc_mode = g_object_ref (tiled_crtc_mode) }; is_preferred = (is_preferred && @@ -1309,8 +1312,9 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled, crtc_mode_info->height, crtc_mode); mode->parent.id = generate_mode_id (&mode->parent.spec); + mode->parent.n_crtc_modes = g_list_length (monitor_priv->outputs); mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode, - g_list_length (monitor_priv->outputs)); + mode->parent.n_crtc_modes); for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) { @@ -1320,7 +1324,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled, { mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) { .output = output, - .crtc_mode = crtc_mode + .crtc_mode = g_object_ref (crtc_mode) }; } else @@ -1680,6 +1684,8 @@ static void meta_monitor_mode_free (MetaMonitorMode *monitor_mode) { g_free (monitor_mode->id); + for (int i = 0; i < monitor_mode->n_crtc_modes; i++) + g_clear_object (&monitor_mode->crtc_modes[i].crtc_mode); g_free (monitor_mode->crtc_modes); g_free (monitor_mode); } diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index cc11348b35e6d7f1587bdd89971165ed1cc53d9e..923e539113309e3dbd05c164da89e2da0b42b91d 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -354,3 +354,5 @@ void meta_monitor_set_for_lease (MetaMonitor *monitor, META_EXPORT_TEST gboolean meta_monitor_is_for_lease (MetaMonitor *monitor); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaMonitorSpec, meta_monitor_spec_free) diff --git a/src/backends/meta-output.c b/src/backends/meta-output.c index aca5a42f51847ce51d97e0895b8556798dd8551d..b278d7ecfd47c7bee1c7ed5f6b89a05a1097151c 100644 --- a/src/backends/meta-output.c +++ b/src/backends/meta-output.c @@ -113,6 +113,8 @@ meta_output_info_unref (MetaOutputInfo *output_info) g_free (output_info->serial); g_free (output_info->edid_checksum_md5); g_clear_pointer (&output_info->edid_info, meta_edid_info_free); + for (int i = 0; i < output_info->n_modes; i++) + g_object_unref (output_info->modes[i]); g_free (output_info->modes); g_free (output_info->possible_crtcs); g_free (output_info->possible_clones); diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c index abea9acd65e86bd2058cd7461b7af68226c5b984..d43192b23073f9fc9aa4e80c8c82406191d525ce 100644 --- a/src/backends/meta-screen-cast-stream-src.c +++ b/src/backends/meta-screen-cast-stream-src.c @@ -2083,6 +2083,7 @@ meta_screen_cast_stream_src_dispose (GObject *object) g_clear_pointer (&priv->pipewire_core, pw_core_disconnect); g_clear_pointer (&priv->pipewire_context, pw_context_destroy); g_clear_pointer (&priv->pipewire_source, g_source_destroy); + g_clear_pointer (&priv->redraw_clip, mtk_region_unref); g_warn_if_fail (!priv->dequeued_buffers); diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c index 6c4e3b4b2f5a53fe5c3e21beefd5253e79cd08ab..4aaa85d4e975032d00f728ad1e3f3ba73d844370 100644 --- a/src/backends/native/meta-kms-impl-device.c +++ b/src/backends/native/meta-kms-impl-device.c @@ -1044,6 +1044,7 @@ init_planes (MetaKmsImplDevice *impl_device) drmModeFreePlane (drm_plane); } priv->planes = g_list_reverse (priv->planes); + drmModeFreePlaneResources (drm_planes); } static void diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c index 27b7533a5eb9b5ad2b582b386b51fc309aff26d6..e522947d1b37deb99ebb044fa211a22f2b7ea307 100644 --- a/src/backends/native/meta-output-kms.c +++ b/src/backends/native/meta-output-kms.c @@ -194,13 +194,13 @@ add_common_modes (MetaOutputInfo *output_info, crtc_mode = meta_gpu_kms_get_mode_from_kms_mode (gpu_kms, fallback_mode, META_CRTC_REFRESH_RATE_MODE_VARIABLE); - g_ptr_array_add (array, crtc_mode); + g_ptr_array_add (array, g_object_ref (crtc_mode)); } crtc_mode = meta_gpu_kms_get_mode_from_kms_mode (gpu_kms, fallback_mode, META_CRTC_REFRESH_RATE_MODE_FIXED); - g_ptr_array_add (array, crtc_mode); + g_ptr_array_add (array, g_object_ref (crtc_mode)); } output_info->modes = g_renew (MetaCrtcMode *, output_info->modes, @@ -318,7 +318,7 @@ init_output_modes (MetaOutputInfo *output_info, meta_gpu_kms_get_mode_from_kms_mode (gpu_kms, kms_mode, META_CRTC_REFRESH_RATE_MODE_VARIABLE); - output_info->modes[i++] = crtc_mode; + output_info->modes[i++] = g_object_ref (crtc_mode); if (!output_info->preferred_mode && kms_mode == kms_preferred_mode) output_info->preferred_mode = crtc_mode; } @@ -326,7 +326,7 @@ init_output_modes (MetaOutputInfo *output_info, crtc_mode = meta_gpu_kms_get_mode_from_kms_mode (gpu_kms, kms_mode, META_CRTC_REFRESH_RATE_MODE_FIXED); - output_info->modes[i++] = crtc_mode; + output_info->modes[i++] = g_object_ref (crtc_mode); if (!output_info->preferred_mode && kms_mode == kms_preferred_mode) output_info->preferred_mode = crtc_mode; } diff --git a/src/backends/x11/meta-output-xrandr.c b/src/backends/x11/meta-output-xrandr.c index 5b9b70ed448ffb7c33c0a6d282e7508724b7d7e2..55f32ae1160778c714e247bb49a24e40768c0074 100644 --- a/src/backends/x11/meta-output-xrandr.c +++ b/src/backends/x11/meta-output-xrandr.c @@ -874,7 +874,7 @@ output_info_init_modes (MetaOutputInfo *output_info, { if (sanity_check_duplicate (output_info->modes, n_actual_modes, mode)) { - output_info->modes[n_actual_modes] = mode; + output_info->modes[n_actual_modes] = g_object_ref (mode); n_actual_modes += 1; } else diff --git a/src/tests/meta-monitor-test-utils.c b/src/tests/meta-monitor-test-utils.c index bfd6e8fd331ea941c63ea51d7018bf1bd9df7f6b..243e8a6e3a52670d698c74e3cfb156b5a7f5a897 100644 --- a/src/tests/meta-monitor-test-utils.c +++ b/src/tests/meta-monitor-test-utils.c @@ -727,7 +727,7 @@ meta_create_monitor_test_setup (MetaBackend *backend, int mode_index; mode_index = setup->outputs[i].modes[j]; - modes[j] = g_list_nth_data (test_setup->modes, mode_index); + modes[j] = g_object_ref (g_list_nth_data (test_setup->modes, mode_index)); } n_possible_crtcs = setup->outputs[i].n_possible_crtcs; diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c index 9392e1b89604c001e8ad9997e7f22d9e46192b76..bf29d2df59c0d545b7653eef563b733edbef313d 100644 --- a/src/wayland/meta-wayland-outputs.c +++ b/src/wayland/meta-wayland-outputs.c @@ -536,24 +536,26 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor, for (l = monitors; l; l = l->next) { MetaMonitor *monitor = l->data; - MetaMonitorSpec *monitor_spec = meta_monitor_get_spec (monitor); - MetaWaylandOutput *wayland_output = NULL; + MetaMonitorSpec *lookup_monitor_spec = meta_monitor_get_spec (monitor); + g_autoptr (MetaMonitorSpec) monitor_spec = NULL; + g_autoptr (MetaWaylandOutput) wayland_output = NULL; if (!meta_monitor_is_active (monitor)) continue; - if (compositor->outputs) - wayland_output = g_hash_table_lookup (compositor->outputs, monitor_spec); - - if (wayland_output) - g_hash_table_steal (compositor->outputs, monitor_spec); - else - wayland_output = meta_wayland_output_new (compositor, monitor); + if (!compositor->outputs || + !g_hash_table_steal_extended (compositor->outputs, lookup_monitor_spec, + (gpointer *) &monitor_spec, + (gpointer *) &wayland_output)) + { + monitor_spec = meta_monitor_spec_clone (lookup_monitor_spec), + wayland_output = meta_wayland_output_new (compositor, monitor); + } wayland_output_update_for_output (wayland_output, monitor); g_hash_table_insert (new_table, - meta_monitor_spec_clone (monitor_spec), - wayland_output); + g_steal_pointer (&monitor_spec), + g_steal_pointer (&wayland_output)); } if (compositor->outputs)