The usage of the vm-ui property is a quick-and-dirty way to enable the
menu elements, which will do for now. This may break QMP, I haven't
tested if it still works. There is no restriction to a single power
channel, the message is broadcasted to all connected power channels.
---
src/virt-viewer-app.c | 1 -
src/virt-viewer-session-spice.c | 46 ++++++++++++++++++++++++++++-----
2 files changed, 40 insertions(+), 7 deletions(-)
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index 5a1204b..db44359 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -1098,7 +1098,6 @@ virt_viewer_app_set_actions_sensitive(VirtViewerApp *self)
action = g_action_map_lookup_action(map, "machine-reset");
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_RESET));
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index 29e14be..734720d 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -1049,9 +1049,33 @@ static void
virt_viewer_session_spice_vm_action(VirtViewerSession *sess G_GNUC_UNUSED,
gint action G_GNUC_UNUSED)
{
-#ifdef WITH_QMP_PORT
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(sess);
+ if (spice_session_has_channel_type(self->session, SPICE_CHANNEL_POWER)) {
+ switch (action) {
+ case VIRT_VIEWER_SESSION_VM_ACTION_RESET: {
+ g_debug("virt_viewer_session_spice_vm_action reset");
+ 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_reset(SPICE_POWER_CHANNEL(channel));
+ }
+
+ g_list_free(channels);
+ return;
+ }
+ }
+ }
+
+#ifdef WITH_QMP_PORT
switch (action) {
case VIRT_VIEWER_SESSION_VM_ACTION_QUIT:
action = SPICE_QMP_PORT_VM_ACTION_QUIT;
@@ -1080,9 +1104,16 @@ static gboolean
virt_viewer_session_spice_has_vm_action(VirtViewerSession *sess G_GNUC_UNUSED,
gint action G_GNUC_UNUSED)
{
-#ifdef WITH_QMP_PORT
VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(sess);
+ if (spice_session_has_channel_type(self->session, SPICE_CHANNEL_POWER)) {
+ switch (action) {
+ case VIRT_VIEWER_SESSION_VM_ACTION_RESET:
+ return TRUE;
+ }
+ }
+
+#ifdef WITH_QMP_PORT
switch (action) {
case VIRT_VIEWER_SESSION_VM_ACTION_QUIT:
case VIRT_VIEWER_SESSION_VM_ACTION_RESET:
@@ -1090,12 +1121,11 @@
virt_viewer_session_spice_has_vm_action(VirtViewerSession *sess G_GNUC_UNUSED,
case VIRT_VIEWER_SESSION_VM_ACTION_PAUSE:
case VIRT_VIEWER_SESSION_VM_ACTION_CONTINUE:
return self->qmp != NULL;
- default:
- return FALSE;
}
-#else
- return FALSE;
#endif
+
+ return FALSE;
+
}
#ifdef WITH_QMP_PORT
@@ -1292,6 +1322,10 @@ virt_viewer_session_spice_channel_new(SpiceSession *s,
if (SPICE_IS_POWER_CHANNEL(channel)) {
g_debug("new power channel");
spice_channel_connect(channel);
+
+ // to re-trigger virt_viewer_app_set_actions_sensitive()
+ g_object_set(virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)),
+ "vm-ui", FALSE, NULL);
}
self->channel_count++;
--
2.52.0