Nautilus 43 no longer allows extensions to directly manipulate GTK widgets – all UI changes now need to happen through model objects. If your script implements any of the following provider interfaces, you will need to update it:
The Nautilus.LocationWidgetProvider
was removed without replacement. If your script requires it, you can request a new model-based API for your specific use case on the Nautilus issue tracker.
The get_file_items
, get_file_items_full
, get_background_items
a get_background_items_full
methods of Nautilus.MenuProvider
no longer take the window
argument. Remove it from your implementations.
If you need to keep supporting older versions of Nautilus, you can use variadic arguments:
1 2 3 4 |
def get_file_items(self, *args): # `args` will be `[files: List[Nautilus.FileInfo]]` in Nautilus 4.0 API, # and `[window: Gtk.Widget, files: List[Nautilus.FileInfo]]` in Nautilus 3.0 API. files = args[-1] |
The Nautilus.PropertyPageProvider
was replaced by Nautilus.PropertiesModelProvider
class. Unlike the previous unrestricted property pages that could contain any GTK widget, the new model-based interface currently only supports a pre-defined layout. Scripts can add pages, each of which can display a list of text properties.
Subclass the Nautilus.PropertiesModelProvider
abstract class and have the get_models
method return the list of Nautilus.PropertiesModel
, one for each properties page.
If you need to keep supporting older versions of Nautilus, you can keep the old definition conditionally:
1 2 3 4 5 6 7 |
if hasattr(Nautilus, "PropertiesModelProvider"): # For Nautilus 4.0 API class MD5SumPropertiesModel(GObject.GObject, Nautilus.PropertiesModelProvider): ... else: class MD5SumPropertyPage(GObject.GObject, Nautilus.PropertyPageProvider): ... |
If you use GTK directly, e.g. to create dialogue windows, you will need to upgrade the code to GTK 4 as well, since Nautilus switched to GTK 4 and it is not possible to use multiple versions of GTK in the same process. Do not forget to replace gi.require_version("Gtk", "3.0")
with gi.require_version("Gtk", "4.0")
, then.
The other option is moving the window and dialogues into a separate program and having the extension just launch it. But unless the code base is very large, migrating to GTK 4 will probably be easier.
See the relevant Nautilus change for more context and the corresponding nautilus-python update for more migration examples.