Table of Contents

xfdesktop: Port to GIO

References to ThunarVFS

main.c

Calls thunar_vfs_init() and thunar_vfs_shutdown(). Those calls can be removed.

xfce-desktop.c

xfce_desktop_setup_icon_view()

Use a GFile instead of a ThunarVfsPath when creating the file icon manager. Pass the GFile to the manager object instead of the ThunarVfsPath.

xfdesktop-clipboard-manager.c

XfdesktopClipboardPasteRequest

Use a GFile instead of the ThunarVfsPath for the target_path struct member.

xfdesktop_clipboard_manager_get_callback()

Make xfdesktop_file_utils_file_icon_list_to_path_list() return a list of GFile objects. Reuse thunar_g_file_list_to_string() instead of using thunar_vfs_path_list_to_string(). Use g_list_foreach() and g_list_free() instead of thunar_vfs_path_list_free().

xfdesktop-file-icon.{c,h}

xfdesktop_file_icon_finalize()

There's no need for cancelling jobs if we don't use jobs anymore. Instead we'll use the new D-Bus methods that have been added to Thunar. When using those we can just fire and forget.

xfdesktop_file_icon_activated()

We don't need the file info here. Just launch the file using Thunar's Launch() D-Bus method. Add an interface method get_file and make it return a GFile. Use this GFile to compute the URI to be passed to Launch().

Make the interface method peek_info return a GFileInfo.

xfdesktop-file-icon-manager.{c,h}

xfdesktop_file_icon_menu_rename()

Use Thunar's Rename() (or RenameFiles?) D-Bus method. For this we only need the GFile of the icon, not the file info. Use xfdesktop_file_icon_get_file() instead of xfdesktop_file_icon_peek_info().

xfdesktop_file_icon_manager_trash_files()

Again, use xfdesktop_file_icon_get_file() instead of xfdesktop_file_icon_peek_info() to obtain the URIs of the files supposed to be trashed.

xfdesktop_file_icon_menu_mime_app_executed()

Use GAppInfo instead of ThunarVfsMimeApplication and call g_app_info_launch() instead of thunar_vfs_mime_handler_exec(). Make sure to change the working directory before and after this call (similar to how Thunar does it).

xfdesktop_menu_item_from_mime_handler()

Replace this method with a similar one based on GAppInfo instead of ThunarVfsMimeApplication.

xfdesktop_file_icon_menu_open_folder()

We don't need the ThunarVfsInfo here. Use xfdesktop_file_icon_get_file() instead of xfdesktop_file_icon_peek_info(). Make xfdesktop_file_utils_open_folder() take a GFile instead of a ThunarVfsInfo.

xfdesktop_file_icon_menu_open_desktop()

See the previous function.

xfdesktop_file_icon_menu_other_app()

Again, we only need the GFile, not the file info, in order to obtain the file URI. Replace xfdesktop_file_icon_peek_info() with xfdesktop_file_icon_get_file() and ThunarVfsInfo/ThunarVfsPath with GFile.

xfdesktop_file_icon_menu_properties()

Again, we only need the GFile to obtain the URI. Don't use the no-D-Bus-fallback properties dialog (what's it good for? Thunar should always be running for other parts of xfdesktop to be working anyway).

xfdesktop_file_icon_create_directory_error()

Remove this function. We'll create directories through the Thunar D-Bus API. We'll probably have to add another D-Bus method for creating directories.

xfdesktop_file_icon_menu_create_launcher()

Use a GFile instead of the ThunarVfsInfo and ThunarVfsPath to obtain the file URI. Feed exo-desktop-item-edit with the URI instead of a local path. The function launcher_dialog_item_button_clicked() in xfce4-panel/plugins/launcher/launcher-dialog.c has an example of how we can do this.

xfdesktop_file_icon_menu_create_folder()

Create the directory using a new Thunar D-Bus method instead of implementing this feature in xfdesktop internally. We'll have to create the D-Bus method first. It should be called CreateFolder() or CreateFile() (with a type parameter). Need to think about this a bit more.

xfdesktop_file_icon_create_file_error()

Remove this function.

xfdesktop_file_icon_interactive_job_ask()

Remove this function.

xfdesktop_file_icon_template_item_activated()

TODO: This needs more thought. Thunar implements the same functionality, so maybe we can reuse its implementation through D-Bus. If not, then at least the ThunarVFS stuff should be replaced with GFile and GFileInfo. The calls to thunar_vfs_copy_file() and thunar_vfs_create_file() should be replaced with Thunar D-Bus method calls.

info_compare()

If this is still needed after the other refactorings, make it compare GFileInfo objects instead of ThunarVfsInfo structs.

xfdesktop_file_icon_menu_fill_template_menu()

Use GFile, GFileEnumerator and GFileInfo instead of the corresponding ThunarVFS structures. Maybe we can reuse some code from Thunar implementing the same thing.

xfdesktop_file_icon_manager_populate_context_menu()

Use GFileInfo instead of ThunarVfsInfo and GFile instead of ThunarVfsPath. Use GAppInfo instead of ThunarVfsMimeDatabase and ThunarVfsMimeHandler/ThunarVfsMimeApplication.

xfdesktop_file_icon_manager_add_icon()

Use GFile instead of ThunarVfsInfo.

xfdesktop_file_icon_manager_add_regular_icon()

Use GFileInfo to query the content type and GFile instead of ThunarVfsPath to query the file path passed to XfceRc.

xfdesktop_file_icon_manager_add_volume_icon()

Use GVolume instead of ThunarVfsVolume.

xfdesktop_file_icon_manager_vfs_monitor_cb()

Replace this with a monitor callback for GFileMonitor.

xfdesktop_file_icon_manager_listdir_infos_ready_cb()

This function will have to be replaced with something similar because we cannot use the list dir job from ThunarVfsJob anymore.

xfdesktop_file_icon_manager_listdir_finished_cb()

This function will have to be replaced with something similar because we cannot use the list dir job from ThunarVfsJob anymore.

xfdesktop_file_icon_manager_listdir_error_cb()

This function will have to be replaced with something similar because we cannot use the list dir job from ThunarVfsJob anymore.

xfdesktop_file_icon_manager_load_desktop_folder()

Asynchronously load the folder using GFileEnumerator.

xfdesktop_file_icon_manager_volume_changed()

Replace this function with a similar one based on GVolumeMonitor.

xfdesktop_file_icon_manager_add_removable_volume()

The calls to thunar_vfs_is_removable() and thunar_vfs_volume_is_present() need to be replaced with something similar based on GVolume. Thunar has the same problem solved with this code:

xfdesktop_file_icon_manager_volumes_added()

This will be replaced with a handler for the volume-added signal of GVolumeMonitor which should call xfdesktop_file_icon_manager_add_removable_volume() as well.

xfdesktop_file_icon_manager_volumes_removed()

Similar to the previous function, this one should be replaced with one that handles a single GVolume volume only.

xfdesktop_file_icon_manager_load_removable_media()

Use the GVolumeMonitor here and connect to the right signals. We'll need new callbacks for some of them.

xfdesktop_file_icon_manager_remove_removable_media()

Needs to iterate over the volumes hash table, disconnect from all returned volumes, destroy all volume icons and disconnect from the GVolumeMonitor.

xfdesktop_file_icon_manager_real_init()

Get rid of the ThunarVfsMimeDatabase and the global ThunarVfsVolumeManager. The hash table needs to use either URIs or GFile as well as the right hash and equal functions for them. URIs are easier due to the availability of string hash and equal functions, I guess.

We'll have to change the ThunarVfsInfo parameter of xfdesktop_regular_file_icon_new() to a GFile or GFileInfo. We can use g_file_new_for_path() instead of thunar_vfs_info_new_for_path() here when creating the GFile for the desktop folder, if the folder member isn't a GFile already.

xfdesktop_file_icon_manager_fini()

The counterpart to the previous function. Same deal.

xfdesktop_file_icon_manager_drag_drop()

Use 'xfdesktop_file_icon_peek_file() instead of …_peek_info(). The file type can then be determined with g_file_query_file_type().

Use g_file_get_child() instead of thunar_vfs_path_relative() and g_file_get_uri() instead of thunar_vfs_path_dup_uri().

xfdesktop_file_icon_manager_drag_data_received()

Use …_peek_file() and …_peek_info() (we need both this time around) and GFile functions instead of ThunarVfsPath. To convert the string list into a list of GFile objects, we can use something similar to Thunar's solution:

We'll need a bit of custom code to execute the executable target file with the dropped files as parameters. There are two possibilities: either the target is a desktop entry, then we can parse it into a GDesktopAppInfo, or it is a regular executable file, then we can simply spawn it (make sure to pass the file parameters and implement startup notification).

The code block dealing with jobs needs to be reworked around GFile, GFileInfo and the Thunar D-Bus API completely. Maybe danielm's branch implements this already?

xfdesktop_file_icon_manager_drag_data_get()

We need to replace xfdesktop_file_utils_file_icon_list_to_path_list() with something like xfdesktop_file_utils_file_icon_list_to_g_file_list() and then call g_file_list_to_string() instead of thunar_vfs_path_list_to_string(). Again, Thunar can serve as an inspiration here:

xfdesktop_file_icon_manager_new()

Change the ThunarVfsPath parameter to a GFile. That's all.

_XfdesktopFileIconManagerPrivate

Change the ThunarVfsPath folder member to a GFile.

Replace the ThunarVfsMonitor with a GVolumeMonitor and remove the ThunarVfsMonitorHandle.

Remove the ThunarVfsJob *list_job member.

xfdesktop_file_icon_manager_class_init()

Alter the “folder” property so that it becomes an object property using the G_TYPE_FILE object type.

xfdesktop_file_icon_manager_set_property()

Change the “folder” property code to reflect the changes to the property type made in the class_init function.

xfdesktop_file_icon_manager_get_property()

Same here, see above.

xfdesktop_file_icon_manager_finalize()

Use g_object_unref() instead of thunar_vfs_path_unref().

xfdesktop_file_icon_manager_check_create_desktop_folder()

Replace the code with something similar based on GFile, g_file_query_exists(), g_file_query_file_type() and g_file_make_directory().

xfdesktop-file-properties-dialog.{c,h}

Remove entirely. We'll re-use Thunar's properties dialog via its D-Bus API.

xfdesktop-file-utils.{c,h}

xfdesktop_file_utils_interactive_job_ask()

Remove. We'll no longer implement anything job-related in xfdesktop itself.

xfdesktop_file_utils_handle_fileop_error()

Remove as well.

xfdesktop_file_utils_get_file_kind()

If this is still needed after refactoring, then make it take a GFileInfo and rewrite the checks based on GFileInfo attributes.

xfdesktop_file_utils_file_icon_list_to_path_list()

Replace with a function called xfdesktop_file_utils_file_icon_list_to_g_file_list() that creates a list of GFile objects.

xfdesktop_file_utils_get_fallback_icon()

No longer needed, remove. g_file_info_get_icon() always returns a valid GIcon.

xfdesktop_file_utils_get_file_icon()

We have two options here: either remove and use g_file_info_get_icon() or make it load and return a GdkPixbuf from the GIcon.

TODO We'll have to investigate where xfdesktop_file_utils_get_file_icon() is being used and how.

xfdesktop_file_utils_launch_fallback()

Remove. We don't use a D-Bus fallback here as we rely on the D-Bus API of Thunar so hard that we can't provide any real functionality without it anyway.

xfdesktop_file_utils_display_folder_cb()

Remove fallback code.

xfdesktop-regular-file-icon.{c,h}

_XfdesktopRegularFileIconPrivate

Replace the ThunarVfsInfo *info member with GFile and GFileInfo members.

xfdesktop_regular_file_icon_peek_info()

Return a GFileInfo.

xfdesktop_regular_file_icon_update_info()

TODO: Replace the ThunarVfsInfo parameter with GFileInfo. Maybe we also need to add a GFile parameter because GFileInfo contains no path information.

xfdesktop_delete_regular_file_finished()

Remove.

xfdesktop_regular_file_icon_finalize()

Call g_object_unref() instead of thunar_vfs_info_unref(). Also release the new GFile member.

xfdesktop_regular_file_icon_tfi_init()

Update this to Thunarx 2. Need to set iface→get_file_info, iface→get_filesystem_info and iface→get_location.

xfdesktop_regular_file_icon_peek_pixbuf()

Need to rewrite this to make use of g_file_get_icon() and tumbler. Maybe a new thumbnailer or icon factory class like in thunar could be introduced.

xfdesktop_regular_file_icon_get_allowed_drag_actions()

Use GFileInfo instead of ThunarVfsInfo. Instead of ThunarVfsInfo flags we have to query GFileInfo attributes to determine the readable/writable state of the target icon.

xfdesktop_regular_file_icon_get_allowed_drop_actions()

See the previous function.

xfdesktop_regular_file_icon_drag_job_error()

I don't think we need this any longer. Thunar will display errors for us.

xfdesktop_regular_file_icon_interactive_job_ask()

Remove.

xfdesktop_regular_file_icon_drag_job_finished()

Remove.

xfdesktop_regular_file_icon_do_drop_dest()

Rewrite the code based on GFileInfo and GFile. Use the Thunar D-Bus API to launch executable files. Use a NULL check with g_file_get_parent() to replace the call to thunar_vfs_path_is_root(). Instead of thunar_vfs_move_file(), thunar_vfs_copy_file() etc. use the Thunar D-Bus API.

Instead of implement the Thunar D-Bus client manually we could rely on code generation.

xfdesktop_regular_file_icon_peek_tooltip()

What we need is to read the last modification time, the file type and a human readable version of the size of the file. There are attributes for the modification time, the file type and the file size in GFileInfo. To humanize the file time we can use something similar to what Thunar is doing, for the file size we can use g_format_size_for_display().

xfdesktop_regular_file_can_write_parent()

Here we can simply rewrite the code to use GFile and GFileInfo.

xfdesktop_delete_file_error()

Remove.

xfdesktop_delete_file_finished()

Remove.

xfdesktop_regular_file_icon_delete_file()

Instead of thunar_vfs_unlink_file(), use the Thunar D-Bus API here. Fire and forget.

xfdesktop_regular_file_icon_rename_file()

See previous function.

xfdesktop_regular_file_icon_peek_info()

Change the return type to GFileInfo.

xfdesktop_regular_file_icon_update_info()

TODO: Check how and where this function is being used and what we can do in order to replace the ThunarVfsInfo parameter.

xfdesktop_regular_file_icon_new()

Add a GFile parameter, update the code to use g_object_ref() instead of thunar_vfs_info_ref().

xfdesktop_special_file_icon.{c,h}

_XfdesktopSpecialFileIconPrivate

TODO

xfdesktop_special_file_icon_finalize()

TODO

xfdesktop_special_file_icon_tfi_init()

TODO

xfdesktop_special_file_icon_get_allowed_drag_actions()

TODO: we no longer need the thunar-vfs workaround I think.

xfdesktop_special_file_icon_get_allowed_drop_actions()

TODO

xfdesktop_special_file_icon_drag_job_error()

TODO

xfdesktop_special_file_icon_interactive_job_ask()

TODO

xfdesktop_special_file_icon_drag_job_finished()

TODO

xfdesktop_special_file_icon_do_drop_dest()

TODO

xfdesktop_special_file_icon_peek_tooltip()

TODO

xfdesktop_special_file_icon_peek_info()

TODO

xfdesktop_special_file_icon_new()

TODO

xfdesktop-volume-icon.{c,h}

_XfdesktopVolumeIconPrivate

TODO

xfdesktop_volume_icon_finalize()

TODO

xfdesktop_volume_icon_tfi_init()

TODO

xfdesktop_volume_icon_volume_changed_cb()

TODO

xfdesktop_volume_icon_peek_pixbuf()

TODO

xfdesktop_volume_icon_peek_label()

TODO

xfdesktop_volume_icon_get_allowed_drag_actions()

TODO

xfdesktop_volume_icon_get_allowed_drop_actions()

TODO

xfdesktop_volume_icon_drag_job_error()

TODO

xfdesktop_volume_icon_interactive_job_ask()

TODO

xfdesktop_volume_icon_drag_job_finished()

TODO

xfdesktop_volume_icon_do_drop_dest()

TODO

xfdesktop_volume_icon_peek_tooltip()

TODO

xfdesktop_volume_icon_menu_toggle_mount()

TODO

xfdesktop_volume_icon_menu_eject()

TODO

xfdesktop_volume_icon_populate_context_menu()

TODO

xfdesktop_volume_icon_peek_info()

TODO

xfdesktop_volume_icon_update_info()

TODO

xfdesktop_volume_icon_activated()

TODO

xfdesktop_volume_icon_new()

TODO

xfdesktop_volume_icon_peek_volume()

TODO