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