[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > 其它 > 正文
Linux程式設計-19.gpm
http://www.openchess.org/noitatsko/programming/ (2001-05-27 12:10:00)


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  
#include  
#include  
#include  

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); 


   (http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Linux程式設計-31.工作群資訊管理(grp) (2001-05-27 22:08:00)
Linux程式設計-30.使用者資訊管理(pwd) (2001-05-27 21:04:00)
Linux程式設計-29.時間處理 (2001-05-27 20:10:01)
Linux程式設計-28.GNU Make (2001-05-27 19:00:00)
Linux程式設計-27.GNU Debugger (2001-05-27 18:08:01)
Linux程式設計-26.PIPE (2001-05-27 17:04:00)
Linux程式設計-25.Message Queues (2001-05-27 16:10:00)
Linux程式設計-24.Semaphores (2001-05-27 15:00:00)
Linux程式設計-23.共享記憶體(Shared Memory) (2001-05-27 14:08:00)
Linux程式設計-20.getopt (2001-05-27 13:04:00)

===更多相關===
 

★  樊強制作 歡迎分享  ★