[glom] Store Glade files in a GResource instead of installing them.



commit 1387e85443fd1d675f1556b5d365686c0e0acd31
Author: Murray Cumming <murrayc murrayc com>
Date:   Tue Oct 8 22:09:55 2013 +0200

    Store Glade files in a GResource instead of installing them.
    
    * ui/glom.gresource.xml: List all the .glade files.
    * Makefile_glom.am: Use glib-compile-resources to create a .c file
      with the GResource data, and compile and link it in to the
      Glom executable.
    * glom/glade_utils.h: Use Gtk::Builder::create_from_resource() instead
      of create_from_file().
    
      This simplifies installation.

 Makefile.am           |    5 +---
 Makefile_glom.am      |   13 +++++++++-
 configure.ac          |    5 +++-
 glom/glade_utils.h    |   37 +++++++++-------------------
 ui/glom.gresource.xml |   65 +++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 94 insertions(+), 31 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index d0eeced..0e070f6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -240,13 +240,10 @@ endif
 
 
 # The AppData file:
-appdata_in_files = glom.appdata.xml.in
-appdata_files = $(appdata_in_files:.xml.in=.xml)
+appdata_files = glom.appdata.xml
 appdatadir = $(datadir)/appdata
 dist_appdata_DATA = $(appdata_files)
 
-EXTRA_DIST = $(appdata_in_files)
-
 @INTLTOOL_XML_RULE@
 
 
diff --git a/Makefile_glom.am b/Makefile_glom.am
index f3301c7..55c2462 100644
--- a/Makefile_glom.am
+++ b/Makefile_glom.am
@@ -28,6 +28,16 @@ bin_PROGRAMS += glom/glom
 
 glom_glom_CPPFLAGS = $(glom_includes) $(GLOM_CFLAGS) $(PYTHON_CPPFLAGS) $(BOOST_PYTHON_CFLAGS) 
$(GCOV_CFLAGS) $(glom_defines)
 
+# Generate the GResource source file:
+# TODO: Do not use all .glade files in the client-only build.
+glom_resource_file = ui/glom.gresource.xml
+BUILT_SOURCES = ui/glom-resources.c
+ui/glom-resources.c: $(glom_resource_file) $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies 
$(glom_resource_file))
+       $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-source 
$(glom_resource_file)
+
+EXTRA_DIST = \
+       $(glom_resource_file)
+
 glom_eggspreadtable_files =  \
   glom/utility_widgets/eggspreadtable/eggmarshalers.c \
        glom/utility_widgets/eggspreadtable/eggmarshalers.h \
@@ -64,7 +74,8 @@ glom_canvas_files =  \
        glom/utility_widgets/canvas/canvas_table_movable.cc             \
        glom/utility_widgets/canvas/canvas_table_movable.h              \
        glom/utility_widgets/canvas/canvas_text_movable.cc              \
-       glom/utility_widgets/canvas/canvas_text_movable.h
+       glom/utility_widgets/canvas/canvas_text_movable.h \
+       $(BUILT_SOURCES)
 
 glom_source_files = \
        glom/appwindow.cc                                               \
diff --git a/configure.ac b/configure.ac
index d63b13e..571a4e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -374,12 +374,15 @@ fi
 AM_CONDITIONAL(GCOV_ENABLED, test x$enable_gcov = xyes)
 AC_MSG_RESULT($enable_gcov)
 
+# GResources
+GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
+AC_SUBST(GLIB_COMPILE_RESOURCES)
 
 AC_CONFIG_FILES([Makefile
-                 docs/user-guide/Makefile
                  po/Makefile.in
                  glom.desktop.in
                  glom/libglom/glom-${GLOM_ABI_VERSION}.pc:glom/libglom/glom.pc.in
+                 docs/user-guide/Makefile
                  docs/libglom_reference/Makefile
                  docs/libglom_reference/Doxyfile
                  docs/pyglom_reference/Makefile
diff --git a/glom/glade_utils.h b/glom/glade_utils.h
index bab4a6b..ca6ed6d 100644
--- a/glom/glade_utils.h
+++ b/glom/glade_utils.h
@@ -35,28 +35,10 @@ namespace Glom
 namespace Utils
 {
 
-inline std::string get_glade_file_path(const std::string& filename)
+inline std::string get_glade_resource_path(const std::string& filename)
 {
-#ifdef G_OS_WIN32
-  gchar* directory = g_win32_get_package_installation_directory_of_module(0);
-  const std::string result = Glib::build_filename(directory, Glib::build_filename("share/glom/glade", 
filename));
-  g_free(directory);
-  directory = 0;
-#else
-  const std::string result = Glib::build_filename(GLOM_PKGDATADIR, Glib::build_filename("glade", filename));
-#endif
-
-  // Check that it exists:
-  const Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(result);
-  if(file && file->query_exists())
-    return result;
-
-  // Try to fall back to the uninstalled file in the source tree,
-  // for instance when running "make distcheck", which doesn't install to _inst/
-  // before running check.
-  std::cout << "Glade file not found: " << result << std::endl;
-  std::cout << "Falling back to the local file." << std::endl;
-  return Glib::build_filename(GLOM_PKGDATADIR_NOTINSTALLED, filename);
+  // This is the same prefix that is in the *gresource.xml.in file.
+  return "/org/gnome/glom/ui/" + filename;
 }
 
 /** This assumes that there are no other top-level windows in the glade file.
@@ -70,11 +52,11 @@ void helper_get_glade_widget_derived_with_warning(const std::string& filename, c
 
   try
   {
-    const std::string filepath = Utils::get_glade_file_path(filename);
+    const std::string filepath = Utils::get_glade_resource_path(filename);
     if(load_all)
-      refXml = Gtk::Builder::create_from_file(filepath);
+      refXml = Gtk::Builder::create_from_resource(filepath);
      else
-      refXml = Gtk::Builder::create_from_file(filepath, id);
+      refXml = Gtk::Builder::create_from_resource(filepath, id);
   }
   catch(const Gtk::BuilderError& ex)
   {
@@ -109,6 +91,7 @@ void get_glade_child_widget_derived_with_warning(T_Widget*& widget)
 
   // Check the path to the installed .glade file:
   // The id is the same as the filename, in a developer/operator sub-directory:
+  // TODO: Should we use build_filename()?
   const std::string filename = Glib::build_filename(
       (T_Widget::glade_developer ? "developer" : "operator"),
       std::string(T_Widget::glade_id) + ".glade"); 
@@ -142,7 +125,7 @@ void get_glade_widget_with_warning(const std::string& filename, const Glib::ustr
 
   try
   {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path(filename), id);
+    refXml = Gtk::Builder::create_from_resource(Utils::get_glade_resource_path(filename), id);
   }
   catch(const Gtk::BuilderError& ex)
   {
@@ -156,6 +139,10 @@ void get_glade_widget_with_warning(const std::string& filename, const Glib::ustr
   {
     std::cerr << ex.what() << std::endl;
   }
+  catch(const Gio::ResourceError& ex)
+  {
+    std::cerr << ex.what() << std::endl;
+  }
 
   if(refXml)
   {
diff --git a/ui/glom.gresource.xml b/ui/glom.gresource.xml
new file mode 100644
index 0000000..cceeca9
--- /dev/null
+++ b/ui/glom.gresource.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/gnome/glom">
+    <file preprocess="xml-stripblanks">ui/developer/box_formatting.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/box_print_layouts.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/box_reports.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_add_related_table.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_change_language.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_choose_field.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_choose_relationship.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_choose_user.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_database_preferences.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_error_create_database.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_fieldslist.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_field_summary.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_flowtable.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_group_by.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_initial_password.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_layout_field_properties.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_line.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_new_group.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_new_library_script.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_notebook.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_relationships_overview.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_script_library.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_sort_fields.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_translation_copy.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_translation_identify_original.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/dialog_user.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_button_script.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_data_layout_export.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_data_layout.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_design.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_field_calculation.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_field_definition_edit.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_groups.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_imageobject.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_print_layout_edit.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_report_layout.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_text_format.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_textobject.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_translations.glade</file>
+    <file preprocess="xml-stripblanks">ui/developer/window_users.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/box_navigation_tables.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_choose_date.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_connection.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_data_invalid_format.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_existing_or_new.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_find_id.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_image_load_progress.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_image_save_progress.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_import_csv.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_import_csv_progress.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/dialog_new_record.glade</file>
+    <file preprocess="xml-stripblanks">ui/operator/window_main.glade</file>
+
+  </gresource>
+</gresources>
+
+
+
+
+ 
+
+


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]