コード例 #1
0
ファイル: PasteboardHelper.cpp プロジェクト: TaleAi/webkit
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()));
    }
}
コード例 #2
0
ファイル: spop-mpris2.c プロジェクト: OlofFredriksson/spop
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));
}