Додаток, який дозволяє показувати вміст буфера обміну та його тип MIME?


9

Я шукаю додаток, який може показати мені деталі змісту буфера обміну.

При копіюванні деяких даних у буфер обміну дані асоціюються з певним MIME-типом. Звичайний текст text/plain, двійкові дані можна скопіювати як application/octet-streamтощо. У мене є додаток, який копіює двійкові дані, позначаючи їх як власний тип MIME, і я хотів би побачити, що це за тип і які дані він має.

Я не можу просто вставити вміст буфера обміну в додаток, схожий на цільовий блокнот, тому що ціль очікує типу MIME об'єкта буфера обміну text/plain.

Додаток, який перераховує всі наявні на даний момент типи MIME об'єктів у буфері обміну, також буде достатньо.

Відповіді:


7

Використання xclip:

xclip -o -t TARGETS

щоб побачити всі доступні типи. Наприклад:

  1. скопіюйте щось із вашого веб-браузера
  2. досліджувати наявні типи
$ xclip -o -t ЦІЛИ
TIMESTAMP
ЦІЛИ
МНОГО
текст / html
text / _moz_htmlконтекст
текст / _moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
ТЕКСТ
STRING
текст / x-moz-url-priv
  1. отримати вміст того, хто вас цікавить: xclip -o -t text/html

Буфер обміну за замовчуванням, до якого звертається xclip, є "первинним". Використовуйте -selection clipboardдля перегляду явно скопійованого вмісту. Дивіться superuser.com/questions/90257/… .
Раман

3

Гаразд, я фактично написав якийсь код, який робить те, що мені потрібно. Добре, що Qt досить легко.

Інформація про будівництво знаходиться внизу цієї публікації.

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)

Інформація про будівництво, як вимагається в коментарі @slm: це залежить від системи, яку ви використовуєте. Цей код потребує Qt5 та CMake для компіляції. Якщо у вас обоє, все, що вам потрібно зробити, - це запустити:

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

або "gmake", якщо ви користуєтеся FreeBSD, або "mingw32-make", якщо ви працюєте в Windows тощо.

Якщо у вас немає Qt5 чи CMake, ви можете спробувати піти з Qt4 та компіляції вручну:

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

Якщо ви отримуєте інформацію про недійсний --std=c++11параметр, спробуйте --std=c++0xзамість цього і розглянути можливість оновлення компілятора;).


1
Дякуємо, що опублікували це рішення. Не могли б ви додати трохи деталей про те, як скласти це для майбутніх відвідувачів?
slm

2
@slm, antonone, я спростив / скоротив ваш код, також слід простіше скомпілювати таким чином: gist.github.com/gsauthof/c955f727606f4a5b0cc2
maxschlepzig
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.