[geary/wip/controller-cleanup: 1/2] Convert GearyController to RAII and rename
- From: Michael Gratton <mjog src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/controller-cleanup: 1/2] Convert GearyController to RAII and rename
- Date: Sun, 21 Apr 2019 03:58:50 +0000 (UTC)
commit e01132d856006cb603cae2512d9ff746dd349d5f
Author: Michael Gratton <mike vee net>
Date: Fri Apr 19 14:59:35 2019 +1000
Convert GearyController to RAII and rename
Convert the controller's open_async() method into its constructor, make
previously nullable properties not nullable, make the application's
instance null until it is contructed, rename to match dir convention.
po/POTFILES.in | 2 +-
...controller.vala => application-controller.vala} | 187 +++++++++------------
src/client/application/geary-application.vala | 63 ++++---
src/client/components/main-toolbar.vala | 4 +-
src/client/components/main-window.vala | 6 +-
.../conversation-list/conversation-list-view.vala | 18 +-
src/client/meson.build | 2 +-
7 files changed, 123 insertions(+), 159 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 5a9ebaf8..533634ab 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -20,9 +20,9 @@ src/client/application/application-certificate-manager.vala
src/client/application/application-command.vala
src/client/application/application-contact-store.vala
src/client/application/application-contact.vala
+src/client/application/application-controller.vala
src/client/application/application-startup-manager.vala
src/client/application/geary-application.vala
-src/client/application/geary-controller.vala
src/client/application/goa-mediator.vala
src/client/application/main.vala
src/client/application/secret-mediator.vala
diff --git a/src/client/application/geary-controller.vala b/src/client/application/application-controller.vala
similarity index 96%
rename from src/client/application/geary-controller.vala
rename to src/client/application/application-controller.vala
index 2f0fba6d..c0d99449 100644
--- a/src/client/application/geary-controller.vala
+++ b/src/client/application/application-controller.vala
@@ -8,9 +8,11 @@
/**
- * Primary controller for a Geary application instance.
+ * Primary controller for a application instance.
+ *
+ * @see GearyAplication
*/
-public class GearyController : Geary.BaseObject {
+public class Application.Controller : Geary.BaseObject {
// Named actions.
public const string ACTION_REPLY_TO_MESSAGE = "reply-to-message";
@@ -55,7 +57,7 @@ public class GearyController : Geary.BaseObject {
static construct {
// Translators: File name used in save chooser when saving
// attachments that do not otherwise have a name.
- GearyController.untitled_file_name = _("Untitled");
+ Controller.untitled_file_name = _("Untitled");
}
@@ -109,49 +111,64 @@ public class GearyController : Geary.BaseObject {
}
- /** Determines if the controller is opening or is open. */
+ /** Determines if the controller is open. */
public bool is_open {
get {
- return (this.open_cancellable != null);
+ return !this.open_cancellable.is_cancelled();
}
}
public weak GearyApplication application { get; private set; } // circular ref
- public Accounts.Manager? account_manager { get; private set; default = null; }
+ /** Account management for the application. */
+ public Accounts.Manager account_manager { get; private set; }
- /** Application-wide {@link Application.CertificateManager} instance. */
- public Application.CertificateManager? certificate_manager {
- get; private set; default = null;
+ /** Certificate management for the application. */
+ public Application.CertificateManager certificate_manager {
+ get; private set;
}
- public MainWindow? main_window { get; private set; default = null; }
-
- public Geary.App.ConversationMonitor? current_conversations { get; private set; default = null; }
+ /** Desktop notifications for the application. */
+ public Notification.Desktop notifications { get; private set; }
- public Application.AvatarStore? avatars {
+ /** Avatar store for the application. */
+ public Application.AvatarStore avatars {
get; private set; default = new Application.AvatarStore();
}
+ /** Contact store cache for the application. */
public ContactListStoreCache contact_list_store_cache {
get; private set; default = new ContactListStoreCache();
}
- public Notification.Desktop? notifications { get; private set; default = null; }
+ /** Default main window */
+ public MainWindow main_window { get; private set; }
- private Geary.Account? current_account = null;
+ /** Conversations for the current folder, null if none selected */
+ public Geary.App.ConversationMonitor? current_conversations {
+ get; private set; default = null;
+ }
+
+ // Primary collection of the application's open accounts
private Gee.Map<Geary.AccountInformation,AccountContext> accounts =
new Gee.HashMap<Geary.AccountInformation,AccountContext>();
- // Created when controller is opened, cancelled and nulled out
- // when closed.
- private GLib.Cancellable? open_cancellable = null;
-
- private Folks.IndividualAggregator? folks = null;
+ // Cancelled if the controller is closed
+ private GLib.Cancellable open_cancellable;
- private Canberra.Context? sound_context = null;
+ private UpgradeDialog upgrade_dialog;
+ private Folks.IndividualAggregator folks;
+ private Canberra.Context sound_context;
+ private NewMessagesMonitor new_messages_monitor;
+ private NewMessagesIndicator new_messages_indicator;
+ private UnityLauncher unity_launcher;
+ // Null if none selected
private Geary.Folder? current_folder = null;
+
+ // Null if no folder ever selected
+ private Geary.Account? current_account = null;
+
private Cancellable cancellable_folder = new Cancellable();
private Cancellable cancellable_search = new Cancellable();
private Cancellable cancellable_open_account = new Cancellable();
@@ -159,14 +176,10 @@ public class GearyController : Geary.BaseObject {
private Gee.Set<Geary.App.Conversation> selected_conversations = new
Gee.HashSet<Geary.App.Conversation>();
private Geary.App.Conversation? last_deleted_conversation = null;
private Gee.LinkedList<ComposerWidget> composer_widgets = new Gee.LinkedList<ComposerWidget>();
- private NewMessagesMonitor? new_messages_monitor = null;
- private NewMessagesIndicator? new_messages_indicator = null;
- private UnityLauncher? unity_launcher = null;
private uint select_folder_timeout_id = 0;
private int64 next_folder_select_allowed_usec = 0;
private Geary.Nonblocking.Mutex select_folder_mutex = new Geary.Nonblocking.Mutex();
private Geary.Folder? previous_non_search_folder = null;
- private UpgradeDialog upgrade_dialog;
private Gee.List<string?> pending_mailtos = new Gee.ArrayList<string>();
private uint operation_count = 0;
@@ -229,18 +242,11 @@ public class GearyController : Geary.BaseObject {
/**
* Constructs a new instance of the controller.
*/
- public GearyController(GearyApplication application) {
+ public async Controller(GearyApplication application,
+ GLib.Cancellable cancellable) {
this.application = application;
- }
+ this.open_cancellable = cancellable;
- ~GearyController() {
- assert(current_account == null);
- }
-
- /**
- * Starts the controller and brings up Geary.
- */
- public async void open_async(GLib.Cancellable? cancellable) {
Geary.Engine engine = this.application.engine;
// This initializes the IconFactory, important to do before
@@ -248,16 +254,14 @@ public class GearyController : Geary.BaseObject {
// custom icons)
IconFactory.instance.init();
- apply_app_menu_fix();
-
- this.open_cancellable = new GLib.Cancellable();
-
// Listen for attempts to close the application.
this.application.exiting.connect(on_application_exiting);
// Create DB upgrade dialog.
- upgrade_dialog = new UpgradeDialog();
- upgrade_dialog.notify[UpgradeDialog.PROP_VISIBLE_NAME].connect(display_main_window_if_ready);
+ this.upgrade_dialog = new UpgradeDialog();
+ this.upgrade_dialog.notify[UpgradeDialog.PROP_VISIBLE_NAME].connect(
+ display_main_window_if_ready
+ );
// Initialise WebKit and WebViews
ClientWebView.init_web_context(
@@ -324,7 +328,7 @@ public class GearyController : Geary.BaseObject {
this.get_contact_store_for_account,
this.should_notify_new_messages
);
- main_window.folder_list.set_new_messages_monitor(new_messages_monitor);
+ main_window.folder_list.set_new_messages_monitor(this.new_messages_monitor);
// New messages indicator (Ubuntuism)
this.new_messages_indicator = NewMessagesIndicator.create(
@@ -334,12 +338,12 @@ public class GearyController : Geary.BaseObject {
this.new_messages_indicator.composer_activated.connect(on_indicator_activated_composer);
this.new_messages_indicator.inbox_activated.connect(on_indicator_activated_inbox);
- unity_launcher = new UnityLauncher(new_messages_monitor);
+ this.unity_launcher = new UnityLauncher(this.new_messages_monitor);
this.notifications = new Notification.Desktop(
this.new_messages_monitor,
this.application,
- this.open_cancellable
+ cancellable
);
this.main_window.conversation_list_view.grab_focus();
@@ -416,50 +420,39 @@ public class GearyController : Geary.BaseObject {
this.expunge_accounts.begin();
}
- /**
- * At the moment, this is non-reversible, i.e. once closed a GearyController cannot be
- * re-opened.
- */
+ /** Closes all accounts and windows, releasing held resources. */
public async void close_async() {
// Cancel internal processes early so they don't block
// shutdown
this.open_cancellable.cancel();
- this.open_cancellable = null;
this.application.engine.account_available.disconnect(on_account_available);
- if (this.main_window != null) {
- // Release folder and conversations in the main window
- on_conversations_selected(new Gee.HashSet<Geary.App.Conversation>());
- on_folder_selected(null);
-
- // Disconnect from various UI signals.
-
this.main_window.conversation_list_view.conversations_selected.disconnect(on_conversations_selected);
-
this.main_window.conversation_list_view.conversation_activated.disconnect(on_conversation_activated);
- this.main_window.conversation_list_view.load_more.disconnect(on_load_more);
- this.main_window.conversation_list_view.mark_conversations.disconnect(on_mark_conversations);
-
this.main_window.conversation_list_view.visible_conversations_changed.disconnect(on_visible_conversations_changed);
- this.main_window.folder_list.folder_selected.disconnect(on_folder_selected);
- this.main_window.folder_list.copy_conversation.disconnect(on_copy_conversation);
- this.main_window.folder_list.move_conversation.disconnect(on_move_conversation);
- this.main_window.main_toolbar.copy_folder_menu.folder_selected.disconnect(on_copy_conversation);
- this.main_window.main_toolbar.move_folder_menu.folder_selected.disconnect(on_move_conversation);
- this.main_window.conversation_viewer.conversation_added.disconnect(
- on_conversation_view_added
- );
+ // Release folder and conversations in the main window
+ on_conversations_selected(new Gee.HashSet<Geary.App.Conversation>());
+ on_folder_selected(null);
+
+ // Disconnect from various UI signals.
+ this.main_window.conversation_list_view.conversations_selected.disconnect(on_conversations_selected);
+ this.main_window.conversation_list_view.conversation_activated.disconnect(on_conversation_activated);
+ this.main_window.conversation_list_view.load_more.disconnect(on_load_more);
+ this.main_window.conversation_list_view.mark_conversations.disconnect(on_mark_conversations);
+
this.main_window.conversation_list_view.visible_conversations_changed.disconnect(on_visible_conversations_changed);
+ this.main_window.folder_list.folder_selected.disconnect(on_folder_selected);
+ this.main_window.folder_list.copy_conversation.disconnect(on_copy_conversation);
+ this.main_window.folder_list.move_conversation.disconnect(on_move_conversation);
+ this.main_window.main_toolbar.copy_folder_menu.folder_selected.disconnect(on_copy_conversation);
+ this.main_window.main_toolbar.move_folder_menu.folder_selected.disconnect(on_move_conversation);
+ this.main_window.conversation_viewer.conversation_added.disconnect(
+ on_conversation_view_added
+ );
- // hide window while shutting down, as this can take a few
- // seconds under certain conditions
- this.main_window.hide();
- }
+ // hide window while shutting down, as this can take a few
+ // seconds under certain conditions
+ this.main_window.hide();
// Release monitoring early so held resources can be freed up
- this.sound_context = null;
- this.notifications = null;
- this.new_messages_indicator = null;
- this.unity_launcher = null;
this.new_messages_monitor.clear_folders();
- this.new_messages_monitor = null;
// drop the Revokable, which will commit it if necessary
save_revokable(null, null);
@@ -547,21 +540,17 @@ public class GearyController : Geary.BaseObject {
this.account_manager.account_removed.disconnect(
on_account_removed
);
- this.account_manager = null;
if (this.main_window != null) {
this.application.remove_window(this.main_window);
this.main_window.destroy();
- this.main_window = null;
}
- this.upgrade_dialog = null;
-
- this.current_account = null;
this.current_folder = null;
-
this.previous_non_search_folder = null;
+ this.current_account = null;
+
this.selected_conversations = new Gee.HashSet<Geary.App.Conversation>();
this.last_deleted_conversation = null;
@@ -570,10 +559,8 @@ public class GearyController : Geary.BaseObject {
this.waiting_to_close.clear();
this.avatars.close();
- this.avatars = null;
-
- debug("Closed GearyController");
+ debug("Closed Application.Controller");
}
/**
@@ -605,28 +592,6 @@ public class GearyController : Geary.BaseObject {
}
}
- // Fix for clients having both:
- // * disabled Gtk/ShellShowsAppMenu setting
- // * no 'menu' setting in Gtk/DecorationLayout
- // See https://bugzilla.gnome.org/show_bug.cgi?id=770617
- private void apply_app_menu_fix() {
- Gtk.Settings? settings = Gtk.Settings.get_default();
-
- if (settings == null) {
- warning("Couldn't fetch Gtk default settings");
- return;
- }
-
- string decoration_layout = settings.gtk_decoration_layout ?? "";
- if (!decoration_layout.contains("menu")) {
- string prefix = "menu:";
- if (decoration_layout.contains(":")) {
- prefix = (decoration_layout.has_prefix(":")) ? "menu" : "menu,";
- }
- settings.gtk_decoration_layout = prefix + settings.gtk_decoration_layout;
- }
- }
-
private void setup_actions() {
this.main_window.add_action_entries(win_action_entries, this);
@@ -1882,7 +1847,7 @@ public class GearyController : Geary.BaseObject {
string? alt_text,
GLib.Cancellable cancellable) {
string alt_display_name = Geary.String.is_empty_or_whitespace(alt_text)
- ? GearyController.untitled_file_name : alt_text;
+ ? Application.Controller.untitled_file_name : alt_text;
string display_name = yield attachment.get_safe_file_name(
alt_display_name
);
@@ -1920,7 +1885,7 @@ public class GearyController : Geary.BaseObject {
content = new Geary.Memory.FileBuffer(attachment.file, true);
dest = dest_dir.get_child_for_display_name(
yield attachment.get_safe_file_name(
- GearyController.untitled_file_name
+ Application.Controller.untitled_file_name
)
);
} catch (GLib.Error err) {
@@ -3136,7 +3101,7 @@ public class GearyController : Geary.BaseObject {
// chars anyway.
string? display_name = source.get_basename();
if (Geary.String.is_empty_or_whitespace(display_name)) {
- display_name = GearyController.untitled_file_name;
+ display_name = Application.Controller.untitled_file_name;
}
this.prompt_save_buffer.begin(
diff --git a/src/client/application/geary-application.vala b/src/client/application/geary-application.vala
index f229d30d..ece62b39 100644
--- a/src/client/application/geary-application.vala
+++ b/src/client/application/geary-application.vala
@@ -176,12 +176,14 @@ public class GearyApplication : Gtk.Application {
/**
- * The global UI controller for this app instance.
+ * The global controller for this application instance.
+ *
+ * This will be non-null in the primary application instance, only
+ * after initial activation, or after startup if {@link
+ * is_background_service} is true.
*/
- public GearyController controller {
- get;
- private set;
- default = new GearyController(this);
+ public Application.Controller? controller {
+ get; private set; default = null;
}
/**
@@ -253,6 +255,7 @@ public class GearyApplication : Gtk.Application {
private bool exiting_fired = false;
private int exitcode = 0;
private bool is_destroyed = false;
+ private GLib.Cancellable controller_cancellable = new GLib.Cancellable();
private Components.Inspector? inspector = null;
@@ -451,19 +454,7 @@ public class GearyApplication : Gtk.Application {
public override void activate() {
base.activate();
-
- // Clear notifications immediately since we are showing a main
- // window. If the controller isn't already open, need to wait
- // for that to happen before doing so
-
- if (present()) {
- this.controller.notifications.clear_all_notifications();
- } else {
- this.create_controller.begin((obj, res) => {
- this.create_controller.end(res);
- this.controller.notifications.clear_all_notifications();
- });
- }
+ this.present.begin();
}
public void add_window_accelerators(string action,
@@ -560,6 +551,8 @@ public class GearyApplication : Gtk.Application {
return;
}
+ this.controller_cancellable.cancel();
+
// Give asynchronous destroy_controller() a chance to
// complete, but to avoid bug(s) where Geary hangs at exit,
// shut the whole thing down if destroy_controller() takes too
@@ -604,6 +597,15 @@ public class GearyApplication : Gtk.Application {
Posix.exit(1);
}
+ // Presents a main window. If the controller is not open, opens it
+ // first.
+ private async void present() {
+ if (this.controller == null) {
+ yield create_controller();
+ }
+ this.controller.main_window.present();
+ }
+
// Opens the controller
private async void create_controller() {
// Manually keep the main loop around for the duration of this
@@ -616,11 +618,16 @@ public class GearyApplication : Gtk.Application {
// this is only logged for the one user-visible instance, not
// the other instances called when sending commands to the app
// via the command-line)
- message("%s %s prefix=%s exec_dir=%s is_installed=%s", NAME, VERSION, INSTALL_PREFIX,
- exec_dir.get_path(), this.is_installed.to_string());
-
- yield this.controller.open_async(null);
+ message(
+ "%s %s prefix=%s exec_dir=%s is_installed=%s",
+ NAME, VERSION, INSTALL_PREFIX,
+ exec_dir.get_path(),
+ this.is_installed.to_string()
+ );
+ this.controller = yield new Application.Controller(
+ this, this.controller_cancellable
+ );
release();
}
@@ -629,8 +636,9 @@ public class GearyApplication : Gtk.Application {
// see create_controller() for reasoning hold/release is used
hold();
- if (this.controller.is_open) {
+ if (this.controller != null) {
yield this.controller.close_async();
+ this.controller = null;
}
release();
@@ -714,15 +722,6 @@ public class GearyApplication : Gtk.Application {
return -1;
}
- private bool present() {
- bool ret = false;
- if (this.controller.main_window != null) {
- this.controller.main_window.present();
- ret = true;
- }
- return ret;
- }
-
/** Removes and re-adds the autostart file if needed. */
private async void update_autostart_file() {
try {
diff --git a/src/client/components/main-toolbar.vala b/src/client/components/main-toolbar.vala
index 92855f60..9a1b30cd 100644
--- a/src/client/components/main-toolbar.vala
+++ b/src/client/components/main-toolbar.vala
@@ -161,7 +161,7 @@ public class MainToolbar : Gtk.Box {
);
if (this.show_trash_button) {
- this.trash_delete_button.action_name = "win."+GearyController.ACTION_TRASH_CONVERSATION;
+ this.trash_delete_button.action_name = "win."+Application.Controller.ACTION_TRASH_CONVERSATION;
this.trash_delete_button.image = trash_image;
this.trash_delete_button.tooltip_text = ngettext(
"Move conversation to Trash (Delete, Backspace)",
@@ -169,7 +169,7 @@ public class MainToolbar : Gtk.Box {
this.selected_conversations
);
} else {
- this.trash_delete_button.action_name = "win."+GearyController.ACTION_DELETE_CONVERSATION;
+ this.trash_delete_button.action_name = "win."+Application.Controller.ACTION_DELETE_CONVERSATION;
this.trash_delete_button.image = delete_image;
this.trash_delete_button.tooltip_text = ngettext(
"Delete conversation (Shift+Delete)",
diff --git a/src/client/components/main-window.vala b/src/client/components/main-window.vala
index db91981e..3369c075 100644
--- a/src/client/components/main-window.vala
+++ b/src/client/components/main-window.vala
@@ -102,7 +102,7 @@ public class MainWindow : Gtk.ApplicationWindow, Geary.BaseInterface {
load_config(application.config);
restore_saved_window_state();
- application.controller.notify[GearyController.PROP_CURRENT_CONVERSATION]
+ application.controller.notify[Application.Controller.PROP_CURRENT_CONVERSATION]
.connect(on_conversation_monitor_changed);
application.controller.folder_selected.connect(on_folder_selected);
this.application.engine.account_available.connect(on_account_available);
@@ -126,7 +126,7 @@ public class MainWindow : Gtk.ApplicationWindow, Geary.BaseInterface {
}
public void open_composer_for_mailbox(Geary.RFC822.MailboxAddress to) {
- GearyController controller = this.application.controller;
+ Application.Controller controller = this.application.controller;
ComposerWidget composer = new ComposerWidget(
this.current_folder.account,
controller.contact_list_store_cache,
@@ -225,7 +225,7 @@ public class MainWindow : Gtk.ApplicationWindow, Geary.BaseInterface {
new ComposerWindow(composer);
} else {
this.conversation_viewer.do_compose(composer);
- get_action(GearyController.ACTION_FIND_IN_CONVERSATION).set_enabled(false);
+ get_action(Application.Controller.ACTION_FIND_IN_CONVERSATION).set_enabled(false);
}
}
diff --git a/src/client/conversation-list/conversation-list-view.vala
b/src/client/conversation-list/conversation-list-view.vala
index dee8a33b..57390503 100644
--- a/src/client/conversation-list/conversation-list-view.vala
+++ b/src/client/conversation-list/conversation-list-view.vala
@@ -59,7 +59,7 @@ public class ConversationListView : Gtk.TreeView, Geary.BaseInterface {
GearyApplication.instance.config.settings.changed[Configuration.DISPLAY_PREVIEW_KEY].connect(
on_display_preview_changed);
- GearyApplication.instance.controller.notify[GearyController.PROP_CURRENT_CONVERSATION].
+ GearyApplication.instance.controller.notify[Application.Controller.PROP_CURRENT_CONVERSATION].
connect(on_conversation_monitor_changed);
// Watch for mouse events.
@@ -291,23 +291,23 @@ public class ConversationListView : Gtk.TreeView, Geary.BaseInterface {
Geary.App.Conversation conversation = get_model().get_conversation_at_path(path);
Menu context_menu_model = new Menu();
- context_menu_model.append(_("Delete conversation"),
"win."+GearyController.ACTION_DELETE_CONVERSATION);
+ context_menu_model.append(_("Delete conversation"),
"win."+Application.Controller.ACTION_DELETE_CONVERSATION);
if (conversation.is_unread())
- context_menu_model.append(_("Mark as _Read"), "win."+GearyController.ACTION_MARK_AS_READ);
+ context_menu_model.append(_("Mark as _Read"),
"win."+Application.Controller.ACTION_MARK_AS_READ);
if (conversation.has_any_read_message())
- context_menu_model.append(_("Mark as _Unread"),
"win."+GearyController.ACTION_MARK_AS_UNREAD);
+ context_menu_model.append(_("Mark as _Unread"),
"win."+Application.Controller.ACTION_MARK_AS_UNREAD);
if (conversation.is_flagged())
- context_menu_model.append(_("U_nstar"), "win."+GearyController.ACTION_MARK_AS_UNSTARRED);
+ context_menu_model.append(_("U_nstar"),
"win."+Application.Controller.ACTION_MARK_AS_UNSTARRED);
else
- context_menu_model.append(_("_Star"), "win."+GearyController.ACTION_MARK_AS_STARRED);
+ context_menu_model.append(_("_Star"), "win."+Application.Controller.ACTION_MARK_AS_STARRED);
Menu actions_section = new Menu();
- actions_section.append(_("_Reply"), "win."+GearyController.ACTION_REPLY_TO_MESSAGE);
- actions_section.append(_("R_eply All"), "win."+GearyController.ACTION_REPLY_ALL_MESSAGE);
- actions_section.append(_("_Forward"), "win."+GearyController.ACTION_FORWARD_MESSAGE);
+ actions_section.append(_("_Reply"), "win."+Application.Controller.ACTION_REPLY_TO_MESSAGE);
+ actions_section.append(_("R_eply All"), "win."+Application.Controller.ACTION_REPLY_ALL_MESSAGE);
+ actions_section.append(_("_Forward"), "win."+Application.Controller.ACTION_FORWARD_MESSAGE);
context_menu_model.append_section(null, actions_section);
Gtk.Menu context_menu = new Gtk.Menu.from_model(context_menu_model);
diff --git a/src/client/meson.build b/src/client/meson.build
index 9f8d9eaf..b4da6ff3 100644
--- a/src/client/meson.build
+++ b/src/client/meson.build
@@ -5,10 +5,10 @@ geary_client_vala_sources = files(
'application/application-command.vala',
'application/application-contact-store.vala',
'application/application-contact.vala',
+ 'application/application-controller.vala',
'application/application-startup-manager.vala',
'application/geary-application.vala',
'application/geary-config.vala',
- 'application/geary-controller.vala',
'application/goa-mediator.vala',
'application/secret-mediator.vala',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]