[gnome-commander/gcmd-1-10] Variable renaming, remove action from action group for action entries in popup



commit 02bfc9af62b1307364a0c3c7eaa389c9a9827676
Author: Uwe Scholz <u scholz83 gmx de>
Date:   Sun May 17 21:47:23 2020 +0200

    Variable renaming, remove action from action group for action entries in popup

 src/gnome-cmd-file-popmenu.cc | 97 +++++++++++++++++++++++--------------------
 1 file changed, 51 insertions(+), 46 deletions(-)
---
diff --git a/src/gnome-cmd-file-popmenu.cc b/src/gnome-cmd-file-popmenu.cc
index feda56f9..6af3bca4 100644
--- a/src/gnome-cmd-file-popmenu.cc
+++ b/src/gnome-cmd-file-popmenu.cc
@@ -53,8 +53,8 @@ struct OpenWithData
 struct ScriptData
 {
     GList *files;
-    const char *name;
-    gboolean term;
+    char *path;
+    gboolean inTerminal;
 };
 
 static GtkMenuClass *parent_class = nullptr;
@@ -292,49 +292,49 @@ static void on_execute (GtkMenuItem *menu_item, GList *files)
 }
 
 
-static void on_execute_script (GtkMenuItem *menu_item, ScriptData *data)
+static void on_execute_script (GtkMenuItem *menuItem, ScriptData *scriptData)
 {
     GdkModifierType mask;
 
     gdk_window_get_pointer (nullptr, nullptr, nullptr, &mask);
 
-    auto files = data->files;
     char *dirName = nullptr;
 
-    string quotationMarks = data->term ? "\\\"" : "\"";
+    string quotationMarks = scriptData->inTerminal ? "\\\"" : "\"";
 
     if (state_is_shift (mask))
     {
         // Run script per file
-        for (; files; files = files->next)
+        for (auto files = scriptData->files; files; files = files->next)
         {
-            auto f = static_cast<GnomeCmdFile*> (files->data);
-            dirName = f->get_dirname ();
-            string command (data->name);
-            command.append (" ").append (quotationMarks).append (f->get_name ()).append (quotationMarks);
+            auto gnomeCmdFile = static_cast<GnomeCmdFile*> (files->data);
+            string command (scriptData->path);
+            command.append (" ").append (quotationMarks).append (gnomeCmdFile->get_name ()).append 
(quotationMarks);
 
-            run_command_indir (command.c_str (), dirName, data->term);
+            dirName = gnomeCmdFile->get_dirname (); // must be g_free'd
+            run_command_indir (command.c_str (), dirName, scriptData->inTerminal);
             g_free(dirName);
         }
     }
     else
     {
         // Run script with list of files
-        string commandString (data->name);
+        string commandString (scriptData->path);
         commandString.append (" ");
-        dirName = static_cast<GnomeCmdFile*> (data->files->data)->get_dirname ();
-        for (; files; files = files->next)
+        for (auto files = scriptData->files; files; files = files->next)
         {
-            auto f = static_cast<GnomeCmdFile*> (files->data);
-            commandString.append (quotationMarks).append(f->get_name ()).append (quotationMarks).append (" 
");
+            auto gnomeCmdFile = static_cast<GnomeCmdFile*> (files->data);
+            commandString.append (quotationMarks).append(gnomeCmdFile->get_name ()).append 
(quotationMarks).append (" ");
         }
 
-        run_command_indir (commandString.c_str (), dirName, data->term);
+        dirName = static_cast<GnomeCmdFile*> (scriptData->files->data)->get_dirname (); // must be g_free'd
+        run_command_indir (commandString.c_str (), dirName, scriptData->inTerminal);
         g_free(dirName);
     }
 
-    g_list_free (data->files);
-    g_free ((gpointer) data->name);
+    // ToDo: free also the other scriptData structs
+    g_list_free (scriptData->files);
+    g_free ((gpointer) scriptData->path);
 }
 
 
@@ -589,24 +589,25 @@ inline gchar *get_default_application_action_label (GnomeCmdFile *gnomeCmdFile)
     return retval;
 }
 
-inline GList *get_list_of_action_scripts(const gchar* userDir)
+inline GList *get_list_of_action_script_file_names(const gchar* scriptsDir)
 {
-    DIR *dp = opendir (userDir);
+    DIR *dp = opendir (scriptsDir);
     GList *scriptList = nullptr;
     if (dp != nullptr)
     {
         struct dirent *directoryEntry;
         while ((directoryEntry = readdir (dp)))
         {
+            char *fileName = directoryEntry->d_name;
             struct stat buf;
-            string script_path (userDir);
-            script_path.append ("/").append (directoryEntry->d_name);
-            if (stat (script_path.c_str(), &buf) == 0)
+            string scriptPath (scriptsDir);
+            scriptPath.append ("/").append (fileName);
+            if (stat (scriptPath.c_str(), &buf) == 0)
             {
                 if (buf.st_mode & S_IFREG)
                 {
-                    DEBUG('p', "Adding \'%s\' to the list of scripts.\n", script_path.c_str());
-                    scriptList = g_list_append (scriptList, g_strdup(directoryEntry->d_name));
+                    DEBUG('p', "Adding \'%s\' to the list of scripts.\n", scriptPath.c_str());
+                    scriptList = g_list_append (scriptList, g_strdup(fileName));
                 }
             }
         }
@@ -618,8 +619,8 @@ inline GList *get_list_of_action_scripts(const gchar* userDir)
 inline guint add_action_script_entries(GtkUIManager *uiManager, GList *files)
 {
     guint pos = 0;
-    auto userDir = g_build_filename (g_get_user_config_dir (), SCRIPT_DIRECTORY, nullptr);
-    auto scriptList = get_list_of_action_scripts(userDir);
+    auto scriptsDir = g_build_filename (g_get_user_config_dir (), SCRIPT_DIRECTORY, nullptr);
+    auto scriptFileNames = get_list_of_action_script_file_names(scriptsDir);
 
     static guint mergeIdActionScripts = 0;
     if (mergeIdActionScripts != 0)
@@ -632,16 +633,17 @@ inline guint add_action_script_entries(GtkUIManager *uiManager, GList *files)
     static GtkActionGroup *dynamicActionGroup = gtk_action_group_new ("actionScripts");
     gtk_ui_manager_insert_action_group (uiManager, dynamicActionGroup, 0);
 
-    for (GList *script = scriptList; script; script = script->next)
+    for (GList *scriptFileName = scriptFileNames; scriptFileName; scriptFileName = scriptFileName->next)
     {
-        ScriptData *scriptData = g_new0 (ScriptData, 1);
+        auto scriptData = g_new0 (ScriptData, 1);
         scriptData->files = files;
 
-        string scriptPathName (userDir);
-        scriptPathName.append ("/").append ((char*) script->data);
-        scriptData->name = g_strdup (scriptPathName.c_str());
+        string scriptPath (scriptsDir);
+        scriptPath.append ("/").append ((char*) scriptFileName->data);
+        scriptData->path = g_strdup (scriptPath.c_str());
 
-        FILE *fileStream = fopen (scriptData->name, "r");
+        char *scriptName = nullptr;
+        FILE *fileStream = fopen (scriptData->path, "r");
         if (fileStream)
         {
             char buf[256];
@@ -650,32 +652,35 @@ inline guint add_action_script_entries(GtkUIManager *uiManager, GList *files)
                 if (strncmp (buf, "#name:", 6) == 0)
                 {
                     buf[strlen (buf)-1] = '\0';
-                    g_free ((gpointer) script->data);
-                    script->data = g_strdup (buf+7);
+                    // Script name given inside the script file
+                    scriptName = g_strdup (buf+7);
                 }
                 else if (strncmp (buf, "#term:", 6) == 0)
                 {
-                    scriptData->term = strncmp (buf + 7, "true", 4) == 0;
+                    scriptData->inTerminal = strncmp (buf + 7, "true", 4) == 0;
                 }
             }
             fclose (fileStream);
         }
 
+        auto dynAction = gtk_action_new (scriptName, scriptName, nullptr, GTK_STOCK_EXECUTE);
 
-        // Only add the script to the ActionGroup if it wasn't added before
-        if (!gtk_action_group_get_action (dynamicActionGroup, (gchar*) script->data))
+        // remove action if it was added in a previous run of this method
+        if (gtk_action_group_get_action (dynamicActionGroup, scriptName))
         {
-            auto dynAction = gtk_action_new ((gchar*) script->data, (gchar*) script->data, nullptr, 
GTK_STOCK_EXECUTE);
-            g_signal_connect (dynAction, "activate", G_CALLBACK (on_execute_script), scriptData);
-            gtk_action_group_add_action (dynamicActionGroup, dynAction);
+            gtk_action_group_remove_action(dynamicActionGroup, dynAction);
         }
 
-        gtk_ui_manager_add_ui (uiManager, mergeIdActionScripts, "/FilePopup/ActionScripts", (gchar*) 
script->data,
-                               (gchar*) script->data, GTK_UI_MANAGER_AUTO, true);
+        g_signal_connect (dynAction, "activate", G_CALLBACK (on_execute_script), scriptData);
+        gtk_action_group_add_action (dynamicActionGroup, dynAction);
+
+        gtk_ui_manager_add_ui (uiManager, mergeIdActionScripts, "/FilePopup/ActionScripts", scriptName,
+                               scriptName, GTK_UI_MANAGER_AUTO, true);
+        g_free(scriptName);
         pos++;
     }
-    g_free (userDir);
-    g_list_free (scriptList);
+    g_free (scriptsDir);
+    g_list_free_full(scriptFileNames, g_free);
 
     return pos;
 }


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