diff --git a/src/MainWindow.vala b/src/MainWindow.vala index a7d97b108..3957925e9 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -1,6 +1,6 @@ // -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*- /*- - * Copyright (c) 2016-2017 elementary LLC. (https://elementary.io) + * Copyright (c) 2016–2018 elementary LLC. (https://elementary.io) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,7 +31,6 @@ public class Installer.MainWindow : Gtk.Window { private SuccessView success_view; private EncryptView encrypt_view; private ErrorView error_view; - private bool check_ignored = false; private uint64 minimum_disk_size; @@ -95,65 +94,39 @@ public class Installer.MainWindow : Gtk.Window { stack.add (try_install_view); stack.visible_child = try_install_view; - try_install_view.custom_step.connect (() => load_partitioning_view ()); - try_install_view.next_step.connect (() => load_disk_view ()); - } + try_install_view.custom_step.connect (() => { + load_check_view ("custom"); + }); - private void set_check_view_visible (bool show) { - if (show) { - check_view.previous_view = stack.visible_child; - stack.visible_child = check_view; - } else if (check_view.previous_view != null) { - stack.visible_child = check_view.previous_view; - check_view.previous_view = null; - } + try_install_view.next_step.connect (() => { + load_check_view ("clean"); + }); } - private void load_check_view () { + private void load_check_view (string next_view) { if (check_view != null) { check_view.destroy (); } - check_view = new Installer.CheckView (minimum_disk_size); - stack.add (check_view); - - check_view.status_changed.connect ((met_requirements) => { - if (!check_ignored) { - set_check_view_visible (!met_requirements); - } - }); - - check_view.cancel.connect (() => { - stack.visible_child = try_install_view; - check_view.previous_view = null; - check_view.destroy (); - }); - - check_view.next_step.connect (() => { - check_ignored = true; - set_check_view_visible (false); - }); - - set_check_view_visible (!check_ignored && !check_view.check_requirements ()); - } + check_view = new CheckView (minimum_disk_size); + check_view.previous_view = try_install_view; - private void load_encrypt_view () { - if (encrypt_view != null) { - encrypt_view.destroy (); + if (next_view == "custom") { + check_view.next_step.connect (() => load_partitioning_view ()); + } else { + check_view.next_step.connect (() => load_disk_view ()); } - encrypt_view = new EncryptView (); - encrypt_view.previous_view = disk_view; - stack.add (encrypt_view); - stack.visible_child = encrypt_view; - - load_check_view (); + if (check_view.check_requirements ()) { + check_view.next_step (); + } else { + stack.add (check_view); + stack.visible_child = check_view; + } - encrypt_view.cancel.connect (() => { + check_view.cancel.connect (() => { stack.visible_child = try_install_view; }); - - encrypt_view.next_step.connect (() => load_progress_view ()); } private void load_disk_view () { @@ -192,6 +165,23 @@ public class Installer.MainWindow : Gtk.Window { }); } + private void load_encrypt_view () { + if (encrypt_view != null) { + encrypt_view.destroy (); + } + + encrypt_view = new EncryptView (); + encrypt_view.previous_view = disk_view; + stack.add (encrypt_view); + stack.visible_child = encrypt_view; + + encrypt_view.cancel.connect (() => { + stack.visible_child = try_install_view; + }); + + encrypt_view.next_step.connect (() => load_progress_view ()); + } + private void load_progress_view () { if (progress_view != null) { progress_view.destroy (); @@ -231,3 +221,4 @@ public class Installer.MainWindow : Gtk.Window { error_view.previous_view = disk_view; } } + diff --git a/src/Views/CheckView.vala b/src/Views/CheckView.vala index 486f82622..cd568a93d 100644 --- a/src/Views/CheckView.vala +++ b/src/Views/CheckView.vala @@ -1,6 +1,6 @@ // -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*- /*- - * Copyright (c) 2016-2017 elementary LLC. (https://elementary.io) + * Copyright (c) 2016–2018 elementary LLC. (https://elementary.io) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,8 @@ public class Installer.CheckView : AbstractInstallerView { public signal void status_changed (bool met_requirements); bool enough_space = true; - bool enough_power = true; + bool minimum_specs = true; + bool vm = false; bool powered = true; int frequency = 0; @@ -45,6 +46,7 @@ public class Installer.CheckView : AbstractInstallerView { NONE, SPACE, SPECS, + VM, POWERED } @@ -65,7 +67,7 @@ public class Installer.CheckView : AbstractInstallerView { ignore_button = new Gtk.Button.with_label (_("Ignore")); ignore_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); - ignore_button.clicked.connect (() => next_step ()); + ignore_button.clicked.connect (() => show_next ()); show_all (); } @@ -76,17 +78,19 @@ public class Installer.CheckView : AbstractInstallerView { frequency = get_frequency (); if (frequency < MINIMUM_FREQUENCY && frequency > 0) { - enough_power = false; + minimum_specs = false; } memory = get_mem_info (); if (memory < MINIMUM_MEMORY) { - enough_power = false; + minimum_specs = false; } powered = !get_is_on_battery (); - bool result = enough_space && enough_power && powered; + vm = get_vm (); + + bool result = enough_space && minimum_specs && !vm && powered; if (result == false) { show_next (); } @@ -144,13 +148,6 @@ public class Installer.CheckView : AbstractInstallerView { if (upower == null) { try { upower = Bus.get_proxy_sync (BusType.SYSTEM, "org.freedesktop.UPower", "/org/freedesktop/UPower", GLib.DBusProxyFlags.GET_INVALIDATED_PROPERTIES); - - (upower as DBusProxy).g_properties_changed.connect ((changed, invalid) => { - var _on_battery = changed.lookup_value ("OnBattery", GLib.VariantType.BOOLEAN); - if (_on_battery != null) { - status_changed (check_requirements ()); - } - }); } catch (Error e) { warning (e.message); return false; @@ -160,40 +157,76 @@ public class Installer.CheckView : AbstractInstallerView { return upower.on_battery; } + private static bool get_vm () { + File file = File.new_for_path ("/proc/cpuinfo"); + try { + DataInputStream dis = new DataInputStream (file.read ()); + string? line; + while ((line = dis.read_line (null,null)) != null) { + if (line.has_prefix ("flags") && line.contains ("hypervisor")) { + return true; + } + } + } catch (Error e) { + critical (e.message); + } + + return false; + } + private void show_next () { State next_state = State.NONE; switch (current_state) { case State.NONE: if (!enough_space) { next_state = State.SPACE; - } else if (!enough_power) { + } else if (!minimum_specs) { next_state = State.SPECS; + } else if (vm) { + next_state = State.VM; } else if (!powered) { next_state = State.POWERED; } else { + next_step (); return; } break; case State.SPACE: - if (!enough_power) { + if (!minimum_specs) { next_state = State.SPECS; + } else if (vm) { + next_state = State.VM; } else if (!powered) { next_state = State.POWERED; } else { + next_step (); return; } break; case State.SPECS: + if (vm) { + next_state = State.VM; + } else if (!powered) { + next_state = State.POWERED; + } else { + next_step (); + return; + } + + break; + case State.VM: if (!powered) { next_state = State.POWERED; } else { + next_step (); return; } break; case State.POWERED: + next_step (); return; } @@ -227,6 +260,22 @@ public class Installer.CheckView : AbstractInstallerView { stack.set_visible_child (grid); break; + case State.VM: + var grid = setup_grid ( + _("Virtual Machine"), + _("You appear to be installing in a virtual machine. Some parts of %s may run slowly, freeze, or not function properly in a virtual machine. It's recommended to install on real hardware.").printf (Utils.get_pretty_name ()), + "utilities-system-monitor" + ); + grid.show_all (); + + if (ignore_button.parent == null) { + action_area.add (ignore_button); + } + + stack.add (grid); + stack.set_visible_child (grid); + break; + case State.POWERED: var grid = setup_grid ( _("Connect to a Power Source"), @@ -343,3 +392,4 @@ public class Installer.CheckView : AbstractInstallerView { public interface UPower : GLib.Object { public abstract bool on_battery { owned get; set; } } +