00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <string.h>
00024 #include <gtk/gtk.h>
00025
00026 #include <libaudcore/hook.h>
00027
00028 #include "audconfig.h"
00029 #include "config.h"
00030 #include "debug.h"
00031 #include "general.h"
00032 #include "i18n.h"
00033 #include "interface.h"
00034 #include "misc.h"
00035 #include "plugins.h"
00036 #include "ui_preferences.h"
00037 #include "visualization.h"
00038
00039 static Iface *current_interface = NULL;
00040
00041 static IfaceOps interface_ops = {
00042 .create_prefs_window = create_prefs_window,
00043 .show_prefs_window = show_prefs_window,
00044 .hide_prefs_window = hide_prefs_window,
00045 .destroy_prefs_window = destroy_prefs_window,
00046 .prefswin_page_new = prefswin_page_new,
00047 };
00048
00049 static IfaceCbs interface_cbs = { NULL };
00050
00051 gboolean interface_load (PluginHandle * plugin)
00052 {
00053 Iface * i = (Iface *) plugin_get_header (plugin);
00054 g_return_val_if_fail (i != NULL, FALSE);
00055
00056 current_interface = i;
00057 i->ops = & interface_ops;
00058 return i->init (& interface_cbs);
00059 }
00060
00061 void interface_unload (void)
00062 {
00063 g_return_if_fail (current_interface != NULL);
00064
00065 if (current_interface->fini != NULL)
00066 current_interface->fini ();
00067
00068 current_interface = NULL;
00069 memset (& interface_cbs, 0, sizeof interface_cbs);
00070 }
00071
00072 void
00073 interface_show_prefs_window(gboolean show)
00074 {
00075 if (interface_cbs.show_prefs_window != NULL)
00076 interface_cbs.show_prefs_window(show);
00077 else
00078 AUDDBG ("Interface didn't register show_prefs_window function.\n");
00079 }
00080
00081
00082
00083
00084
00085
00086 void
00087 interface_run_filebrowser(gboolean play_button)
00088 {
00089 if (interface_cbs.run_filebrowser != NULL)
00090 interface_cbs.run_filebrowser(play_button);
00091 else
00092 AUDDBG ("Interface didn't register run_filebrowser function.\n");
00093 }
00094
00095 void
00096 interface_hide_filebrowser(void)
00097 {
00098 if (interface_cbs.hide_filebrowser != NULL)
00099 interface_cbs.hide_filebrowser();
00100 else
00101 AUDDBG ("Interface didn't register hide_filebrowser function.\n");
00102 }
00103
00104 void
00105 interface_toggle_visibility(void)
00106 {
00107 if (interface_cbs.toggle_visibility != NULL)
00108 interface_cbs.toggle_visibility();
00109 else
00110 AUDDBG ("Interface didn't register toggle_visibility function.\n");
00111 }
00112
00113 void
00114 interface_show_error_message(const gchar * markup)
00115 {
00116 if (interface_cbs.show_error != NULL)
00117 interface_cbs.show_error(markup);
00118 else
00119 AUDDBG ("Interface didn't register show_error function.\n");
00120 }
00121
00122 void
00123 interface_show_jump_to_track(void)
00124 {
00125 if (interface_cbs.show_jump_to_track != NULL)
00126 interface_cbs.show_jump_to_track();
00127 else
00128 AUDDBG ("Interface didn't register show_jump_to_track function.\n");
00129 }
00130
00131 void
00132 interface_hide_jump_to_track(void)
00133 {
00134 if (interface_cbs.hide_jump_to_track != NULL)
00135 interface_cbs.hide_jump_to_track();
00136 else
00137 AUDDBG ("Interface didn't register hide_jump_to_track function.\n");
00138 }
00139
00140 void
00141 interface_show_about_window(gboolean show)
00142 {
00143 if (show == FALSE) {
00144 if (interface_cbs.hide_about_window != NULL)
00145 interface_cbs.hide_about_window();
00146 else
00147 AUDDBG ("Interface didn't register hide_about_window function.\n");
00148 } else {
00149 if (interface_cbs.show_about_window != NULL)
00150 interface_cbs.show_about_window();
00151 else
00152 AUDDBG ("Interface didn't register show_about_window function.\n");
00153 }
00154 }
00155
00156 static gboolean delete_cb (GtkWidget * window, GdkEvent * event, PluginHandle *
00157 plugin)
00158 {
00159 plugin_enable (plugin, FALSE);
00160 return TRUE;
00161 }
00162
00163 void interface_add_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
00164 {
00165 if (interface_cbs.run_gtk_plugin != NULL)
00166 interface_cbs.run_gtk_plugin (widget, plugin_get_name (plugin));
00167 else
00168 {
00169 GtkWidget * window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00170 gtk_window_set_title ((GtkWindow *) window, plugin_get_name (plugin));
00171 gtk_container_add ((GtkContainer *) window, widget);
00172 g_signal_connect (window, "delete-event", (GCallback) delete_cb, plugin);
00173 gtk_widget_show_all (window);
00174 }
00175 }
00176
00177 void interface_remove_plugin_widget (PluginHandle * plugin, GtkWidget * widget)
00178 {
00179 if (interface_cbs.stop_gtk_plugin != NULL)
00180 interface_cbs.stop_gtk_plugin (widget);
00181 else
00182 gtk_widget_destroy (gtk_widget_get_parent (widget));
00183 }
00184
00185 void
00186 interface_install_toolbar(void *widget)
00187 {
00188 if (interface_cbs.install_toolbar != NULL)
00189 interface_cbs.install_toolbar(widget);
00190 else
00191 AUDDBG ("Interface didn't register install_toolbar function.\n");
00192 }
00193
00194 void
00195 interface_uninstall_toolbar(void *widget)
00196 {
00197 if (interface_cbs.uninstall_toolbar != NULL)
00198 interface_cbs.uninstall_toolbar(widget);
00199 else
00200 AUDDBG ("Interface didn't register uninstall_toolbar function.\n");
00201 }
00202
00203 void
00204 interface_toggle_shuffle(void)
00205 {
00206 if (interface_cbs.toggle_shuffle != NULL)
00207 interface_cbs.toggle_shuffle();
00208 else
00209 AUDDBG ("Interface didn't register toggle_shuffle function.\n");
00210 }
00211
00212 void
00213 interface_toggle_repeat(void)
00214 {
00215 if (interface_cbs.toggle_repeat != NULL)
00216 interface_cbs.toggle_repeat();
00217 else
00218 AUDDBG ("Interface didn't register toggle_repeat function.\n");
00219 }
00220
00221 typedef enum {
00222 HOOK_PREFSWIN_SHOW,
00223 HOOK_FILEBROWSER_SHOW,
00224 HOOK_FILEBROWSER_HIDE,
00225 HOOK_TOGGLE_VISIBILITY,
00226 HOOK_SHOW_ERROR,
00227 HOOK_JUMPTOTRACK_SHOW,
00228 HOOK_JUMPTOTRACK_HIDE,
00229 HOOK_ABOUTWIN_SHOW,
00230 HOOK_TOGGLE_SHUFFLE,
00231 HOOK_TOGGLE_REPEAT,
00232 } IfaceHookID;
00233
00234 void
00235 interface_hook_handler(gpointer hook_data, gpointer user_data)
00236 {
00237 switch (GPOINTER_TO_INT(user_data)) {
00238 case HOOK_PREFSWIN_SHOW:
00239 interface_show_prefs_window(GPOINTER_TO_INT(hook_data));
00240 break;
00241 case HOOK_FILEBROWSER_SHOW:
00242 interface_run_filebrowser(GPOINTER_TO_INT(hook_data));
00243 break;
00244 case HOOK_FILEBROWSER_HIDE:
00245 interface_hide_filebrowser();
00246 break;
00247 case HOOK_TOGGLE_VISIBILITY:
00248 interface_toggle_visibility();
00249 break;
00250 case HOOK_SHOW_ERROR:
00251 interface_show_error_message((const gchar *) hook_data);
00252 break;
00253 case HOOK_JUMPTOTRACK_SHOW:
00254 interface_show_jump_to_track();
00255 break;
00256 case HOOK_JUMPTOTRACK_HIDE:
00257 interface_hide_jump_to_track();
00258 break;
00259 case HOOK_ABOUTWIN_SHOW:
00260 interface_show_about_window(GPOINTER_TO_INT(hook_data));
00261 break;
00262 case HOOK_TOGGLE_SHUFFLE:
00263 interface_toggle_shuffle();
00264 break;
00265 case HOOK_TOGGLE_REPEAT:
00266 interface_toggle_repeat();
00267 break;
00268 default:
00269 break;
00270 }
00271 }
00272
00273 typedef struct {
00274 const gchar *name;
00275 IfaceHookID id;
00276 } IfaceHooks;
00277
00278 static IfaceHooks hooks[] = {
00279 {"prefswin show", HOOK_PREFSWIN_SHOW},
00280 {"filebrowser show", HOOK_FILEBROWSER_SHOW},
00281 {"filebrowser hide", HOOK_FILEBROWSER_HIDE},
00282 {"interface toggle visibility", HOOK_TOGGLE_VISIBILITY},
00283 {"interface show error", HOOK_SHOW_ERROR},
00284 {"interface show jump to track", HOOK_JUMPTOTRACK_SHOW},
00285 {"interface hide jump to track", HOOK_JUMPTOTRACK_HIDE},
00286 {"aboutwin show", HOOK_ABOUTWIN_SHOW},
00287 {"toggle shuffle", HOOK_TOGGLE_SHUFFLE},
00288 {"toggle repeat", HOOK_TOGGLE_REPEAT},
00289 };
00290
00291 void
00292 register_interface_hooks(void)
00293 {
00294 gint i;
00295 for (i=0; i<G_N_ELEMENTS(hooks); i++)
00296 hook_associate(hooks[i].name,
00297 (HookFunction) interface_hook_handler,
00298 GINT_TO_POINTER(hooks[i].id));
00299
00300 }
00301
00302 static gboolean probe_cb (PluginHandle * p, PluginHandle * * pp)
00303 {
00304 * pp = p;
00305 return FALSE;
00306 }
00307
00308 PluginHandle * iface_plugin_probe (void)
00309 {
00310 PluginHandle * p = NULL;
00311 plugin_for_each (PLUGIN_TYPE_IFACE, (PluginForEachFunc) probe_cb, & p);
00312 return p;
00313 }
00314
00315 static PluginHandle * current_plugin = NULL;
00316
00317 PluginHandle * iface_plugin_get_current (void)
00318 {
00319 return current_plugin;
00320 }
00321
00322 gboolean iface_plugin_set_current (PluginHandle * plugin)
00323 {
00324 hook_call ("config save", NULL);
00325
00326 if (current_plugin != NULL)
00327 {
00328 AUDDBG ("Unloading plugin widgets.\n");
00329 general_cleanup ();
00330
00331 AUDDBG ("Unloading visualizers.\n");
00332 vis_cleanup ();
00333
00334 AUDDBG ("Unloading %s.\n", plugin_get_name (current_plugin));
00335 interface_unload ();
00336
00337 current_plugin = NULL;
00338 }
00339
00340 if (plugin != NULL)
00341 {
00342 AUDDBG ("Loading %s.\n", plugin_get_name (plugin));
00343
00344 if (! interface_load (plugin))
00345 return FALSE;
00346
00347 current_plugin = plugin;
00348
00349 AUDDBG ("Loading visualizers.\n");
00350 vis_init ();
00351
00352 AUDDBG ("Loading plugin widgets.\n");
00353 general_init ();
00354 }
00355
00356 return TRUE;
00357 }