1 /* support.c
2 * Copyright (C) 2004, 2005, 2006 Sylvain Cresto <scresto@gmail.com>
3 *
4 * This file is part of graveman!
5 *
6 * graveman! is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or
9 * (at your option) any later version.
10 *
11 * graveman! is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with program; see the file COPYING. If not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
19 * MA 02111-1307, USA.
20 *
21 * URL: http://www.nongnu.org/graveman/
22 *
23 */
24
25 #include "graveman.h"
26
27 static GdkCursor *_cursor = NULL;
28
29 /* glade-xml.c */
30 static const gchar *glade_xml_tooltips_key = "GladeXML::tooltips";
31 static GQuark glade_xml_tooltips_id = 0;
32 /* glade-xml.c */
33
34
glade_to_hash(GladeXML * Axml,GHashTable * Ahash,gchar * Akey)35 GtkWidget *glade_to_hash(GladeXML *Axml, GHashTable *Ahash, gchar *Akey)
36 {
37 GtkWidget *Lobj = glade_xml_get_widget(Axml, Akey);
38
39 if (! GTK_IS_WIDGET(Lobj)) {
40 g_warning("glade_to_hash: '%s' is not a widget !\n", Akey);
41 return NULL;
42 }
43 _DEB("on insere le widget '%s'\n", Akey);
44 g_hash_table_insert(Ahash, g_strdup(Akey), Lobj);
45
46 return Lobj;
47 }
48
glade_to_hash_list(GladeXML * Axml,GHashTable * Ahash,const gchar * Afirst,...)49 void glade_to_hash_list(GladeXML *Axml, GHashTable *Ahash, const gchar *Afirst, ...)
50 {
51 va_list Largs;
52 gchar *Lbuf = (gchar *) Afirst;
53 gchar *Lname;
54 GtkWidget *Lobject;
55 if ((Lobject = glade_xml_get_widget(Axml, Afirst)))
56 g_hash_table_insert(Ahash, Lbuf, Lobject);
57
58 va_start(Largs, Afirst);
59 while (*Lbuf++) {
60 if (!(Lname = va_arg(Largs, gchar *))) break;
61 _DEB("unwid %s !!!\n", Lname);
62 if ((Lobject = glade_xml_get_widget(Axml, Lname))) {
63 g_hash_table_insert(Ahash, Lname, Lobject);
64 #ifdef DEBUG
65 } else {
66 _DEB("object non trouve => %s\n", Lname);
67 #endif
68 }
69 }
70
71 va_end(Largs);
72 }
73
glade_to_hashv(GladeXML * Axml,GHashTable * Ahash,const gchar * Akeyformat,...)74 GtkWidget *glade_to_hashv(GladeXML *Axml, GHashTable *Ahash, const gchar *Akeyformat, ...)
75 {
76 va_list Largs;
77 gchar *Lkey;
78 GtkWidget *Lreturn;
79
80 va_start(Largs, Akeyformat);
81 Lkey = g_strdup_vprintf(Akeyformat, Largs);
82 va_end(Largs);
83 _DEB("ON ENREGISTRE => '%s'", Lkey);
84
85 Lreturn = glade_to_hash(Axml, Ahash, Lkey);
86 g_free(Lkey);
87
88 return Lreturn;
89 }
90
91 /* gestion du curseur de la souris */
set_cursor(GtkWidget * Awindow,GdkCursorType Acursortype)92 void set_cursor(GtkWidget *Awindow, GdkCursorType Acursortype)
93 {
94 _cursor = gdk_cursor_new(Acursortype);
95 gdk_window_set_cursor(GDK_WINDOW(Awindow->window), _cursor);
96 gdk_flush ();
97 }
98
unset_cursor(GtkWidget * Awindow)99 void unset_cursor(GtkWidget *Awindow)
100 {
101 gdk_window_set_cursor(GDK_WINDOW(Awindow->window), NULL);
102 gdk_cursor_unref(_cursor);
103 }
104
105 /* mise a jour d'une barre d'avancement */
maj_progress(GtkProgressBar * AprogressBar,gdouble Apourcent)106 void maj_progress(GtkProgressBar *AprogressBar, gdouble Apourcent)
107 {
108 gchar Lsbuf[40];
109
110 gtk_progress_bar_set_fraction(AprogressBar, Apourcent);
111 g_snprintf(Lsbuf, sizeof(Lsbuf)-1, "%.0f%%", Apourcent*100);
112 gtk_progress_bar_set_text(AprogressBar, Lsbuf);
113 }
114
115 /* traitement Twidget */
sc_grave_newempty()116 Tgrave *sc_grave_newempty()
117 {
118 Tgrave *Agrave = g_malloc0(sizeof(Tgrave));
119
120 Agrave->data = g_hash_table_new(g_str_hash, g_str_equal);
121
122 return Agrave;
123 }
124
sc_grave_load(gchar * Aname)125 Tgrave *sc_grave_load(gchar *Aname)
126 {
127 Tgrave *Agrave = g_malloc0(sizeof(Tgrave));
128 gchar Lfullname[MAXPATHLEN];
129
130 g_snprintf(Lfullname, sizeof(Lfullname)-1, "%s/%s/%s", DATA_DIR, PACKAGE, Aname);
131
132 Agrave->xml = glade_xml_new(Lfullname, NULL, NULL);
133
134
135 if (!Agrave->xml) {
136 g_free(Agrave);
137 g_critical(_("error cannot load '%s': %s"), Lfullname, g_strerror(errno));
138 return FALSE;
139 }
140
141 Agrave->data = g_hash_table_new(g_str_hash, g_str_equal);
142
143 return Agrave;
144 }
145
sc_init()146 void sc_init()
147 {
148 glade_xml_tooltips_id = g_quark_from_static_string(glade_xml_tooltips_key);
149 }
150
151 /* activer / desactiver les tooltips */
sc_tooltips(GtkWidget * Awin,gboolean Aetat)152 void sc_tooltips(GtkWidget *Awin, gboolean Aetat)
153 {
154 GtkTooltips *Ltooltips = NULL;
155
156 Ltooltips = GTK_TOOLTIPS(g_object_get_qdata(G_OBJECT(Awin), glade_xml_tooltips_id));
157
158 if (GTK_IS_TOOLTIPS(Ltooltips)) {
159 if (Aetat) {
160 gtk_tooltips_enable(Ltooltips);
161 } else {
162 gtk_tooltips_disable(Ltooltips);
163 }
164 }
165 }
166
sc_grave_destroy(Tgrave * Agrave)167 Tgrave *sc_grave_destroy(Tgrave *Agrave)
168 {
169 g_return_val_if_fail(Agrave != NULL, NULL);
170
171 if (Agrave->xml != NULL) {
172 g_object_unref(Agrave->xml);
173 }
174 if (Agrave->data) g_hash_table_destroy(Agrave->data);
175
176 g_free(Agrave);
177
178 return NULL;
179 }
180
sc_grave_get_widget(Tgrave * Agrave,gchar * Aname)181 GtkWidget *sc_grave_get_widget(Tgrave *Agrave, gchar *Aname)
182 {
183 if (Agrave == NULL || Agrave->xml == NULL) return NULL;
184
185 return glade_xml_get_widget(Agrave->xml, Aname);
186 }
187
sc_grave_get_widgetordata(Tgrave * Agrave,gchar * Aname)188 gpointer sc_grave_get_widgetordata(Tgrave *Agrave, gchar *Aname)
189 {
190 gpointer Ldata = NULL;
191 if (Agrave == NULL || Agrave->xml == NULL) return NULL;
192
193 if ((Ldata = glade_xml_get_widget(Agrave->xml, Aname))) return Ldata;
194
195 if ((Ldata = g_hash_table_lookup(Agrave->data, Aname))) return Ldata;
196
197 return NULL;
198
199 }
200
sc_grave_get_widgetv(Tgrave * Agrave,gchar * Aformat,...)201 GtkWidget *sc_grave_get_widgetv(Tgrave *Agrave, gchar *Aformat, ...)
202 {
203 va_list Largs;
204 gchar *Lfname;
205 GtkWidget *Lptr;
206
207 va_start(Largs, Aformat);
208 Lfname = g_strdup_vprintf(Aformat, Largs);
209 va_end(Largs);
210 Lptr = sc_grave_get_widget(Agrave, Lfname);
211 g_free(Lfname);
212
213 return Lptr;
214 }
215
sc_grave_get_data(Tgrave * Agrave,gchar * Aname)216 gpointer sc_grave_get_data(Tgrave *Agrave, gchar *Aname)
217 {
218 g_return_val_if_fail(Agrave != NULL && Agrave->data != NULL, NULL);
219
220 return g_hash_table_lookup(Agrave->data, Aname);
221 }
222
sc_grave_get_datav(Tgrave * Agrave,gchar * Aformat,...)223 gpointer sc_grave_get_datav(Tgrave *Agrave, gchar *Aformat, ...)
224 {
225 va_list Largs;
226 gchar *Lfname;
227 gpointer Lptr;
228
229 va_start(Largs, Aformat);
230 Lfname = g_strdup_vprintf(Aformat, Largs);
231 va_end(Largs);
232 Lptr = sc_grave_get_data(Agrave, Lfname);
233 g_free(Lfname);
234
235 return Lptr;
236 }
237
sc_grave_set_data(Tgrave * Agrave,gpointer Aptr,gchar * Aname)238 gpointer sc_grave_set_data(Tgrave *Agrave, gpointer Aptr, gchar *Aname)
239 {
240 g_return_val_if_fail(Agrave != NULL && Agrave->data != NULL, NULL);
241
242 g_hash_table_insert(Agrave->data, Aname, Aptr);
243
244 return Aptr;
245 }
246
sc_grave_set_datav(Tgrave * Agrave,gpointer Aptr,gchar * Aformat,...)247 gpointer sc_grave_set_datav(Tgrave *Agrave, gpointer Aptr, gchar *Aformat, ...)
248 {
249 va_list Largs;
250 gchar *Lfname;
251
252 va_start(Largs, Aformat);
253 Lfname = g_strdup_vprintf(Aformat, Largs);
254 va_end(Largs);
255 sc_grave_set_data(Agrave, Aptr, Lfname);
256 g_free(Lfname);
257
258 return Aptr;
259 }
260
sc_grave_replace_data(Tgrave * Agrave,gpointer Aptr,gchar * Aname)261 gpointer sc_grave_replace_data(Tgrave *Agrave, gpointer Aptr, gchar *Aname)
262 {
263 g_return_val_if_fail(Agrave != NULL && Agrave->data != NULL, NULL);
264
265 g_hash_table_replace(Agrave->data, Aname, Aptr);
266
267 return Aptr;
268 }
269
sc_grave_replace_datav(Tgrave * Agrave,gpointer Aptr,gchar * Aformat,...)270 gpointer sc_grave_replace_datav(Tgrave *Agrave, gpointer Aptr, gchar *Aformat, ...)
271 {
272 va_list Largs;
273 gchar *Lfname;
274
275 va_start(Largs, Aformat);
276 Lfname = g_strdup_vprintf(Aformat, Largs);
277 va_end(Largs);
278 sc_grave_replace_data(Agrave, Aptr, Lfname);
279 g_free(Lfname);
280
281 return Aptr;
282 }
283
sc_grave_del_data(Tgrave * Agrave,gchar * Aname)284 gpointer sc_grave_del_data(Tgrave *Agrave, gchar *Aname)
285 {
286 g_return_val_if_fail(Agrave != NULL && Agrave->data != NULL, NULL);
287
288 g_hash_table_remove(Agrave->data, Aname);
289
290 return NULL;
291 }
292
sc_grave_del_datav(Tgrave * Agrave,gchar * Aformat,...)293 gpointer sc_grave_del_datav(Tgrave *Agrave, gchar *Aformat, ...)
294 {
295 va_list Largs;
296 gchar *Lfname;
297
298 va_start(Largs, Aformat);
299 Lfname = g_strdup_vprintf(Aformat, Largs);
300 va_end(Largs);
301 sc_grave_del_data(Agrave, Lfname);
302 g_free(Lfname);
303
304 return NULL;
305 }
306
sc_grave_ref_wtd(Tgrave * Agrave,gchar * Awidgetsrc,gchar * Adatadst)307 gpointer sc_grave_ref_wtd(Tgrave *Agrave, gchar *Awidgetsrc, gchar *Adatadst)
308 {
309 GtkWidget *Awidg;
310 g_return_val_if_fail(Agrave && Agrave->data && Agrave->xml, NULL);
311
312 if (!(Awidg = glade_xml_get_widget(Agrave->xml, Awidgetsrc))) return NULL;
313
314 g_hash_table_insert(Agrave->data, Adatadst, Awidg);
315
316 return Awidg;
317 }
318
319 /*
320 * vim:et:ts=8:sts=2:sw=2
321 */
322