Mercurial > audlegacy-plugins
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 { |