Mercurial > audlegacy
annotate src/audacious/glade.c @ 2861:7d3beedf1db8 trunk
BSD relicensing (pass 2).
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Sat, 23 Jun 2007 22:31:46 -0500 |
parents | 3149d4b1a9a9 |
children | 51dda959be4d |
rev | line source |
---|---|
2861
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
1 /* |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
2 * audacious: Cross-platform multimedia player. |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
3 * glade.c: libglade loading and function mapping support |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
4 * |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
5 * Copyright (c) 2005-2007 Audacious development team. |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
6 * Copyright (c) 2003-2005 BMP development team. |
2313 | 7 * |
2861
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
8 * Redistribution and use in source and binary forms, with or without |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
9 * modification, are permitted provided that the following conditions are |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
10 * met: |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
11 * |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
12 * 1. Redistributions of source code must retain the above copyright notice, |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
13 * this list of conditions and the following disclaimer. |
2313 | 14 * |
2861
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
15 * 2. Redistributions in binary form must reproduce the above copyright |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
16 * notice, this list of conditions and the following disclaimer in the |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
17 * documentation and/or other materials provided with the distribution. |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
18 * |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
19 * 3. The name of the author may not be used to endorse or promote products |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
20 * derived from this software without specific prior written permission. |
2313 | 21 * |
2861
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
24 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
25 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
26 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
27 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
28 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
30 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
31 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
7d3beedf1db8
BSD relicensing (pass 2).
William Pitcock <nenolod@atheme.org>
parents:
2313
diff
changeset
|
32 * POSSIBILITY OF SUCH DAMAGE. |
2313 | 33 */ |
34 | |
35 #ifndef HAVE_CONFIG_H | |
36 # include "config.h" | |
37 #endif | |
38 | |
39 #include <glib.h> | |
40 #include <glib/gi18n.h> | |
41 #include <gmodule.h> | |
42 #include <gtk/gtk.h> | |
43 #include <glade/glade.h> | |
44 | |
45 #include <stdlib.h> | |
46 | |
47 #include "glade.h" | |
48 | |
49 | |
50 GladeXML * | |
51 glade_xml_new_or_die(const gchar * name, | |
52 const gchar * path, | |
53 const gchar * root, | |
54 const gchar * domain) | |
55 { | |
56 const gchar *markup = | |
57 N_("<b><big>Unable to create %s.</big></b>\n" | |
58 "\n" | |
59 "Could not open glade file (%s). Please check your " | |
60 "installation.\n"); | |
61 | |
62 GladeXML *xml = glade_xml_new(path, root, domain); | |
63 | |
64 if (!xml) { | |
65 GtkWidget *dialog = | |
66 gtk_message_dialog_new_with_markup(NULL, | |
67 GTK_DIALOG_MODAL, | |
68 GTK_MESSAGE_ERROR, | |
69 GTK_BUTTONS_CLOSE, | |
70 _(markup), | |
71 name, path); | |
72 gtk_dialog_run(GTK_DIALOG(dialog)); | |
73 gtk_widget_destroy(dialog); | |
74 | |
75 exit(EXIT_FAILURE); | |
76 } | |
77 | |
78 return xml; | |
79 } | |
80 | |
81 GtkWidget * | |
82 glade_xml_get_widget_warn(GladeXML * xml, const gchar * name) | |
83 { | |
84 GtkWidget *widget = glade_xml_get_widget(xml, name); | |
85 | |
86 if (!widget) { | |
87 g_warning("Widget not found (%s)", name); | |
88 return NULL; | |
89 } | |
90 | |
91 return widget; | |
92 } | |
93 | |
94 | |
95 static GCallback | |
96 self_symbol_lookup(const gchar * symbol_name) | |
97 { | |
98 static GModule *module = NULL; | |
99 gpointer symbol = NULL; | |
100 | |
101 if (!module) | |
102 module = g_module_open(NULL, 0); | |
103 | |
104 g_module_symbol(module, symbol_name, &symbol); | |
105 return (GCallback) symbol; | |
106 } | |
107 | |
108 static GHashTable * | |
109 func_map_to_hash(FuncMap * map) | |
110 { | |
111 GHashTable *hash; | |
112 FuncMap *current; | |
113 | |
114 g_return_val_if_fail(map != NULL, NULL); | |
115 | |
116 hash = g_hash_table_new(g_str_hash, g_str_equal); | |
117 | |
118 for (current = map; current->name; current++) | |
119 g_hash_table_insert(hash, current->name, (gpointer) current->function); | |
120 | |
121 return hash; | |
122 } | |
123 | |
124 static void | |
125 map_connect_func(const gchar * handler_name, | |
126 GObject * object, | |
127 const gchar * signal_name, | |
128 const gchar * signal_data, | |
129 GObject * connect_object, | |
130 gboolean after, | |
131 gpointer data) | |
132 { | |
133 GHashTable *hash = data; | |
134 GCallback callback; | |
135 | |
136 g_return_if_fail(object != NULL); | |
137 g_return_if_fail(handler_name != NULL); | |
138 g_return_if_fail(signal_name != NULL); | |
139 | |
140 if (!(callback = self_symbol_lookup(handler_name))) | |
141 callback = (GCallback) g_hash_table_lookup(hash, handler_name); | |
142 | |
143 if (!callback) { | |
144 g_message("Signal handler (%s) not found", handler_name); | |
145 return; | |
146 } | |
147 | |
148 if (connect_object) { | |
149 g_signal_connect_object(object, signal_name, callback, | |
150 connect_object, | |
151 (after ? G_CONNECT_AFTER : 0) | | |
152 G_CONNECT_SWAPPED); | |
153 } | |
154 else { | |
155 if (after) | |
156 g_signal_connect_after(object, signal_name, callback, NULL); | |
157 else | |
158 g_signal_connect(object, signal_name, callback, NULL); | |
159 } | |
160 } | |
161 | |
162 void | |
163 glade_xml_signal_autoconnect_map(GladeXML * xml, | |
164 FuncMap * map) | |
165 { | |
166 GHashTable *hash; | |
167 | |
168 g_return_if_fail(xml != NULL); | |
169 g_return_if_fail(map != NULL); | |
170 | |
171 hash = func_map_to_hash(map); | |
172 glade_xml_signal_autoconnect_full(xml, map_connect_func, hash); | |
173 g_hash_table_destroy(hash); | |
174 } |