diff -uNr thunar-1.8.15.orig/docs/Thunar.xml thunar-1.8.15/docs/Thunar.xml --- thunar-1.8.15.orig/docs/Thunar.xml 2020-05-10 17:54:14.000000000 +0800 +++ thunar-1.8.15/docs/Thunar.xml 2021-05-21 16:07:29.326702880 +0800 @@ -48,9 +48,9 @@ Invocation - Thunar takes a list of URIs for folders that should be - opened in new file manager windows or files that should be run using the default application for their - types. The URIs may be specified as either file: + Thunar takes a list of URIs for files/folders that should be + opened in new file manager windows. + The URIs may be specified as either file: or trash: URIs, absolute paths or paths relative to the current directory from which Thunar is being invoked. If no URIs are specified, the current folder will be opened in a new file manager window. diff -uNr thunar-1.8.15.orig/thunar/thunar-application.c thunar-1.8.15/thunar/thunar-application.c --- thunar-1.8.15.orig/thunar/thunar-application.c 2020-05-24 20:27:08.000000000 +0800 +++ thunar-1.8.15/thunar/thunar-application.c 2021-05-21 16:15:06.977921451 +0800 @@ -207,6 +207,7 @@ #endif GList *files_to_launch; + ThunarApplicationProcessAction process_file_action; guint dbus_owner_id_xfce; guint dbus_owner_id_fdo; @@ -276,6 +277,7 @@ * in the primary instance anyways */ application->files_to_launch = NULL; + application->process_file_action = THUNAR_APPLICATION_SELECT_FILES; application->progress_dialog = NULL; application->preferences = NULL; @@ -529,7 +531,7 @@ } else if (filenames != NULL) { - if (!thunar_application_process_filenames (application, cwd, filenames, NULL, NULL, &error)) + if (!thunar_application_process_filenames (application, cwd, filenames, NULL, NULL, &error,THUNAR_APPLICATION_SELECT_FILES)) { /* we failed to process the filenames or the bulk rename failed */ g_application_command_line_printerr (command_line, "Thunar: %s\n", error->message); @@ -537,7 +539,7 @@ } else if (!daemon) { - if (!thunar_application_process_filenames (application, cwd, cwd_list, NULL, NULL, &error)) + if (!thunar_application_process_filenames (application, cwd, cwd_list, NULL, NULL, &error,THUNAR_APPLICATION_SELECT_FILES)) { /* we failed to process the filenames or the bulk rename failed */ g_application_command_line_printerr (command_line, "Thunar: %s\n", error->message); @@ -1507,8 +1509,27 @@ } else { - /* try to open the file or directory */ - thunar_file_launch (target_file, screen, startup_id, &error); + if (application->process_file_action == THUNAR_APPLICATION_LAUNCH_FILES) + { + /* try to launch the file / open the directory */ + thunar_file_launch (target_file, screen, startup_id, &error); + } + else if (thunar_file_is_directory (file)) + { + thunar_application_open_window (application, file, screen, startup_id, FALSE); + } + else + { + /* Note that for security reasons we do not execute files passed via command line */ + /* Lets rather open the containing directory */ + ThunarFile *parent = thunar_file_get_parent (file, NULL); + + if (G_LIKELY (parent != NULL)) + { + thunar_application_open_window (application, parent, screen, startup_id, FALSE); + g_object_unref (parent); + } + } /* remove the file from the list */ application->files_to_launch = g_list_delete_link (application->files_to_launch, @@ -1577,18 +1598,20 @@ * @startup_id : startup id to finish startup notification and properly focus the * window when focus stealing is enabled or %NULL. * @error : return location for errors or %NULL. + * @action : action to invoke on the files * * Tells @application to process the given @filenames and launch them appropriately. * * Return value: %TRUE on success, %FALSE if @error is set. **/ gboolean -thunar_application_process_filenames (ThunarApplication *application, - const gchar *working_directory, - gchar **filenames, - GdkScreen *screen, - const gchar *startup_id, - GError **error) +thunar_application_process_filenames (ThunarApplication *application, + const gchar *working_directory, + gchar **filenames, + GdkScreen *screen, + const gchar *startup_id, + GError **error, + ThunarApplicationProcessAction action) { ThunarFile *file; GError *derror = NULL; @@ -1660,7 +1683,10 @@ /* start processing files if we have any to launch */ if (application->files_to_launch != NULL) - thunar_application_process_files (application); + { + application->process_file_action = action; + thunar_application_process_files (application); + } /* free the file list */ g_list_free (file_list); diff -uNr thunar-1.8.15.orig/thunar/thunar-application.h thunar-1.8.15/thunar/thunar-application.h --- thunar-1.8.15.orig/thunar/thunar-application.h 2020-05-10 17:54:14.000000000 +0800 +++ thunar-1.8.15/thunar/thunar-application.h 2021-05-21 16:18:56.761466323 +0800 @@ -31,6 +31,12 @@ typedef struct _ThunarApplicationClass ThunarApplicationClass; typedef struct _ThunarApplication ThunarApplication; +typedef enum +{ + THUNAR_APPLICATION_LAUNCH_FILES, + THUNAR_APPLICATION_SELECT_FILES +} ThunarApplicationProcessAction; + #define THUNAR_TYPE_APPLICATION (thunar_application_get_type ()) #define THUNAR_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), THUNAR_TYPE_APPLICATION, ThunarApplication)) #define THUNAR_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), THUNAR_TYPE_APPLICATION, ThunarApplicationClass)) @@ -74,7 +80,8 @@ gchar **filenames, GdkScreen *screen, const gchar *startup_id, - GError **error); + GError **error, + ThunarApplicationProcessAction action); void thunar_application_rename_file (ThunarApplication *application, ThunarFile *file, diff -uNr thunar-1.8.15.orig/thunar/thunar-dbus-service.c thunar-1.8.15/thunar/thunar-dbus-service.c --- thunar-1.8.15.orig/thunar/thunar-dbus-service.c 2020-05-10 17:54:14.000000000 +0800 +++ thunar-1.8.15/thunar/thunar-dbus-service.c 2021-05-21 16:19:54.537347954 +0800 @@ -991,7 +991,7 @@ { /* let the application process the filenames */ application = thunar_application_get (); - thunar_application_process_filenames (application, working_directory, filenames, screen, startup_id, &error); + thunar_application_process_filenames (application, working_directory, filenames, screen, startup_id, &error,THUNAR_APPLICATION_LAUNCH_FILES); g_object_unref (G_OBJECT (application)); /* release the screen */