GNU PGM
Linux程序设计入门 - gpm
gpm是Linux console下的滑鼠驱动程序,它主要提供文字模式下的滑鼠事件处
理。Linux下文字界面的滑鼠几乎都是用gpm来处理。
gpm的文件在gpm原始码的doc目录中,详细的说明可叁考该目录中的文件gpm
programming guide,此处只提供给您KickStart的一些技巧及一些叁考说明。
特别注意到以下的范例,需在console下执行,不可在X Window的 Terminal下
执行。
范例 : gpm_mouse.c
gpm原始码中有一个mev.c的程序 ,主要用来测试滑鼠状态。事实上,mev.c是个
很好的范例,本范例便是取自mev.c,经过简化修改而来。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <gpm.h>
void main(int argc,char **argv)
{
fd_set readset;
Gpm_Event event;
Gpm_Connect conn;
conn.eventMask = ~0;
conn.defaultMask = ~GPM_HARD;
conn.maxMod = 0;
conn.minMod = 0;
if (Gpm_Open(&conn,0)==-1) {
printf("Can not open mouse connection\n");
exit(1);
}
while (1) {
FD_ZERO(&readset);
FD_SET(gpm_fd,&readset);
select(gpm_fd+1,&readset,0,0,0);
if (FD_ISSET(gpm_fd,&readset)) {
if (Gpm_GetEvent(&event)>0) {
printf("mouse: event 0x%02X, at %2i %2i (delta %2i %2i),"
"button %i, modifiers 0x%02X\r\n",
event.type,
event.x,event.y,
event.dx,event.dy,
event.buttons,
event.modifiers
);
}
}
}
while (Gpm_Close());
}
编译
gcc -o gpm_mouse gpm_mouse.c -lgpm
检验结果
mouse: event 0x01, at 15 1 (delta -2 -1),button 0, modifiers 0x00
mouse: event 0x01, at 14 1 (delta -1 0),button 0, modifiers 0x00
mouse: event 0x01, at 13 1 (delta -1 0),button 0, modifiers 0x00
资料结构
typedef struct Gpm_Connect {
unsigned short eventMask, defaultMask;
unsigned short minMod, maxMod;
int pid;
int vc;
} Gpm_Connect;
enum Gpm_Etype {
GPM_MOVE=1,
GPM_DRAG=2, /* exactly one of the bare ones is active at a time
*/
GPM_DOWN=4,
GPM_UP= 8,
GPM_SINGLE=16, /* at most one in three is set */
GPM_DOUBLE=32,
GPM_TRIPLE=64, /* WARNING: I depend on the values */
GPM_MFLAG=128, /* motion during click? */
GPM_HARD=256, /* if set in the defaultMask, force an
already used event to pass over to another handler */
GPM_ENTER=512, /* enter event, user in Roi's */
GPM_LEAVE=1024 /* leave event, used in Roi's */
};
typedef struct Gpm_Event {
unsigned char buttons, modifiers; /* try to be a multiple of 4 */
unsigned short vc;
short dx, dy, x, y;
enum Gpm_Etype type;
int clicks;
enum Gpm_Margin margin;
} Gpm_Event;
typedef int Gpm_Handler(Gpm_Event *event, void *clientdata);
函数宣告
int Gpm_Open(Gpm_Connect * CONN, int FLAGS);
int Gpm_Close(void);
int Gpm_GetEvent(Gpm_Event * EVENT);
int Gpm_Getc(FILE * fp);
#define Gpm_Getchar() Gpm_Getc(stdin)
int Gpm_Wgetch();
#define Gpm_Getch() (Gpm_Wgetch(NULL))
int Gpm_Repeat (int millisecs);
int Gpm_DrawPointer (int X, int Y, int FD);
int GPM_DRAWPOINTER (Gpm_Event *EPTR;)
int Gpm_FitValuesM (int *X, int *Y, int MARGIN);
int Gpm_FitValues (X,Y);
Gpm_FitEvent (EPTR);
char *Gpm_GetLibVersion (int *where);
char *Gpm_GetServerVersion (int *where);
int Gpm_GetSnapshot (Gpm_Event *ePtr);
OK STATION, Webmaster, Brian Lin
GNU PGM的更多相关文章
- 感悟 GNU C 以及将 Vim 打造成 C/C++ 的半自动化 IDE
C 语言在 Linux 系统中的重要性自然是无与伦比.不可替代,所以我写 Linux 江湖系列不可能不提 C 语言.C 语言是我的启蒙语言,感谢 C 语言带领我进入了程序世界.虽然现在不靠它吃饭,但是 ...
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- 在 Linux 中使用 Eclipse 和 Gnu Autotools 管理 C/C++ 项目
在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 U ...
- GNU Readline 库及编程简介
用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以用来命令补全 ↑ 或 ↓ 键可以用来快速输入历史命令 还有一些交互式行编辑快捷键: C-A / C-E 将光标移到行首/行尾 C ...
- GNU Radio Radar Toolbox
GNU Radio Radar Toolbox Install guide Change to any folder in your home directory and enter followin ...
- gnu coreutils-8.25 for win32 static - Beta
gnu.win32-coreutils-8.25.7z 2.7 Mb bc-1.06.tar.gz coreutils-8.25.tar.xz diffutils-3.5.tar.xz gawk-4. ...
- window下搭建c开发环境(GNU环境的安装)
一.在windows平台上安装GNU环境 windows操作系统不自带GNU环境,如果需要开发跨平台的C语言程序,那么需要给windows安装GNU环境 windows下的两款GNU环境:MinGW和 ...
- GNU make使用变量⑤变量的引用、定义等
在 Makefile 中,变量是一个名字(像是 C 语言中的宏),代表一个文本字符串(变量的值).在 Makefile 的目标.依赖.命令中引用变量的地方,变量会被它的值所取代(与 C 语言中宏引用的 ...
- ZeroMQ接口函数之 :zmq_pgm – ØMQ 使用PGM 进行可靠的多路传输
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...
随机推荐
- HTML Canvas 鼠标画图
原文来自:http://www.williammalone.com/articles/create-html5-canvas-javascript-drawing-app(已被墙) 译文: http: ...
- MST(Kruskal’s Minimum Spanning Tree Algorithm)
You may refer to the main idea of MST in graph theory. http://en.wikipedia.org/wiki/Minimum_spanning ...
- ios面试题整理
(1).weak 和assign的区别? assign: 用于非指针变量 (2).IOS开发之----#import.#include和@class的区别? 1. 如果不是c/c++,尽量用#impo ...
- Hash表——The Hash table
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h&q ...
- MySQL查询语句执行过程及性能优化(JOIN/ORDER BY)-图
http://blog.csdn.net/iefreer/article/details/12622097 MySQL查询语句执行过程及性能优化-查询过程及优化方法(JOIN/ORDER BY) 标签 ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...
- [转] Understanding Twitter Bootstrap 3
Bootstrap is a popular, open source framework. Complete with pre-built components it allows web desi ...
- 记一次网站服务器迁移(my)
遇到的难题: 基本没有遇到太大的问题,因为服务器环境是配好的阿里云环境,最后再nginx的rewrite配置遇到了一点问题,最后也算解决. 收获小点: 1) vim替换命令: 利用 :s 命令可以实现 ...
- SQL Server 表字段值转换成字段名称(二)
上次写了个比较简单的只有两个字段的例子,经要求在写个 3 个字段的示例 ,贴上来与大家共勉一下 如果你们有更好的方法,提供一下, 感激不尽. 示例如下: /*--drop table temp_ ...
- opencar二次开发常用代码
<?php //创建Registry对象 //注册所有公共类 //创建Front类对象,作为请求分发器(Dispatcher) //根据用户请求(url)创建控制器对象及其动作. // 在Fro ...