使用 GTK3 退出应用程序后如何在系统剪贴板上存储文本?

How to store text on the system clipboard after application has quit using GTK3?

我正在尝试从 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 执行此操作?

GDK_SELECTION_PRIMARY -> 用于获取当前选中的对象或文本 GDK_SELECTION_CLIPBOARD -> 用于执行类似 Cut/copy/paste 的操作 (https://developer.gnome.org/gtk3/stable/gtk3-Clipboards.html#gtk-clipboard-get-for-display)

要存储文本,应用程序必须在主循环中停留足够长的时间,以便让剪贴板管理器复制文本。

#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();
}

根据文档(https://developer.gnome.org/gdk3/stable/GdkDisplay.html#gdk-display-supports-clipboard-persistence) clipboard_persistance 只会检查 运行 剪贴板守护程序。我猜这方面有一些变化,因为我在我的机器上找不到任何 运行 剪贴板守护进程(他们可能已经将它集成到 window 管理器中)

(https://wiki.ubuntu.com/ClipboardPersistence) -> 此文档解释了剪贴板持久性的问题以及修复它的方法。

如果您安装 "clipit"(剪贴板管理器)并尝试复制文本而无需在主循环中等待几毫秒,您的输出将是 "Clipboard is null, recovering"

xclip 大部分时间都会在线停留几毫秒以允许复制文本。