00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <gtk/gtk.h>
00024
00025 #include <libaudcore/hook.h>
00026
00027 #include "debug.h"
00028 #include "general.h"
00029 #include "interface.h"
00030 #include "main.h"
00031 #include "plugin.h"
00032 #include "plugins.h"
00033 #include "visualization.h"
00034
00035 static IfacePlugin *current_interface = NULL;
00036
00037 gboolean interface_load (PluginHandle * plugin)
00038 {
00039 IfacePlugin * i = plugin_get_header (plugin);
00040 g_return_val_if_fail (i, FALSE);
00041
00042 if (PLUGIN_HAS_FUNC (i, init) && ! i->init ())
00043 return FALSE;
00044
00045 current_interface = i;
00046 return TRUE;
00047 }
00048
00049 void interface_unload (void)
00050 {
00051 g_return_if_fail (current_interface);
00052
00053 if (PLUGIN_HAS_FUNC (current_interface, cleanup))
00054 current_interface->cleanup ();
00055
00056 current_interface = NULL;
00057 }
00058
00059 void interface_show (gboolean show)
00060 {
00061 g_return_if_fail (current_interface);
00062
00063 if (PLUGIN_HAS_FUNC (current_interface, show))
00064 current_interface->show (show);
00065 }
00066
00067 gboolean interface_is_shown (void)
00068 {
00069 g_return_val_if_fail (current_interface, FALSE);
00070
00071 if (PLUGIN_HAS_FUNC (current_interface, is_shown))
00072 return current_interface->is_shown ();
00073 return TRUE;
00074 }
00075
00076 gboolean interface_is_focused (void)
00077 {
00078 g_return_val_if_fail (current_interface, FALSE);
00079
00080 if (PLUGIN_HAS_FUNC (current_interface, is_focused))
00081 return current_interface->is_focused ();
00082 return TRUE;
00083 }
00084
00085 void interface_show_error (const gchar * markup)
00086 {
00087 if (headless)
00088 {
00089 fprintf (stderr, "ERROR: %s\n", markup);
00090 return;
00091 }
00092
00093 g_return_if_fail (current_interface);
00094
00095 if (PLUGIN_HAS_FUNC (current_interface, show_error))
00096 current_interface->show_error (markup);
00097 }
00098
00099
00100
00101
00102
00103
00104 void interface_show_filebrowser (gboolean play_button)
00105 {
00106 g_return_if_fail (current_interface);
00107
00108 if (PLUGIN_HAS_FUNC (current_interface, show_filebrowser))
00109 current_interface->show_filebrowser (play_button);
00110 }
00111
00112 void interface_show_jump_to_track (void)
00113 {
00114 g_return_if_fail (current_interface);
00115
00116 if (PLUGIN_HAS_FUNC (current_interface, show_jump_to_track))
00117 current_interface->show_jump_to_track ();
00118 }
00119
00120 static gboolean delete_cb (GtkWidget * window, GdkEvent * event, PluginHandle *
00121 plugin)
00122 {
00123 plugin_enable (plugin, FALSE);
00124 return TRUE;
00125 }
00126
00127 void interface_add_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
00128 {
00129 g_return_if_fail (current_interface);
00130
00131 if (PLUGIN_HAS_FUNC (current_interface, run_gtk_plugin))
00132 current_interface->run_gtk_plugin (widget, plugin_get_name (plugin));
00133 else
00134 {
00135 GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00136 gtk_window_set_title ((GtkWindow *) window, plugin_get_name (plugin));
00137 gtk_window_set_default_size ((GtkWindow *) window, 300, 200);
00138 gtk_container_add ((GtkContainer *) window, widget);
00139 g_signal_connect (window, "delete-event", (GCallback) delete_cb, plugin);
00140 gtk_widget_show_all (window);
00141 }
00142 }
00143
00144 void interface_remove_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
00145 {
00146 g_return_if_fail (current_interface);
00147
00148 if (PLUGIN_HAS_FUNC (current_interface, stop_gtk_plugin))
00149 current_interface->stop_gtk_plugin (widget);
00150 else
00151 gtk_widget_destroy (gtk_widget_get_parent (widget));
00152 }
00153
00154 void interface_install_toolbar (void * widget)
00155 {
00156 g_return_if_fail (current_interface);
00157
00158 if (PLUGIN_HAS_FUNC (current_interface, install_toolbar))
00159 current_interface->install_toolbar (widget);
00160 else
00161 g_object_ref (widget);
00162 }
00163
00164 void interface_uninstall_toolbar (void * widget)
00165 {
00166 g_return_if_fail (current_interface);
00167
00168 if (PLUGIN_HAS_FUNC (current_interface, uninstall_toolbar))
00169 current_interface->uninstall_toolbar (widget);
00170 else
00171 g_object_unref (widget);
00172 }
00173
00174 typedef enum {
00175 HOOK_SHOW,
00176 HOOK_SHOW_TOGGLE,
00177 HOOK_SHOW_ERROR,
00178 HOOK_SHOW_JUMPTOTRACK,
00179 HOOK_SHOW_FILEBROWSER,
00180 } IfaceHookID;
00181
00182 void interface_hook_handler (void * hook_data, void * user_data)
00183 {
00184 switch (GPOINTER_TO_INT (user_data))
00185 {
00186 case HOOK_SHOW:
00187 interface_show (GPOINTER_TO_INT (hook_data));
00188 break;
00189 case HOOK_SHOW_TOGGLE:
00190
00191
00192
00193 interface_show (! interface_is_shown ());
00194 break;
00195 case HOOK_SHOW_ERROR:
00196 interface_show_error (hook_data);
00197 break;
00198 case HOOK_SHOW_FILEBROWSER:
00199 interface_show_filebrowser (GPOINTER_TO_INT (hook_data));
00200 break;
00201 case HOOK_SHOW_JUMPTOTRACK:
00202 interface_show_jump_to_track ();
00203 break;
00204 }
00205 }
00206
00207 typedef struct {
00208 const gchar *name;
00209 IfaceHookID id;
00210 } IfaceHooks;
00211
00212 static IfaceHooks hooks[] = {
00213 {"interface show", HOOK_SHOW},
00214 {"interface toggle visibility", HOOK_SHOW_TOGGLE},
00215 {"interface show error", HOOK_SHOW_ERROR},
00216 {"interface show filebrowser", HOOK_SHOW_FILEBROWSER},
00217 {"interface show jump to track", HOOK_SHOW_JUMPTOTRACK},
00218 };
00219
00220 void
00221 register_interface_hooks(void)
00222 {
00223 gint i;
00224 for (i=0; i<G_N_ELEMENTS(hooks); i++)
00225 hook_associate(hooks[i].name,
00226 (HookFunction) interface_hook_handler,
00227 GINT_TO_POINTER(hooks[i].id));
00228
00229 }
00230
00231 static gboolean probe_cb (PluginHandle * p, PluginHandle * * pp)
00232 {
00233 * pp = p;
00234 return FALSE;
00235 }
00236
00237 PluginHandle * iface_plugin_probe (void)
00238 {
00239 PluginHandle * p = NULL;
00240 plugin_for_each (PLUGIN_TYPE_IFACE, (PluginForEachFunc) probe_cb, & p);
00241 return p;
00242 }
00243
00244 static PluginHandle * current_plugin = NULL;
00245
00246 PluginHandle * iface_plugin_get_current (void)
00247 {
00248 return current_plugin;
00249 }
00250
00251 gboolean iface_plugin_set_current (PluginHandle * plugin)
00252 {
00253 hook_call ("config save", NULL);
00254
00255 if (current_plugin != NULL)
00256 {
00257 AUDDBG ("Unloading plugin widgets.\n");
00258 general_cleanup ();
00259
00260 AUDDBG ("Unloading visualizers.\n");
00261 vis_cleanup ();
00262
00263 AUDDBG ("Unloading %s.\n", plugin_get_name (current_plugin));
00264 interface_unload ();
00265
00266 current_plugin = NULL;
00267 }
00268
00269 if (plugin != NULL)
00270 {
00271 AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
00272
00273 if (! interface_load (plugin))
00274 return FALSE;
00275
00276 current_plugin = plugin;
00277
00278 AUDDBG ("Loading visualizers.\n");
00279 vis_init ();
00280
00281 AUDDBG ("Loading plugin widgets.\n");
00282 general_init ();
00283 }
00284
00285 return TRUE;
00286 }