一. xlib 创建窗口

linux应用Xlib来显示内存图像数据到窗口的方式 由于需要动态的将相机取得到图像数据动态的在窗口中显示,开始时试过好几个开源的显示库都没有达到想要到效果,SDL是最接近想要的效果的,可是目前到版本对于多窗口的显示支持还不完善,最终决定应用xlib来直接显示,归根结底这些库最终都是应用xlib来显示的。 在linux下 的xli 阅读详情

系列文章目录

本系列文章记录在Linux操作系统下,如何在不依赖QT、GTK等开源GUI库的情况下,基于x11窗口系统(xlib)图形界面应用程序开发。之所以使用x11进行窗口开发,是在开发一个基于duilib跨平台的界面库项目,使用gtk时,发现基于gtk的开发,依赖的动态库太多,发布时太麻烦,gtk不支持静态库编译发布。所以我们决定使用更底层的xlib接口。在此记录下linux系统下基于xlib接口的界面开发

一、xlib创建窗口
二、xlib事件
三、xlib窗口图元
四、xlib区域
五、xlib绘制按钮控件
六、绘制图片
七、xlib窗口渲染
八、实现编辑框控件
九、异形窗口
十、基于xlib实现定时器
十一、xlib绘制编辑框-续
十二、Linux实现截屏小工具



xlib用于在linux操作系统下创建GUI应用程序,笔者在将duilib移植到linux操作系统下时,使用了xlib创建窗口、文本以及图片渲染。以此文档记录xlib的使用。目前跨平台的duilib界面库还在开发中,项目代码地址基于duilib的跨平台界面库

1.xlib

X Window System

什么是X Window System,以下是维基百科对于X Window System的解释

X窗口系统(X Window System,也常称为X11或X,天窗口系统)是一种以位图方式显示的软件窗口系统。最初是1984年麻省理工学院的研究,之后变成UNIX、类UNIX、以及OpenVMS等操作系统所一致适用的标准化软件工具包及显示架构的运作协议。X窗口系统通过软件工具及架构协议来建立操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上。现在几乎所有的操作系统都能支持与使用X。更重要的是,今日知名的桌面环境——GNOME和KDE也都是以X窗口系统为基础建构成的。

xlib

xlib是用于与X Window System进行交互的c语言库。这是构成X客户端的基础,允许应用程序创建窗口、绘制图形和管理用户输入等操作。

2.第一个图形应用程序

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    Display *display;
    Window window;
    int screen;

    /* 打开与X服务器的连接 */
    display = XOpenDisplay(NULL);
    if (display == NULL) {
        fprintf(stderr, "无法打开X显示器\n");
        exit(1);
    }

    screen = DefaultScreen(display);

    /* 创建窗口 */
    window = XCreateSimpleWindow(display, RootWindow(display, screen), 10, 10, 400, 300, 1,
                                 BlackPixel(display, screen), WhitePixel(display, screen));

    /* 显示(映射)窗口 */
    XMapWindow(display, window);

    XEvent  event;
    while (1) {
        XNextEvent(display,&event);
    }

    XDestroyWindow(display, window);
    XCloseDisplay(display);

    return 0;
}

以上代码XOpenDisplay返回一个Display类型的指针,xlib其本身是一个客户端/服务端架构的界面程序,XOpenDisplay用于说明将要连接的服务器。我们创建一个本地的界面应用程序,所以XOpenDisplay参数给NULL。DefaultScreen用于获取Display所对应的Server默认的屏幕编号。XCreateSimpleWindow用于创建一个窗口,该函数原型如下

extern Window XCreateSimpleWindow(
    Display*        /* display */,
    Window        /* parent */,
    int            /* x */,
    int            /* y */,
    unsigned int    /* width */,
    unsigned int    /* height */,
    unsigned int    /* border_width */,
    unsigned long    /* border */,
    unsigned long    /* background */
);

XMapWindow将XCreateSimpleWindow创建的窗口进行映射显示。XNetEvent,窗口创建成功后会产生许多类型的消息如显示,窗口大小变化、鼠标移动、键盘输入等事件,在Xlib中使用XNextEvent获取窗口的消息事件。并进行处理。

XDestroyWindow销毁创建的窗口。XCloseDisplay,关闭连接到X Server的句柄,并释放资源。

3.编译程序

在linux系统下编译xlib图形应用程序,需要x11开发包。本文以ubuntu20.04为例,描述如何编译xib操作系统。首先使用apt search查看x11的开发包是否已经安装。如下

apt search libx11-dev

若出现类似如下信息,说明xlib的开发包已经安装。

libx11-dev/focal-updates,focal-security,now 2:1.6.9-2ubuntu1.6 amd64 [已安装,自动]
  X11 client-side library (development headers)

若没有以上信息,则执行apt install安装xlib开发包

sudo apt install libx11-dev

我们可以使用gcc/g++或者clang编译以上源码。以下以gcc为例

gcc FirstUIApp.c -o FirstUIApp -lX11

在编译源码时我们需要链接libX11.so这样的库,如果没有链接这个库,则会提示XOpenDisplay等函数的实现找不到。编译后运行我们的程序,则会在屏幕上显示我们在linux操作系统下的第一个界面应用程序,运行结果如下

在这里插入图片描述

这里显示了一个空白的界面,界面的风格与你操作系统所设置的主题风格有关。

4.xlib与gtk、QT

xlib提供了较低层次的创建窗口的接口,gtk和qt对xlib进行了封装,便于开发,并提供了跨操作系统平台的接口功能,xlib运行在linux/unix系统,而gtk、qt可以运行在windows、linux以及mac系统。由于xlib的设计过于陈旧,现代操作系统中引入了一些新的界面框架,如wayland,通过使用ldd在ubuntu系统下分析libgtk-3.so动态库,该库依赖了libX11.so以及libwayland.so系统列的动态库。所以在这猜测gtk应该是对linux系统下多种窗口系统进行了封装,并向外提供统一的接口。关于QT使用ldd分析libQt5Gui.so动态库,其依赖了libGL.so、libGLX.so等动态库,而libGLX.so又依赖了libX11.so库,所以Qt库可能也是对xlib的接口进行封装,并提供跨平台访问接口。

最后我们可以打印系统环境变量获取当前操作系统使用的窗口系统,环境变量名为:XDG_SESSION_TYPE。

echo $XDG_SESSION_TYPE

当linux操作系统界面使用x11作为窗口系统时,以上打印x11,使用其它的窗口系统则会打印出相应的字符串信息如:wayland

XLib-GUI:Linux环境下的GUI开发指南 XLib-GUI 项目是利用XLib库开发Linux平台图形用户界面(GUI)的综合性工程。该项目旨在提供一套简单易用的接口,帮助开发者快速构建美观、高效的桌面应用。XLib,即X Window System Library,是X Window系统的基础库,它为X Window系统提供了底层的通信协议实现以及核心的图形操作接口。XLib允许开发者直接与X服务器交互,执行包括创建窗口、绘制图形、处理输入设备(如键盘和鼠标)等操作。 阅读详情

相关推荐

深入Xlib底层:从窗口创建到事件循环的GUI编程实战

图形界面编程是很多开发者绕不开的技术领域,而Xlib作为X Window System的C语言标准接口,是理解Linux GUI底层的核心入口。它没有封装控件,只提供与X服务器通信的能力,并通过Display、Window、Graphics Context和Event等概念构建起事件驱动的绘图模型。掌握Xlib能帮助你理解窗口系统的工作原理,解决GTK/Qt使用中遇到的闪烁、事件丢失等疑难问题,也适合嵌入式环境下的轻量级图形界面开发。本文从连接X服务器、创建窗口、配置绘图上下文开始,逐步构建可交互的窗口程序

weixin_34343308的博客 516

Xlib基础图形编程

图形用户接口(GUI)编程-异步编程模式 不像我们通常的令人愉快的程序,一个GUI程序通常使用异步编程模式,也就是下面要介绍的"事件驱动编程"。这个"事件驱动编程"的意思是说程序通常都处于空闲状态,等待从X服务器发来的事件,等收到了事件,才根据事件做相应的事情。一个事件可能是"用户在屏幕某处x,y点击了鼠标左键",或者是"你控制的窗口需要被重画"。因为程序要回应用户的请求,同时还需要刷新自己的请

arag2009的学习专栏 9176

Xlib编程实战:从Display到事件循环的窗口系统开发

X Window系统是Linux图形界面的基石,采用C/S架构把显示管理和应用绘制隔离开。Xlib作为X协议的C语言封装库,是图形编程的基础,连接了应用与X服务器。它提供了Display连接管理、事件循环、图形上下文等核心机制,让开发者能直接控制窗口创建、重绘以及输入响应。理解Xlib的价值在于,它不仅能维护大量历史桌面代码,也能快速搭建轻量级GUI原型。从窗口映射的时机到Expose事件重绘,再到Pixmap双缓冲避免闪烁,Xlib的工程实践覆盖了图形程序最常见的难点。这些底层经验同样适用于理解XCB和更

weixin_34239169的博客 386

XLib编程手册 ---- 简介

Xlib - C语言的X接口是一个参考指南,以低层C语言接口的X窗口系统协议。它既不是编写X Window系统的教程,也不是用户指南。相反,它提供了库中每个函数的详细描述以及相关背景信息的讨论。Xlib - C语言X Interface假定对图形窗口系统和C编程语言有基本的了解。其他高级抽象(例如,由工具包为X提供的抽象)构建在Xlib库之上。有关这些高级库的更多信息,请参阅适当的工具包文档。X ...

Linux应用程序开发的博客 8021

linux视频游戏开发C语言源程序XLIB06

这个程序很不错,可以帮助你学习xlib。

【深度排查】VScode 远程 SSH 连接失败:从网络握手到服务部署的全链路诊断指南

本文详细解析了VScode远程SSH连接失败的常见原因及解决方案,从基础网络排查到SSH服务配置,再到VScode特有的问题处理。特别针对Ubuntu和TrueNAS系统提供了具体配置建议,帮助开发者快速解决'Could not establish connection'等连接问题,提升远程开发效率。

weixin_30301449的博客 447

linux xlib函数手册,Xlib 编程手册之颜色

第七章 颜色这一章说明如何在程序中使用颜色。在 X中颜色的处理可能比在其它系统更加复杂,因为需要针对许多不同类型显示(display)的可移植性。颜色处理中的一些先进的主题在 X标准中规定的仍然比较差。这一章从每个人都应该读的基础开始,并且逐渐地转移到更先进的主题,包括R5的设备无关的颜色。从最新的部分中适当地摘录和选择了一些。典型的 X应用程序允许用户指定窗口的背景和边框,指定光标的颜色,以及...

weixin_40009099的博客 1112

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6154

Xlib 基础概念

1.1 一个Display 包含了一个或者多个Screen, 是一个集合了键盘,鼠标和一个或多个Screen 的工作站。 1.2  X协议(X protocol)是X 客户程序和服务器进行通信的一套协定,X 协议支持网络,能在本地系统中和网络实现这个协议,支持的网络协议有TCP/IP, DECnet等。 1.3  XServer 是控制每个Display 的程序,一个XServer

河 的 第 三 条 岸 2491

用pyqtgraph 和pyqt5绘制股票K线图

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'QWidget_plot.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost!...

qq_23114283的博客 5429

GD32F470 DSP库移植避坑指南:从CMSIS版本冲突到AC6工程配置

本文详细解析了在GD32F470平台上移植CMSIS-DSP库的完整流程与关键避坑点。针对CMSIS版本冲突、AC6编译器下的浮点ABI配置、DSP库源文件添加等核心难题,提供了经过验证的解决方案,帮助开发者高效完成移植,确保硬件FPU正常工作并优化性能。

data3的博客 531

X11窗口

x11窗口

orbitgw的博客 529

爆肝整理:微信公众号文章HTML编写完整规范,运营必备手册

微信公众号文章排版总是出错?📱 这份完整的HTML编写规范文档帮你彻底解决!文档包含所有支持的标签、CSS属性、实用代码模板和注意事项 📋,让你快速掌握微信文章的HTML编写技巧,告别第三方编辑器依赖 ✅

XiaoqiangClub的博客 2311

七、xlib窗口渲染

本文介绍了如何在X Window系统中使用XRender扩展渲染带有透明度的PNG图片。由于默认的24位颜色深度窗口无法正确处理PNG的alpha通道,导致图片显示为黑色背景。解决这一问题有两种方法:一是创建支持32位颜色的窗口,二是使用XRender扩展。XRender不仅支持透明度绘制,还能实现图片混合和渐变窗口等复杂效果。文章提供了使用XRender渲染PNG图片的代码示例,包括加载PNG文件、创建Pixmap和Picture对象,并通过XRenderComposite函数将图片绘制到窗口上。

mxway的专栏 1269

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 539

从VLM到VLA概论

智驾视觉大模型

xiaomu_347的博客 1714

linux使用xlib库创建窗口

linux使用xlib创建窗体不依赖其它的库

m0_60352504的博客 2209

Android 12,通过JNI写framebuff实现白板书写加速

Android 书写加速

448313096@qq.com 1204

x11用xlib库创建个framebuffer可写的窗口

X11的Xlib库创建个可写的framebuffer窗口

yvee的博客 1111

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Xlib 窗口属性

所有的 InputOutput窗口都可以有零个或者多个像素的边框宽度,一个可选的背景,一个事件压制掩码(它压制来自孩子的事件传播),和一个 property列表。窗口的边框和背景可以是一个实心颜色或者是一个称为平铺的调色板。除了根窗口之外的所有的窗口都有父亲并且都是由它们的父亲所裁剪。如果一个窗口是在压栈压在另一个窗口的上面,它遮挡用于输入的其它窗口。如果一个窗口有背景(大多数都有),

shenbin1430的专栏 5390

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

使用xlib改变窗口属性

xlib编程相关的头文件如下:#include #include #include #include #include 将xlib函数与gtk应用程序相结合。通常在xlib函数中需要指定特定的Display以及相应widget的Window(xwindow id)。为了在Gtk应用中使用xlib相关函数,我们需要找到在gtk与xlib之间的桥梁。Gtk是在G

Just Programming Myself (c_spark) 2886

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

三、xlib窗口图元

本文介绍了如何在xlib窗口系统中绘制文本和图形元素。本文使用最简洁的代码展示了如何在xlib窗口系统中渲染文本。使用Xft库绘制特效文字。在xlib窗口系统中如何绘制点线、矩形、弧形。以及如何在xlib窗口系统使用颜色对一些特定区域进行填充。

mxway的专栏 898

xlib/x11+OpenGL:创建一个监测键盘事件的窗口-7-创建opengl context

/** * Phase 07 - Create an OpenGL Context. * * The main goal of this phase is to see if it makes sense to structure the Xlib * code without the OpenGL code, or if they are married together. * *...

RToax 2400

五、xlib绘制按钮控件

本文简单介绍了在linux操作系统如何不使用qt、gtk库的情况下,创建GUI程序,并在窗口中绘制按钮控件。xlib没有提供控件这类高级概念,我们可以通过直接在主窗口中绘制,或是子窗口的方式实现按钮控件绘制;直接绘制和子窗口方式绘制本质上没有区别,只是对于事件处理逻辑不同。这种绘制控件的思想与具体操作系统、或界面库无关,只要提供基本绘图元素和鼠标事件处理接口,我们可以在任意操作系统下,使用任意UI绘制控件。通过按钮控件的绘制我们提示了gtk、QT这样的UI库事件循环、高级控件的基本原理。

mxway的专栏 1298
上一篇: C++项目总四之内存溢出造成的诡异函数调用
下一篇: 二、xlib事件
mxway
博客等级 码龄17年 370粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值