使用 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 大部分时间都会在线停留几毫秒以允许复制文本。
我正在尝试从 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 大部分时间都会在线停留几毫秒以允许复制文本。