Nautilus Window Restoring

Is it really that hard for a program to restore the windows that were open when you logged out? One of the things I liked about OS X was that it remembered the open file manager windows and folders. The default file manager on Ubuntu, Nautilus (Gnome Files), doesn’t do that. It just opens your Home folder. I wrote a couple of python scripts to remedy the situation.

Step one was to figure out how to determine the folders that were open. I found a Nautilus D-Bus entry that contains the window ID and folder for each open window.

The next step was to get the window positions and sizes. For this I used Xlib.

The source code is in the NautilusWinMon github project.

window-monitor.py

This is a Nautilus LocationWidgetProvider that gets notified whenever the user changes folders in a window. This spawns window-monitor-helper.py to save the current window positions/sizes and folders. This has to be done asynchronously because otherwise the Nautilus process would be talking to itself via D-Bus and would deadlock until D-Bus timed out.

window-monitor-helper.py

This is called asynchronously by window-monitor.py and saves the current Nautilus window positions and folders to a configuration file. It uses D-Bus to get the window IDs and folders. Then uses Xlib to get the window positions and sizes.

window-monitor-login.py

This is called at login to restore the Nautilus windows. It shell execs nautilus for each window/folder, then uses Xlib to position and size each window.

Notes

The Ubuntu window manager Compiz, places an invisible 8 pixel border around a resizable window to capture window resizing events. When programmatically positioning a window, Compiz will not let you move the resizing border offscreen. When positioning a window manually, Compiz will let you move the resizing border off screen. This means that even though you can position a Nautilus window in a corner with no visible gap, when the window is restored, the resizing gap will appear.

Leave a Reply

Your email address will not be published. Required fields are marked *