chiark / gitweb /
systemadm: update UI when jobs/units change
[elogind.git] / systemadm.vala
index bdff0d4259d334effde91621de28f1a4d0c57d03..6ea464f58dba461ab3d1d86aa9fbaf6cc8fdc40a 100644 (file)
@@ -92,7 +92,7 @@ public class MainWindow : Window {
         private ComboBox unit_type_combo_box;
 
         public MainWindow() throws DBus.Error {
-                title = "systemdadm";
+                title = "systemadm";
                 position = WindowPosition.CENTER;
                 set_default_size(1000, 700);
                 set_border_width(12);
@@ -297,6 +297,8 @@ public class MainWindow : Window {
                                         i.unit_path,
                                         "org.freedesktop.systemd1.Unit") as Unit;
 
+                        u.changed += on_unit_changed;
+
                         unit_model.append(out iter);
                         unit_model.set(iter,
                                        0, i.id,
@@ -322,6 +324,8 @@ public class MainWindow : Window {
                                         i.job_path,
                                         "org.freedesktop.systemd1.Job") as Job;
 
+                        j.changed += on_job_changed;
+
                         job_model.append(out iter);
                         job_model.set(iter,
                                       0, "%u".printf(i.id),
@@ -486,7 +490,7 @@ public class MainWindow : Window {
                 try {
                         u.start("replace");
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
 
@@ -499,7 +503,7 @@ public class MainWindow : Window {
                 try {
                         u.stop("replace");
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
 
@@ -512,7 +516,7 @@ public class MainWindow : Window {
                 try {
                         u.reload("replace");
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
 
@@ -525,7 +529,7 @@ public class MainWindow : Window {
                 try {
                         u.restart("replace");
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
 
@@ -538,15 +542,11 @@ public class MainWindow : Window {
                 try {
                         j.cancel();
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
 
-        public void on_unit_new(string id, ObjectPath path) {
-                Unit u = bus.get_object(
-                                "org.freedesktop.systemd1",
-                                path,
-                                "org.freedesktop.systemd1.Unit") as Unit;
+        public void update_unit_iter(TreeIter iter, string id, Unit u) {
 
                 string t = "";
                 Unit.JobLink jl = u.job;
@@ -560,8 +560,6 @@ public class MainWindow : Window {
                         t = j.job_type;
                 }
 
-                TreeIter iter;
-                unit_model.append(out iter);
                 unit_model.set(iter,
                                0, id,
                                1, u.description,
@@ -572,16 +570,22 @@ public class MainWindow : Window {
                                6, u);
         }
 
-        public void on_job_new(uint32 id, ObjectPath path) {
-                Job j = bus.get_object(
+        public void on_unit_new(string id, ObjectPath path) {
+                Unit u = bus.get_object(
                                 "org.freedesktop.systemd1",
                                 path,
-                                "org.freedesktop.systemd1.Job") as Job;
+                                "org.freedesktop.systemd1.Unit") as Unit;
+
+                u.changed += on_unit_changed;
 
                 TreeIter iter;
-                job_model.append(out iter);
+                unit_model.append(out iter);
+                update_unit_iter(iter, id, u);
+        }
+
+        public void update_job_iter(TreeIter iter, uint32 id, Job j) {
                 job_model.set(iter,
-                              0, "%u".printf(j.id),
+                              0, "%u".printf(id),
                               1, j.unit.id,
                               2, "→ %s".printf(j.job_type),
                               3, j.state,
@@ -589,6 +593,19 @@ public class MainWindow : Window {
                               5, id);
         }
 
+        public void on_job_new(uint32 id, ObjectPath path) {
+                Job j = bus.get_object(
+                                "org.freedesktop.systemd1",
+                                path,
+                                "org.freedesktop.systemd1.Job") as Job;
+
+                j.changed += on_job_changed;
+
+                TreeIter iter;
+                job_model.append(out iter);
+                update_job_iter(iter, id, j);
+        }
+
         public void on_unit_removed(string id, ObjectPath path) {
                 TreeIter iter;
                 if (!(unit_model.get_iter_first(out iter)))
@@ -632,10 +649,62 @@ public class MainWindow : Window {
                 } while (job_model.iter_next(ref iter));
         }
 
+        public void on_unit_changed(Unit u) {
+                TreeIter iter;
+                string id;
+
+                if (!(unit_model.get_iter_first(out iter)))
+                        return;
+
+                id = u.id;
+
+                do {
+                        string name;
+
+                        unit_model.get(iter, 0, out name);
+
+                        if (id == name) {
+                                update_unit_iter(iter, id, u);
+
+                                if (current_unit_id == id)
+                                        show_unit(u);
+
+                                break;
+                        }
+
+                } while (unit_model.iter_next(ref iter));
+        }
+
+        public void on_job_changed(Job j) {
+                TreeIter iter;
+                uint32 id;
+
+                if (!(job_model.get_iter_first(out iter)))
+                        return;
+
+                id = j.id;
+
+                do {
+                        uint32 k;
+
+                        job_model.get(iter, 5, out k);
+
+                        if (id == k) {
+                                update_job_iter(iter, id, j);
+
+                                if (current_job_id == id)
+                                        show_job(j);
+
+                                break;
+                        }
+
+                } while (job_model.iter_next(ref iter));
+        }
+
         public bool unit_filter(TreeModel model, TreeIter iter) {
-                string id, active_state;
+                string id, active_state, job;
 
-                model.get(iter, 0, out id, 3, out active_state);
+                model.get(iter, 0, out id, 3, out active_state, 5, out job);
 
                 if (id == null)
                         return false;
@@ -646,7 +715,7 @@ public class MainWindow : Window {
                                 return true;
 
                         case 1:
-                                return active_state != "inactive";
+                                return active_state != "inactive" || job != "";
 
                         case 2:
                                 return id.has_suffix(".service");
@@ -683,7 +752,7 @@ public class MainWindow : Window {
                 try {
                         manager.reload();
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
 
@@ -695,9 +764,19 @@ public class MainWindow : Window {
                                 unit_type_combo_box.set_active(8);
 
                 } catch (DBus.Error e) {
-                        new MessageDialog(this, DialogFlags.DESTROY_WITH_PARENT, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                        show_error(e.message);
                 }
         }
+
+        public void show_error(string e) {
+                var m = new MessageDialog(this,
+                                          DialogFlags.DESTROY_WITH_PARENT,
+                                          MessageType.ERROR,
+                                          ButtonsType.CLOSE, "%s", e);
+                m.run();
+                m.destroy();
+        }
+
 }
 
 static const OptionEntry entries[] = {
@@ -706,6 +785,12 @@ static const OptionEntry entries[] = {
         { null }
 };
 
+void show_error(string e) {
+        var m = new MessageDialog(null, 0, MessageType.ERROR, ButtonsType.CLOSE, "%s", e);
+        m.run();
+        m.destroy();
+}
+
 int main (string[] args) {
 
         try {
@@ -716,9 +801,9 @@ int main (string[] args) {
 
                 Gtk.main();
         } catch (DBus.Error e) {
-                new MessageDialog(null, 0, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                show_error(e.message);
         } catch (GLib.Error e) {
-                new MessageDialog(null, 0, MessageType.ERROR, ButtonsType.CLOSE, "%s", e.message).run();
+                show_error(e.message);
         }
 
         return 0;