代码之家  ›  专栏  ›  技术社区  ›  Håkon Hægland

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

  •  0
  • Håkon Hægland  · 技术社区  · 4 年前

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

    0 回复  |  直到 4 年前
        1
  •  1
  •   Siva Guru    4 年前

    GDK_选择_优先级->用于获取当前选定的对象或文本 GDK_SELECTION_CLIPBOARD->用于执行剪切/复制/粘贴等操作 ( 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();
    }
    

    根据doc( https://developer.gnome.org/gdk3/stable/GdkDisplay.html#gdk-display-supports-clipboard-persistence )clipboard_persistance将只检查正在运行的剪贴板守护进程。我猜测在这方面做了一些更改,因为我在我的机器中找不到任何正在运行的剪贴板守护进程(他们可能已经将其集成到窗口管理器中)

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

    如果你安装了“clipit”(剪贴板管理器)并尝试复制文本,而不在主循环中等待几毫秒,你的输出将是“剪贴板为空,正在恢复”

    xclip通常会在线几毫秒,以便复制文本。