comparison src/skins/ui_manager.c @ 3037:91d50f13948a

Get plugin services working again for 2.0 (bug #8)
author John Lindgren <john.lindgren@tds.net>
date Sun, 12 Apr 2009 17:23:45 -0400
parents 3134a0987162
children 1ffcad5f406c
comparison
equal deleted inserted replaced
3036:b0f8da03187b 3037:91d50f13948a
41 #endif 41 #endif
42 #include "plugin.h" 42 #include "plugin.h"
43 #include <audlegacy/ui_plugin_menu.h> 43 #include <audlegacy/ui_plugin_menu.h>
44 44
45 static GtkUIManager *ui_manager = NULL; 45 static GtkUIManager *ui_manager = NULL;
46 static gboolean menu_created = FALSE;
47
48 46
49 /* toggle action entries */ 47 /* toggle action entries */
50 48
51 static GtkToggleActionEntry toggleaction_entries_others[] = { 49 static GtkToggleActionEntry toggleaction_entries_others[] = {
52 50
171 /* normal actions */ 169 /* normal actions */
172 170
173 static GtkActionEntry action_entries_playback[] = { 171 static GtkActionEntry action_entries_playback[] = {
174 172
175 { "playback", NULL, N_("Playback") }, 173 { "playback", NULL, N_("Playback") },
176 174
177 { "playback play", GTK_STOCK_MEDIA_PLAY , N_("Play"), "X", 175 { "playback play", GTK_STOCK_MEDIA_PLAY , N_("Play"), "X",
178 N_("Play"), G_CALLBACK(action_playback_play) }, 176 N_("Play"), G_CALLBACK(action_playback_play) },
179 177
180 { "playback pause", GTK_STOCK_MEDIA_PAUSE , N_("Pause"), "C", 178 { "playback pause", GTK_STOCK_MEDIA_PAUSE , N_("Pause"), "C",
181 N_("Pause"), G_CALLBACK(action_playback_pause) }, 179 N_("Pause"), G_CALLBACK(action_playback_pause) },
270 N_("Deselects all of the playlist entries."), 268 N_("Deselects all of the playlist entries."),
271 G_CALLBACK(action_playlist_select_none) }, 269 G_CALLBACK(action_playlist_select_none) },
272 }; 270 };
273 271
274 static GtkActionEntry action_entries_playlist_delete[] = { 272 static GtkActionEntry action_entries_playlist_delete[] = {
275 { "playlist remove all", GTK_STOCK_CLEAR, N_("Remove All"), NULL, 273 { "playlist remove all", GTK_STOCK_CLEAR, N_("Remove All"), NULL,
276 N_("Removes all entries from the playlist."), 274 N_("Removes all entries from the playlist."),
277 G_CALLBACK(action_playlist_remove_all) }, 275 G_CALLBACK(action_playlist_remove_all) },
278 276
279 { "playlist clear queue", GTK_STOCK_CLEAR, N_("Clear Queue"), "<Shift>Q", 277 { "playlist clear queue", GTK_STOCK_CLEAR, N_("Clear Queue"), "<Shift>Q",
280 N_("Clears the queue associated with this playlist."), 278 N_("Clears the queue associated with this playlist."),
288 286
289 { "playlist remove dups by title", NULL , N_("By Title"), NULL, 287 { "playlist remove dups by title", NULL , N_("By Title"), NULL,
290 N_("Removes duplicate entries from the playlist by title."), 288 N_("Removes duplicate entries from the playlist by title."),
291 G_CALLBACK(action_playlist_remove_dupes_by_title) }, 289 G_CALLBACK(action_playlist_remove_dupes_by_title) },
292 290
293 { "playlist remove dups by filename", NULL , N_("By Filename"), NULL, 291 { "playlist remove dups by filename", NULL , N_("By Filename"), NULL,
294 N_("Removes duplicate entries from the playlist by filename."), 292 N_("Removes duplicate entries from the playlist by filename."),
295 G_CALLBACK(action_playlist_remove_dupes_by_filename) }, 293 G_CALLBACK(action_playlist_remove_dupes_by_filename) },
296 294
297 { "playlist remove dups by full path", NULL , N_("By Path + Filename"), NULL, 295 { "playlist remove dups by full path", NULL , N_("By Path + Filename"), NULL,
298 N_("Removes duplicate entries from the playlist by their full path."), 296 N_("Removes duplicate entries from the playlist by their full path."),
299 G_CALLBACK(action_playlist_remove_dupes_by_full_path) }, 297 G_CALLBACK(action_playlist_remove_dupes_by_full_path) },
300 298
301 { "playlist remove unselected", GTK_STOCK_REMOVE, N_("Remove Unselected"), NULL, 299 { "playlist remove unselected", GTK_STOCK_REMOVE, N_("Remove Unselected"), NULL,
302 N_("Remove unselected entries from the playlist."), 300 N_("Remove unselected entries from the playlist."),
303 G_CALLBACK(action_playlist_remove_unselected) }, 301 G_CALLBACK(action_playlist_remove_unselected) },
304 302
305 { "playlist remove selected", GTK_STOCK_REMOVE, N_("Remove Selected"), "Delete", 303 { "playlist remove selected", GTK_STOCK_REMOVE, N_("Remove Selected"), "Delete",
306 N_("Remove selected entries from the playlist."), 304 N_("Remove selected entries from the playlist."),
307 G_CALLBACK(action_playlist_remove_selected) }, 305 G_CALLBACK(action_playlist_remove_selected) },
308 }; 306 };
309 307
310 static GtkActionEntry action_entries_playlist_sort[] = { 308 static GtkActionEntry action_entries_playlist_sort[] = {
423 N_("Jump to File"), G_CALLBACK(action_jump_to_file) }, 421 N_("Jump to File"), G_CALLBACK(action_jump_to_file) },
424 422
425 { "jump to time", GTK_STOCK_JUMP_TO , N_("Jump to Time"), "<Ctrl>J", 423 { "jump to time", GTK_STOCK_JUMP_TO , N_("Jump to Time"), "<Ctrl>J",
426 N_("Jump to Time"), G_CALLBACK(action_jump_to_time) }, 424 N_("Jump to Time"), G_CALLBACK(action_jump_to_time) },
427 425
428 { "queue toggle", AUD_STOCK_QUEUETOGGLE , N_("Queue Toggle"), "Q", 426 { "queue toggle", AUD_STOCK_QUEUETOGGLE , N_("Queue Toggle"), "Q",
429 N_("Enables/disables the entry in the playlist's queue."), 427 N_("Enables/disables the entry in the playlist's queue."),
430 G_CALLBACK(action_queue_toggle) }, 428 G_CALLBACK(action_queue_toggle) },
431 }; 429 };
432 430
433 431
634 632
635 #ifdef GDK_WINDOWING_QUARTZ 633 #ifdef GDK_WINDOWING_QUARTZ
636 static GtkWidget *carbon_menubar; 634 static GtkWidget *carbon_menubar;
637 #endif 635 #endif
638 636
639 static void
640 ui_manager_create_menus_init_pmenu( gchar * path )
641 {
642 GtkWidget *plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , path );
643 if ( plugins_menu_item )
644 {
645 /* initially set count of items under plugins_menu_item to 0 */
646 g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(0) );
647 /* and since it's 0, hide the plugins_menu_item */
648 gtk_widget_hide( plugins_menu_item );
649 }
650 return;
651 }
652
653 637
654 void 638 void
655 ui_manager_create_menus ( void ) 639 ui_manager_create_menus ( void )
656 { 640 {
657 GError *gerr = NULL; 641 GError *gerr = NULL;
672 mainwin_playback_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/playback" ); 656 mainwin_playback_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/playback" );
673 mainwin_playlist_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/playlist" ); 657 mainwin_playlist_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/playlist" );
674 mainwin_view_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/view" ); 658 mainwin_view_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/view" );
675 mainwin_general_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu" ); 659 mainwin_general_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu" );
676 660
677 /* initialize plugins-menu for mainwin-menus */ 661 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
678 ui_manager_create_menus_init_pmenu( "/mainwin-menus/main-menu/plugins-menu" ); 662 (ui_manager, "/mainwin-menus/main-menu/plugins-menu")), aud_get_plugin_menu
663 (AUDACIOUS_MENU_MAIN));
679 664
680 #ifdef GDK_WINDOWING_QUARTZ 665 #ifdef GDK_WINDOWING_QUARTZ
681 gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/carbon-menubar.ui" , &gerr ); 666 gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/carbon-menubar.ui" , &gerr );
682 667
683 if ( gerr != NULL ) 668 if ( gerr != NULL )
706 playlistwin_pldel_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/del-menu"); 691 playlistwin_pldel_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/del-menu");
707 playlistwin_plsel_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/select-menu"); 692 playlistwin_plsel_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/select-menu");
708 playlistwin_plsort_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/misc-menu"); 693 playlistwin_plsort_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/misc-menu");
709 playlistwin_pllist_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/playlist-menu"); 694 playlistwin_pllist_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/playlist-menu");
710 695
711 /* initialize plugins-menu for playlist-menus */ 696 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
712 ui_manager_create_menus_init_pmenu( "/playlist-menus/playlist-menu/plugins-menu" ); 697 (ui_manager, "/playlist-menus/playlist-menu/plugins-menu")),
713 ui_manager_create_menus_init_pmenu( "/playlist-menus/add-menu/plugins-menu" ); 698 aud_get_plugin_menu (AUDACIOUS_MENU_PLAYLIST));
714 ui_manager_create_menus_init_pmenu( "/playlist-menus/del-menu/plugins-menu" ); 699 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
715 ui_manager_create_menus_init_pmenu( "/playlist-menus/select-menu/plugins-menu" ); 700 (ui_manager, "/playlist-menus/playlist-rightclick-menu/plugins-menu")),
716 ui_manager_create_menus_init_pmenu( "/playlist-menus/misc-menu/plugins-menu" ); 701 aud_get_plugin_menu (AUDACIOUS_MENU_PLAYLIST_RCLICK));
717 ui_manager_create_menus_init_pmenu( "/playlist-menus/playlist-rightclick-menu/plugins-menu" ); 702 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
703 (ui_manager, "/playlist-menus/add-menu/plugins-menu")), aud_get_plugin_menu
704 (AUDACIOUS_MENU_PLAYLIST_ADD));
705 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
706 (ui_manager, "/playlist-menus/del-menu/plugins-menu")), aud_get_plugin_menu
707 (AUDACIOUS_MENU_PLAYLIST_REMOVE));
708 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
709 (ui_manager, "/playlist-menus/select-menu/plugins-menu")),
710 aud_get_plugin_menu (AUDACIOUS_MENU_PLAYLIST_SELECT));
711 gtk_menu_item_set_submenu (GTK_MENU_ITEM (gtk_ui_manager_get_widget
712 (ui_manager, "/playlist-menus/misc-menu/plugins-menu")), aud_get_plugin_menu
713 (AUDACIOUS_MENU_PLAYLIST_MISC));
718 714
719 gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/equalizer.ui" , &gerr ); 715 gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/equalizer.ui" , &gerr );
720 716
721 if ( gerr != NULL ) 717 if ( gerr != NULL )
722 { 718 {
724 g_error_free( gerr ); 720 g_error_free( gerr );
725 return; 721 return;
726 } 722 }
727 723
728 equalizerwin_presets_menu = ui_manager_get_popup_menu(ui_manager, "/equalizer-menus/preset-menu"); 724 equalizerwin_presets_menu = ui_manager_get_popup_menu(ui_manager, "/equalizer-menus/preset-menu");
729
730 menu_created = TRUE;
731
732 return; 725 return;
733 } 726 }
734 727
735 728
736 GtkAccelGroup * 729 GtkAccelGroup *
778 pos[0] = x; 771 pos[0] = x;
779 pos[1] = y; 772 pos[1] = y;
780 773
781 gtk_menu_popup( menu , NULL , NULL , 774 gtk_menu_popup( menu , NULL , NULL ,
782 (GtkMenuPositionFunc) menu_popup_pos_func , pos , button , time ); 775 (GtkMenuPositionFunc) menu_popup_pos_func , pos , button , time );
783 }
784
785
786
787 /******************************/
788 /* plugin-available functions */
789
790 #define _MP_GWID(y) gtk_ui_manager_get_widget( ui_manager , y )
791
792 static GtkWidget*
793 audacious_menu_plugin_menuwid( menu_id )
794 {
795 switch (menu_id)
796 {
797 case AUDACIOUS_MENU_MAIN:
798 return _MP_GWID("/mainwin-menus/main-menu/plugins-menu");
799 case AUDACIOUS_MENU_PLAYLIST:
800 return _MP_GWID("/playlist-menus/playlist-menu/plugins-menu");
801 case AUDACIOUS_MENU_PLAYLIST_RCLICK:
802 return _MP_GWID("/playlist-menus/playlist-rightclick-menu/plugins-menu");
803 case AUDACIOUS_MENU_PLAYLIST_ADD:
804 return _MP_GWID("/playlist-menus/add-menu/plugins-menu");
805 case AUDACIOUS_MENU_PLAYLIST_REMOVE:
806 return _MP_GWID("/playlist-menus/del-menu/plugins-menu");
807 case AUDACIOUS_MENU_PLAYLIST_SELECT:
808 return _MP_GWID("/playlist-menus/select-menu/plugins-menu");
809 case AUDACIOUS_MENU_PLAYLIST_MISC:
810 return _MP_GWID("/playlist-menus/misc-menu/plugins-menu");
811 default:
812 return NULL;
813 }
814 }
815
816
817 gint
818 menu_plugin_item_add( gint menu_id , GtkWidget * item )
819 {
820 if ( menu_created )
821 {
822 GtkWidget *plugins_menu = NULL;
823 GtkWidget *plugins_menu_item = audacious_menu_plugin_menuwid( menu_id );
824 if ( plugins_menu_item )
825 {
826 gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu_item),"ic"));
827 if ( ic == 0 ) /* no items under plugins_menu_item, create the submenu */
828 {
829 plugins_menu = gtk_menu_new();
830 gtk_menu_item_set_submenu( GTK_MENU_ITEM(plugins_menu_item), plugins_menu );
831 }
832 else /* items available under plugins_menu_item, pick the existing submenu */
833 {
834 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) );
835 if ( !plugins_menu ) return -1;
836 }
837 gtk_menu_shell_append( GTK_MENU_SHELL(plugins_menu) , item );
838 gtk_widget_show( plugins_menu_item );
839 g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(++ic) );
840 return 0; /* success */
841 }
842 }
843 return -1; /* failure */
844 }
845
846
847 gint
848 menu_plugin_item_remove( gint menu_id , GtkWidget * item )
849 {
850 if ( menu_created )
851 {
852 GtkWidget *plugins_menu = NULL;
853 GtkWidget *plugins_menu_item = audacious_menu_plugin_menuwid( menu_id );
854 if ( plugins_menu_item )
855 {
856 gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu_item),"ic"));
857 if ( ic > 0 )
858 {
859 plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) );
860 if ( plugins_menu )
861 {
862 /* remove the plugin-added entry */
863 gtk_container_remove( GTK_CONTAINER(plugins_menu) , item );
864 g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(--ic) );
865 if ( ic == 0 ) /* if the menu is empty now, destroy it */
866 {
867 gtk_menu_item_remove_submenu( GTK_MENU_ITEM(plugins_menu_item) );
868 gtk_widget_destroy( plugins_menu );
869 gtk_widget_hide( plugins_menu_item );
870 }
871 return 0; /* success */
872 }
873 }
874 }
875 }
876 return -1; /* failure */
877 } 776 }
878 777
879 void 778 void
880 ui_manager_destroy( void ) 779 ui_manager_destroy( void )
881 { 780 {