Merge lp:~donadigo/appcenter/client-class-improvements into lp:~elementary-apps/appcenter/appcenter

Proposed by Adam Bieńkowski
Status: Merged
Approved by: Zisu Andrei
Approved revision: 328
Merged at revision: 334
Proposed branch: lp:~donadigo/appcenter/client-class-improvements
Merge into: lp:~elementary-apps/appcenter/appcenter
Diff against target: 465 lines (+89/-107)
3 files modified
src/Core/Client.vala (+86/-100)
src/Core/Task.vala (+1/-5)
src/MainWindow.vala (+2/-2)
To merge this branch: bzr merge lp:~donadigo/appcenter/client-class-improvements
Reviewer Review Type Date Requested Status
Corentin Noël Approve
Review via email: mp+308592@code.launchpad.net

Commit message

Client:
 * Use one task accross the class
 * Fix code-style issues
 * Cache used members / variables

Description of the change

This branch does some improvements to the Client class, mostly it replaces the task list with one task (packagekit can do only one task at a time), fixes some code-style issues.

To post a comment you must log in.
Revision history for this message
Corentin Noël (tintou) wrote :

Works fine here, everything looks sane

review: Approve
Revision history for this message
RabbitBot (rabbitbot-a) wrote :

Attempt to merge into lp:appcenter failed due to conflicts:

text conflict in src/Application.vala
text conflict in src/Core/Client.vala
text conflict in src/MainWindow.vala

328. By Adam Bieńkowski

Resolve conflicts

Revision history for this message
Adam Bieńkowski (donadigo) wrote :

Conflicts resolved.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/Core/Client.vala'
--- src/Core/Client.vala 2016-10-26 12:59:05 +0000
+++ src/Core/Client.vala 2016-11-06 15:34:19 +0000
@@ -16,18 +16,16 @@
1616
17public class AppCenterCore.Client : Object {17public class AppCenterCore.Client : Object {
18 public signal void updates_available ();18 public signal void updates_available ();
19 public signal void tasks_finished ();
2019
21 public bool connected { public get; private set; }20 public bool connected { public get; private set; }
22 public bool updating_cache { public get; private set; }21 public bool updating_cache { public get; private set; }
22 public uint task_count { public get; private set; default = 0; }
2323
24 public AppCenterCore.Package os_updates { public get; private set; }24 public AppCenterCore.Package os_updates { public get; private set; }
2525
26 private Gee.LinkedList<AppCenter.Task> task_list;
27 private Gee.LinkedList<AppCenter.Task> task_with_agreement_list;
28 private Gee.HashMap<string, AppCenterCore.Package> package_list;26 private Gee.HashMap<string, AppCenterCore.Package> package_list;
29 private AppStream.Pool appstream_pool;27 private AppStream.Pool appstream_pool;
30 private GLib.Cancellable interface_cancellable;28 private GLib.Cancellable cancellable;
31 private GLib.DateTime last_cache_update;29 private GLib.DateTime last_cache_update;
32 private uint updates_number = 0U;30 private uint updates_number = 0U;
33 private uint update_cache_timeout_id = 0;31 private uint update_cache_timeout_id = 0;
@@ -35,73 +33,57 @@
3533
36 private const int SECONDS_BETWEEN_REFRESHES = 60*60*24;34 private const int SECONDS_BETWEEN_REFRESHES = 60*60*24;
3735
36 private Task client;
37 private SuspendControl sc;
38
38 private Client () {39 private Client () {
39 appstream_pool.get_components ().foreach ((comp) => {
40 var package = new AppCenterCore.Package (comp);
41 foreach (var pkg_name in comp.get_pkgnames ()) {
42 package_list.set (pkg_name, package);
43 }
44 });
45 }40 }
4641
47 construct {42 construct {
48 task_list = new Gee.LinkedList<AppCenter.Task> ();
49 task_with_agreement_list = new Gee.LinkedList<AppCenter.Task> ();
50 package_list = new Gee.HashMap<string, AppCenterCore.Package> (null, null);43 package_list = new Gee.HashMap<string, AppCenterCore.Package> (null, null);
51 interface_cancellable = new GLib.Cancellable ();44 cancellable = new GLib.Cancellable ();
45
46 client = new Task ();
47 sc = new SuspendControl ();
48
49 cancellable = new GLib.Cancellable ();
52 last_cache_update = null;50 last_cache_update = null;
5351
54 appstream_pool = new AppStream.Pool ();52 appstream_pool = new AppStream.Pool ();
53
55 try {54 try {
56 appstream_pool.load ();55 appstream_pool.load ();
56 appstream_pool.get_components ().foreach ((comp) => {
57 var package = new AppCenterCore.Package (comp);
58 foreach (var pkg_name in comp.get_pkgnames ()) {
59 package_list.set (pkg_name, package);
60 }
61 });
57 } catch (Error e) {62 } catch (Error e) {
58 error (e.message);63 error (e.message);
59 }64 }
6065
66 var icon = new AppStream.Icon ();
67 icon.set_name ("distributor-logo");
68 icon.set_kind (AppStream.IconKind.STOCK);
69
61 var os_updates_component = new AppStream.Component ();70 var os_updates_component = new AppStream.Component ();
62 os_updates_component.id = AppCenterCore.Package.OS_UPDATES_ID;71 os_updates_component.id = AppCenterCore.Package.OS_UPDATES_ID;
63 os_updates_component.name = _("Operating System Updates");72 os_updates_component.name = _("Operating System Updates");
64 os_updates_component.summary = _("Updates to system components");73 os_updates_component.summary = _("Updates to system components");
65 var icon = new AppStream.Icon ();
66 icon.set_name ("distributor-logo");
67 icon.set_kind (AppStream.IconKind.STOCK);
68 os_updates_component.add_icon (icon);74 os_updates_component.add_icon (icon);
75
69 os_updates = new AppCenterCore.Package (os_updates_component);76 os_updates = new AppCenterCore.Package (os_updates_component);
70 }77 }
7178
72 public bool has_tasks () {79 public bool has_tasks () {
73 return !task_list.is_empty;80 return task_count > 0;
74 }
75
76 private AppCenter.Task request_task (bool requires_user_agreement = true) {
77 AppCenter.Task task = new AppCenter.Task ();
78 task_list.add (task);
79 if (requires_user_agreement) {
80 if (task_with_agreement_list.size == 0) {
81 Pk.polkit_agent_open ();
82 }
83 task_with_agreement_list.add (task);
84 }
85 return task;
86 }
87
88 private void release_task (AppCenter.Task task) {
89 task_list.remove (task);
90 if (task_list.is_empty) {
91 tasks_finished ();
92 if (task in task_with_agreement_list) {
93 task_with_agreement_list.remove (task);
94 if (task_with_agreement_list.size == 0) {
95 Pk.polkit_agent_close ();
96 }
97 }
98 }
99 }81 }
10082
101 public async Pk.Exit install_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error {83 public async Pk.Exit install_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error {
84 task_count++;
85
102 Pk.Exit exit_status = Pk.Exit.UNKNOWN;86 Pk.Exit exit_status = Pk.Exit.UNKNOWN;
103 AppCenter.Task install_task = request_task ();
104 AppCenter.Task search_task = request_task ();
105 string[] packages_ids = {};87 string[] packages_ids = {};
106 foreach (var pkg_name in package.component.get_pkgnames ()) {88 foreach (var pkg_name in package.component.get_pkgnames ()) {
107 packages_ids += pkg_name;89 packages_ids += pkg_name;
@@ -110,7 +92,7 @@
110 packages_ids += null;92 packages_ids += null;
11193
112 try {94 try {
113 var results = yield search_task.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.NEWEST, Pk.Filter.ARCH), packages_ids, cancellable, () => {});95 var results = yield client.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.NEWEST, Pk.Filter.ARCH), packages_ids, cancellable, () => {});
114 packages_ids = {};96 packages_ids = {};
11597
116 results.get_package_array ().foreach ((package) => {98 results.get_package_array ().foreach ((package) => {
@@ -119,28 +101,24 @@
119101
120 packages_ids += null;102 packages_ids += null;
121103
122 results = yield install_task.install_packages_async (packages_ids, cancellable, cb);104 results = yield client.install_packages_async (packages_ids, cancellable, cb);
123 exit_status = results.get_exit_code ();105 exit_status = results.get_exit_code ();
124 if (exit_status != Pk.Exit.SUCCESS) {106 if (exit_status != Pk.Exit.SUCCESS) {
125 release_task (search_task);
126 release_task (install_task);
127 throw new GLib.IOError.FAILED (Pk.Exit.enum_to_string (results.get_exit_code ()));107 throw new GLib.IOError.FAILED (Pk.Exit.enum_to_string (results.get_exit_code ()));
128 }108 }
129 } catch (Error e) {109 } catch (Error e) {
130 release_task (search_task);110 task_count--;
131 release_task (install_task);
132 throw e;111 throw e;
133 }112 }
134113
135 release_task (search_task);114 task_count--;
136 release_task (install_task);
137 return exit_status;115 return exit_status;
138 }116 }
139117
140 public async Pk.Exit update_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error {118 public async Pk.Exit update_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error {
119 task_count++;
120
141 Pk.Exit exit_status = Pk.Exit.UNKNOWN;121 Pk.Exit exit_status = Pk.Exit.UNKNOWN;
142 SuspendControl sc = new SuspendControl ();
143 AppCenter.Task update_task = request_task ();
144 string[] packages_ids = {};122 string[] packages_ids = {};
145 foreach (var pk_package in package.change_information.changes) {123 foreach (var pk_package in package.change_information.changes) {
146 packages_ids += pk_package.get_id ();124 packages_ids += pk_package.get_id ();
@@ -150,13 +128,14 @@
150128
151 try {129 try {
152 sc.inhibit ();130 sc.inhibit ();
153 var results = yield update_task.update_packages_async (packages_ids, cancellable, cb);131
132 var results = yield client.update_packages_async (packages_ids, cancellable, cb);
154 exit_status = results.get_exit_code ();133 exit_status = results.get_exit_code ();
155 } catch (Error e) {134 } catch (Error e) {
135 task_count--;
156 throw e;136 throw e;
157 } finally {137 } finally {
158 sc.uninhibit ();138 sc.uninhibit ();
159 release_task (update_task);
160 }139 }
161140
162 if (exit_status != Pk.Exit.SUCCESS) {141 if (exit_status != Pk.Exit.SUCCESS) {
@@ -165,64 +144,65 @@
165 package.change_information.clear_update_info ();144 package.change_information.clear_update_info ();
166 }145 }
167146
147 task_count--;
168 yield refresh_updates ();148 yield refresh_updates ();
169
170 return exit_status;149 return exit_status;
171 }150 }
172151
173 public async Pk.Exit remove_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error {152 public async Pk.Exit remove_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error {
153 task_count++;
154
174 Pk.Exit exit_status = Pk.Exit.UNKNOWN;155 Pk.Exit exit_status = Pk.Exit.UNKNOWN;
175 AppCenter.Task remove_task = request_task ();
176 AppCenter.Task search_task = request_task ();
177 string[] packages_ids = {};156 string[] packages_ids = {};
178 foreach (var pkg_name in package.component.get_pkgnames ()) {157 foreach (var pkg_name in package.component.get_pkgnames ()) {
179 packages_ids += pkg_name;158 packages_ids += pkg_name;
180 }159 }
160
181 packages_ids += null;161 packages_ids += null;
182162
183 try {163 try {
184 var results = yield search_task.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST), packages_ids, cancellable, () => {});164 var results = yield client.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST), packages_ids, cancellable, () => {});
185 packages_ids = {};165 packages_ids = {};
186 results.get_package_array ().foreach ((package) => {166 results.get_package_array ().foreach ((package) => {
187 packages_ids += package.package_id;167 packages_ids += package.package_id;
188 });168 });
189169
190 results = yield remove_task.remove_packages_async (packages_ids, true, true, cancellable, cb);170 results = yield client.remove_packages_async (packages_ids, true, true, cancellable, cb);
191 exit_status = results.get_exit_code ();171 exit_status = results.get_exit_code ();
192 } catch (Error e) {172 } catch (Error e) {
193 release_task (search_task);173 task_count--;
194 release_task (remove_task);
195 throw e;174 throw e;
196 }175 }
197176
177 task_count--;
198 yield refresh_updates ();178 yield refresh_updates ();
199 release_task (search_task);
200 release_task (remove_task);
201 return exit_status;179 return exit_status;
202 }180 }
203181
204 public async void get_updates () {182 public async void get_updates () {
205 AppCenter.Task update_task = request_task (false);183 task_count++;
206 AppCenter.Task details_task = request_task (false);184
207 try {185 try {
208 Pk.Results result = yield update_task.get_updates_async (0, interface_cancellable, (t, p) => { });186 Pk.Results results = yield client.get_updates_async (0, cancellable, (t, p) => { });
209 string[] packages_array = {};187 string[] packages_array = {};
210 result.get_package_array ().foreach ((pk_package) => {188 results.get_package_array ().foreach ((pk_package) => {
211 packages_array += pk_package.get_id ();189 packages_array += pk_package.get_id ();
212 });190 });
213191
214 // We need a null to show to PackageKit that it's then end of the array.192 // We need a null to show to PackageKit that it's then end of the array.
215 packages_array += null;193 packages_array += null;
216194
217 Pk.Results result2 = yield details_task.get_details_async (packages_array , interface_cancellable, (t, p) => { });195 results = yield client.get_details_async (packages_array , cancellable, (t, p) => { });
218 result2.get_details_array ().foreach ((pk_detail) => {196 results.get_details_array ().foreach ((pk_detail) => {
219 var pk_package = new Pk.Package ();197 var pk_package = new Pk.Package ();
220 try {198 try {
221 pk_package.set_id (pk_detail.get_package_id ());199 pk_package.set_id (pk_detail.get_package_id ());
200
222 unowned string pkg_name = pk_package.get_name ();201 unowned string pkg_name = pk_package.get_name ();
223 var package = package_list.get (pkg_name);202 var package = package_list.get (pkg_name);
224 if (package == null) {203 if (package == null) {
225 package = os_updates;204 package = os_updates;
205
226 var pkgnames = os_updates.component.pkgnames;206 var pkgnames = os_updates.component.pkgnames;
227 pkgnames += pkg_name;207 pkgnames += pkg_name;
228 os_updates.component.pkgnames = pkgnames;208 os_updates.component.pkgnames = pkgnames;
@@ -240,17 +220,19 @@
240 if (e.code != 19) {220 if (e.code != 19) {
241 critical (e.message);221 critical (e.message);
242 }222 }
223
224 task_count--;
225 return;
243 }226 }
244227
245 release_task (details_task);228 task_count--;
246 release_task (update_task);
247 updates_available ();229 updates_available ();
248 }230 }
249231
250 public async Gee.Collection<AppCenterCore.Package> get_installed_applications () {232 public async Gee.Collection<AppCenterCore.Package> get_installed_applications () {
251 var packages = new Gee.TreeSet<AppCenterCore.Package> ();233 var packages = new Gee.TreeSet<AppCenterCore.Package> ();
252 var packages_list = yield get_installed_packages ();234 var installed = yield get_installed_packages ();
253 foreach (var pk_package in packages_list) {235 foreach (var pk_package in installed) {
254 var package = package_list.get (pk_package.get_name ());236 var package = package_list.get (pk_package.get_name ());
255 if (package != null) {237 if (package != null) {
256 package.installed_packages.add (pk_package);238 package.installed_packages.add (pk_package);
@@ -300,43 +282,49 @@
300 }282 }
301283
302 public Pk.Package? get_app_package (string application, Pk.Bitfield additional_filters = 0) throws GLib.Error {284 public Pk.Package? get_app_package (string application, Pk.Bitfield additional_filters = 0) throws GLib.Error {
303 AppCenter.Task packages_task = request_task (false);285 task_count++;
286
304 Pk.Package? package = null;287 Pk.Package? package = null;
305 var filter = Pk.Bitfield.from_enums (Pk.Filter.NEWEST);288 var filter = Pk.Bitfield.from_enums (Pk.Filter.NEWEST);
306 filter |= additional_filters;289 filter |= additional_filters;
307 try {290 try {
308 var results = packages_task.search_names_sync (filter, { application, null }, interface_cancellable, () => {});291 var results = client.search_names_sync (filter, { application, null }, cancellable, () => {});
309 var array = results.get_package_array ();292 var array = results.get_package_array ();
310 if (array.length > 0) {293 if (array.length > 0) {
311 package = array.get (0);294 package = array.get (0);
312 }295 }
313 } catch (Error e) {296 } catch (Error e) {
314 release_task (packages_task);297 task_count--;
315 throw e;298 throw e;
316 }299 }
317300
318 release_task (packages_task);301 task_count--;
319 return package;302 return package;
320 }303 }
321304
322 private async void refresh_updates () {305 private async void refresh_updates () {
323 var update_task = new AppCenter.Task ();
324 updating_cache = true;306 updating_cache = true;
307 task_count++;
325308
326 try {309 try {
327 Pk.Results result = yield update_task.get_updates_async (0, interface_cancellable, (t, p) => {});310 Pk.Results results = yield client.get_updates_async (0, null, (t, p) => {});
311
328 bool was_empty = updates_number == 0U;312 bool was_empty = updates_number == 0U;
329 updates_number = get_package_count (result.get_package_array ());313 updates_number = get_package_count (results.get_package_array ());
314
315 var application = Application.get_default ();
330 if (was_empty && updates_number != 0U) {316 if (was_empty && updates_number != 0U) {
331 string title = ngettext ("Update Available", "Updates Available", updates_number);317 string title = ngettext ("Update Available", "Updates Available", updates_number);
332 string body = ngettext ("%u update is available for your system", "%u updates are available for your system", updates_number).printf (updates_number);318 string body = ngettext ("%u update is available for your system", "%u updates are available for your system", updates_number).printf (updates_number);
319
333 var notification = new Notification (title);320 var notification = new Notification (title);
334 notification.set_body (body);321 notification.set_body (body);
335 notification.set_icon (new ThemedIcon ("system-software-install"));322 notification.set_icon (new ThemedIcon ("system-software-install"));
336 notification.set_default_action ("app.open-application");323 notification.set_default_action ("app.open-application");
337 Application.get_default ().send_notification ("updates", notification);324
325 application.send_notification ("updates", notification);
338 } else {326 } else {
339 Application.get_default ().withdraw_notification ("updates");327 application.withdraw_notification ("updates");
340 }328 }
341329
342#if HAVE_UNITY330#if HAVE_UNITY
@@ -349,12 +337,14 @@
349 }337 }
350338
351 updating_cache = false;339 updating_cache = false;
340 task_count--;
352 refresh_in_progress = false;341 refresh_in_progress = false;
353 }342 }
354343
355 public uint get_package_count (GLib.GenericArray<weak Pk.Package> package_array) {344 public uint get_package_count (GLib.GenericArray<weak Pk.Package> package_array) {
356 bool os_update_found = false;345 bool os_update_found = false;
357 var result_comp = new Gee.TreeSet<AppStream.Component> ();346 var result_comp = new Gee.TreeSet<AppStream.Component> ();
347
358 package_array.foreach ((pk_package) => {348 package_array.foreach ((pk_package) => {
359 var comp = package_list.get (pk_package.get_name ());349 var comp = package_list.get (pk_package.get_name ());
360 if (comp != null) {350 if (comp != null) {
@@ -373,7 +363,7 @@
373 }363 }
374364
375 public void cancel_updates (bool cancel_timeout) {365 public void cancel_updates (bool cancel_timeout) {
376 interface_cancellable.cancel ();366 cancellable.cancel ();
377367
378 if (update_cache_timeout_id > 0 && cancel_timeout) {368 if (update_cache_timeout_id > 0 && cancel_timeout) {
379 Source.remove (update_cache_timeout_id);369 Source.remove (update_cache_timeout_id);
@@ -381,7 +371,7 @@
381 last_cache_update = null;371 last_cache_update = null;
382 }372 }
383373
384 interface_cancellable = new GLib.Cancellable ();374 cancellable = new GLib.Cancellable ();
385 refresh_in_progress = false;375 refresh_in_progress = false;
386 }376 }
387377
@@ -413,21 +403,16 @@
413 /* One cache update a day, keeps the doctor away! */403 /* One cache update a day, keeps the doctor away! */
414 if (force || last_cache_update == null ||404 if (force || last_cache_update == null ||
415 (new DateTime.now_local ()).difference (last_cache_update) / GLib.TimeSpan.SECOND >= SECONDS_BETWEEN_REFRESHES) {405 (new DateTime.now_local ()).difference (last_cache_update) / GLib.TimeSpan.SECOND >= SECONDS_BETWEEN_REFRESHES) {
416
417 var nm = NetworkMonitor.get_default ();406 var nm = NetworkMonitor.get_default ();
418407 if (nm.get_network_available ()) {
419 if (nm.get_network_available()) {
420 debug ("New refresh task");408 debug ("New refresh task");
421 var refresh_task = new AppCenter.Task ();
422
423409
424 try {410 try {
425 Pk.Results result = yield refresh_task.refresh_cache_async (false, interface_cancellable, (t, p) => { });411 Pk.Results results = yield client.refresh_cache_async (false, cancellable, (t, p) => { });
426 success = result.get_exit_code () == Pk.Exit.SUCCESS;412 success = results.get_exit_code () == Pk.Exit.SUCCESS;
427 last_cache_update = new DateTime.now_local ();413 last_cache_update = new DateTime.now_local ();
428 } catch (Error e) {414 } catch (Error e) {
429 critical ("Update_cache: Refesh cache async failed - %s", e.message);415 critical ("Update_cache: Refesh cache async failed - %s", e.message);
430
431 }416 }
432417
433 if (success) {418 if (success) {
@@ -454,21 +439,22 @@
454 }439 }
455440
456 public async Gee.TreeSet<Pk.Package> get_installed_packages () {441 public async Gee.TreeSet<Pk.Package> get_installed_packages () {
457 var packages_task = request_task ();442 task_count++;
458 var filter = Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST);443
444 Pk.Bitfield filter = Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST);
459 var installed = new Gee.TreeSet<Pk.Package> ();445 var installed = new Gee.TreeSet<Pk.Package> ();
446
460 try {447 try {
461 Pk.Results result = yield packages_task.get_packages_async (filter, null, (prog, type) => {});448 Pk.Results results = yield client.get_packages_async (filter, null, (prog, type) => {});
462 result.get_package_array ().foreach ((pk_package) => {449 results.get_package_array ().foreach ((pk_package) => {
463 installed.add (pk_package);450 installed.add (pk_package);
464 });451 });
465452
466 release_task (packages_task);
467 } catch (Error e) {453 } catch (Error e) {
468 critical (e.message);454 critical (e.message);
469 release_task (packages_task);
470 }455 }
471456
457 task_count--;
472 return installed;458 return installed;
473 }459 }
474460
475461
=== modified file 'src/Core/Task.vala'
--- src/Core/Task.vala 2016-07-18 21:16:57 +0000
+++ src/Core/Task.vala 2016-11-06 15:34:19 +0000
@@ -18,11 +18,7 @@
18 * Authored by: Corentin Noël <corentin@elementary.io>18 * Authored by: Corentin Noël <corentin@elementary.io>
19 */19 */
2020
21public class AppCenter.Task : Pk.Task {21public class AppCenterCore.Task : Pk.Task {
22 public Task () {
23
24 }
25
26 public override void untrusted_question (uint request, Pk.Results results) {22 public override void untrusted_question (uint request, Pk.Results results) {
27 user_accepted (request);23 user_accepted (request);
28 }24 }
2925
=== modified file 'src/MainWindow.vala'
--- src/MainWindow.vala 2016-10-17 17:27:00 +0000
+++ src/MainWindow.vala 2016-11-06 15:34:19 +0000
@@ -171,8 +171,8 @@
171 }171 }
172172
173 hide ();173 hide ();
174 task_finished_connection = client.tasks_finished.connect (() => {174 task_finished_connection = client.notify["task-count"].connect (() => {
175 if (!visible) {175 if (!visible && client.task_count == 0) {
176 destroy ();176 destroy ();
177 }177 }
178 });178 });

Subscribers

People subscribed via source and target branches