您的位置:首页 > 其它

GNU PGM

2013-09-25 06:03 162 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: