Audacious  $Id:Doxyfile42802007-03-2104:39:00Znenolod$
interface.c
Go to the documentation of this file.
1 /*
2  * Audacious2
3  * Copyright (c) 2008 William Pitcock <nenolod@dereferenced.org>
4  * Copyright (c) 2008-2009 Tomasz Moń <desowin@gmail.com>
5  * Copyright (c) 2010-2011 John Lindgren <john.lindgren@tds.net>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; under version 3 of the License.
10  *
11  * This program 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
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses>.
18  *
19  * The Audacious team does not consider modular code linking to
20  * Audacious or using our public API to be a derived work.
21  */
22 
23 #include <gtk/gtk.h>
24 #include <pthread.h>
25 
26 #include <libaudcore/hook.h>
27 
28 #include "debug.h"
29 #include "general.h"
30 #include "interface.h"
31 #include "main.h"
32 #include "misc.h"
33 #include "plugin.h"
34 #include "plugins.h"
35 #include "visualization.h"
36 
37 static IfacePlugin *current_interface = NULL;
38 
39 static pthread_mutex_t error_mutex = PTHREAD_MUTEX_INITIALIZER;
40 static GQueue error_queue = G_QUEUE_INIT;
41 static int error_source;
42 
44 {
45  IfacePlugin * i = plugin_get_header (plugin);
46  g_return_val_if_fail (i, FALSE);
47 
48  if (PLUGIN_HAS_FUNC (i, init) && ! i->init ())
49  return FALSE;
50 
52  return TRUE;
53 }
54 
55 void interface_unload (void)
56 {
57  g_return_if_fail (current_interface);
58 
59  if (PLUGIN_HAS_FUNC (current_interface, cleanup))
60  current_interface->cleanup ();
61 
63 }
64 
66 {
67  g_return_if_fail (current_interface);
68 
70  current_interface->show (show);
71 }
72 
74 {
75  g_return_val_if_fail (current_interface, FALSE);
76 
77  if (PLUGIN_HAS_FUNC (current_interface, is_shown))
78  return current_interface->is_shown ();
79  return TRUE;
80 }
81 
83 {
84  g_return_val_if_fail (current_interface, FALSE);
85 
86  if (PLUGIN_HAS_FUNC (current_interface, is_focused))
87  return current_interface->is_focused ();
88  return TRUE;
89 }
90 
91 static bool_t error_idle_func (void * unused)
92 {
93  pthread_mutex_lock (& error_mutex);
94 
95  char * message;
96  while ((message = g_queue_pop_head (& error_queue)))
97  {
98  pthread_mutex_unlock (& error_mutex);
99 
101  current_interface->show_error (message);
102  else
103  fprintf (stderr, "ERROR: %s\n", message);
104 
105  g_free (message);
106 
107  pthread_mutex_lock (& error_mutex);
108  }
109 
110  error_source = 0;
111 
112  pthread_mutex_unlock (& error_mutex);
113  return FALSE;
114 }
115 
116 void interface_show_error (const char * message)
117 {
118  pthread_mutex_lock (& error_mutex);
119 
120  g_queue_push_tail (& error_queue, g_strdup (message));
121 
122  if (! error_source)
123  error_source = g_idle_add (error_idle_func, NULL);
124 
125  pthread_mutex_unlock (& error_mutex);
126 }
127 
128 /*
129  * bool_t play_button
130  * TRUE - open files
131  * FALSE - add files
132  */
134 {
135  g_return_if_fail (current_interface);
136 
137  if (PLUGIN_HAS_FUNC (current_interface, show_filebrowser))
138  current_interface->show_filebrowser (play_button);
139 }
140 
142 {
143  g_return_if_fail (current_interface);
144 
145  if (PLUGIN_HAS_FUNC (current_interface, show_jump_to_track))
146  current_interface->show_jump_to_track ();
147 }
148 
149 static bool_t delete_cb (GtkWidget * window, GdkEvent * event, PluginHandle *
150  plugin)
151 {
152  plugin_enable (plugin, FALSE);
153  return TRUE;
154 }
155 
156 void interface_add_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
157 {
158  g_return_if_fail (current_interface);
159 
160  if (PLUGIN_HAS_FUNC (current_interface, run_gtk_plugin))
161  current_interface->run_gtk_plugin (widget, plugin_get_name (plugin));
162  else
163  {
164  GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
165  gtk_window_set_title ((GtkWindow *) window, plugin_get_name (plugin));
166  gtk_window_set_default_size ((GtkWindow *) window, 300, 200);
167  gtk_container_add ((GtkContainer *) window, widget);
168  g_signal_connect (window, "delete-event", (GCallback) delete_cb, plugin);
169  gtk_widget_show_all (window);
170  }
171 }
172 
174 {
175  g_return_if_fail (current_interface);
176 
177  if (PLUGIN_HAS_FUNC (current_interface, stop_gtk_plugin))
178  current_interface->stop_gtk_plugin (widget);
179  else
180  gtk_widget_destroy (gtk_widget_get_parent (widget));
181 }
182 
183 void interface_install_toolbar (void * widget)
184 {
185  g_return_if_fail (current_interface);
186 
187  if (PLUGIN_HAS_FUNC (current_interface, install_toolbar))
188  current_interface->install_toolbar (widget);
189  else
190  g_object_ref (widget);
191 }
192 
193 void interface_uninstall_toolbar (void * widget)
194 {
195  g_return_if_fail (current_interface);
196 
197  if (PLUGIN_HAS_FUNC (current_interface, uninstall_toolbar))
198  current_interface->uninstall_toolbar (widget);
199  else
200  g_object_unref (widget);
201 }
202 
204 {
205  * pp = p;
206  return FALSE;
207 }
208 
210 {
211  PluginHandle * p = NULL;
213  return p;
214 }
215 
217 
219 {
220  return current_plugin;
221 }
222 
224 {
225  hook_call ("config save", NULL); /* tell interface to save layout */
226 
227  if (current_plugin != NULL)
228  {
229  AUDDBG ("Unloading plugin widgets.\n");
230  general_cleanup ();
231 
232  AUDDBG ("Unloading visualizers.\n");
233  vis_cleanup ();
234 
235  AUDDBG ("Unloading %s.\n", plugin_get_name (current_plugin));
236  interface_unload ();
237 
238  current_plugin = NULL;
239  }
240 
241  if (plugin != NULL)
242  {
243  AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
244 
245  if (! interface_load (plugin))
246  return FALSE;
247 
248  current_plugin = plugin;
249 
250  AUDDBG ("Loading visualizers.\n");
251  vis_init ();
252 
253  AUDDBG ("Loading plugin widgets.\n");
254  general_init ();
255  }
256 
257  return TRUE;
258 }