运用xlib进行事件响应(X11 API)的小例子

转自:http://blog.csdn.net/linuxheik/article/details/7659090

File: x11_test.cxx

#include <X11/Xlib.h>
每一个Xlib 程序都必须包含这个头文件
#include <stdio.h>1. int main(void) {2. Display *display = XopenDisplay(NULL);首先打开与server 的连接。在你的程序可以使用display 之前,必须先建立一个和X server 的连接。这个连接建立以后,就可以使用Xlib 的函数或宏定义来获得display 的信息了。参数为hardware display name,当设为NULL时,为默认的DISPLAY环境变量。这个函数返回一个指向Display类型的结构的指针,表明已与X server建立了连接,并且包含了这个X serer的所有信息。这样我们就可以使用display之上的所有窗口了。3. int screen = DefaultScreen(display);得到display打开之后的窗口号。本例中,得到0。我理解是:尚未创建窗口,所以窗口号为0。不知道对不对。DefaultScreen是个宏,对应的函数为XDefaultScreen。两者作用相同。4. int width = DisplayWidth(display, screen)/2;5. int height = DisplayHeight(display, screen)/2;函数DisplayWidth得到窗口的宽,DisplayHeight得到窗口的高。窗口虽然没有创建,但是有关窗口的默认信息在display打开之时就已经从X server处获得了。本例,获得默认的尺寸为1024*768,就是显示器的尺寸。6. int black_pixel = BlackPixel(display, screen);7. int white_pixel = WhitePixel(display, screen);X使用一种很复杂的颜色模型,每个颜色用一个整数表示。但是当机器不同,甚至程序不同时,一个整数不一定就代表固定的某个颜色。X能够保证的颜色只有两个:黑和白。用 BlackPixel和 WhitePixel可以得到这两个颜色的值。8. Window win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, width, height, 3, black_pixel, white_pixel);创建窗口的最普遍的函数是XCreateWindow和XCreateSimpleWindow(我目前还没有研究两者具体差别)。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);其中, RootWindow函数产生的是我们创建的窗口的父窗口(我还不太明白到底是哪个);x, y为创建的窗口的起始坐标;width, height为窗口的尺寸;border_width为窗口边框的像素数;border为边框的颜色;background为窗口的背景色。函数返回创建的窗口的ID,并使得X server产生一个CreateNotify事件。9. XSelectInput(display, win, ExposureMask|StructureNotifyMask);我们知道,X是一个服务器-客户端的结构。由服务器向客户端发送事件信息,让客户端知道发生了什么事情,然后客户端告诉服务器它感兴趣的是什么事情,也就是说,客户端会对那些事件产生反应。用XSelectInput这个函数,就是告诉服务器,这个窗口会对那些消息,也就是事件有响应。这里讲的“事件”,比如又创建,画,改变大小等等。XselectInput(Display *display,Window w,long event_mask);其中,w为希望对事件作出响应的窗口;event_mask为事件号。希望窗口会有那些响应,就在参数中加上这个事件对应的名字。10. XMapWindow(display, win);用XCreateSimpleWindow创建窗口之后,窗口并不能显示出来,需要调用这个函数来画窗口让它显示。如果这个窗口有父窗口,那么在所有父窗口没有画出来之前,这个窗口即使用了这个函数,也是不能显示出来的。必须等所有父窗口都显示了,这个窗口才能画。(不太明白这一步)(没看明白在什么情况下)X server产生一个MapNotify事件。11. GC gc = XCreateGC(display, win, 0, NULL);X并不能记住要画的窗口的属性,那么每次要画窗口时都要把它的全部属性传给server,为了避免每次都传太多参数,X使用了一个结构Graphics Context,简称GC,存储图形操作的大部分属性,比如线的宽度,风格,背景色等等。12. While(1)13. {14. XEvent event = {0};15. XNextEvent(display, &event);16. }接下来就是进入事件循环了。获得事件,处理或丢弃。上面讲到,调用XMapWindow函数后,X server会发出一个MapNotify事件给客户端,这时客户端就已经有相应操作了,就是画窗口,所以事件循环里并没有写出来。17. Return 0;18. }至此,整个程序结束。编译:g++ -lX11 -o x11_test x11_test.cxx运行,屏幕上就显示一个最简单的窗口了。如果我们想看看MapNotify事件到底是怎么回事,就这样写:while(1){XEvent event;XNextEvent(display, &event);if(event.type == MapNotify) break;}//sleep(3);return 0;运行发现,窗口一闪而过。也就是说,客户端一接收到这个事件就显示窗口,一显示窗口就break了。把注释拿掉,则显示窗口3秒钟后才消失。这里看到,接收到的事件由XNextEvent函数从消息队列里获得,把事件放到event.type里并从队列里删除该消息。当队列为空也就是没有下一个事件被接收时,XNextEvent“flushes the output buffer”,也就是窗口最终被显示,并且程序就一直停留在XNextEvent里直到有下一个事件,除非有跳出循环的语句。继续改程序:while(1){XEvent event;XNextEvent(display, &event);if(event.type == MapNotify) break;}XDrawLine(display, win, gc, 10, 160, 180, 20);//XFlush(display);sleep(3);return 0;跳出循环后,用XDrawLine画一条线。这时运行程序,窗口上并没有出现直线。因为窗口的信息改变了,就需要XFlush函数来flush一下,让窗口重画。而之前之所以没有XFlush函数,是因为XNextEvent函数隐式地调用XFlush了,而且调用后并没有改变窗口信息。继续改,添加事件:XSelectInput(display, win, ExposureMask|KeyPressMask|StructureNotifyMask);while(1){XEvent event = {0};XNextEvent(display, &event);switch(event.type){case ConfigureNotify:{width = event.xconfigure.width;height = event.xconfigure.height;break;}case Expose:{XSetForeground(display, gc, WhitePixel(display, screen));XFillRectangle(display, win, gc, 0, 0, width, height);XSetForeground(display, gc, BlackPixel(display, screen));XDrawString(display, win, gc, width/2, height/2, "XWindow", 7);break;}case KeyPress:{if(event.xkey.keycode == XKeysymToKeycode(display, XK_Escape)){XFreeGC(display, gc);XCloseDisplay(display);return 0;}}default: break;}}return 0;事件类型StructureNotifyMask对应事件ConfigureNotify,即改变窗口状态,比如尺寸,位置等;ExposureMask对应事件Expose(我不知道怎么解释这个事件),本例中是在这里设置窗口颜色,画字符串并设置字符串颜色;KeyPressMask对应KeyPress,即键盘响应,本例是当Escape键按下时,退出窗口。退出窗口时,需要释放或者说销毁GC,最开始曾打开display,在这里需要关闭和X server的连接,于是也就销毁了相关资源,关闭了窗口。在这种循环的写法中,退出switch,并没有退出整个循环,XNextEvent仍然在显示窗口,所以不需要我们自己调用XFlush。

有这样一个网址:http://tronche.com/gui/x/xlib-tutorial/

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

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

相关文章

Java 之HashSet、LinkedHashSet、TreeSet比较

4.HashSet、LinkedHashSet、TreeSet比较 Set接口Set不允许包含相同的元素&#xff0c;如果试图把两个相同元素加入同一个集合中&#xff0c;add方法返回false。Set判断两个对象相同不是使用运算符&#xff0c;而是根据equals方法。也就是说&#xff0c;只要两个对象用equals方法…

jquery1.9学习笔记 之选择器(基本元素四)

ID选择器("#id") 描述&#xff1a; 选择与给出ID属性匹配的单元标签。 对于ID选择器&#xff0c;jquery使用JS的函数document.getElementById()&#xff0c;当一个标签附加到ID选择器上时&#xff0c;也是非常有效的。如h2#pageTitle&#xff0c;jquery会在识别元素标…

Java(ArrayList和LinkedList)、(HashTable与HashMap)、(HashMap、Hashtable、LinkedHashMap和TreeMap比较)

1.ArrayList和LinkedList &#xff08;1&#xff09;ArrayList是实现了基于动态数组的数据结构&#xff0c;LinkedList基于链表的数据结构。 &#xff08;2&#xff09;对于随机访问get和set&#xff0c;ArrayList绝对优于LinkedList&#xff0c;因为LinkedList要移动指针。 &a…

oracle 事务测试

此文章是根据官方改变 模拟帐户转账流程1.JOHN帐户扣除-DAVID帐户增加-记录日志&#xff0d;事务提交三个操作必须全部完成此事务才完成&#xff0c;否则失败创建帐户余额表自增字段自增序列&#xff1b;createsequencesaving_seqincrementby1startwith1maxvalue99999999999999…

apt-get 获取源码的方法

apt-get source gconf-editor –allow-unauthenticated 注&#xff1a;gconf-editor是一个包名&#xff0c;根据自己的需求相应更改即可

Java 集合之自动打包和解包以及泛型

自动打包与解包&#xff1a;泛型&#xff1a;上栗子&#xff1a; TestMap1.java: package com.zhj.www; import java.util.*;public class TestMap {public static void main(String[] args) {Map m1 new HashMap();Map m2 new TreeMap();//m1.put("one", new Inte…

select * from dim.dim_area_no@to_dw

应该是建的有database linksdim是用户名&#xff0c;dim_area_no是表名&#xff0c;to_dw 是建的database links的名&#xff0c;dim_area_no表属于dim用户创建database links的作用是连接其他数据库的表select * from dim.dim_area_noto_dw 这个语句的作用是查询属于dim用户的…

ios 内存管理 心得

- alloc, copy, retain会把引用计数1 - release会把引用计数-1 - 局部变量如果初始化时不是autorelease的&#xff0c;要及时调用release释放&#xff0c;并且赋值为nil否则引用仍然存在导致下次无法用nil做是否有值的判断 - 实例变量要在每次赋值时要先释放当前引用的对象再赋…

error while loading shared libraries: xxx.so.x 错误的原因和解决办法

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory 原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.…

泗洪高薪行业

泗洪高薪行业转载于:https://www.cnblogs.com/soundcode/p/3302297.html

libghttp 编译及封装使用实例

想用C语言写个采集程序&#xff0c;涉及到http相关的东西&#xff0c;找了找&#xff0c;有现成的libghttp库。 libghttp库的官方网址google一下第一条结果一般就是的&#xff1a;http://lfs.linuxsir.org/htdocs/blfscvs/gnome/libghttp.html 将源码包下载下来&#xff0c;进…

Java IO 节点流与处理流类型

处理流类型&#xff1a;1、处理流之首先缓冲流&#xff1a;解释&#xff1a;例子&#xff1a;TestBufferStream1.java package com.zhj.www;import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException;public class TestBufferStream1 …

高级浏览器-SRWare Iron 29.0.1600.0 版本发布

SRWare Iron是德国一安全公司srware改造的Chrome&#xff08;铬&#xff09;命名为铁&#xff08;iron&#xff09;的浏览器。于2008年9月18日首次发布。 据官方介绍&#xff0c;Iron浏览器砍掉了Chromium原程序中的很多有碍“隐私”问题的代码。 “iron中去除的功能包括&#…

shell中的${},##和%%的使用

假设我们定义了一个变量为&#xff1a; file/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值&#xff1a; ${file#*/}&#xff1a;删掉第一个 / 及其左边的字符串&#xff1a;dir1/dir2/dir3/my.file.txt ${file##*/}&#xff1a;删掉最后一个 / 及其左边的字…

Java 线程多线程编程1---基础

1、线程的基本概念例子&#xff1a;分析&#xff1a;2、线程的创建和启动第一种线程的创建&#xff1a;定义一个线程类来实现Runner接口 例子&#xff1a; package com.zhj.www; import java.lang.Thread; public class TestThread1 {public static void main(String[] args) {…

移动互联网下一步:“深度学习”配合大数据

随着电子商务不断深入&#xff0c;百度、腾讯、阿里巴巴的移动互联网战略的可比性越来月低&#xff0c;如今百度的移动互联网的战略也面临挑战&#xff0c;最大的因素在于数据的来源。 对于互联网的公司最近的动态是什么&#xff1f;这个不是很难的&#xff0c;主要看一下公司的…

windows挂载linux网络文件系统NFS

ubuntu上安装配置nfs服务 #apt-get install nfs-kernel-server #mkdir /home/nfs #vim /etc/exports 在文档的最后一行加入/home/nfs *(rw,sync,no_root_squash,no_subtree_check)&#xff0c;保存退出。 #/etc/init.d/rpcbind restart 重启rpcbind #/etc/init.d/nfs-kern…

SQL的连接分为三种:内连接、外连接、交叉连接。

先给出两张表&#xff1a;一、内连接&#xff1a;内连接&#xff08;INNER JOIN&#xff09;&#xff1a;有两种&#xff0c;显式的和隐式的&#xff0c;返回连接表中符合连接条件和查询条件的数据行。&#xff08;所谓的链接表就是数据库在做查询形成的中间表&#xff09;。1、…

如何在使用摩托罗拉上的RSS阅读器应用进行一次订阅

订阅一个CSDN的RSS为例。 1、打开RSS阅读器。 2、设置->新增订阅->手动新增 订阅URL:输入http://articles.csdn.net/api/rss.php?tid1000 &#xff08;可以先在PC上打开下该网页&#xff0c;发现他是一个xml网页。&#xff09; 订阅名称&#xff1a;自己起一个名字&…

RTP与RTCP协议介绍

本文转自&#xff1a;http://blog.51cto.com/zhangjunhd/25481 1&#xff0e;流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物。术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身…