Как сохранить текст в системном буфере обмена после завершения работы приложения с помощью GTK3? - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь обновить системный буфер обмена из приложения GTK. Вот упрощенная программа:

#include <gtk/gtk.h>

void callback(GtkClipboard *clipboard, const gchar *text, gpointer data) {
    printf( "In callback: text = '%s'\n", text);
}

int main() {
    gtk_init(NULL, NULL); 
    GdkScreen *screen = gdk_screen_get_default();
    GdkDisplay *display = gdk_display_get_default();
    GtkClipboard *clipboard = gtk_clipboard_get_for_display(
        display, GDK_SELECTION_PRIMARY );
    gtk_clipboard_set_text( clipboard, "Hello world", -1);
    gtk_clipboard_request_text( clipboard, callback, NULL );
    if( gdk_display_supports_clipboard_persistence(display) ) {
        printf( "Supports clipboard persistence.\n");
        gtk_clipboard_store(clipboard);
    }
}

Вывод (после компиляции вышеуказанной программы на моем ноутбуке Ubuntu 19.10):

In callback: text = 'Hello world'

Обратите внимание, что текст: Supports clipboard persistence. не отображается , так что, видимо, дисплей не поддерживает обновление системного буфера обмена (?). Тем не менее, я могу легко обновить его с помощью команды xclip. Почему это невозможно сделать из GTK?

1 Ответ

1 голос
/ 10 февраля 2020

GDK_SELECTION_PRIMARY -> используется для получения выбранного в данный момент объекта или текста. GDK_SELECTION_CLIPBOARD -> используется для выполнения таких операций, как вырезание / копирование / вставка (https://developer.gnome.org/gtk3/stable/gtk3-Clipboards.html#gtk -clipboard-get-for-display )

и для сохранения текста приложение должно оставаться в главном l oop достаточно долго, чтобы менеджер буфера обмена мог скопировать текст.

#include <gtk/gtk.h>

void callback(GtkClipboard *clipboard, const gchar *text, gpointer data) {
  printf("In callback: text = '%s'\n", text);
}

int main() {
  gtk_init(NULL, NULL);
  GdkScreen *screen = gdk_screen_get_default();
  GdkDisplay *display = gdk_display_get_default();
  GtkClipboard *clipboard =
      gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD);
  gtk_clipboard_set_text(clipboard, "Hello world", -1);
  gtk_clipboard_request_text(clipboard, callback, NULL);
  if (gdk_display_supports_clipboard_persistence(display)) {
    printf("Supports clipboard persistence.\n");
    gtk_clipboard_store(clipboard);
  }

  g_timeout_add(100, gtk_main_quit, NULL);
  gtk_main();
}

в соответствии с do c ( https://developer.gnome.org/gdk3/stable/GdkDisplay.html#gdk -display-support-clipboard-persistence ) clipboard_persistance будет проверять только работающий демон буфера обмена. Я предполагаю, что в эту область были внесены некоторые изменения, так как я не смог найти на моем компьютере ни одного работающего демона буфера обмена (возможно, они интегрировали его в диспетчер окон)

(* 1015) *) -> это делает c объясняет проблемы с сохранением буфера обмена и способы ее устранения.

, если вы устанавливаете «clipit» (менеджер буфера обмена) и пытаетесь скопировать текст, не ожидая в main l oop в течение нескольких миллисекунд ваш вывод будет "Буфер обмена пуст, восстановление"

xclip в основном оставался бы в сети в течение нескольких миллисекунд, чтобы позволить копирование текста.

...