[Xfce4-commits] <exo:master> Silenty save to local application is permission denied.

Nick Schermer noreply at xfce.org
Tue Dec 27 17:08:01 CET 2011


Updating branch refs/heads/master
         to 8d3f805170cad14a350155adbd404769298a694b (commit)
       from 4a885644dfd42569f65c95256f8822e5331ca02b (commit)

commit 8d3f805170cad14a350155adbd404769298a694b
Author: Nick Schermer <nick at xfce.org>
Date:   Tue Dec 27 17:04:01 2011 +0100

    Silenty save to local application is permission denied.
    
    Save to $XFCE_RESOURCE_DATA/applications if the file
    location is not writable. This will make editing application
    launchers in /usr/share/applications a lot easier.

 exo-desktop-item-edit/main.c |  122 +++++++++++++++++++++++++++---------------
 1 files changed, 78 insertions(+), 44 deletions(-)

diff --git a/exo-desktop-item-edit/main.c b/exo-desktop-item-edit/main.c
index 602c19d..95841aa 100644
--- a/exo-desktop-item-edit/main.c
+++ b/exo-desktop-item-edit/main.c
@@ -133,6 +133,9 @@ main (int argc, char **argv)
   gsize            length = 0;
   gboolean         res;
   GFileType        file_type;
+  GFile           *gfile_localapps;
+  GFile           *gfile_new;
+  gchar           *localapps;
 
   /* setup translation domain */
   xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -464,59 +467,90 @@ main (int argc, char **argv)
         }
 
       /* try to save the file */
-      if (!exo_die_g_key_file_save (key_file, opt_create_new, gfile, mode, &error)
-          && opt_create_new)
+      if (!exo_die_g_key_file_save (key_file, opt_create_new, gfile, mode, &error))
         {
-          /* reset the error */
-          g_clear_error (&error);
-
-          /* create failed, ask the user to specify a file name */
-          chooser = gtk_file_chooser_dialog_new (_("Choose filename"),
-                                                 GTK_WINDOW (dialog),
-                                                 GTK_FILE_CHOOSER_ACTION_SAVE,
-                                                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                                 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
-                                                 NULL);
-          gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE);
-          gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (chooser), TRUE);
-
-          file_type = g_file_query_file_type (gfile, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL);
-
-          /* if base is a folder, enter the folder */
-          if (file_type == G_FILE_TYPE_DIRECTORY)
+          if (opt_create_new)
             {
-              gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (chooser), gfile, NULL);
-              gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser), "new-file.desktop");
-            }
-          else if (file_type == G_FILE_TYPE_REGULAR)
-            {
-              gfile_parent = g_file_get_parent (gfile);
-              if (G_LIKELY (gfile_parent != NULL))
+              /* reset the error */
+              g_clear_error (&error);
+
+              /* create failed, ask the user to specify a file name */
+              chooser = gtk_file_chooser_dialog_new (_("Choose filename"),
+                                                     GTK_WINDOW (dialog),
+                                                     GTK_FILE_CHOOSER_ACTION_SAVE,
+                                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                                     GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                                     NULL);
+              gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), TRUE);
+              gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (chooser), TRUE);
+
+              file_type = g_file_query_file_type (gfile, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL);
+
+              /* if base is a folder, enter the folder */
+              if (file_type == G_FILE_TYPE_DIRECTORY)
                 {
-                  gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (chooser), gfile_parent, NULL);
-                  g_object_unref (G_OBJECT (gfile_parent));
+                  gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (chooser), gfile, NULL);
+                  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser), "new-file.desktop");
+                }
+              else if (file_type == G_FILE_TYPE_REGULAR)
+                {
+                  gfile_parent = g_file_get_parent (gfile);
+                  if (G_LIKELY (gfile_parent != NULL))
+                    {
+                      gtk_file_chooser_set_current_folder_file (GTK_FILE_CHOOSER (chooser), gfile_parent, NULL);
+                      g_object_unref (G_OBJECT (gfile_parent));
+                    }
+
+                  base_name = g_file_get_basename (gfile);
+                  gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser), base_name);
+                  g_free (base_name);
                 }
 
-              base_name = g_file_get_basename (gfile);
-              gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser), base_name);
-              g_free (base_name);
-            }
+              /* run the chooser */
+              response = gtk_dialog_run (GTK_DIALOG (chooser));
+              if (G_LIKELY (response == GTK_RESPONSE_ACCEPT))
+                {
+                  /* release the previous file name */
+                  if (G_LIKELY (gfile != NULL))
+                    g_object_unref (G_OBJECT (gfile));
 
-          /* run the chooser */
-          response = gtk_dialog_run (GTK_DIALOG (chooser));
-          if (G_LIKELY (response == GTK_RESPONSE_ACCEPT))
-            {
-              /* release the previous file name */
-              if (G_LIKELY (gfile != NULL))
-                g_object_unref (G_OBJECT (gfile));
+                  /* try again to save to the new file */
+                  gfile = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (chooser));
+                  exo_die_g_key_file_save (key_file, FALSE, gfile, mode, &error);
+                }
 
-              /* try again to save to the new file */
-              gfile = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (chooser));
-              exo_die_g_key_file_save (key_file, FALSE, gfile, mode, &error);
+              /* destroy the chooser */
+              gtk_widget_destroy (chooser);
             }
+          else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED))
+            {
+              localapps = xfce_resource_save_location (XFCE_RESOURCE_DATA, "applications/", TRUE);
+              gfile_localapps = g_file_new_for_path (localapps);
 
-          /* destroy the chooser */
-          gtk_widget_destroy (chooser);
+              /* check if the file is not already saved in ~/.local/share/applications */
+              if (!g_file_has_parent (gfile, gfile_localapps))
+                {
+                  /* create local file with the same name */
+                  base_name = g_file_get_basename (gfile);
+                  gfile_new = g_file_get_child (gfile_localapps, base_name);
+
+                  /* silently notify the user we're going to write to a new location */
+                  exo_die_error ("\"%s\" is not writeable, saving to \"%s%s\" instead.",
+                                 argv[1], localapps, base_name);
+
+                  /* reset the error */
+                  g_clear_error (&error);
+
+                  /* try another save */
+                  exo_die_g_key_file_save (key_file, FALSE, gfile_new, mode, &error);
+
+                  g_object_unref (G_OBJECT (gfile_new));
+                  g_free (base_name);
+                }
+
+              g_free (localapps);
+              g_object_unref (G_OBJECT (gfile_localapps));
+            }
         }
 
       /* check if we failed to save/create */


More information about the Xfce4-commits mailing list