如何使用X11复制到剪贴板?

Mic*_*ael 8 c linux x11 pasteboard copy-paste

使用OS X上的框架,我可以使用以下内容将PNG复制到粘贴板(在C中 - 显然我可以将NSPasteboard与Cocoa一起使用):

#include <ApplicationServices/ApplicationServices.h>

int copyThatThing(void)
{
    PasteboardRef clipboard;
    if (PasteboardCreate(kPasteboardClipboard, &clipboard) != noErr) {
        return -1;
    }

    if (PasteboardClear(clipboard) != noErr) {
        CFRelease(clipboard);
        return -1;
    }

    size_t len;
    char *pngbuf = createMyPNGBuffer(&len); /* Defined somewhere else */
    if (pngbuf == NULL) {
        CFRelease(clipboard);
        return -1;
    }

    CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, pngbuf, 
                                         len, kCFAllocatorNull);
    if (data == NULL) {
        CFRelease(clipboard);
        free(pngbuf);
        return -1;
    }

    OSStatus err;
    err = PasteboardPutItemFlavor(clipboard, NULL, kUTTypePNG, data, 0);
    CFRelease(clipboard);
    CFRelease(data);
    free(pngbuf);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有兴趣将此功能移植到Linux/*BSD平台.我怎样才能用X复制这个?

eph*_*ent 10

先阅读X选择,切割缓冲区和杀死戒指.X11有一个相当独特的系统,似乎没有其他人复制过.

与大多数其他系统不同的一个奇怪之处是:如果拥有选择的程序(剪贴板)消失,选择也会消失.因此,当您的程序说"我有一个选择(恰好是一个图像)"然后退出时,没有人能够从您那里请求该图像的副本.为了有用,剪贴板所有者需要至少坚持到另一个程序进行选择.

还在?这是一个使用PyGTK做你想要的简短程序(因为C很痛苦).

#!/usr/bin/env python
import gtk
import sys

count = 0
def handle_owner_change(clipboard, event):
    global count
    print 'clipboard.owner-change(%r, %r)' % (clipboard, event)
    count += 1
    if count > 1:
        sys.exit(0)

image = gtk.gdk.pixbuf_new_from_file(sys.argv[1])
clipboard = gtk.clipboard_get()
clipboard.connect('owner-change', handle_owner_change)
clipboard.set_image(image)
clipboard.store()
gtk.main()
Run Code Online (Sandbox Code Playgroud)

引擎盖下发生了什么:

  • Gdk加载图像.
  • Gtk声称CLIPBOARD选择的所有权.
  • Gtk 请求 CLIPBOARD_MANAGER复制并进行选择.(可能没有一个正在运行,所以这可能不会发生.)
  • 当另一个程序从我们的选择中请求数据时,Gtk处理从图像到目标的数据转换和传输.
  • 第一个OWNER_CHANGE事件对应于我们获得所有权; 等待对应我们失去所有权的下一个,并退出.

如果剪贴板管理器正在运行,则此程序可能会立即退出.否则,它将等待直到在另一个程序中执行"剪切/复制".