When the user calls Quit, the windows are disabled and the Evolution
prepares for quit. In case the quit takes longer than a minute, the user
is asked whether the Evolution should wait for the background tasks to
finish or quit. Sometimes the user wants to quit even earlier, thus let
it do it when it tries to close the window again.
The shell_ready_for_quit() could be called twice, the first time for user-initiated
quit, the second time when the GApplication "shutdown" signal had been invoked. This
invocation had been added recently, to fix memory leaks. While it didn't matter
for desktop environments where the GtkApplication's inhibit/uninhibit didn't work,
it did matter for the GNOME Shell. The second call to shell_ready_for_quit() had been
called inside EShell's finalize, which didn't find the right GtkApplication class (a
NULL had been passed to the function), which caused the crash. The fix is to not call
shell_prepare_for_quit() from within the "shutdown" signal callback when the quit
had been already acknowledged.
The shell creates it on start and unrefs it on its dispose, but
the window is not freed, it's still left in memory. The other parts
are need too, otherwise runtime warnings are shown during the free
of the preferences window.
This could exhibit as a double-prompt whether wants to quit with
pending messages in Outbox, where the second prompt, the one with
the EShellWindow being destroyed, didn't make much sense.
Since this change the client is responsible to provide credentials
to use to authenticate backends (through ESource-s, to be more precise),
unless the credentials are already saved.
A simple Evolution run and move between all views means creation of
more than 100 GSettings objects, with only a bit more than 10 schemas.
Reusing the objects should have a positive impact on a performance too.
This is related to bug 698275, which did not cover all cases.
The problem here is that the dconf can in certain situation claim
that everything changed (path "/" changed), which GSettingsBinding
propagates to a GObject property unconditionally and GObject's
property setter (g_object_set_property()) also notifies about
the property change unconditionally, despite the real descendant
property setter properly checks for the value change. After all
these false notifications a callback on "notify" signal is called
and possibly an expensive operation is run.
Checking whether the value really changed helps in performance, for
which were added new e-util functions:
e_signal_connect_notify()
e_signal_connect_notify_after()
e_signal_connect_notify_swapped()
e_signal_connect_notify_object()
which have the same prototype as their GLib counterparts, but they allow
only "notify::..." signals and they test whether the value really changed
before they call the registered callback.
Win32 headers have a #define for 'interface', which breaks the build
when this word is used in the code, thus replace it to 'iface',
the same way as GLib or GTK+ code use to have it. (See bug #722068.)
EShellSettings predates GSettings and is no longer necessary.
GSettings allows binding GObject properties to GSettings keys,
with optional mapping functions. That fulfills the purpose of
EShellSettings.
EShell's instance of EClientCache gets instantiated before modules are
loaded, so explicitly call e_extensible_load_extensions() on the cache
after modules are loaded.
This requires commit 525fba8 in evolution-data-server to work.
Evolution consists of entirely too many small utility libraries, which
increases linking and loading time, places a burden on higher layers of
the application (e.g. modules) which has to remember to link to all the
small in-tree utility libraries, and makes it difficult to generate API
documentation for these utility libraries in one Gtk-Doc module.
Merge the following utility libraries under the umbrella of libeutil,
and enforce a single-include policy on libeutil so we can reorganize
the files as desired without disrupting its pseudo-public API.
libemail-utils/libemail-utils.la
libevolution-utils/libevolution-utils.la
filter/libfilter.la
widgets/e-timezone-dialog/libetimezonedialog.la
widgets/menus/libmenus.la
widgets/misc/libemiscwidgets.la
widgets/table/libetable.la
widgets/text/libetext.la
This also merges libedataserverui from the Evolution-Data-Server module,
since Evolution is its only consumer nowadays, and I'd like to make some
improvements to those APIs without concern for backward-compatibility.
And finally, start a Gtk-Doc module for libeutil. It's going to be a
project just getting all the symbols _listed_ much less _documented_.
But the skeletal structure is in place and I'm off to a good start.