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)
引擎盖下发生了什么:
如果剪贴板管理器正在运行,则此程序可能会立即退出.否则,它将等待直到在另一个程序中执行"剪切/复制".