/** * rb_button_bar_remove_accelerators: * @bar: a #RBButtonBar * @group: the #GtkAccelGroup to remove accelerators from * * Reverses the effects of @rb_button_bar_add_accelerators. */ void rb_button_bar_remove_accelerators (RBButtonBar *bar, GtkAccelGroup *group) { GList *c, *l; c = gtk_container_get_children (GTK_CONTAINER (bar)); for (l = c; l != NULL; l = l->next) { GtkWidget *widget = l->data; const char *accel_text; guint accel_key; GdkModifierType accel_mods; accel_text = g_object_get_data (G_OBJECT (widget), "rb-accel"); if (accel_text != NULL) { gtk_accelerator_parse (accel_text, &accel_key, &accel_mods); if (accel_key != 0) { gtk_widget_remove_accelerator (widget, group, accel_key, accel_mods); } } /* handle menus attached to menu buttons */ if (GTK_IS_MENU_BUTTON (widget)) { RBApplication *app = RB_APPLICATION (g_application_get_default ()); GMenuModel *model; model = g_object_get_data (G_OBJECT (widget), "rb-menu-model"); if (model != NULL) rb_application_set_menu_accelerators (app, model, FALSE); } } g_list_free (c); }
RBSource * rb_mtp_source_new (RBShell *shell, GObject *plugin, #if defined(HAVE_GUDEV) GUdevDevice *udev_device, #else const char *udi, #endif LIBMTP_raw_device_t *device) { RBMtpSource *source = NULL; RhythmDBEntryType *entry_type; RhythmDB *db = NULL; GSettings *settings; GtkBuilder *builder; GMenu *toolbar; char *name = NULL; g_object_get (shell, "db", &db, NULL); name = g_strdup_printf ("MTP-%u-%d", device->bus_location, device->devnum); entry_type = g_object_new (RHYTHMDB_TYPE_ENTRY_TYPE, "db", db, "name", name, "save-to-disk", FALSE, "category", RHYTHMDB_ENTRY_NORMAL, NULL); g_free (name); g_object_unref (db); builder = rb_builder_load_plugin_file (plugin, "mtp-toolbar.ui", NULL); toolbar = G_MENU (gtk_builder_get_object (builder, "mtp-toolbar")); rb_application_link_shared_menus (RB_APPLICATION (g_application_get_default ()), toolbar); settings = g_settings_new ("org.gnome.rhythmbox.plugins.mtpdevice"); source = RB_MTP_SOURCE (g_object_new (RB_TYPE_MTP_SOURCE, "plugin", plugin, "entry-type", entry_type, "shell", shell, "visibility", TRUE, "raw-device", device, #if defined(HAVE_GUDEV) "udev-device", udev_device, #else "udi", udi, #endif "load-status", RB_SOURCE_LOAD_STATUS_LOADING, "settings", g_settings_get_child (settings, "source"), "encoding-settings", g_settings_get_child (settings, "encoding"), "toolbar-menu", toolbar, "name", _("Media Player"), NULL)); g_object_unref (settings); g_object_unref (builder); rb_shell_register_entry_type_for_source (shell, RB_SOURCE (source), entry_type); return RB_SOURCE (source); }
static void impl_dispose (GObject *object) { RBGenericPlayerSourcePrivate *priv = GET_PRIVATE (object); if (priv->load_playlists_id != 0) { g_source_remove (priv->load_playlists_id); priv->load_playlists_id = 0; } if (priv->db != NULL) { if (priv->ignore_type != NULL) { rhythmdb_entry_delete_by_type (priv->db, priv->ignore_type); g_object_unref (priv->ignore_type); priv->ignore_type = NULL; } if (priv->error_type != NULL) { rhythmdb_entry_delete_by_type (priv->db, priv->error_type); g_object_unref (priv->error_type); priv->error_type = NULL; } g_object_unref (priv->db); priv->db = NULL; } if (priv->import_job != NULL) { rhythmdb_import_job_cancel (priv->import_job); g_object_unref (priv->import_job); priv->import_job = NULL; } if (priv->device_info != NULL) { g_object_unref (priv->device_info); priv->device_info = NULL; } if (priv->mount != NULL) { g_object_unref (priv->mount); priv->mount = NULL; } rb_application_remove_plugin_menu_item (RB_APPLICATION (g_application_get_default ()), "display-page-add-playlist", priv->new_playlist_action_name); G_OBJECT_CLASS (rb_generic_player_source_parent_class)->dispose (object); }
static void rb_playlist_source_constructed (GObject *object) { GObject *shell_player; RBPlaylistSource *source; RBShell *shell; RhythmDB *db; RhythmDBQueryModel *query_model; GtkBuilder *builder; GSettings *settings; RB_CHAIN_GOBJECT_METHOD (rb_playlist_source_parent_class, constructed, object); source = RB_PLAYLIST_SOURCE (object); g_object_get (source, "shell", &shell, NULL); g_object_get (shell, "db", &db, "shell-player", &shell_player, NULL); rb_playlist_source_set_db (source, db); g_object_unref (db); g_object_unref (shell); /* store playlist settings using the memory backend * this means the settings path doesn't have to be consistent, * it just has to be unique, so the address of the source object works. * for local playlists, we write the settings into the playlist file on disk * to make them persistent. */ g_object_get (source, "settings", &settings, NULL); if (settings == NULL) { char *path; path = g_strdup_printf ("/org/gnome/rhythmbox/playlist/%p/", source); settings = g_settings_new_with_backend_and_path ("org.gnome.rhythmbox.source", playlist_settings_backend, path); g_free (path); g_object_set (source, "settings", settings, NULL); } g_signal_connect (settings, "changed", G_CALLBACK (playlist_settings_changed_cb), source); g_object_unref (settings); builder = rb_builder_load ("playlist-popup.ui", NULL); source->priv->popup = G_MENU (gtk_builder_get_object (builder, "playlist-popup")); rb_application_link_shared_menus (RB_APPLICATION (g_application_get_default ()), source->priv->popup); g_object_ref (source->priv->popup); g_object_unref (builder); source->priv->entries = g_hash_table_new_full (rb_refstring_hash, rb_refstring_equal, (GDestroyNotify)rb_refstring_unref, NULL); source->priv->songs = rb_entry_view_new (source->priv->db, shell_player, TRUE, TRUE); g_object_unref (shell_player); g_signal_connect_object (source->priv->songs, "notify::sort-order", G_CALLBACK (rb_playlist_source_songs_sort_order_changed_cb), source, 0); query_model = rhythmdb_query_model_new_empty (source->priv->db); rb_playlist_source_set_query_model (source, query_model); g_object_unref (query_model); { const char *title = ""; const char *strings[3] = {0}; GtkTreeViewColumn *column = gtk_tree_view_column_new (); GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); g_object_set(renderer, "style", PANGO_STYLE_OBLIQUE, "weight", PANGO_WEIGHT_LIGHT, "xalign", 1.0, NULL); gtk_tree_view_column_pack_start (column, renderer, TRUE); gtk_tree_view_column_set_resizable (column, TRUE); gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED); strings[0] = title; strings[1] = "9999"; rb_entry_view_set_fixed_column_width (source->priv->songs, column, renderer, strings); gtk_tree_view_column_set_cell_data_func (column, renderer, (GtkTreeCellDataFunc) rb_playlist_source_track_cell_data_func, source, NULL); rb_entry_view_insert_column_custom (source->priv->songs, column, title, "PlaylistTrack", NULL, 0, NULL, 0); } rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_TRACK_NUMBER, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_TITLE, TRUE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_GENRE, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_ARTIST, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_COMPOSER, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_ALBUM, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_YEAR, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_DURATION, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_QUALITY, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_RATING, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_PLAY_COUNT, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_COMMENT, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_LOCATION, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_LAST_PLAYED, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_FIRST_SEEN, FALSE); rb_entry_view_append_column (source->priv->songs, RB_ENTRY_VIEW_COL_BPM, FALSE); rb_entry_view_set_columns_clickable (source->priv->songs, FALSE); rb_playlist_source_setup_entry_view (source, source->priv->songs); gtk_container_add (GTK_CONTAINER (source), GTK_WIDGET (source->priv->songs)); gtk_widget_show_all (GTK_WIDGET (source)); }
static RBSource * create_source_cb (RBRemovableMediaManager *rmm, GMount *mount, MPIDDevice *device_info, RBGenericPlayerPlugin *plugin) { RBSource *source = NULL; GType source_type = G_TYPE_NONE; RBShell *shell; RhythmDB *db; RhythmDBEntryType *entry_type; RhythmDBEntryType *error_type; RhythmDBEntryType *ignore_type; GtkBuilder *builder; GMenu *toolbar; GVolume *volume; GSettings *settings; const char *name_prefix; char *name; char *path; if (rb_psp_is_mount_player (mount, device_info)) { source_type = RB_TYPE_PSP_SOURCE; name_prefix = "psp"; } else if (rb_nokia770_is_mount_player (mount, device_info)) { source_type = RB_TYPE_NOKIA770_SOURCE; name_prefix = "nokia770"; } else if (rb_generic_player_is_mount_player (mount, device_info)) { source_type = RB_TYPE_GENERIC_PLAYER_SOURCE; name_prefix = "generic-player"; } else { return NULL; } volume = g_mount_get_volume (mount); path = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE); g_object_get (plugin, "object", &shell, NULL); g_object_get (shell, "db", &db, NULL); name = g_strdup_printf ("%s: %s", name_prefix, path); entry_type = g_object_new (RHYTHMDB_TYPE_ENTRY_TYPE, "db", db, "name", name, "save-to-disk", FALSE, "category", RHYTHMDB_ENTRY_NORMAL, NULL); rhythmdb_register_entry_type (db, entry_type); g_free (name); name = g_strdup_printf ("%s (ignore): %s", name_prefix, path); ignore_type = g_object_new (RHYTHMDB_TYPE_ENTRY_TYPE, "db", db, "name", name, "save-to-disk", FALSE, "category", RHYTHMDB_ENTRY_VIRTUAL, NULL); rhythmdb_register_entry_type (db, ignore_type); g_free (name); name = g_strdup_printf ("%s (errors): %s", name_prefix, path); error_type = g_object_new (RHYTHMDB_TYPE_ENTRY_TYPE, "db", db, "name", name, "save-to-disk", FALSE, "category", RHYTHMDB_ENTRY_VIRTUAL, NULL); rhythmdb_register_entry_type (db, error_type); g_free (name); g_object_unref (db); builder = rb_builder_load_plugin_file (G_OBJECT (plugin), "generic-player-toolbar.ui", NULL); toolbar = G_MENU (gtk_builder_get_object (builder, "generic-player-toolbar")); rb_application_link_shared_menus (RB_APPLICATION (g_application_get_default ()), toolbar); settings = g_settings_new ("org.gnome.rhythmbox.plugins.generic-player"); source = RB_SOURCE (g_object_new (source_type, "plugin", plugin, "entry-type", entry_type, "ignore-entry-type", ignore_type, "error-entry-type", error_type, "mount", mount, "shell", shell, "device-info", device_info, "load-status", RB_SOURCE_LOAD_STATUS_LOADING, "settings", g_settings_get_child (settings, "source"), "encoding-settings", g_settings_get_child (settings, "encoding"), "toolbar-menu", toolbar, NULL)); g_object_unref (settings); g_object_unref (builder); rb_shell_register_entry_type_for_source (shell, RB_SOURCE (source), entry_type); plugin->player_sources = g_list_prepend (plugin->player_sources, source); g_signal_connect_object (G_OBJECT (source), "deleted", G_CALLBACK (rb_generic_player_plugin_source_deleted), plugin, 0); g_object_unref (shell); return source; }
static void impl_constructed (GObject *object) { RBGenericPlayerSource *source; RBGenericPlayerSourcePrivate *priv; RhythmDBEntryType *entry_type; char **playlist_formats; char **output_formats; char *mount_name; RBShell *shell; GFile *root; GFileInfo *info; GError *error = NULL; char *label; char *fullname; char *name; RB_CHAIN_GOBJECT_METHOD (rb_generic_player_source_parent_class, constructed, object); source = RB_GENERIC_PLAYER_SOURCE (object); priv = GET_PRIVATE (source); rb_device_source_set_display_details (RB_DEVICE_SOURCE (source)); g_object_get (source, "shell", &shell, "entry-type", &entry_type, "name", &name, NULL); g_object_get (shell, "db", &priv->db, NULL); priv->import_errors = rb_import_errors_source_new (shell, priv->error_type, entry_type, priv->ignore_type); priv->new_playlist_action_name = g_strdup_printf ("generic-player-%p-playlist-new", source); fullname = g_strdup_printf ("app.%s", priv->new_playlist_action_name); label = g_strdup_printf (_("New Playlist on %s"), name); rb_application_add_plugin_menu_item (RB_APPLICATION (g_application_get_default ()), "display-page-add-playlist", priv->new_playlist_action_name, g_menu_item_new (label, fullname)); g_free (fullname); g_free (label); g_free (name); root = g_mount_get_root (priv->mount); mount_name = g_mount_get_name (priv->mount); info = g_file_query_filesystem_info (root, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, NULL, &error); if (error != NULL) { rb_debug ("error querying filesystem info for %s: %s", mount_name, error->message); g_error_free (error); priv->read_only = FALSE; } else { priv->read_only = g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY); g_object_unref (info); } g_free (mount_name); g_object_unref (root); g_object_get (priv->device_info, "playlist-formats", &playlist_formats, NULL); if ((priv->read_only == FALSE) && playlist_formats != NULL && g_strv_length (playlist_formats) > 0) { RBDisplayPageModel *model; GMenu *playlist_menu; GMenuModel *playlists; priv->new_playlist_action = g_simple_action_new (priv->new_playlist_action_name, NULL); g_signal_connect (priv->new_playlist_action, "activate", G_CALLBACK (new_playlist_action_cb), source); g_action_map_add_action (G_ACTION_MAP (g_application_get_default ()), G_ACTION (priv->new_playlist_action)); g_object_get (shell, "display-page-model", &model, NULL); playlists = rb_display_page_menu_new (model, RB_DISPLAY_PAGE (source), RB_TYPE_GENERIC_PLAYER_PLAYLIST_SOURCE, "app.playlist-add-to"); g_object_unref (model); playlist_menu = g_menu_new (); g_menu_append (playlist_menu, _("Add to New Playlist"), priv->new_playlist_action_name); g_menu_append_section (playlist_menu, NULL, playlists); g_object_set (source, "playlist-menu", playlist_menu, NULL); } g_strfreev (playlist_formats); g_object_unref (entry_type); g_object_get (priv->device_info, "output-formats", &output_formats, NULL); if (output_formats != NULL) { GstEncodingTarget *target; int i; target = gst_encoding_target_new ("generic-player", "device", "", NULL); for (i = 0; output_formats[i] != NULL; i++) { const char *media_type = rb_gst_mime_type_to_media_type (output_formats[i]); if (media_type != NULL) { GstEncodingProfile *profile; profile = rb_gst_get_encoding_profile (media_type); if (profile != NULL) { gst_encoding_target_add_profile (target, profile); } } } g_object_set (source, "encoding-target", target, NULL); } g_strfreev (output_formats); g_object_unref (shell); }