void PasteboardHelper::fillSelectionData(GtkSelectionData* selectionData, guint info, DataObjectGtk* dataObject) { if (info == TargetTypeText) gtk_selection_data_set_text(selectionData, dataObject->text().utf8().data(), -1); else if (info == TargetTypeMarkup) { // Some Linux applications refuse to accept pasted markup unless it is // prefixed by a content-type meta tag. CString markup = String(gMarkupPrefix + dataObject->markup()).utf8(); gtk_selection_data_set(selectionData, markupAtom, 8, reinterpret_cast<const guchar*>(markup.data()), markup.length()); } else if (info == TargetTypeURIList) { CString uriList = dataObject->uriList().utf8(); gtk_selection_data_set(selectionData, uriListAtom, 8, reinterpret_cast<const guchar*>(uriList.data()), uriList.length()); } else if (info == TargetTypeNetscapeURL && dataObject->hasURL()) { String url(dataObject->url()); String result(url); result.append("\n"); if (dataObject->hasText()) result.append(dataObject->text()); else result.append(url); GUniquePtr<gchar> resultData(g_strdup(result.utf8().data())); gtk_selection_data_set(selectionData, netscapeURLAtom, 8, reinterpret_cast<const guchar*>(resultData.get()), strlen(resultData.get())); } else if (info == TargetTypeImage) gtk_selection_data_set_pixbuf(selectionData, dataObject->image()); else if (info == TargetTypeSmartPaste) gtk_selection_data_set_text(selectionData, "", -1); else if (info == TargetTypeUnknown) { GVariantBuilder builder; g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY); auto types = dataObject->unknownTypes(); auto end = types.end(); for (auto it = types.begin(); it != end; ++it) { GUniquePtr<gchar> dictItem(g_strdup_printf("{'%s', '%s'}", it->key.utf8().data(), it->value.utf8().data())); g_variant_builder_add_parsed(&builder, dictItem.get()); } GRefPtr<GVariant> variant = g_variant_builder_end(&builder); GUniquePtr<gchar> serializedVariant(g_variant_print(variant.get(), TRUE)); gtk_selection_data_set(selectionData, unknownAtom, 1, reinterpret_cast<const guchar*>(serializedVariant.get()), strlen(serializedVariant.get())); } }
void spop_mpris2_player_update_properties(Mpris2Player* obj) { g_debug("mpris2: update properties"); g_object_freeze_notify(G_OBJECT(obj)); queue_status qs; sp_track* cur_track; int cur_track_nb, tot_tracks; qs = queue_get_status(&cur_track, &cur_track_nb, &tot_tracks); /* Easy ones first */ mpris2_player_set_shuffle(obj, queue_get_shuffle()); mpris2_player_set_loop_status(obj, queue_get_repeat() ? "Playlist" : "None"); mpris2_player_set_playback_status(obj, ((qs == PLAYING) ? "Playing" : ((qs == PAUSED) ? "Paused" : "Stopped"))); mpris2_player_set_can_go_next(obj, (cur_track_nb < tot_tracks)); mpris2_player_set_can_go_previous(obj, (cur_track_nb > 0)); mpris2_player_set_can_play(obj, cur_track != NULL); mpris2_player_set_can_pause(obj, cur_track != NULL); /* Then boring ones */ spop_mpris2_player_update_position(obj); /* And finally interesting ones */ if (cur_track) { gchar* track_name; gchar* track_artist; gchar* track_album; gchar* track_link; int duration; track_get_data(cur_track, &track_name, &track_artist, &track_album, &track_link, &duration, NULL); /* Turn artist into a GVariant array of strings */ gchar* artists[] = {track_artist, NULL}; GVariant* va = g_variant_new_strv((const gchar* const*) artists, 1); /* Turn Spotify URI into a D-Bus object path */ gchar* trackid = g_strdup_printf("/net/schnouki/spop/%s", track_link); g_strdelimit(trackid, ":", '/'); /* Get filename for the image and turn it into an URI */ gchar* image_filename; track_get_image_file(cur_track, &image_filename); gchar* image_uri = NULL; if (image_filename) image_uri = g_filename_to_uri(image_filename, NULL, NULL); /* Add all relevant metadata to a dictionary */ GVariantBuilder* vb; vb = g_variant_builder_new(G_VARIANT_TYPE_VARDICT); g_variant_builder_add_parsed(vb, "{'mpris:trackid', <%o>}", trackid); g_variant_builder_add_parsed(vb, "{'mpris:length', <%x>}", duration*1000); g_variant_builder_add_parsed(vb, "{'xesam:album', <%s>}", track_album); g_variant_builder_add_parsed(vb, "{'xesam:artist', %v}", va); g_variant_builder_add_parsed(vb, "{'xesam:title', <%s>}", track_name); g_variant_builder_add_parsed(vb, "{'xesam:url', <%s>}", track_link); if (image_uri) g_variant_builder_add_parsed(vb, "{'mpris:artUrl', <%s>}", image_uri); GVariant* metadata = g_variant_builder_end(vb); mpris2_player_set_metadata(obj, metadata); /* Cleanup time */ g_variant_builder_unref(vb); g_free(trackid); g_free(image_filename); if (image_uri) g_free(image_uri); g_free(track_name); g_free(track_artist); g_free(track_album); g_free(track_link); } g_object_thaw_notify(G_OBJECT(obj)); }