[gnome-disk-utility] Restrict maximal label length if known



commit 39538a572ac9e894e5b1ac1df19b6717217d23b7
Author: Kai Lüke <kailueke riseup net>
Date:   Sun Apr 9 17:45:42 2017 +0200

    Restrict maximal label length if known
    
    Too long filesystem labels are simply cut when they are set, but there
    was no indication for this in the GUI.
    
    The respective dialogs now restrict the maximal FS label length.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=689360

 src/disks/gducreatefilesystemwidget.c |    6 ++++-
 src/disks/gdufilesystemdialog.c       |    9 ++++++++
 src/libgdu/gduutils.c                 |   36 +++++++++++++++++++++++++++++++++
 src/libgdu/gduutils.h                 |    5 ++++
 4 files changed, 55 insertions(+), 1 deletions(-)
---
diff --git a/src/disks/gducreatefilesystemwidget.c b/src/disks/gducreatefilesystemwidget.c
index 55803e6..a6d9aa0 100644
--- a/src/disks/gducreatefilesystemwidget.c
+++ b/src/disks/gducreatefilesystemwidget.c
@@ -15,6 +15,7 @@
 #include <gdk/gdkx.h>
 #include <stdlib.h>
 
+#include "gduutils.h"
 #include "gduapplication.h"
 #include "gduwindow.h"
 #include "gducreatefilesystemwidget.h"
@@ -194,7 +195,6 @@ update (GduCreateFilesystemWidget *widget)
                                    GTK_ENTRY_ICON_SECONDARY,
                                    NULL);
 
-  name = gtk_entry_get_text (GTK_ENTRY (widget->name_entry));
   passphrase = gtk_entry_get_text (GTK_ENTRY (widget->passphrase_entry));
 
   id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (widget->type_combobox));
@@ -260,6 +260,10 @@ update (GduCreateFilesystemWidget *widget)
       has_info = TRUE;
     }
 
+  _gtk_entry_buffer_truncate_bytes (gtk_entry_get_buffer (GTK_ENTRY (widget->name_entry)),
+                                    gdu_utils_get_max_label_length (fstype));
+  name = gtk_entry_get_text (GTK_ENTRY (widget->name_entry));
+
   if (show_name_widgets)
     {
       gtk_widget_show (widget->name_label);
diff --git a/src/disks/gdufilesystemdialog.c b/src/disks/gdufilesystemdialog.c
index c3c5a5c..8db4705 100644
--- a/src/disks/gdufilesystemdialog.c
+++ b/src/disks/gdufilesystemdialog.c
@@ -11,6 +11,7 @@
 
 #include <glib/gi18n.h>
 
+#include "gduutils.h"
 #include "gduapplication.h"
 #include "gduwindow.h"
 #include "gdufilesystemdialog.h"
@@ -23,6 +24,7 @@ typedef struct
 {
   GtkWidget *dialog;
   gchar *orig_label;
+  guint label_max_length;
 } ChangeFilesystemLabelData;
 
 static void
@@ -32,6 +34,9 @@ on_change_filesystem_label_entry_changed (GtkEditable *editable,
   ChangeFilesystemLabelData *data = user_data;
   gboolean sensitive;
 
+  _gtk_entry_buffer_truncate_bytes (gtk_entry_get_buffer (GTK_ENTRY (editable)),
+                                    data->label_max_length);
+
   sensitive = FALSE;
   if (g_strcmp0 (gtk_entry_get_text (GTK_ENTRY (editable)), data->orig_label) != 0)
     {
@@ -77,6 +82,7 @@ gdu_filesystem_dialog_show (GduWindow    *window,
   const gchar *label;
   ChangeFilesystemLabelData data;
   const gchar *label_to_set;
+  gchar *fstype;
 
   block = udisks_object_peek_block (object);
   filesystem = udisks_object_peek_filesystem (object);
@@ -99,6 +105,9 @@ gdu_filesystem_dialog_show (GduWindow    *window,
   memset (&data, '\0', sizeof (ChangeFilesystemLabelData));
   data.dialog = dialog;
   data.orig_label = g_strdup (label);
+  fstype = udisks_block_dup_id_type (block);
+  data.label_max_length = gdu_utils_get_max_label_length (fstype);
+  g_free (fstype);
 
   gtk_entry_set_text (GTK_ENTRY (entry), label);
   gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
diff --git a/src/libgdu/gduutils.c b/src/libgdu/gduutils.c
index f1940ad..ee29af8 100644
--- a/src/libgdu/gduutils.c
+++ b/src/libgdu/gduutils.c
@@ -780,6 +780,42 @@ gdu_utils_is_ntfs_available (void)
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+guint
+gdu_utils_get_max_label_length (const gchar *fstype)
+{
+  guint max_length = G_MAXUINT;
+
+  if (g_strcmp0 (fstype, "exfat") == 0)
+    {
+      max_length = 15;
+    }
+  else if (g_strcmp0 (fstype, "vfat") == 0)
+    {
+      max_length = 11;
+    }
+
+  return max_length;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+gboolean
+_gtk_entry_buffer_truncate_bytes (GtkEntryBuffer *gtk_entry_buffer,
+                                  guint           max_bytes)
+{
+  guint max_utf8_length = max_bytes;
+
+  while (gtk_entry_buffer_get_bytes (gtk_entry_buffer) > max_bytes)
+    {
+      gtk_entry_buffer_delete_text (gtk_entry_buffer, max_utf8_length, -1);
+      max_utf8_length--;
+    }
+
+  return max_utf8_length != max_bytes;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 #ifdef __GNUC_PREREQ
 # if __GNUC_PREREQ(4,6)
 #  pragma GCC diagnostic pop
diff --git a/src/libgdu/gduutils.h b/src/libgdu/gduutils.h
index 060cd0c..707da51 100644
--- a/src/libgdu/gduutils.h
+++ b/src/libgdu/gduutils.h
@@ -62,6 +62,11 @@ gboolean        gdu_utils_show_confirmation (GtkWindow    *parent_window,
 
 gboolean gdu_utils_is_ntfs_available (void);
 
+guint gdu_utils_get_max_label_length (const gchar *fstype);
+
+gboolean _gtk_entry_buffer_truncate_bytes (GtkEntryBuffer *gtk_entry_buffer,
+                                           guint           max_bytes);
+
 gboolean gdu_util_is_same_size (GList   *blocks,
                                 guint64 *out_min_size);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]