¿Aplicación que permite mostrar el contenido del portapapeles y su tipo MIME?

9

Estoy buscando una aplicación que pueda mostrarme los detalles del contenido del portapapeles.

Al copiar algunos datos en el portapapeles, los datos se asocian con un tipo MIME específico. El texto normal es text/plain, los datos binarios se pueden copiar como application/octet-stream, etc. Tengo una aplicación que copia datos binarios, etiquetándolos como su propio tipo MIME, y me gustaría ver qué tipo es y qué datos tiene.

No puedo simplemente pegar el contenido del portapapeles en una aplicación de tipo bloc de notas de destino, porque el objetivo espera que sea el tipo MIME del objeto del portapapeles text/plain.

También sería suficiente una aplicación que enumera todos los tipos de objetos MIME existentes actualmente en el portapapeles.

antonone
fuente

Respuestas:

6

Uso xclip:

xclip -o -t TARGETS

para ver todos los tipos disponibles. Por ejemplo:

  1. copia algo de tu navegador web
  2. investigar los tipos disponibles
$ xclip -o -t OBJETIVOS
TIMESTAMP
OBJETIVOS
MÚLTIPLE
texto / html
text / _moz_htmlcontext
text / _moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEXTO
CUERDA
text / x-moz-url-priv
  1. Obtenga el contenido para el que le interesa: xclip -o -t text/html
neo
fuente
3

OK, en realidad he escrito un código que hace lo que necesito. Lo bueno es que es bastante fácil en Qt.

La información del edificio se encuentra al final de esta publicación.

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)

Información de construcción según lo solicitado en el comentario de @slm: depende del sistema que esté utilizando. Este código necesita Qt5 y CMake para compilar. Si tiene ambos, todo lo que necesita hacer es ejecutar:

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

o 'gmake' si estás en FreeBSD, o 'mingw32-make' si estás en Windows, etc.

Si no tiene Qt5 o CMake, puede intentar salirse con Qt4 y la compilación manual:

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

Si obtiene información sobre una --std=c++11opción no válida , intente--std=c++0x y considere actualizar su compilador;).

antonone
fuente
1
Gracias por publicar esta solución. ¿Podría agregar un poco de detalles sobre cómo compilarlo para futuros visitantes?
slm
2
@slm, antonone, he simplificado / acortado su código, también debería ser más fácil de compilar de esa manera: gist.github.com/gsauthof/c955f727606f4a5b0cc2
maxschlepzig