Aplikacja, która pozwala wyświetlać zawartość schowka i jego typ MIME?


9

Szukam aplikacji, która może pokazać mi szczegóły zawartości schowka.

Podczas kopiowania niektórych danych do schowka, dane są powiązane z określonym typem MIME. Normalny tekst to text/plain, dane binarne mogą być kopiowane jako application/octet-streamitp. Mam aplikację, która kopiuje dane binarne, oznaczając je jako swój własny typ MIME, i chciałbym zobaczyć, jaki to typ i jakie dane ma.

Nie mogę po prostu wkleić zawartości schowka do docelowej aplikacji podobnej do notatnika, ponieważ obiekt docelowy oczekuje typu MIME obiektu schowka text/plain.

Wystarczyłaby również aplikacja, która wylicza wszystkie istniejące typy obiektów MIME w schowku.

Odpowiedzi:


6

Użyj xclip:

xclip -o -t TARGETS

aby zobaczyć wszystkie dostępne typy. Na przykład:

  1. skopiuj coś z twojej przeglądarki internetowej
  2. sprawdź dostępne typy
$ xclip -o -t CELE
ZNAK CZASU
CELE
WIELOKROTNOŚĆ
text / html
text / _moz_htmlcontext
text / _moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEKST
STRUNOWY
text / x-moz-url-priv
  1. zdobądź zawartość dla tego, który Cię interesuje: xclip -o -t text/html

3

OK, napisałem kod, który robi to, czego potrzebuję. Dobrze, że w Qt jest dość łatwo.

Informacje o budynku znajdują się na dole tego postu.

xclipshow.cpp:

#include <QApplication>
#include <QTimer>
#include <QClipboard>
#include <QMimeData>
#include <QDebug>
#include <QStringList>

class App: public QObject {
    Q_OBJECT
private:
    void main();
public:
    App(): QObject() { }
public slots:
    void qtmain() { main(); emit finished(); }
signals:
    void finished();
};

void App::main() {
    QClipboard *clip = QApplication::clipboard();

    for(QString& formatName: clip->mimeData()->formats()) {
        std::string s;
        s = formatName.toStdString();

        QByteArray arr = clip->mimeData()->data(formatName);
        printf("name=%s, size=%d: ", s.c_str(), arr.size());

        for(int i = 0; i < arr.size(); i++) {
            printf("%02x ", (unsigned char) arr.at(i));
        }

        printf("\n");
    }
}

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    App *task = new App();
    QObject::connect(task, SIGNAL(finished()), & app, SLOT(quit()));
    QTimer::singleShot(0, task, SLOT(qtmain()));
    return app.exec();
}

#include "xclipshow.moc"

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0.0)
project(xclipshow)
find_package(Qt5Widgets)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(SRC
    xclipshow.cpp)

add_definitions(-std=c++11)
add_executable(xclipshow ${SRC})
qt5_use_modules(xclipshow Widgets Core)

Informacje o budynku zgodnie z żądaniem w komentarzu @slm: zależy to od używanego systemu. Ten kod wymaga Qt5 i CMake do kompilacji. Jeśli masz oba te elementy, wystarczy uruchomić:

BUILD_DIR=<path to an empty temporary dir, which will contain the executable file>
SRC_DIR=<path to the directory which contains xclipshow.cpp>

$ cd $BUILD_DIR
$ cmake $SRC_DIR
$ make

lub „gmake”, jeśli korzystasz z FreeBSD, lub „mingw32-make”, jeśli korzystasz z systemu Windows itp.

Jeśli nie masz Qt5 lub CMake, możesz spróbować uciec z Qt4 i ręczną kompilacją:

$ moc xclipshow.cpp > xclipshow.moc
$ g++ xclipshow.cpp -o xclipshow `pkg-config --cflags --libs QtGui` -I. --std=c++11

Jeśli otrzymujesz informacje o nieprawidłowej --std=c++11opcji, spróbuj --std=c++0xzamiast tego i rozważ uaktualnienie swojego kompilatora;).


1
Dziękujemy za opublikowanie tego rozwiązania. Czy możesz dodać trochę szczegółów na temat tego, jak skompilować go dla przyszłych użytkowników?
slm

2
@slm, antonone, uprościłem / skróciłem twój kod, powinno być również łatwiejsze do skompilowania w ten sposób: gist.github.com/gsauthof/c955f727606f4a5b0cc2
maxschlepzig
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.