[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