General code cleanup
[projects/chimara/chimara.git] / player / util.c
1 /*
2  * Copyright (C) 2008, 2009, 2010, 2011 Philip Chimento and Marijn van Vliet.
3  * All rights reserved.
4  *
5  * Chimara is free software copyrighted by Philip Chimento and Marijn van Vliet.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  *    this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright notice,
13  *    this list of conditions and the following disclaimer in the documentation
14  *    and/or other materials provided with the distribution.
15  * 3. Neither of the names Philip Chimento or Marijn van Vliet, nor the name of
16  *    any other contributor may be used to endorse or promote products derived
17  *    from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #include <glib.h>
33 #include <glib/gi18n.h>
34 #include <gtk/gtk.h>
35 #include <config.h>
36 #include "util.h"
37 #include "error.h"
38
39 char *
40 get_data_file_path(const char *filename)
41 {
42         char *path = g_build_filename(PACKAGE_DATA_DIR, filename, NULL);
43         if(g_file_test(path, G_FILE_TEST_EXISTS))
44                 return path;
45 #ifdef DEBUG
46         g_free(path);
47         path = g_build_filename(PACKAGE_SRC_DIR, filename, NULL);
48         if(g_file_test(path, G_FILE_TEST_EXISTS))
49                 return path;
50 #endif /* DEBUG */
51         g_error("Could not find data file: %s", filename);
52 }
53
54 GtkBuilder *
55 new_builder_with_objects(char **object_ids)
56 {
57         GError *error = NULL;
58         GtkBuilder *builder = gtk_builder_new();
59         
60         if( !gtk_builder_add_objects_from_file(builder, PACKAGE_DATA_DIR "/chimara.ui", object_ids, &error) ) {
61 #ifdef DEBUG
62                 g_error_free(error);
63                 error = NULL;
64                 if( !gtk_builder_add_objects_from_file(builder, PACKAGE_SRC_DIR "/chimara.ui", object_ids, &error) )
65 #endif /* DEBUG */
66                         goto fail;
67         }
68         return builder;
69
70 fail:
71         error_dialog(NULL, error, _("Error while building interface: "));
72         return NULL;
73 }
74
75 GObject *
76 load_object(GtkBuilder *builder, const char *name)
77 {
78         GObject *retval;
79         if( (retval = gtk_builder_get_object(builder, name)) == NULL) {
80                 error_dialog(NULL, NULL, "Error while getting object '%s'", name);
81                 g_error("Error while getting object '%s'", name);
82         }
83         return retval;
84 }
85
86 GtkUIManager *
87 new_ui_manager(const char *filename)
88 {
89         GError *error = NULL;
90         GtkUIManager *uimanager = gtk_ui_manager_new();
91         char *path = g_build_filename(PACKAGE_DATA_DIR, filename, NULL);
92         
93         if( !gtk_ui_manager_add_ui_from_file(uimanager, path, &error) ) {
94 #ifdef DEBUG
95                 g_free(path);
96                 path = g_build_filename(PACKAGE_SRC_DIR, filename, NULL);
97                 g_error_free(error);
98                 error = NULL;
99                 if( !gtk_ui_manager_add_ui_from_file(uimanager, path, &error) )
100 #endif /* DEBUG */
101                         goto fail;
102         }
103         return uimanager;
104
105 fail:
106         error_dialog(NULL, error, _("Error while building interface: "));
107         return NULL;
108 }
109