Как использовать буфер обмена в GTK? - PullRequest
0 голосов
/ 06 сентября 2018

Как я могу, используя GtkClipboard , читать и записывать в буфер обмена? В качестве примера, пожалуйста, покажите мне, как получить текущее содержимое буфера обмена и распечатать его на консоли.

Я пытался получить и напечатать то, что в данный момент находится в буфере обмена, но это не работает:

GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
gtk_clipboard_request_text(clip, (GtkClipboardTextReceivedFunc)print_clip, NULL);

Все компилируется без каких-либо предупреждений, но функция print_clip() никогда не достигается. Может быть, я должен использовать другую функцию, например gtk_clipboard_wait_for_text()? Пожалуйста, помогите мне, что я должен делать?

Я использую Linux / X11, если это имеет значение. Также я использую GTK + 3, а не GTK + 2 или какой-либо другой релиз.


Хорошо, у меня есть рабочий пример:
#include <gtk/gtk.h>

void clipboard_callback(GtkClipboard *clip, const gchar *text, gpointer data)
{
        g_print("Now we're in clipboard_callback function.\n");
        gtk_main_quit();
}

int main(int argc, char **argv)
{
        gtk_init(&argc, &argv);
        GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
        gtk_clipboard_request_text(clip, clipboard_callback, NULL);
        gtk_main();
        return 0;
}

Единственное, что мне сейчас нужно, это как-то выйти из clipboard_callback() без вызова gtk_main_quit(), так как это закрывает приложение.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Надо действительно использовать gtk_clipboard_wait_for_text() вместо gtk_clipboard_request_text().

Например, вот как это должно быть сделано:

GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
gchar *text = gtk_clipboard_wait_for_text(clip);
0 голосов
/ 06 сентября 2018

Вы можете использовать следующий код из этой ссылки.

   #include <gdk/gdk.h> 
   #include <gtk/gtk.h>

    // This callback is invoked when the clipboard contents have been
    // received. The text contents of the clipboard will be in UTF-8 in
    // the `text` parameter.
    void text_request_callback(GtkClipboard *clipboard,
                               const gchar *text,
                               gpointer data)
    {
        // To demonstrate setting a new value into the clipboard, we
        // choose some text.
        const gchar* new_clipboard_text = "Clipboard test 1";
        if(text == 0 || g_utf8_collate(text, new_clipboard_text) == 0)
        {
            // If the program was already run, and the clipboard contains
            // our string already, use a different string. This way when
            // you run the program multiple times in a row, you'll see the
            // string changing.
            new_clipboard_text = "Clipboard test 2";
        }

        // This sets the text. I'm passing -1 because I'm lazy -- the
        // function will call strlen on the string to figure out how long
        // it is.
        gtk_clipboard_set_text(clipboard, new_clipboard_text, -1);

        // Display the content and the contents of the variable we passed
        // in.
        printf("Clipboard text was %s, value is %8X\n",
               text, *(int*)data);

        // Now that we've monkeyed with the clipboard, our job is done
        // here.
        gtk_main_quit();
    }

    int main(int argc, char** argv)
    {
        // Standard boilerplate: initialize the toolkit.
        gtk_init(&argc, &argv);

        // Get a handle to the given clipboard. You can also ask for
        // GDK_SELECTION_PRIMARY (the X "primary selection") or
        // GDK_SELECTION_SECONDARY.
        GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);

        // This is just an arbitrary value to pass through to the
        // callback. You could pass a pointer to a local struct or
        // something similar if that was useful to you.
        int value = 0xDECAFBAD;

        // There are more complex things you can place in the clipboard,
        // but this demonstrates text. The callback will be invoked when
        // the clipboard contents has been received.
        //
        // For a much simpler method of getting the text in the clipboard,
        // see gtk_clipboard_wait_for_text(), which is used in the example
        // program clipboard_watch.
        gtk_clipboard_request_text(clipboard, text_request_callback, &value);

        // We have to run the GTK main loop so that the events required to
        // fetch the clipboard contents can be processed.
        gtk_main();

        return 0;
    }
...