[virt-tools-list] [virt-viewer] Use GResource for loading ui files

Fabiano Fidêncio fabiano at fidencio.org
Tue Mar 1 21:58:31 UTC 2016


On Tue, Mar 1, 2016 at 10:54 PM, Jonathon Jongsma <jjongsma at redhat.com> wrote:
> On Fri, 2016-02-26 at 23:38 +0100, Fabiano Fidêncio wrote:
>> Let's take advantage of GResource for loading ui files in a better and
>> cleaner way than virt_viewer_util_load_ui() was doing.
>> It also brings the benefit, at least for developers, of being able to
>> test ui changes without having to "make install" virt-viewer.
>>
>> Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
>> ---
>>  src/Makefile.am               | 25 ++++++++++++++++++----
>>  src/virt-viewer-about.xml     |  1 -
>>  src/virt-viewer-app.c         | 10 +++++++++
>>  src/virt-viewer-util.c        | 50 ++++++------------------------------------
>> -
>>  src/virt-viewer-window.c      | 20 +++++++++++++----
>>  src/virt-viewer.gresource.xml | 19 ++++++++++++++++
>>  6 files changed, 73 insertions(+), 52 deletions(-)
>>  create mode 100644 src/virt-viewer.gresource.xml
>>
>> diff --git a/src/Makefile.am b/src/Makefile.am
>> index f42a7bf..ce31f08 100644
>> --- a/src/Makefile.am
>> +++ b/src/Makefile.am
>> @@ -18,8 +18,10 @@ builderxml_DATA =                          \
>>
>>  EXTRA_DIST =                                 \
>>       $(builderxml_DATA)                      \
>> +     $(resource_files)                       \
>>       virt-viewer-enums.c.etemplate           \
>>       virt-viewer-enums.h.etemplate           \
>> +     virt-viewer.gresource.xml               \
>>       $(NULL)
>>
>>  ENUMS_FILES =                                        \
>> @@ -27,15 +29,32 @@ ENUMS_FILES =                                     \
>>       $(NULL)
>>
>>  BUILT_SOURCES =                                      \
>> +     virt-viewer-resources.h                 \
>> +     virt-viewer-resources.c                 \
>>       virt-viewer-enums.h                     \
>>       virt-viewer-enums.c                     \
>>       $(NULL)
>>
>> -$(BUILT_SOURCES): %: %.etemplate $(ENUMS_FILES)
>> -     $(AM_V_GEN)$(GLIB_MKENUMS) --template $^ | \
>> +resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) -
>> -generate-dependencies $(srcdir)/virt-viewer.gresource.xml)
>> +virt-viewer-resources.c: $(srcdir)/virt-viewer.gresource.xml
>> $(resource_files)
>> +     glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate
>> -source --c-name virt_viewer $(srcdir)/virt-viewer.gresource.xml
>> +virt-viewer-resources.h: $(srcdir)/virt-viewer.gresource.xml
>> $(resource_files)
>> +     glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate
>> -header --c-name virt_viewer $(srcdir)/virt-viewer.gresource.xml
>> +
>> +virt-viewer-enums.h: %: virt-viewer-enums.h.etemplate $(ENUMS_FILES)
>> +            $(AM_V_GEN)$(GLIB_MKENUMS) --template $^ | \
>> +            sed -e 's/VIRT_TYPE_VIEWER/VIRT_VIEWER_TYPE/' \
>> +                -e 's,#include "$(srcdir)/,#include ",' > $@
>> +
>> +virt-viewer-enums.c: %: virt-viewer-enums.c.etemplate $(ENUMS_FILES)
>> +            $(AM_V_GEN)$(GLIB_MKENUMS) --template $^ | \
>>              sed -e 's/VIRT_TYPE_VIEWER/VIRT_VIEWER_TYPE/' \
>>                  -e 's,#include "$(srcdir)/,#include ",' > $@
>
>
> This duplication seems a shame. Is there a reason we can't continue using a
> pattern rule?

Hmm. Maybe? I'm not sure, to be honest.

>
>>
>> +CLEANFILES = \
>> +     $(BUILT_SOURCES)                                \
>> +     $(NULL)
>> +
>>  libvirt_viewer_la_SOURCES =                                  \
>>       $(BUILT_SOURCES)                                \
>>       virt-viewer-util.h                              \
>> @@ -185,8 +204,6 @@ if OS_WIN32
>>  remote_viewer_LDFLAGS += -Wl,--subsystem,windows
>>  endif
>>
>> -AM_CPPFLAGS = -DPACKAGE_DATADIR=\""$(pkgdatadir)"\"
>> -
>>  VIRT_VIEWER_RES = virt-viewer.rc virt-viewer.manifest
>>  ICONDIR = $(top_builddir)/icons
>>  MANIFESTDIR = $(srcdir)
>> diff --git a/src/virt-viewer-about.xml b/src/virt-viewer-about.xml
>> index 16db3c2..287c68d 100644
>> --- a/src/virt-viewer-about.xml
>> +++ b/src/virt-viewer-about.xml
>> @@ -36,7 +36,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
>>  02111-1307  USA
>>  Marc-André Lureau
>>  </property>
>>      <property name="translator_credits" translatable="yes">The Fedora
>> Translation Team</property>
>> -    <property name="logo_icon_name">virt-viewer</property>
>>      <signal name="delete-event" handler="virt_viewer_app_about_delete"
>> swapped="no"/>
>>      <signal name="response" handler="virt_viewer_app_about_close"
>> swapped="no"/>
>>      <child internal-child="vbox">
>> diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
>> index 3fa80a5..68fe533 100644
>> --- a/src/virt-viewer-app.c
>> +++ b/src/virt-viewer-app.c
>> @@ -52,6 +52,7 @@
>>  #endif
>>
>>  #include "virt-viewer-app.h"
>> +#include "virt-viewer-resources.h"
>>  #include "virt-viewer-auth.h"
>>  #include "virt-viewer-window.h"
>>  #include "virt-viewer-session.h"
>> @@ -115,6 +116,7 @@ struct _VirtViewerAppPrivate {
>>      gchar *clipboard;
>>      GtkWidget *preferences;
>>      GtkFileChooser *preferences_shared_folder;
>> +    GResource *resource;
>>      gboolean direct;
>>      gboolean verbose;
>>      gboolean enable_accel;
>> @@ -1717,6 +1719,11 @@ virt_viewer_app_dispose (GObject *object)
>>          g_hash_table_unref(tmp);
>>      }
>>
>> +    if (priv->resource != NULL) {
>> +        g_resources_unregister(priv->resource);
>> +        priv->resource = NULL;
>> +    }
>> +
>
> I'm quite sure that this is not actually necessary, since you did not pass -
> -manual-register to the glib-compile-resources script. The generated code makes
> use of 'constructor' functions to register these static resources automatically.
>
>>      g_clear_object(&priv->session);
>>      g_free(priv->title);
>>      priv->title = NULL;
>> @@ -1863,6 +1870,9 @@ virt_viewer_app_on_application_startup(GApplication
>> *app)
>>
>>      G_APPLICATION_CLASS(virt_viewer_app_parent_class)->startup(app);
>>
>> +    self->priv->resource = virt_viewer_get_resource();
>> +    g_resources_register(self->priv->resource);
>> +
>
> same as above
>

Well, didn't work without doing this.
You can remove this part and see if it works for you, but wasn't the case here.

>>      virt_viewer_app_set_debug(opt_debug);
>>      virt_viewer_app_set_fullscreen(self, opt_fullscreen);
>>
>> diff --git a/src/virt-viewer-util.c b/src/virt-viewer-util.c
>> index 76b61a1..ce81e06 100644
>> --- a/src/virt-viewer-util.c
>> +++ b/src/virt-viewer-util.c
>> @@ -41,6 +41,8 @@
>>
>>  #include "virt-viewer-util.h"
>>
>> +#define VIRT_VIEWER_RESOURCE_PREFIX "/org/virt-manager/virt-viewer"
>> +
>>  GQuark
>>  virt_viewer_error_quark(void)
>>  {
>> @@ -49,53 +51,15 @@ virt_viewer_error_quark(void)
>>
>>  GtkBuilder *virt_viewer_util_load_ui(const char *name)
>>  {
>> -    struct stat sb;
>>      GtkBuilder *builder;
>> -    GError *error = NULL;
>> -
>> -    builder = gtk_builder_new();
>> -    if (stat(name, &sb) >= 0) {
>> -        gtk_builder_add_from_file(builder, name, &error);
>> -    } else {
>> -        gchar *path = g_build_filename(PACKAGE_DATADIR, "ui", name, NULL);
>> -        gboolean success = (gtk_builder_add_from_file(builder, path, &error)
>> != 0);
>> -        if (error) {
>> -            if (!(error->domain == G_FILE_ERROR && error->code ==
>> G_FILE_ERROR_NOENT))
>> -                g_warning("Failed to add ui file '%s': %s", path, error
>> ->message);
>> -            g_clear_error(&error);
>> -        }
>> -        g_free(path);
>> -
>> -        if (!success) {
>> -            const gchar * const * dirs = g_get_system_data_dirs();
>> -            g_return_val_if_fail(dirs != NULL, NULL);
>> -
>> -            while (dirs[0] != NULL) {
>> -                path = g_build_filename(dirs[0], PACKAGE, "ui", name, NULL);
>> -                if (gtk_builder_add_from_file(builder, path, NULL) != 0) {
>> -                    g_free(path);
>> -                    break;
>> -                }
>> -                g_free(path);
>> -                dirs++;
>> -            }
>> -            if (dirs[0] == NULL)
>> -                goto failed;
>> -        }
>> -    }
>> +    gchar *resource = g_strdup_printf("%s/%s",
>> +                                      VIRT_VIEWER_RESOURCE_PREFIX,
>> +                                      name);
>>
>> -    if (error) {
>> -        g_error("Cannot load UI description %s: %s", name,
>> -                error->message);
>> -        g_clear_error(&error);
>> -        goto failed;
>> -    }
>> +    builder = gtk_builder_new_from_resource(resource);
>>
>> +    g_free(resource);
>>      return builder;
>> - failed:
>> -    g_error("failed to find UI description file");
>> -    g_object_unref(builder);
>> -    return NULL;
>>  }
>>
>>  int
>> diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
>> index 8ce34ca..2c46c06 100644
>> --- a/src/virt-viewer-window.c
>> +++ b/src/virt-viewer-window.c
>> @@ -1030,11 +1030,24 @@ G_MODULE_EXPORT void
>>  virt_viewer_window_menu_help_about(GtkWidget *menu G_GNUC_UNUSED,
>>                                     VirtViewerWindow *self)
>>  {
>> -    GtkBuilder *about = virt_viewer_util_load_ui("virt-viewer-about.xml");
>> +    GtkBuilder *about;
>> +    GtkWidget *dialog;
>> +    GdkPixbuf *icon;
>> +
>> +    about = virt_viewer_util_load_ui("virt-viewer-about.xml");
>> +
>> +    dialog = GTK_WIDGET(gtk_builder_get_object(about, "about"));
>>
>> -    GtkWidget *dialog = GTK_WIDGET(gtk_builder_get_object(about, "about"));
>>      gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), VERSION BUILDID);
>>
>> +    icon = gdk_pixbuf_new_from_resource("/org/virt-manager/virt
>> -viewer/icons/48x48/virt-viewer.png", NULL);
>
> VIRT_VIEWER_RESOURCE_PREFIX could be used here.
>
>> +    if (icon != NULL) {
>> +        gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(dialog), icon);
>> +        g_object_unref(icon);
>> +    } else {
>> +        gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(dialog), "virt
>> -viewer");
>> +    }
>> +
>>      gtk_window_set_transient_for(GTK_WINDOW(dialog),
>>                                   GTK_WINDOW(self->priv->window));
>>
>> @@ -1066,8 +1079,7 @@ virt_viewer_window_toolbar_setup(VirtViewerWindow *self)
>>      g_signal_connect(button, "clicked",
>> G_CALLBACK(virt_viewer_window_menu_file_quit), self);
>>
>>      /* USB Device selection */
>> -    button = gtk_image_new_from_icon_name("virt-viewer-usb",
>> -                                          GTK_ICON_SIZE_INVALID);
>> +    button = gtk_image_new_from_resource("/org/virt-manager/virt
>> -viewer/icons/24x24/virt-viewer-usb.png");
>
> and here
>
>>      button = GTK_WIDGET(gtk_tool_button_new(button, NULL));
>>      gtk_tool_button_set_label(GTK_TOOL_BUTTON(button), _("USB device
>> selection"));
>>      gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(button), _("USB device
>> selection"));
>> diff --git a/src/virt-viewer.gresource.xml b/src/virt-viewer.gresource.xml
>> new file mode 100644
>> index 0000000..596889a
>> --- /dev/null
>> +++ b/src/virt-viewer.gresource.xml
>> @@ -0,0 +1,19 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<gresources>
>> +  <gresource prefix="/org/virt-manager/virt-viewer">
>> +    <file>remote-viewer-connect.xml</file>
>> +    <file>virt-viewer-about.xml</file>
>> +    <file>virt-viewer-auth.xml</file>
>> +    <file>virt-viewer-guest-details.xml</file>
>> +    <file>virt-viewer-preferences.xml</file>
>> +    <file>virt-viewer-vm-connection.xml</file>
>> +    <file>virt-viewer.xml</file>
>> +    <file alias="icons/16x16/virt-viewer.png">../icons/16x16/virt
>> -viewer.png</file>
>> +    <file alias="icons/22x22/virt-viewer.png">../icons/22x22/virt
>> -viewer.png</file>
>> +    <file alias="icons/24x24/virt-viewer.png">../icons/24x24/virt
>> -viewer.png</file>
>> +    <file alias="icons/24x24/virt-viewer-usb.png">../icons/24x24/virt-viewer
>> -usb.png</file>
>> +    <file alias="icons/32x32/virt-viewer.png">../icons/32x32/virt
>> -viewer.png</file>
>> +    <file alias="icons/48x48/virt-viewer.png">../icons/48x48/virt
>> -viewer.png</file>
>> +    <file alias="icons/256x256/virt-viewer.png">../icons/256x256/virt
>> -viewer.png</file>
>> +  </gresource>
>> +</gresources>
>
>
> Reviewed-by: Jonathon Jongsma <jjongsma at redhat.com>
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list


I will address your (and Eduardo) comments and submit a v2.

Best Regards,
-- 
Fabiano Fidêncio




More information about the virt-tools-list mailing list