* gnu/packages/patches/gnome-control-center-use-udisks-to-get-disk-size.patch: Rename to... * gnu/packages/patches/gnome-control-center-udisks.patch: ... this. * gnu/local.mk (dist_patch_DATA): Adjust accordingly. * gnu/packages/gnome.scm (gnome-control-center)[source]: Likewise.
		
			
				
	
	
		
			221 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| This patch is derived from upstream commit 2520aea6 and fixes upstream issues
 | |
| 285 and 302.  See https://gitlab.gnome.org/GNOME/gcr/merge_requests/387,
 | |
| https://gitlab.gnome.org/GNOME/gnome-control-center/issues/285 and
 | |
| https://gitlab.gnome.org/GNOME/gnome-control-center/issues/302.
 | |
| 
 | |
| diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c
 | |
| index e2276a295b3fd9de01b30fc3369069b5d33ba5b7..ff47c1fef2493bcc7ab34f9e8716d570d8d370ed 100644
 | |
| --- a/panels/info/cc-info-overview-panel.c
 | |
| +++ b/panels/info/cc-info-overview-panel.c
 | |
| @@ -36,6 +36,7 @@
 | |
|  #include <glibtop/mountlist.h>
 | |
|  #include <glibtop/mem.h>
 | |
|  #include <glibtop/sysinfo.h>
 | |
| +#include <udisks/udisks.h>
 | |
|  
 | |
|  #include <gdk/gdk.h>
 | |
|  
 | |
| @@ -81,9 +82,7 @@ typedef struct
 | |
|  
 | |
|    GCancellable   *cancellable;
 | |
|  
 | |
| -  /* Free space */
 | |
| -  GList          *primary_mounts;
 | |
| -  guint64         total_bytes;
 | |
| +  UDisksClient   *client;
 | |
|  
 | |
|    GraphicsData   *graphics_data;
 | |
|  } CcInfoOverviewPanelPrivate;
 | |
| @@ -96,8 +95,6 @@ struct _CcInfoOverviewPanel
 | |
|   CcInfoOverviewPanelPrivate *priv;
 | |
|  };
 | |
|  
 | |
| -static void get_primary_disc_info_start (CcInfoOverviewPanel *self);
 | |
| -
 | |
|  typedef struct
 | |
|  {
 | |
|    char *major;
 | |
| @@ -486,111 +483,51 @@ get_os_type (void)
 | |
|  }
 | |
|  
 | |
|  static void
 | |
| -query_done (GFile               *file,
 | |
| -            GAsyncResult        *res,
 | |
| -            CcInfoOverviewPanel *self)
 | |
| +get_primary_disc_info (CcInfoOverviewPanel *self)
 | |
|  {
 | |
|    CcInfoOverviewPanelPrivate *priv;
 | |
| -  g_autoptr(GFileInfo) info = NULL;
 | |
| -  g_autoptr(GError) error = NULL;
 | |
| -
 | |
| -  info = g_file_query_filesystem_info_finish (file, res, &error);
 | |
| -  if (info != NULL)
 | |
| -    {
 | |
| -      priv = cc_info_overview_panel_get_instance_private (self);
 | |
| -      priv->total_bytes += g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE);
 | |
| -    }
 | |
| -  else
 | |
| -    {
 | |
| -      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
 | |
| -          return;
 | |
| -      else
 | |
| -        {
 | |
| -          g_autofree char *path = NULL;
 | |
| -          path = g_file_get_path (file);
 | |
| -          g_warning ("Failed to get filesystem free space for '%s': %s", path, error->message);
 | |
| -        }
 | |
| -    }
 | |
| +  GDBusObjectManager *manager;
 | |
| +  g_autolist(GDBusObject) objects = NULL;
 | |
| +  GList *l;
 | |
| +  guint64 total_size;
 | |
|  
 | |
| -  /* And onto the next element */
 | |
| -  get_primary_disc_info_start (self);
 | |
| -}
 | |
| -
 | |
| -static void
 | |
| -get_primary_disc_info_start (CcInfoOverviewPanel *self)
 | |
| -{
 | |
| -  GUnixMountEntry *mount;
 | |
| -  g_autoptr(GFile) file = NULL;
 | |
| -  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
 | |
| +  priv = cc_info_overview_panel_get_instance_private (self);
 | |
| +  total_size = 0;
 | |
|  
 | |
| -  if (priv->primary_mounts == NULL)
 | |
| +  if (!priv->client)
 | |
|      {
 | |
| -      g_autofree char *size = NULL;
 | |
| -
 | |
| -      size = g_format_size (priv->total_bytes);
 | |
| -      gtk_label_set_text (GTK_LABEL (priv->disk_label), size);
 | |
| -
 | |
| +      gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown"));
 | |
|        return;
 | |
|      }
 | |
|  
 | |
| -  mount = priv->primary_mounts->data;
 | |
| -  priv->primary_mounts = g_list_remove (priv->primary_mounts, mount);
 | |
| -  file = g_file_new_for_path (g_unix_mount_get_mount_path (mount));
 | |
| -  g_unix_mount_free (mount);
 | |
| -
 | |
| -  g_file_query_filesystem_info_async (file,
 | |
| -                                      G_FILE_ATTRIBUTE_FILESYSTEM_SIZE,
 | |
| -                                      0,
 | |
| -                                      priv->cancellable,
 | |
| -                                      (GAsyncReadyCallback) query_done,
 | |
| -                                      self);
 | |
| -}
 | |
| -
 | |
| -static void
 | |
| -get_primary_disc_info (CcInfoOverviewPanel *self)
 | |
| -{
 | |
| -  GList *points;
 | |
| -  GList *p;
 | |
| -  GHashTable *hash;
 | |
| -  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
 | |
| -
 | |
| -  hash = g_hash_table_new (g_str_hash, g_str_equal);
 | |
| -  points = g_unix_mount_points_get (NULL);
 | |
| -
 | |
| -  /* If we do not have /etc/fstab around, try /etc/mtab */
 | |
| -  if (points == NULL)
 | |
| -    points = g_unix_mounts_get (NULL);
 | |
| +  manager = udisks_client_get_object_manager (priv->client);
 | |
| +  objects = g_dbus_object_manager_get_objects (manager);
 | |
|  
 | |
| -  for (p = points; p != NULL; p = p->next)
 | |
| +  for (l = objects; l != NULL; l = l->next)
 | |
|      {
 | |
| -      GUnixMountEntry *mount = p->data;
 | |
| -      const char *mount_path;
 | |
| -      const char *device_path;
 | |
| -
 | |
| -      mount_path = g_unix_mount_get_mount_path (mount);
 | |
| -      device_path = g_unix_mount_get_device_path (mount);
 | |
| -
 | |
| -      /* Do not count multiple mounts with same device_path, because it is
 | |
| -       * probably something like btrfs subvolume. Use only the first one in
 | |
| -       * order to count the real size. */
 | |
| -      if (gsd_should_ignore_unix_mount (mount) ||
 | |
| -          gsd_is_removable_mount (mount) ||
 | |
| -          g_str_has_prefix (mount_path, "/media/") ||
 | |
| -          g_str_has_prefix (mount_path, g_get_home_dir ()) ||
 | |
| -          g_hash_table_lookup (hash, device_path) != NULL)
 | |
| +      UDisksDrive *drive;
 | |
| +      drive = udisks_object_peek_drive (UDISKS_OBJECT (l->data));
 | |
| +
 | |
| +      /* Skip removable devices */
 | |
| +      if (drive == NULL ||
 | |
| +          udisks_drive_get_removable (drive) ||
 | |
| +          udisks_drive_get_ejectable (drive))
 | |
|          {
 | |
| -          g_unix_mount_free (mount);
 | |
|            continue;
 | |
|          }
 | |
|  
 | |
| -      priv->primary_mounts = g_list_prepend (priv->primary_mounts, mount);
 | |
| -      g_hash_table_insert (hash, (gpointer) device_path, (gpointer) device_path);
 | |
| +      total_size += udisks_drive_get_size (drive);
 | |
|      }
 | |
| -  g_list_free (points);
 | |
| -  g_hash_table_destroy (hash);
 | |
|  
 | |
| -  priv->cancellable = g_cancellable_new ();
 | |
| -  get_primary_disc_info_start (self);
 | |
| +  if (total_size > 0)
 | |
| +    {
 | |
| +      g_autofree gchar *size = g_format_size (total_size);
 | |
| +      gtk_label_set_text (GTK_LABEL (priv->disk_label), size);
 | |
| +    }
 | |
| +  else
 | |
| +    {
 | |
| +      gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown"));
 | |
| +    }
 | |
|  }
 | |
|  
 | |
|  static char *
 | |
| @@ -852,8 +789,7 @@ cc_info_overview_panel_finalize (GObject *object)
 | |
|        g_clear_object (&priv->cancellable);
 | |
|      }
 | |
|  
 | |
| -  if (priv->primary_mounts)
 | |
| -    g_list_free_full (priv->primary_mounts, (GDestroyNotify) g_unix_mount_free);
 | |
| +  g_clear_object (&priv->client);
 | |
|  
 | |
|    g_free (priv->gnome_version);
 | |
|    g_free (priv->gnome_date);
 | |
| @@ -895,6 +831,7 @@ static void
 | |
|  cc_info_overview_panel_init (CcInfoOverviewPanel *self)
 | |
|  {
 | |
|    CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
 | |
| +  g_autoptr(GError) error = NULL;
 | |
|  
 | |
|    gtk_widget_init_template (GTK_WIDGET (self));
 | |
|  
 | |
| @@ -907,6 +844,12 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
 | |
|    else
 | |
|      gtk_widget_destroy (priv->updates_button);
 | |
|  
 | |
| +  priv->client = udisks_client_new_sync (NULL, &error);
 | |
| +
 | |
| +  if (error != NULL)
 | |
| +      g_warning ("Unable to get UDisks client: %s. Disk information will not be available.",
 | |
| +                 error->message);
 | |
| +
 | |
|    info_overview_panel_setup_overview (self);
 | |
|    info_overview_panel_setup_virt (self);
 | |
|  }
 | |
| diff --git a/panels/info/meson.build b/panels/info/meson.build
 | |
| index 03742551314f91b60e3ec1caad153ff314b93310..c54e5fdaff3c6ddb59cca8ee9a2bf5a0212bf196 100644
 | |
| --- a/panels/info/meson.build
 | |
| +++ b/panels/info/meson.build
 | |
| @@ -61,6 +61,7 @@ sources += gnome.compile_resources(
 | |
|  
 | |
|  deps = common_deps + [
 | |
|    polkit_gobject_dep,
 | |
| +  dependency('udisks2', version: '>= 2.1.8'),
 | |
|    dependency('libgtop-2.0')
 | |
|  ]
 | |
|  
 |