---
 src/virt-viewer-app.c           |  1 -
 src/virt-viewer-session-spice.c | 20 ++++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index db44359..c473728 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -1104,7 +1104,6 @@ virt_viewer_app_set_actions_sensitive(VirtViewerApp *self)
     action = g_action_map_lookup_action(map, "machine-powerdown");
     g_simple_action_set_enabled(G_SIMPLE_ACTION(action),
                                 priv->connected &&
-                                priv->vm_ui &&
                                 
virt_viewer_session_has_vm_action(priv->session,
                                                                   
VIRT_VIEWER_SESSION_VM_ACTION_POWER_DOWN));
 
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index 734720d..381855a 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -1072,6 +1072,25 @@ virt_viewer_session_spice_vm_action(VirtViewerSession 
*sess G_GNUC_UNUSED,
             g_list_free(channels);
             return;
         }
+        case VIRT_VIEWER_SESSION_VM_ACTION_POWER_DOWN: {
+            g_debug("virt_viewer_session_spice_vm_action poweroff");
+            SpiceSession *session = self->session;
+            GList *l, *channels;
+
+            channels = spice_session_get_channels(session);
+            for (l = channels; l != NULL; l = l->next) {
+                SpiceChannel *channel = l->data;
+
+                if (!SPICE_IS_POWER_CHANNEL(channel)) {
+                    continue;
+                }
+
+                
spice_power_channel_send_poweroff(SPICE_POWER_CHANNEL(channel));
+            }
+
+            g_list_free(channels);
+            return;
+        }
         }
     }
 
@@ -1109,6 +1128,7 @@ virt_viewer_session_spice_has_vm_action(VirtViewerSession 
*sess G_GNUC_UNUSED,
     if (spice_session_has_channel_type(self->session, SPICE_CHANNEL_POWER)) {
         switch (action) {
         case VIRT_VIEWER_SESSION_VM_ACTION_RESET:
+        case VIRT_VIEWER_SESSION_VM_ACTION_POWER_DOWN:
             return TRUE;
         }
     }
-- 
2.52.0

Reply via email to