#include

#include

#include

#include

#include

// 以下代码源自

// [需要在文本控制台下运行,才能获取到数据,在ubuntu 8.10 GNOME界面只能收到1个字节数据0xfa][luther.gliethttp]

// libminigui-1.6.10/src/ial/native/native.c

// InitIAL==>__mg_cur_input = inputs{"console", InitNativeInput, TermNativeInput},

// mousedev = mousedev_IMPS2;

// input->update_mouse = mouse_update;

/* Mouse button bits*/

#define WHEEL_UP 0x10

#define WHEEL_DOWN 0x08

#define BUTTON_L 0x04

#define BUTTON_M 0x02

#define BUTTON_R 0x01

#define SCALE 3 /* default scaling factor for acceleration */

#define THRESH 5 /* default threshhold for acceleration */

static int xpos; /* current x position of mouse */

static int ypos; /* current y position of mouse */

static int minx; /* minimum allowed x position */

static int maxx; /* maximum allowed x position */

static int miny; /* minimum allowed y position */

static int maxy; /* maximum allowed y position */

static int buttons; /* current state of buttons */

static int scale = SCALE; /* acceleration scale factor */

static int thresh = THRESH;/* acceleration threshhold */

static int mouse_update(int dx, int dy, int dz);

static int IMPS2_Read (int *dx, int *dy, int *dz, int *bp);

static void mouse_setposition (int newx, int newy);

static void mouse_setrange (int newminx, int newminy, int newmaxx, int newmaxy);

int mouse_fd;

int main(void)

{

int dx,dy,dz;

static unsigned char imps2_param [] = {243,200,243,100,243,80};//,242};

// 来自vnc4的xc/programs/Xserver/hw/xfree86/input/mouse/mouse.c==> PROT_IMPS2

const char *mdev="/dev/input/mice";

mouse_fd = open (mdev, O_RDWR); // | O_NONBLOCK);

if (mouse_fd < 0) {

printf("[luther.gliethttp]: RW error [please use root user]: %s\n", mdev);

mouse_fd = open (mdev, O_RDONLY); // | O_NONBLOCK);

if (mouse_fd < 0)

return -1;

} else {

write (mouse_fd, imps2_param, sizeof (imps2_param)); // 初始化序列, 这样可以读取4个字节数据

// 0x80用来表示滚轮向上还是向下滚动.de>

de> // 0xa0表示滚轮向上滚动的同时中键按下

de>

de> printf("[luther.gliethttp]: imps2_param ok!\n");

}

mouse_setrange(0, 0, 1024, 768);

for (;;) {

IMPS2_Read(&dx, &dy, &dz, &buttons);

mouse_update(dx, dy, dz);

mouse_setposition(xpos, ypos);

printf("[%04d,%04d,0x%04x]\n", xpos, ypos, buttons);

}

return 0;

}

static int IMPS2_Read (int *dx, int *dy, int *dz, int *bp)

{

static unsigned char buf[5];

static int buttons[7] = { 0, 1, 3, 0, 2, 0, 0}; // 1左键,2中键,3右键

static int nbytes;

int n;

while ((n = read (mouse_fd, &buf [nbytes], 4 - nbytes))) {

if (n < 0) {

if (errno == EINTR)

continue;

else

return -1;

}

nbytes += n;

if (nbytes == 4) {

int wheel;

// printf("[luther.gliethttp]: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);

if ((buf[0] & 0xc0) != 0) {

buf[0] = buf[1];

buf[1] = buf[2];

buf[2] = buf[3];

nbytes = 3;

return -1;

}

/* FORM XFree86 4.0.1 */

*bp = buttons[(buf[0] & 0x07)];

*dx = (buf[0] & 0x10) ? buf[1] - 256 : buf[1];

*dy = (buf[0] & 0x20) ? -(buf[2] - 256) : -buf[2];

/* Is a wheel event? */

if ((wheel = buf[3]) != 0) {

if(wheel > 0x7f) {

*bp |= WHEEL_UP;

}

else {

*bp |= WHEEL_DOWN;

}

}

*dz = 0;

nbytes = 0;

return 1;

}

}

return 0;

}

static int mouse_update(int dx, int dy, int dz)

{

int r;

int sign;

sign = 1;

if (dx < 0) {

sign = -1;

dx = -dx;

}

if (dx > thresh)

dx = thresh + (dx - thresh) * scale;

dx *= sign;

xpos += dx;

if( xpos < minx )

xpos = minx;

if( xpos > maxx )

xpos = maxx;

sign = 1;

if (dy < 0) {

sign = -1;

dy = -dy;

}

if (dy > thresh)

dy = thresh + (dy - thresh) * scale;

dy *= sign;

ypos += dy;

if ( ypos < miny )

ypos = miny;

if ( ypos > maxy )

ypos = maxy;

return 1;

}

static void mouse_setposition (int newx, int newy)

{

if (newx < minx)

newx = minx;

if (newx > maxx)

newx = maxx;

if (newy < miny)

newy = miny;

if (newy > maxy)

newy = maxy;

if (newx == xpos && newy == ypos)

return;

xpos = newx;

ypos = newy;

}

static void mouse_setrange (int newminx, int newminy, int newmaxx, int newmaxy)

{

minx = newminx;

miny = newminy;

maxx = newmaxx;

maxy = newmaxy;

mouse_setposition ((newminx + newmaxx) / 2, (newminy + newmaxy) / 2);

}

static int mouse_getbutton (void)

{

return buttons;

}

static void mouse_getxy (int* x, int* y)

{

*x = xpos;

*y = ypos;

}

linux鼠标怎么取出来,浅析linux中鼠标数据读取相关推荐

  1. linux下去ldap数据,Linux系统下要如何修改LDAP中的数据

    在天下网吧-网吧系统-网吧天下栏目上一篇文章中,我们看到了:希望对各位网吧网管或者网吧维护,做网吧系统的各位大大有用,那么今天我们一起来看下:Linux系统下要如何修改LDAP中的数据 在之前的文章中 ...

  2. android libbfaac.so,Android中Json数据读取与创建

    一:  Json的特性和在数据交互中的地位就不用说了,直接看案例. 首先在android studio中创建assets文件目录,用于存放Json数据文件,android studio 1.3 默认项 ...

  3. python怎么读取csv的一部分数据_python批量读取csv文件 如何用python将csv文件中的数据读取成数组...

    如何用python把多个csv文件数据处理后汇总到新csv文件你看这月光多温柔,小编转头还能看见你,一切从未坍塌. 可以用pandas读取数据,首先把文件方同一个文件价里,然后对当前文件价的所有内容循 ...

  4. 集合中的数据存入到文件中,文件中的数据读取到集合中

    * Map<String ,Integer> map = new LinkedHashMap<>(); * map.put("摩卡",30); * map. ...

  5. linux内核定时器死机,浅析linux内核中timer定时器的生成和sofirq软中断调用流程

    浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...

  6. linux查看共享内存max,浅析Linux的共享内存与tmpfs文件系统

    浅析Linux的共享内存与tmpfs文件系统 前言 共享内存主要用于进程间通信,Linux有两种共享内存(Shared Memory)机制: (1)** System V shared memory( ...

  7. linux取消线程的原理,浅析 Linux 进程与线程

    简介 进程与线程是所有的程序员都熟知的概念,简单来说进程是一个执行中的程序,而线程是进程中的一条执行路径.进程是操作系统中基本的抽象概念,本文介绍 Linux 中进程和线程的用法以及原理,包括创建.消 ...

  8. java 中鼠标事件_[Java教程]js中鼠标事件总结

    [Java教程]js中鼠标事件总结 0 2017-07-11 00:00:19 js中鼠标事件主要有onclick,onmousedown,onmouseup,oncontextmenu,ondblc ...

  9. win10没有鼠标怎样用计算机,Win10电脑中鼠标光标消失怎么解决

    鼠标是我们使用电脑的时候必不可少的设备,然而有不少用户升级到win10系统的时候,却遇到鼠标光标消失的现象,移动鼠标或者触控板都没有任何反应,该如何解决呢,本教程就给大家带来Win10电脑中鼠标光标消 ...

  10. 浅析WebRtc中视频数据的收集和发送流程

    前言 本文是基于PineAppRtc开源项目https://github.com/thfhongfeng/PineAppRtc 因为一个需求,我们需要将一个视频流通过WebRtc发送出去,所以就研究一 ...

最新文章

  1. LED亮度与电流之间的关系?
  2. 【错误记录】Windows 系统 bat 脚本报错 ( Java 生成 bat 脚本乱码处理 | 输出 GB2312 字符串 | Windows 中的换行时 \r\n )
  3. python与mysql数据库_python与MySQL数据库
  4. BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)
  5. Maven开发web项目的搭建
  6. 计算机辅助语文识字教学的优势,小学语文计算机辅助教学研究
  7. 小辣椒android密码怎样开,小辣椒手机忘记密码怎么恢复出厂设置
  8. Android网速实时显示
  9. 恢复未保存的word
  10. Discuz!首页去掉版块的最后发表、主题数、总帖数
  11. 《.NET大局观》--嬗变的痛苦
  12. python数字转换拼音程序_课内资源 - 基于Python的拼音汉字转换程序
  13. 三线制电阻内引线阻值测量
  14. 金属有机骨架材料Fe3O4@ZIF-67|Fe3O4@ZIF-8;甲硫基官能化MIL-101(Cr)负载银纳米粒子
  15. JS对异步循环使用递归,分批进行大量异步请求
  16. 第一章 Vue基础入门
  17. 动脑学院-网络请求框架
  18. matlab-CPD工具箱的使用
  19. 【滴滴出行】 2019校招在线笔试
  20. jq layui遮罩层出现多个layui-layer-shade问题

热门文章

  1. 浙江大学【面板数据分析与STATA应用】——第二讲长面板数据分析与机制识别方法
  2. PPT学习整理(六)从入门到放弃。
  3. 交互设计和UI设计有区别吗 UI学习路线是什么
  4. Postman 接口测试神器
  5. laravel whereDoesntHave 查询不等于条件的数据
  6. 【转载】Linux下用dd命令扇区读写SD卡
  7. 测序深度和覆盖度(Sequencing depth and coverage)
  8. 读取工程下的文档 统计重复的姓名 并按次数排序 java_当多个节点有相同名字但是内容不同的时候,生成的类名是相同的,导致导入项目中的时候不好识别。...
  9. 区块链在保险业的应用
  10. [论文阅读] Meta-Weight-Net: Learning an Explicit Mapping For Sample Weighting