Audacious  $Id:Doxyfile42802007-03-2104:39:00Znenolod$
interface.c
Go to the documentation of this file.
1 /*
2  * interface.c
3  * Copyright 2010-2011 John Lindgren
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions, and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions, and the following disclaimer in the documentation
13  * provided with the distribution.
14  *
15  * This software is provided "as is" and without any warranty, express or
16  * implied. In no event shall the authors be liable for any damages arising from
17  * the use of this software.
18  */
19 
20 #include <gtk/gtk.h>
21 #include <pthread.h>
22 
23 #include <libaudcore/hook.h>
24 
25 #include "debug.h"
26 #include "general.h"
27 #include "interface.h"
28 #include "main.h"
29 #include "misc.h"
30 #include "plugin.h"
31 #include "plugins.h"
32 #include "visualization.h"
33 
34 static IfacePlugin *current_interface = NULL;
35 
36 static pthread_mutex_t error_mutex = PTHREAD_MUTEX_INITIALIZER;
37 static GQueue error_queue = G_QUEUE_INIT;
38 static int error_source;
39 
41 {
42  IfacePlugin * i = plugin_get_header (plugin);
43  g_return_val_if_fail (i, FALSE);
44 
45  if (PLUGIN_HAS_FUNC (i, init) && ! i->init ())
46  return FALSE;
47 
49  return TRUE;
50 }
51 
52 void interface_unload (void)
53 {
54  g_return_if_fail (current_interface);
55 
56  if (PLUGIN_HAS_FUNC (current_interface, cleanup))
57  current_interface->cleanup ();
58 
60 }
61 
63 {
64  g_return_if_fail (current_interface);
65 
66  set_bool (NULL, "show_interface", show);
67 
69  current_interface->show (show);
70 }
71 
73 {
74  g_return_val_if_fail (current_interface, FALSE);
75 
76  if (PLUGIN_HAS_FUNC (current_interface, is_shown))
77  return current_interface->is_shown ();
78  return TRUE;
79 }
80 
82 {
83  g_return_val_if_fail (current_interface, FALSE);
84 
85  if (PLUGIN_HAS_FUNC (current_interface, is_focused))
86  return current_interface->is_focused ();
87  return TRUE;
88 }
89 
90 static bool_t error_idle_func (void * unused)
91 {
92  pthread_mutex_lock (& error_mutex);
93 
94  char * message;
95  while ((message = g_queue_pop_head (& error_queue)))
96  {
97  pthread_mutex_unlock (& error_mutex);
98 
100  current_interface->show_error (message);
101  else
102  fprintf (stderr, "ERROR: %s\n", message);
103 
104  g_free (message);
105 
106  pthread_mutex_lock (& error_mutex);
107  }
108 
109  error_source = 0;
110 
111  pthread_mutex_unlock (& error_mutex);
112  return FALSE;
113 }
114 
115 void interface_show_error (const char * message)
116 {
117  pthread_mutex_lock (& error_mutex);
118 
119  g_queue_push_tail (& error_queue, g_strdup (message));
120 
121  if (! error_source)
122  error_source = g_idle_add (error_idle_func, NULL);
123 
124  pthread_mutex_unlock (& error_mutex);
125 }
126 
127 /*
128  * bool_t play_button
129  * TRUE - open files
130  * FALSE - add files
131  */
133 {
134  g_return_if_fail (current_interface);
135 
136  if (PLUGIN_HAS_FUNC (current_interface, show_filebrowser))
137  current_interface->show_filebrowser (play_button);
138 }
139 
141 {
142  g_return_if_fail (current_interface);
143 
144  if (PLUGIN_HAS_FUNC (current_interface, show_jump_to_track))
145  current_interface->show_jump_to_track ();
146 }
147 
148 static bool_t delete_cb (GtkWidget * window, GdkEvent * event, PluginHandle *
149  plugin)
150 {
151  plugin_enable (plugin, FALSE);
152  return TRUE;
153 }
154 
155 void interface_add_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
156 {
157  g_return_if_fail (current_interface);
158 
159  if (PLUGIN_HAS_FUNC (current_interface, run_gtk_plugin))
160  current_interface->run_gtk_plugin (widget, plugin_get_name (plugin));
161  else
162  {
163  GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
164  gtk_window_set_title ((GtkWindow *) window, plugin_get_name (plugin));
165  gtk_window_set_default_size ((GtkWindow *) window, 300, 200);
166  gtk_window_set_has_resize_grip ((GtkWindow *) window, FALSE);
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  if (get_bool (NULL, "show_interface") && current_interface &&
231  current_interface->show (FALSE);
232 
233  AUDDBG ("Unloading plugin widgets.\n");
234  general_cleanup ();
235 
236  AUDDBG ("Unloading visualizers.\n");
237  vis_cleanup ();
238 
239  AUDDBG ("Unloading %s.\n", plugin_get_name (current_plugin));
240  interface_unload ();
241 
242  current_plugin = NULL;
243  }
244 
245  if (plugin != NULL)
246  {
247  AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
248 
249  if (! interface_load (plugin))
250  return FALSE;
251 
252  current_plugin = plugin;
253 
254  AUDDBG ("Loading visualizers.\n");
255  vis_init ();
256 
257  AUDDBG ("Loading plugin widgets.\n");
258  general_init ();
259 
260  if (get_bool (NULL, "show_interface") && current_interface &&
262  current_interface->show (TRUE);
263  }
264 
265  return TRUE;
266 }