X11 Xlib截屏问题及深入分析一 —— 源码位置

news2025/1/12 3:52:02

在使用类Ubuntu操作系统进行截屏时,发现屏幕有时不能正确截取,于是这才有了这段时间的Spetacle、Flameshot、X11 Xlib的系列文章。最后不使用Qt、直接使用X11 Xlib进行截屏仍然存在同样问题。这就需要深入对于代码进行分析了。再次列出源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
 
int main(int argc, char *argv[])
{
	Display *display = XOpenDisplay(NULL);
	if(!display)
	{
		printf("XOpenDisplay failed\n");
		return -1;
	}
 
	int screen_num = DefaultScreen(display);
	printf("default screen_num is: %d\n", screen_num);
 
	int screen_width = DisplayWidth(display, screen_num);
	int screen_height = DisplayHeight(display, screen_num);
	printf("screen_width: %d, screen_height: %d\n", screen_width, screen_height);
 
	Window root_win = RootWindow(display, screen_num);
	if(!root_win)
	{
		printf("can not get root window\n");
		return -1;
	}
 
	Window disp_win = XCreateSimpleWindow(display, root_win, 0, 0, screen_width, screen_height, 1, 0, 0) ;
	if(!disp_win)
	{
		printf("can not get snapshot display window\n");
		return -1;
	}
 
	XMapWindow(display, disp_win);
 
	XImage *img = XGetImage(display, root_win, 0, 0, screen_width, screen_height, ~0, ZPixmap);	
 
	XPutImage(display, disp_win, DefaultGC(display, screen_num), img, 0, 0, 0, 0, screen_width, screen_height);
 
	char c = getchar();
 
	//XDestroyImage(img);
	XCloseDisplay(display);
 
	printf("screen_snapshot finished\n");
 
	return 0;
}

可以看到,源码比较简单,只是几个基本的接口函数。由于是经典的接口函数,因此基本上不用怀疑函数本身的问题,而是要深入跟到接口函数的底层,看看究竟是哪里出现了问题(初步分析是驱动问题或者缺少某些库)。

那么问题来了,这些接口函数的源码在哪里实现?也可以说是在哪个包、哪个库中实现?

源码中有一句#include <X11/Xlib.h>,在终端下搜索其是在哪个包中:

$ dpkg -S /usr/include/X11/Xlib.h
libx11-dev:amd64: /usr/include/X11/Xlib.h

既然有头文件,那么必有相同或者相似名称的源文件或者库文件,继续在终端下进行以下搜索:

$ dpkg -S /usr/lib/x86_64-linux-gnu/libX11.so
libx11-dev:amd64: /usr/lib/x86_64-linux-gnu/libX11.so

可见,libx11-dev就是我们要找的目标。那么libx11-dev对应的源码又在哪里?也就是说哪个源码包经过编译最终生成的libX11.so?

实际上源码是在这里:

https://www.linuxfromscratch.org/blfs/view/systemd/x/x7lib.html

 

上图中的libX11-1.8.2.tar.xz(版本可能略有不同)就是libX11-dev对应的源码包。下载链接为:

https://www.x.org/archive//individual/lib/libX11-1.8.2.tar.xz

下载并解压后(过程略),内容如下:

$ ls
aclocal.m4  ChangeLog  config.guess  configure     COPYING      depcomp     include  install-sh  m4           Makefile.in  missing  NEWS  README.md  src          x11.pc.in
AUTHORS     compile    config.sub    configure.ac  cpprules.in  docbook.am  INSTALL  ltmain.sh   Makefile.am  man

源码包找到了,关于接口函数的具体位置对应的源码分析就是接下来要做的事情了。参见接下来的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/22511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]SSM计算机毕业设计高校创新创业服务平台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]

文章目录CAD图像读取与显示说明官方实体说明实体圆弧dxf记录信息代码实现测试优化多段线的凸度dxf记录信息代码实现测试椭圆dxf记录信息代码实现测试引用图片引用文章引用CAD图像读取与显示说明 如果想要开发一个可以读取dxf图像的软件&#xff0c;为了方便图像在软件中的绘制&…

优秀开源项目解读(六

一、Piggy Metrics介绍 PiggyMetrics是一个模拟的个人记账理财的应用&#xff0c;原作者称其为一个端到端的微服务PoC(Proof of Concept)&#xff0c;也就是说他开发这个是为了验证微服务架构和Spring Cloud技术栈。PiggyMetrics目前在github上有超过12k星&#xff0c;是学习微…

安卓讲课笔记5.6 列表视图

文章目录零、本讲学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;列表视图概述1、继承关系图2、列表视图API文档3、列表视图四要素4、四种常用适配器&#xff08;二&#xff09;数组适配器1、数组适配器API文档2、数据适配器继承关系图3、数组适配器构造方法&…

第3章 定义内存缓存和log4net日志中间件

006 ICaching、MemoryCaching、SqlSugarMemoryCacheService 、MemoryCacheSetup Icaching&#xff1a;继承该接口的具体实现类&#xff0c;用于把内存缓存中间件实例注入到内置容器中&#xff0c;为实体实例的缓存数据交互操作提供内存管理操作支撑。 MemoryCaching&#xff1a…

了解Redis之命令操作

目录 1、Redis简介 2、Redis安装 2.1解压redis 2.2.安装gcc 2.3.编译redis 2.4.检测安装情况 2.5.修改redis.conf文件 2.6启动redis 2.7.测试redis启动是否成功 3、Redis命令 3.1.String 3.2.Hash 3.3.List 3.4.set 1、Redis简介 Redis是一个开源&#xff08;BSD许可…

第二次上机作业 大连理工大学

某百货公司6月份各天的销售数据如下:【数据】 x = c(257,276,301,252,238,310,246,236,265,278,271,292,261,281,301,274,267,280,291,258,272,284,268,303,273,263,301,249,269,295)计算该百货公司日销售额的中位数、四分位数和众数 median(x)# 中位数 quantile(x) # 四分位…

详解TCP为什么不能是两次握手

三次握手的过程 注意不要遗漏全双工下两缓存&#xff08;读/写缓存&#xff09;的分配和变量的分配。 CLOSED&#xff1a;表示初始状态。 LISTEN&#xff1a;该状态表示服务器端的某个SOCKET处于监听状态&#xff0c;可以接受连接。 SYN_SENT&#xff1a;这个状态与SYN_RCVD遥…

极限学习机和自适应稀疏表示算法 (EA-SRC)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

梦开始的地方—— C语言动态内存管理(malloc+calloc+realloc+free)

文章目录动态内存管理1.为什么需要动态内存分配&#xff1f;2. 动态内存函数malloc&freecallocrealloc3. 常见的动态内存错误对NULL解引用对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存…

Vue实现模糊查询:filter()

需求&#xff1a;在输入框里输入内容&#xff0c;包含相关内容的值被筛选出来&#xff1b; 图示&#xff1a; 最初的代码&#xff1a; <body><div id"box"><input type"text" input"handleInput()" v-model"mytext"&…

计算机网络 - 网络层 选择填空判断复习题

一. 单选题&#xff08;共25题&#xff0c;80分&#xff09; (单选题) 以下( )协议完成了从网卡到IP地址的映射。 A A.ARP协议 B.RARP协议 C.IGMP协议 D.ICMP协议 (单选题) 一个C类地址,采用了255.255.255.240作为子网掩码,那么这个C类地址可以划分为( )个子网。 A A.16 B.32 …

零基础自学javase黑马课程第十四天

零基础自学javase黑马课程第十四天 ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&#x1f39e;2022年11月21日&…

【Hack The Box】Linux练习-- FriendZone

HTB 学习笔记 【Hack The Box】Linux练习-- FriendZone &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#…

秋招失足,拿到这份“Java 高分指南(25 专题)”,金三银四翻盘有望

面试造火箭&#xff0c;工作拧螺丝&#xff01;金九银十灰溜溜地落榜&#xff0c;备受打击。正当准备明年金三银四之际&#xff0c;意外喜提朋友赠送的这“Java 高分指南&#xff08;25 专题&#xff09;”&#xff1a;Elasticsearch、微服务、Linux、JavaOOP、集合/泛型、Mysq…

move_base代码解析(一)MoveBase::executeCb

move_base是ROS中的经典路径规划算法&#xff0c;move_base 功能包提供了基于动作(action)的路径规划实现&#xff0c;move_base 可以根据给定的目标点&#xff0c;控制机器人底盘运动至目标位置&#xff0c;并且在运动过程中会连续反馈机器人自身的姿态与目标点的状态信息。 …

HTTP协议中的HTTP报文

HTTP中的HTTP报文 1、HTTP报文信息 1.1定义 用于HTTP协议交互的信息叫做HTTP 报文。 HTTP 报文大致可分为报文首部和报文主体两块。两者由最初出现的空行&#xff08;CRLF&#xff09;来划分&#xff08;通常并不一定要有报文主体&#xff09;。 1.2请求报文和响应报文 请…

CSS13_由html{height: 100%} 引发的CSS百分比宽高度的思考

一、html, body { height:100% } CSS有一个常见设置&#xff1a;html,body{ height:100% }&#xff0c;可能大家已经熟视无睹了&#xff0c;但细细思索&#xff0c;可能会有些奇怪&#xff0c;为什么html还需要设置height:100%呢&#xff1f;html不就代表整个页面了吗&#xf…

[附源码]java毕业设计网上书店管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SpringBoot项目使用JSP

SpringBoot不推荐使用JSP,而是使用模板技术代替JSP视图 先创建个SpringBoot项目 使用JSP需要如下配置 加入一个处理JSP的依赖(使用该JSP依赖原因是SpringBoot的jar包是内嵌了一个Tomcat因此要用这个Jar包,如果你的SpringBoot需要打成war包,不使用内嵌Tomcat,可用通用的JSP依赖…