<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jun 30, 2014 at 10:49 PM, Jonathon Jongsma <span dir="ltr"><<a href="mailto:jjongsma@redhat.com" target="_blank">jjongsma@redhat.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">This allows the user to obtain the GUID and vm name of the currently-connected<br>
guest.  Obviously, this only works with spice. In the future, it will allow them<br>
to set guest-specific configuration options (using a GUID as a key)<br>
---<br>
 src/Makefile.am                   |   1 +<br>
 src/virt-viewer-app.c             |  25 ++++++++<br>
 src/virt-viewer-app.h             |   1 -<br>
 src/virt-viewer-guest-details.xml | 120 ++++++++++++++++++++++++++++++++++++++<br>
</div> src/virt-viewer-session-spice.c   |  17 +++++-<br>
 src/virt-viewer-window.c          |  45 ++++++++++++++<br>
<div class=""> src/virt-viewer.c                 |   2 +-<br>
 src/virt-viewer.xml               |  10 ++++<br>
</div> 8 files changed, 218 insertions(+), 3 deletions(-)<br>
<div class=""> create mode 100644 src/virt-viewer-guest-details.xml<br>
<br>
diff --git a/src/Makefile.am b/src/Makefile.am<br>
index b3a9637..d4163c8 100644<br>
--- a/src/Makefile.am<br>
+++ b/src/Makefile.am<br>
@@ -8,6 +8,7 @@ builderxml_DATA =                               \<br>
        virt-viewer.xml                         \<br>
        virt-viewer-about.xml                   \<br>
        virt-viewer-auth.xml                    \<br>
+       virt-viewer-guest-details.xml   \<br>
        $(NULL)<br>
<br>
 EXTRA_DIST =                                   \<br>
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c<br>
</div>index 6cf2747..e0f33bd 100644<br>
<div><div class="h5">--- a/src/virt-viewer-app.c<br>
+++ b/src/virt-viewer-app.c<br>
@@ -139,6 +139,7 @@ struct _VirtViewerAppPrivate {<br>
     gchar *guest_name;<br>
     gboolean grabbed;<br>
     char *title;<br>
+    char *uuid;<br>
<br>
     gint focused;<br>
     GKeyFile *config;<br>
@@ -168,6 +169,7 @@ enum {<br>
     PROP_HAS_FOCUS,<br>
     PROP_KIOSK,<br>
     PROP_QUIT_ON_DISCONNECT,<br>
+    PROP_UUID,<br>
 };<br>
<br>
 enum {<br>
@@ -305,6 +307,7 @@ app_window_try_fullscreen(VirtViewerApp *self G_GNUC_UNUSED,<br>
 }<br>
<br>
<br>
+static<br>
 void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_string)<br>
 {<br>
     GArray* mapping = NULL;<br>
@@ -315,6 +318,8 @@ void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_stri<br>
<br>
     g_debug("%s: UUID changed to %s", G_STRFUNC, uuid_string);<br>
<br>
+    g_free(self->priv->uuid);<br>
+    self->priv->uuid = g_strdup(uuid_string);<br>
     displays = g_key_file_get_integer_list(self->priv->config,<br>
                                            uuid_string, "monitor-mapping", &ndisplays, &error);<br>
     if (error) {<br>
</div></div>@@ -1457,6 +1462,10 @@ virt_viewer_app_get_property (GObject *object, guint property_id,<br>
<div class="">         g_value_set_boolean(value, priv->quit_on_disconnect);<br>
         break;<br>
<br>
+    case PROP_UUID:<br>
+        g_value_set_string(value, priv->uuid);<br>
+        break;<br>
+<br>
     default:<br>
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);<br>
     }<br>
</div>@@ -1507,6 +1516,10 @@ virt_viewer_app_set_property (GObject *object, guint property_id,<br>
<div class="">         priv->quit_on_disconnect = g_value_get_boolean(value);<br>
         break;<br>
<br>
+    case PROP_UUID:<br>
+        virt_viewer_app_set_uuid_string(self, g_value_get_string(value));<br>
+        break;<br>
+<br>
     default:<br>
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);<br>
     }<br>
</div>@@ -1539,6 +1552,8 @@ virt_viewer_app_dispose (GObject *object)<br>
<div class="">     priv->guri = NULL;<br>
     g_free(priv->title);<br>
     priv->title = NULL;<br>
+    g_free(priv->uuid);<br>
+    priv->uuid = NULL;<br>
     g_free(priv->config_file);<br>
     priv->config_file = NULL;<br>
     g_clear_pointer(&priv->config, g_key_file_free);<br>
</div>@@ -1813,6 +1828,16 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass)<br>
<div class="">                                                          G_PARAM_READWRITE |<br>
                                                          G_PARAM_STATIC_STRINGS));<br>
<br>
+    g_object_class_install_property(object_class,<br>
+                                    PROP_UUID,<br>
+                                    g_param_spec_string("uuid",<br>
+                                                        "uuid",<br>
+                                                        "uuid",<br>
</div>+                                                        NULL,<br>
<div><div class="h5">+                                                        G_PARAM_READABLE |<br>
+                                                        G_PARAM_WRITABLE |<br>
+                                                        G_PARAM_STATIC_STRINGS));<br>
+<br>
     signals[SIGNAL_WINDOW_ADDED] =<br>
         g_signal_new("window-added",<br>
                      G_OBJECT_CLASS_TYPE(object_class),<br>
diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h<br>
index 6a53992..ba8cf71 100644<br>
--- a/src/virt-viewer-app.h<br>
+++ b/src/virt-viewer-app.h<br>
@@ -100,7 +100,6 @@ const GOptionEntry* virt_viewer_app_get_options(void);<br>
 void virt_viewer_app_clear_hotkeys(VirtViewerApp *app);<br>
 gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self);<br>
 gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display);<br>
-void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_string);<br>
 void virt_viewer_app_set_enable_accel(VirtViewerApp *app, gboolean enable);<br>
<br>
 G_END_DECLS<br>
diff --git a/src/virt-viewer-guest-details.xml b/src/virt-viewer-guest-details.xml<br>
new file mode 100644<br>
index 0000000..7f00567<br>
--- /dev/null<br>
+++ b/src/virt-viewer-guest-details.xml<br>
@@ -0,0 +1,120 @@<br>
+<?xml version="1.0" encoding="UTF-8"?><br>
+<!-- Generated with glade 3.16.0 on Thu Jan 16 16:13:38 2014 --><br>
+<interface><br>
+  <!-- interface-requires gtk+ 3.0 --><br>
+  <object class="GtkDialog" id="guestdetailsdialog"><br>
+    <property name="can_focus">False</property><br>
+    <property name="title" translatable="yes">Guest Details</property><br>
+    <property name="resizable">True</property><br>
+    <property name="default_width">400</property><br>
+    <property name="type_hint">dialog</property><br>
+    <signal name="response" handler="virt_viewer_window_guest_details_response" swapped="no"/><br>
+    <child internal-child="vbox"><br>
+      <object class="GtkBox" id="dialog-vbox2"><br>
+        <property name="can_focus">False</property><br>
+        <property name="orientation">vertical</property><br>
+        <property name="spacing">2</property><br>
+        <child internal-child="action_area"><br>
+          <object class="GtkButtonBox" id="dialog-action_area2"><br>
+            <property name="can_focus">False</property><br>
+            <property name="layout_style">end</property><br>
+            <child><br>
+              <object class="GtkButton" id="button1"><br>
+                <property name="label">gtk-close</property><br>
+                <property name="visible">True</property><br>
+                <property name="can_focus">True</property><br>
+                <property name="receives_default">True</property><br>
+                <property name="use_stock">True</property><br>
+              </object><br>
+              <packing><br>
+                <property name="expand">False</property><br>
+                <property name="fill">True</property><br>
+                <property name="position">0</property><br>
+              </packing><br>
+            </child><br>
+          </object><br>
+          <packing><br>
+            <property name="expand">False</property><br>
+            <property name="fill">True</property><br>
+            <property name="pack_type">end</property><br>
+            <property name="position">0</property><br>
+          </packing><br>
+        </child><br>
+        <child><br>
+          <object class="GtkTable" id="grid1"><br>
+            <property name="visible">True</property><br>
+            <property name="can_focus">False</property><br>
+            <property name="border_width">6</property><br>
+            <property name="row_spacing">6</property><br>
+            <property name="column_spacing">6</property><br>
+            <property name="n_rows">2</property><br>
+            <child><br>
+              <object class="GtkLabel" id="label1"><br>
+                <property name="visible">True</property><br>
+                <property name="can_focus">False</property><br>
+                <property name="xalign">1</property><br>
+                <property name="label" translatable="yes">Name:</property><br>
+              </object><br>
+              <packing><br>
+                <property name="x_options">GTK_SHRINK | GTK_FILL</property><br>
+                <property name="y_options">GTK_FILL</property><br>
+              </packing><br>
+            </child><br>
+            <child><br>
+              <object class="GtkLabel" id="label2"><br>
+                <property name="visible">True</property><br>
+                <property name="can_focus">False</property><br>
+                <property name="xalign">1</property><br>
+                <property name="label" translatable="yes">GUID:</property><br>
+              </object><br>
+              <packing><br>
+                <property name="top_attach">1</property><br>
+                <property name="bottom_attach">2</property><br>
+                <property name="x_options">GTK_SHRINK | GTK_FILL</property><br>
+                <property name="y_options">GTK_FILL</property><br>
+              </packing><br>
+            </child><br>
+            <child><br>
+              <object class="GtkLabel" id="namevaluelabel"><br>
+                <property name="visible">True</property><br>
+                <property name="can_focus">False</property><br>
+                <property name="xalign">0</property><br>
+                <property name="label" translatable="yes">label</property><br>
+                <property name="selectable">True</property><br>
+              </object><br>
+              <packing><br>
+                <property name="left_attach">1</property><br>
+                <property name="right_attach">2</property><br>
+                <property name="y_options">GTK_FILL</property><br>
+              </packing><br>
+            </child><br>
+            <child><br>
+              <object class="GtkLabel" id="guidvaluelabel"><br>
+                <property name="visible">True</property><br>
+                <property name="can_focus">False</property><br>
+                <property name="xalign">0</property><br>
+                <property name="label" translatable="yes">label</property><br>
+                <property name="selectable">True</property><br>
+              </object><br>
+              <packing><br>
+                <property name="left_attach">1</property><br>
+                <property name="right_attach">2</property><br>
+                <property name="top_attach">1</property><br>
+                <property name="bottom_attach">2</property><br>
+                <property name="y_options">GTK_FILL</property><br>
+              </packing><br>
+            </child><br>
+          </object><br>
+          <packing><br>
+            <property name="expand">False</property><br>
+            <property name="fill">True</property><br>
+            <property name="position">1</property><br>
+          </packing><br>
+        </child><br>
+      </object><br>
+    </child><br>
+    <action-widgets><br>
+      <action-widget response="-7">button1</action-widget><br>
+    </action-widgets><br>
+  </object><br>
+</interface><br>
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c<br>
</div></div>index 255b3ee..06322f5 100644<br>
<div class="">--- a/src/virt-viewer-session-spice.c<br>
+++ b/src/virt-viewer-session-spice.c<br>
@@ -876,7 +876,7 @@ uuid_changed(GObject *gobject G_GNUC_UNUSED,<br>
<br>
         if (!uuid_empty) {<br>
             gchar* uuid_str = spice_uuid_to_string(uuid);<br>
-            virt_viewer_app_set_uuid_string(app, uuid_str);<br>
+            g_object_set(app, "uuid", uuid_str, NULL);<br>
             g_free(uuid_str);<br>
         }<br>
     }<br>
</div>@@ -884,6 +884,20 @@ uuid_changed(GObject *gobject G_GNUC_UNUSED,<br>
<div class="">     virt_viewer_session_spice_fullscreen_auto_conf(self);<br>
 }<br>
<br>
+static void<br>
+name_changed(GObject *gobject G_GNUC_UNUSED,<br>
+              GParamSpec *pspec G_GNUC_UNUSED,<br>
+              VirtViewerSessionSpice *self)<br>
+{<br>
+    gchar* name = NULL;<br>
+    VirtViewerApp* app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self));<br>
+<br>
+    g_object_get(self->priv->session, "name", &name, NULL);<br>
+<br>
+    g_object_set(app, "guest-name", name, NULL);<br>
</div>+    g_free(name);<br>
<div class="">+}<br>
+<br>
 VirtViewerSession *<br>
 virt_viewer_session_spice_new(VirtViewerApp *app, GtkWindow *main_window)<br>
 {<br>
</div>@@ -899,6 +913,7 @@ virt_viewer_session_spice_new(VirtViewerApp *app, GtkWindow *main_window)<br>
<div class="">     /* notify::uuid is guaranteed to be emitted during connection startup even<br>
      * if the server is too old to support sending uuid */<br>
     g_signal_connect(self->priv->session, "notify::uuid", G_CALLBACK(uuid_changed), self);<br>
+    g_signal_connect(self->priv->session, "notify::name", G_CALLBACK(name_changed), self);<br>
<br>
     return VIRT_VIEWER_SESSION(self);<br>
 }<br>
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c<br>
</div>index 22326e8..83fe131 100644<br>
<div class="">--- a/src/virt-viewer-window.c<br>
+++ b/src/virt-viewer-window.c<br>
@@ -49,6 +49,7 @@ void virt_viewer_window_menu_view_zoom_reset(GtkWidget *menu, VirtViewerWindow *<br>
 gboolean virt_viewer_window_delete(GtkWidget *src, void *dummy, VirtViewerWindow *self);<br>
 void virt_viewer_window_menu_file_quit(GtkWidget *src, VirtViewerWindow *self);<br>
 void virt_viewer_window_menu_help_about(GtkWidget *menu, VirtViewerWindow *self);<br>
+void virt_viewer_window_menu_help_guest_details(GtkWidget *menu, VirtViewerWindow *self);<br>
 void virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, VirtViewerWindow *self);<br>
 void virt_viewer_window_menu_send(GtkWidget *menu, VirtViewerWindow *self);<br>
 void virt_viewer_window_menu_file_screenshot(GtkWidget *menu, VirtViewerWindow *self);<br>
</div>@@ -1012,6 +1013,50 @@ virt_viewer_window_menu_view_release_cursor(GtkWidget *menu G_GNUC_UNUSED,<br>
 }<br>
<br>
 G_MODULE_EXPORT void<br>
+virt_viewer_window_menu_help_guest_details(GtkWidget *menu G_GNUC_UNUSED,<br>
<div class="">+                                           VirtViewerWindow *self)<br>
+{<br>
+    GtkBuilder *ui = virt_viewer_util_load_ui("virt-viewer-guest-details.xml");<br>
+    char* name = NULL;<br>
+    char* uuid = NULL;<br>
+<br>
</div>+    g_return_if_fail(ui != NULL);<br>
<div class="">+<br>
+    GtkWidget *dialog = GTK_WIDGET(gtk_builder_get_object(ui, "guestdetailsdialog"));<br>
+    GtkWidget *namelabel = GTK_WIDGET(gtk_builder_get_object(ui, "namevaluelabel"));<br>
+    GtkWidget *guidlabel = GTK_WIDGET(gtk_builder_get_object(ui, "guidvaluelabel"));<br>
+<br>
</div>+    g_return_if_fail(dialog && namelabel && guidlabel);<br>
<div class="">+<br>
+    g_object_get(self->priv->app, "guest-name", &name, "uuid", &uuid, NULL);<br>
+<br>
+    if (!name)<br>
+        name = g_strdup(_("Unknown"));<br></div></blockquote><div><br></div><div>Would be better check for (!name || *name == ' \0'), no?</div><div>The same applied for the uuid check right below.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">
+    if (!uuid)<br>
+        uuid = g_strdup(_("Unknown"));<br>
</div>+    gtk_label_set_text(GTK_LABEL(namelabel), name);<br>
+    gtk_label_set_text(GTK_LABEL(guidlabel), uuid);<br>
<div><div class="h5">+    g_free(name);<br>
+    g_free(uuid);<br>
+<br>
+    gtk_window_set_transient_for(GTK_WINDOW(dialog),<br>
+                                 GTK_WINDOW(self->priv->window));<br>
+<br>
+    gtk_builder_connect_signals(ui, self);<br>
+<br>
+    gtk_widget_show_all(dialog);<br>
+<br>
+    g_object_unref(G_OBJECT(ui));<br>
+}<br>
+<br>
+G_MODULE_EXPORT void<br>
+virt_viewer_window_guest_details_response(GtkDialog *dialog, gint response_id, gpointer user_data)<br>
+{<br>
+    if (response_id == GTK_RESPONSE_CLOSE)<br>
+        gtk_widget_hide(GTK_WIDGET(dialog));<br>
+}<br>
+<br>
+G_MODULE_EXPORT void<br>
 virt_viewer_window_menu_help_about(GtkWidget *menu G_GNUC_UNUSED,<br>
                                    VirtViewerWindow *self)<br>
 {<br>
diff --git a/src/virt-viewer.c b/src/virt-viewer.c<br>
index 8a1d8c5..c03503e 100644<br>
--- a/src/virt-viewer.c<br>
+++ b/src/virt-viewer.c<br>
@@ -560,7 +560,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error)<br>
     if (virDomainGetUUIDString(dom, uuid_string) < 0) {<br>
         g_debug("Couldn't get uuid from libvirt");<br>
     } else {<br>
-        virt_viewer_app_set_uuid_string(app, uuid_string);<br>
+        g_object_set(app, "uuid", uuid_string, NULL);<br>
     }<br>
<br>
     virt_viewer_app_show_status(app, _("Checking guest domain status"));<br>
diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml<br>
</div></div>index 8a3d3c0..e460dba 100644<br>
<div class="">--- a/src/virt-viewer.xml<br>
+++ b/src/virt-viewer.xml<br>
@@ -215,6 +215,16 @@<br>
                     <property name="visible">True</property><br>
                     <property name="can_focus">False</property><br>
                     <child><br>
+                      <object class="GtkMenuItem" id="menu-help-guest-details"><br>
+                        <property name="visible">True</property><br>
+                        <property name="can_focus">False</property><br>
+                        <property name="use_action_appearance">False</property><br>
</div>+                        <property name="label" translatable="yes">_Guest Details</property><br>
<div class="HOEnZb"><div class="h5">+                        <property name="use_underline">True</property><br>
+                        <signal name="activate" handler="virt_viewer_window_menu_help_guest_details" swapped="no"/><br>
+                      </object><br>
+                    </child><br>
+                    <child><br>
                       <object class="GtkImageMenuItem" id="imagemenuitem10"><br>
                         <property name="label">gtk-about</property><br>
                         <property name="visible">True</property><br>
--<br>
1.9.3<br>
<br>
_______________________________________________<br>
virt-tools-list mailing list<br>
<a href="mailto:virt-tools-list@redhat.com">virt-tools-list@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/virt-tools-list" target="_blank">https://www.redhat.com/mailman/listinfo/virt-tools-list</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Fabiano Fidêncio</div>
</div></div>