LINUX X11剪贴板/clipboard访问C代码范例

简介: LINUX X11剪贴板/clipboard访问C代码范例

真奇怪啊。关于LINUX剪贴板的C代码,网上完全找不到。找到的都是一些SHELL命令。


经过千辛万苦,自己理解,终于找到一个代码范例。



为了方便他人,提供代码如下(初步测试表明,图片取不到数据):


  • 标准情况:
// gcc -o xclipget xclipget.c -lX11
#include <stdio.h>
#include <limits.h>
#include <X11/Xlib.h>
Bool PrintSelection(Display *display, Window window, const char *bufname, const char *fmtname)
{
  char *result;
  unsigned long ressize, restail;
  int resbits;
  Atom bufid = XInternAtom(display, bufname, False),
       fmtid = XInternAtom(display, fmtname, False),
       propid = XInternAtom(display, "XSEL_DATA", False),
       incrid = XInternAtom(display, "INCR", False);
  XEvent event;
  XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);
  do {
    XNextEvent(display, &event);
  } while (event.type != SelectionNotify || event.xselection.selection != bufid);
  if (event.xselection.property)
  {
    XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, False, AnyPropertyType,
      &fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);
    if (fmtid == incrid)
      printf("Buffer is too large and INCR reading is not implemented yet.\n");
    else
      printf("%.*s", (int)ressize, result);
    XFree(result);
    return True;
  }
  else // request failed, e.g. owner can't convert to the target format
    return False;
}
int main()
{
  Display *display = XOpenDisplay(NULL);
  unsigned long color = BlackPixel(display, DefaultScreen(display));
  Window window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0,0, 1,1, 0, color, color);
  Bool result = PrintSelection(display, window, "CLIPBOARD", "UTF8_STRING") ||
                PrintSelection(display, window, "CLIPBOARD", "STRING");
  XDestroyWindow(display, window);
  XCloseDisplay(display);
  return !result;
}
  • 超大内存情况
// gcc -o xclipget xclipget.c -lX11
#include <stdio.h>
#include <limits.h>
#include <X11/Xlib.h>
Bool PrintSelection(Display *display, Window window, const char *bufname, const char *fmtname)
{
  char *result;
  unsigned long ressize, restail;
  int resbits;
  Atom bufid = XInternAtom(display, bufname, False),
       fmtid = XInternAtom(display, fmtname, False),
       propid = XInternAtom(display, "XSEL_DATA", False),
       incrid = XInternAtom(display, "INCR", False);
  XEvent event;
  XSelectInput (display, window, PropertyChangeMask);
  XConvertSelection(display, bufid, fmtid, propid, window, CurrentTime);
  do {
    XNextEvent(display, &event);
  } while (event.type != SelectionNotify || event.xselection.selection != bufid);
  if (event.xselection.property)
  {
    XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, True, AnyPropertyType,
      &fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);
    if (fmtid != incrid)
      printf("%.*s", (int)ressize, result);
    XFree(result);
    if (fmtid == incrid)
      do {
        do {
          XNextEvent(display, &event);
        } while (event.type != PropertyNotify || event.xproperty.atom != propid || event.xproperty.state != PropertyNewValue);
        XGetWindowProperty(display, window, propid, 0, LONG_MAX/4, True, AnyPropertyType,
          &fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);
        printf("%.*s", (int)ressize, result);
        XFree(result);
      } while (ressize > 0);
    return True;
  }
  else // request failed, e.g. owner can't convert to the target format
    return False;
}
int main()
{
  Display *display = XOpenDisplay(NULL);
  unsigned long color = BlackPixel(display, DefaultScreen(display));
  Window window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0,0, 1,1, 0, color, color);
  Bool result = PrintSelection(display, window, "CLIPBOARD", "UTF8_STRING") ||
                PrintSelection(display, window, "CLIPBOARD", "STRING");
  XDestroyWindow(display, window);
  XCloseDisplay(display);
  return !result;
}
目录
相关文章
|
消息中间件 存储 缓存
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍(1)
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
4125 0
|
Oracle 算法 搜索推荐
C/C++/Linux/PostgreSQL 高性能服务器开发技术博文分类汇总(持续更新...)
C/C++/Linux/PostgreSQL 高性能服务器开发技术博文分类汇总(持续更新...)
384 0
C/C++/Linux/PostgreSQL 高性能服务器开发技术博文分类汇总(持续更新...)
|
网络协议 NoSQL 关系型数据库
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
705 0
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
|
自然语言处理 Java 数据挖掘
Linux下跨语言调用C++实践
Linux下跨语言调用C++实践
490 0
|
弹性计算 JSON 移动开发
ECS云服务器简单使用方法以及linux下c++socket搭建web服务器
ECS云服务器使用感受;关于linux下c++socket套接字搭建web服务器的坑:http响应体与跨域请求
ECS云服务器简单使用方法以及linux下c++socket搭建web服务器
|
算法 前端开发 小程序
Python | C++、Java、Linux、Go、前端、算法资料分享
Python | C++、Java、Linux、Go、前端、算法资料分享
Python | C++、Java、Linux、Go、前端、算法资料分享
|
消息中间件 Linux Kafka
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
1414 0
Linux下kafka之C/C++客户端库librdkafka的编译,安装以及函数介绍
|
Ubuntu Linux 持续交付
开源代码使用Travis CI 之c++ Linux篇
1. Travis CI的作用 Travis CI 官网: https://travis-ci.org/ Travis CI是一个提供持续集成的工具,如果您正在开发一个开源项目,那么Travis CI是一个免费的工具,可以在有push动作时,自动完成编译,编译结果可以通过一个图标来显示。 比如我们在工程的README.md中加入下列代码 [![Build Status](https://
1154 0
|
NoSQL Linux 编译器
Linux C++ 应用二进制兼容实践
本文将介绍一些在开发多 Linux 平台 C++ 应用时可能遇到的兼容性问题和相关的解法。虽然是以 C++ 为讲述对象,但兼容性这个问题,在没有 VM 帮你做这些脏活累活的情况下,是所有 C-like 语言(比如 Go、Rust 等)都可能遇到的。
2929 0
|
JSON NoSQL C语言
linux平台下C/C++调试技术分享总结-纯干货!
  调试作为一种日常中常见的工作,提高调试水平是非常有必要的。   调试的过程是收集足够多的信息来判断出错误信息。   本文介绍调试过程中所需要的的内存相关知识、底层知识、调试技巧,通过这些知识加强信息收集,减少无用的调试工作,使调试更有目的性。   程序挂掉大多表现为内存异常,通过分析core文件中的内存信息来推断程序异常原因是一种常见的方法,而在分析的过程中需要确保收集到的信息是正确的,因此glibc内存管理原理与程序中内存使用方法是调试的基础知识。   代码段、数据段、bss段,由内核在启动程序时分配。   代码段、数据段,BSS段处于较低位置,在地址上能明显区分出来。   
659 0