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 в основном оставался бы в сети в течение нескольких миллисекунд, чтобы позволить копирование текста.