闲的想要吃Droppings,被很多人嫌弃。我先声明,这些事没有任何意义,调一个API能解决的事,非要自己去做,而且还做的不好,那就是傻逼,是的,我就是傻逼。

仅仅因为我爸来了,老年人和我观点不一致,不想交流,然而又能干什么,只能干点没有意义的事假装在工作了。


一切皆文件! UNIX已经说了。埃里克雷蒙德这样说的,不服吗?他有枪。

既然 /dev/fb0 被抽象成了显示器,可以在字符终端通过操作映射了 /dev/fb0 的内存在屏幕上画32bit真彩图,那么如何操作鼠标键盘呢?

/dev/input/mouse0 可以用来读取鼠标事件。当你在字符终端cat它并移动鼠标时,它貌似告诉你有事情发生了,但是你却无法解读:

为了找到解读它的正确方法,要么谷歌,要么百度,要么还有一个最直接的方法,那就是查Linux内核源码中关于mouse0这个文件的read回调函数:

static ssize_t mousedev_read(struct file *file, char __user *buffer,size_t count, loff_t *ppos)
{struct mousedev_client *client = file->private_data;struct mousedev *mousedev = client->mousedev;// mousedev_client结构体里查找到ps2的大小是6个字节。signed char data[sizeof(client->ps2)];int retval = 0;spin_lock_irq(&client->packet_lock);if (!client->buffer && client->ready) {// 这里就是核心了,继续跟过去mousedev_packet(client, client->ps2);client->buffer = client->bufsiz;}...

我们看看 mousedev_packet 是如何组装包的:

static void mousedev_packet(struct mousedev_client *client,signed char *ps2_data)
{struct mousedev_motion *p = &client->packets[client->tail];ps2_data[0] = 0x08 |((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07);ps2_data[1] = mousedev_limit_delta(p->dx, 127);ps2_data[2] = mousedev_limit_delta(p->dy, 127);p->dx -= ps2_data[1];p->dy -= ps2_data[2];
...

非常明白,我不管别的,我也没有动机去学,我现在就是想知道鼠标的X,Y坐标:

  • p->dx,p->dy从名字上和从代码上都可以看出,这是 相对于上一次 的坐标的变化!

所有信息都有了。

那么,现在,可以写代码了:

#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <stdlib.h>// 正方形边长为100个像素点
#define LENGTH  100// 显示器显存的抽象
unsigned int *mem = NULL;
// 保存上一次的屏幕
unsigned int *old_mem = NULL;
// 屏幕信息
static struct fb_var_screeninfo info;
int mouse_fd, fb_fd;// 正方形涂成红色
int start = 0xffff0000;int main(int argc, char **argv)
{signed char mouse_event[6];char rel_x, rel_y;int old_x = 0, old_y = 0;int abs_x = 0, abs_y = 0;mouse_fd = open("/dev/input/mouse0", O_RDONLY);fb_fd = open("/dev/fb0", O_RDWR);ioctl(fb_fd, FBIOGET_VSCREENINFO, &info);mem = (unsigned int *)mmap(NULL, info.xres*info.yres*info.bits_per_pixel/8, PROT_READ|PROT_WRITE, MAP_SHARED, fb_fd, 0);while(read(mouse_fd, &mouse_event[0], 6)) {int i, w, h;static int idx = 0;// 按照内核mousedev_packet的定义,解析出相对位移。rel_x = (char) mouse_event[1];rel_y = (char) mouse_event[2];// 计算绝对位移abs_x += rel_x;abs_y -= rel_y;if (abs_x <= 0 || abs_x >= info.xres - LENGTH || abs_y <= 0 || abs_y >= info.yres - LENGTH) {continue;}if (old_mem == NULL) {old_mem = (unsigned int *)mmap(NULL, info.xres*info.yres*info.bits_per_pixel/8, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);if (old_mem == NULL) {exit(1);}} else {// 恢复上一次正方形区域里的像素for (w = old_x; w < old_x + LENGTH; w++) {for (h = old_y; h < old_y + LENGTH; h++) {idx = h*info.xres + w;mem[idx] = old_mem[idx];}}old_x = abs_x;old_y = abs_y;}// 保存当前的像素,以便下一次恢复for (w = abs_x; w < abs_x + LENGTH; w++) {for (h = abs_y; h < abs_y + LENGTH; h++) {idx = h*info.xres + w;old_mem[idx] = mem[idx];}}// 根据鼠标的位置涂抹红色矩形for (w = abs_x; w < abs_x + LENGTH; w++) {for (h = abs_y; h < abs_y + LENGTH; h++) {idx = h*info.xres + w;mem[idx] = start;}}}return 0;
}

运行它,然后在字符终端移动鼠标,效果如下:

嗯,矩形随着鼠标而移动,并且不会破坏任何所到之处的字符。


现在,我来回顾一下这个周末做的这些事情,意味着什么。

  • 我可以在字符终端上画32位真彩图;
  • 我可以检测到鼠标键盘的事件并且反应。

这意味着,如果有时间和精力,我可以实现一个GUI系统了。

当然,GUI系统和网络协议栈那是隔行如隔山,肯定会遇到超级多的麻烦,不是仅仅读写两个文件:

  • /dev/fb0
  • /dev/input/mouse0

就可以搞定的。

事实上,真正的GUI系统从来不用这种方式。它们貌似在反抗着 UNIX一切皆文件 的理念,并且证明这样会更好!哦,对了,Windows GUI的成功就是一个证明,还有后来最新版本的MacOS…


说什么字符终端,字符也是 画出来的 。没什么大不了的。只不过,想要用像素去设置字符,那就要了解一下 字符点阵 的information了…这又是另一个领域的话题。


浙江温州皮鞋湿,下雨进水不会胖。

Linux字符终端用鼠标移动一个红色矩形相关推荐

  1. linux字符终端浏览器-----Lynx

    Lynx         (一)   Lynx   简介       Lynx   是一个字符界面下的全功能的WWW浏览器.Lynx   可以运行在很多种   操作系统下,如VMS,   UNIX, ...

  2. linux字符终端图片展示

    所用操作系统概述:linux3.2.0内核,64位的Ubuntu12.04虚拟机 关于linux下操作fb0的介绍网上已经有很多资料了,大家可以随便搜索一下就能找到大量的比较详细的原理性的东西的介绍, ...

  3. linux字符终端看视频,在Linux终端上看电影很酷吗?

    时至今日,随处可见高分辨率的视频(youtube上也是如此),只有那些真正的怪人才会去使用ascii文本来在终端上播放电影.不过令人惊讶的是,一些视频用这种方法竟然效果还行! 我发现动画视频的显示效果 ...

  4. lua运行外部程序_LTUI v2.2 发布, 一个基于lua的跨平台字符终端UI界面库

    LTUI是一个基于lua的跨平台字符终端UI界面库. 此框架源于xmake中图形化菜单配置的需求,类似linux kernel的menuconf去配置编译参数,因此基于curses和lua实现了一整套 ...

  5. linux nona怎么用_nano命令_Linux nano 命令用法详解:字符终端文本编辑器

    nano是一个字符终端的文本编辑器,有点像DOS下的editor程序.它比vi/vim要简单得多,比较适合Linux初学者使用.某些Linux发行版的默认编辑器就是nano. nano命令可以打开指定 ...

  6. linux字符设备驱动在哪里设置,从点一个灯开始学写Linux字符设备驱动!

    原标题:从点一个灯开始学写Linux字符设备驱动! [导读] 前一篇文章,介绍了如何将一个hello word模块编译进内核或者编译为动态加载内核模块,本篇来介绍一下如何利用Linux驱动模型来完成一 ...

  7. linux 串口 字符 间隔,嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)...

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include #incl ...

  8. 嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include<st ...

  9. 想在image上画一个粗线,如何在鼠标未按下去的时候让鼠标显示为一个红色半透明的圆形呢?...

    想在image上画一个粗线,如何在鼠标未按下去的时候让鼠标显示为一个红色半透明的圆形呢? Delphi / Windows SDK/API http://www.delphi2007.net/Delp ...

  10. linux cut 最后一个字符,linux - 如何使用'cut'找到最后一个字段

    linux - 如何使用'cut'找到最后一个字段 不使用sed或awk,仅使用cut,如果字段数未知或每行更改,如何获取最后一个字段? noobcoder asked 2019-03-15T12:4 ...

最新文章

  1. ios8 Xcode6 设置Launch Image 启动图片
  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
  3. 【机器学习】集成学习之梯度提升树GBDT
  4. linux安装mq报5724,小白提问:linux安装MQ出现的错误
  5. Cocos2D 添加 UIView
  6. 你羡慕了吗?10万个数字人民币红包派发,每个200元
  7. linux集群中mpi的并行计算环境简单配置,linux集群中MPI的并行计算环境简单配置...
  8. jsp % % ! 区别
  9. 计算机服务里打印功能停止,win7系统电脑打印机print spooler服务总是自动停止的解决方法...
  10. 分享-追书神器旧版本-无广告、可换源看小说
  11. 怎么用计算机算一元三次方程,一元三次方程计算器求解(附使用方法)
  12. 行为主义心理学在游戏领域的10年发展
  13. vue全家桶都包括哪些 vue全家桶都有什么 vue全家桶详细介绍
  14. QUESTION: 由于文件 无法被用户‘_apt‘访问,已脱离沙盒并提权为根用户来进行下载。 - pkgAcquire::Run (13: 权限不够)
  15. 小米笔记本开机提示:no bootable device -- insert boot disk and press any key
  16. 2017百度之星初赛a
  17. Linux c在图片添加时间水印,如何在照片上添加时间水印
  18. 日语词汇辨析:以来と以降と以後
  19. 2021年武汉市中等职业学校学生技能大赛“网络空间安全”赛项技术规程
  20. 曾为面试官的我也有今天,面试百度Android被按地上血虐

热门文章

  1. android ios 逆向工程,iOS逆向工程之砸壳
  2. 飘逸的python - 使用图像匹配SIFT算法进行LOGO检测
  3. 免费图片文字识别,非常好用
  4. C++ 灰度图像伪彩色处理
  5. C#中new一个对象的过程说明
  6. ERP系统功能之生产管理
  7. html5简单在线绘图,html5实现一个简单的在线画板
  8. Scrapy 官方文档中文版
  9. 海思HI3559和海思HI3559A的区别以及Hi3559c开发板
  10. 「Python海龟画图」利用海龟画笔绘制谢尔宾斯基三角形