⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mou_x11.c

📁 神龙卡开发原代码
💻 C
字号:
/* * Author: Tony Rogvall <tony@bluetail.com> * */#include <stdio.h>#include <errno.h>#include <unistd.h>#include <X11/Xlib.h>#include "device.h"#define	SCALE		3	/* default scaling factor for acceleration */#define	THRESH		5	/* default threshhold for acceleration */static int  	X11_Open(MOUSEDEVICE *pmd);static void 	X11_Close(void);static int  	X11_GetButtonInfo(void);static void	X11_GetDefaultAccel(int *pscale,int *pthresh);static int  	X11_Read(MWCOORD *dx, MWCOORD *dy, MWCOORD *dz, int *bp);extern Display*     x11_dpy;extern int          x11_scr;extern Visual*      x11_vis;extern Window       x11_win;extern GC           x11_gc;extern unsigned int x11_event_mask;extern int          x11_setup_display();extern void         x11_handle_event(XEvent*);MOUSEDEVICE mousedev = {    X11_Open,    X11_Close,    X11_GetButtonInfo,    X11_GetDefaultAccel,    X11_Read,    NULL};/* * Open up the mouse device. * Returns the fd if successful, or negative if unsuccessful. */static int X11_Open(MOUSEDEVICE *pmd){    if (x11_setup_display() < 0)	return -1;    /* return the x11 file descriptor for select */    return ConnectionNumber(x11_dpy);  }/* * Close the mouse device. */static voidX11_Close(void){    /* nop */}/* * Get mouse buttons supported */static intX11_GetButtonInfo(void){	return MWBUTTON_L | MWBUTTON_M | MWBUTTON_R;}/* * Get default mouse acceleration settings */static voidX11_GetDefaultAccel(int *pscale,int *pthresh){    *pscale = SCALE;    *pthresh = THRESH;}/* * Attempt to read bytes from the mouse and interpret them. * Returns -1 on error, 0 if either no bytes were read or not enough * was read for a complete state, or 1 if the new state was read. * When a new state is read, the current buttons and x and y deltas * are returned.  This routine does not block. */static intX11_Read(MWCOORD *dx, MWCOORD *dy, MWCOORD *dz, int *bp){    static int noevent_count = 0;    XEvent ev;    int events = 0;    long mask = /* x11_event_mask | */#ifdef USE_EXPOSURE      ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask;#else      ButtonPressMask | ButtonReleaseMask | PointerMotionMask;#endif    while (XCheckMaskEvent(x11_dpy, mask, &ev)) {	if (ev.type == MotionNotify) {	    if (ev.xmotion.window == x11_win) {		int button = 0;		*dx = ev.xmotion.x;		*dy = ev.xmotion.y;		*dz = 0;		if (ev.xmotion.state & Button1Mask)		    button |= MWBUTTON_L;		if (ev.xmotion.state & Button2Mask)		    button |= MWBUTTON_M;		if (ev.xmotion.state & Button3Mask)		    button |= MWBUTTON_R;		*bp = button;		events++;	    }	}	else if (ev.type == ButtonPress) {	    if (ev.xbutton.window == x11_win) {	        int button = 0;				/* Get pressed button */	    	if(ev.xbutton.button == 1)			button = MWBUTTON_L;		else if(ev.xbutton.button == 2)			button = MWBUTTON_M;		else if(ev.xbutton.button == 3)			button = MWBUTTON_R;		/* Get any other buttons that might be already held */		if (ev.xbutton.state & Button1Mask)		    button |= MWBUTTON_L;		if (ev.xbutton.state & Button2Mask)		    button |= MWBUTTON_M;		if (ev.xbutton.state & Button3Mask)		    button |= MWBUTTON_R;		/*		printf("!Pressing button: 0x%x, state: 0x%x, button: 0x%x\n",			button,ev.xbutton.state, ev.xbutton.button);*/		*bp = button;		*dx = ev.xbutton.x;		*dy = ev.xbutton.y;		*dz = 0;		events++;	    }	}	else if (ev.type == ButtonRelease) {	    if (ev.xbutton.window == x11_win) {	        int button = 0;		int released = 0;			/* Get released button */	    	if(ev.xbutton.button == 1)			released = MWBUTTON_L;		else if(ev.xbutton.button == 2)			released = MWBUTTON_M;		else if(ev.xbutton.button == 3)			released = MWBUTTON_R;				/* Get any other buttons that might be already held */		if (ev.xbutton.state & Button1Mask)		    button |= MWBUTTON_L;		if (ev.xbutton.state & Button2Mask)		    button |= MWBUTTON_M;		if (ev.xbutton.state & Button3Mask)		    button |= MWBUTTON_R;			/* We need to remove the released button from the button mask*/		button &= ~released;		/*printf("!Releasing button: 0x%x, state: 0x%x, button: 0x%x\n",			button,ev.xbutton.state, ev.xbutton.button);*/		*bp = button;		*dx = ev.xbutton.x;		*dy = ev.xbutton.y;		*dz = 0;		events++;	    }	}	else {	    x11_handle_event(&ev);	}    }    if (events == 0) {	/* after a bunch of consecutive noevent calls here           (meaning select() says there's something to read but nothing            is returned......), force an event read (which will            most likely terminate the connection) */	if (++noevent_count >= 50) {            while(XNextEvent(x11_dpy, &ev)) {                /* if we return, then we got an event...put it back                   so we can properly process it next time through */                XPutBackEvent(x11_dpy, &ev);            }            noevent_count = 0;	}	return 0;    }    noevent_count = 0;    return 2;		/* absolute position returned*/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -