Linux内核 触摸板,linux触摸板自然滚动 - Young_Blog

触摸板的自然滚动最早是乔帮主发明的。

所谓自然滚动是指触摸板双指滚动的功能,当用两个手指向上滑动触摸板时,屏幕向上滚动,当双指向下化时,屏幕向下滚动。若是反过来就和鼠标一样了。自然滚动让人觉是得在用爽指控制屏幕而不是在控制触摸板。

开始觉得反人类,谁知道用习惯了才知道那真的很爽!爽到不想再用鼠标了。但是在linux系统里面触摸板还不是自然滚动。

我是synaptics的触摸板,方法一对其他触摸板不见得管用。如果不是synaptics的触摸板貌似也有利用xorg来改的方法,在文章后面再介绍。

###1. synaptics 触摸板

首先要安装synapclient的驱动:xserver-xorg-input-synaptics。

其实在大多数linux系统内都已经默认按装了。

sudo apt-get install xserver-xorg-input-synaptics

然后你可以用两个命令来设置垂直滚动和水平滚动的速度:

synclient VertScrollDelta=-103

synclient HorizScrollDelta=-103

这里把速度设置成负值意思就是让触摸板按照与原来方向的相反方向移动。需要说明的是数值的绝对值越大滚动越慢。

然后我们就达到目的了。为了让这两个命令开机的之后就能自动执行可以

把他们加到home目录里的.bashrc文件里。

或者在/etc/profile.d/里面创建一个脚本,比如我建立的是

/etc/profile.d/synaptics\_natural\_scrolling.sh

#################################################################### File Name:/etc/profile.d/synaptics_natural_scrolling.sh# Author:Landerl Young# e-Mail:LanderlYoung@gmail.com# Created Time:Thu 31 Oct 2013 01:41:46 PM HST####################################################################!/bin/bashsynclient VertScrollDelta=-103synclient HorizScrollDelta=-103

最后别忘了加可执行权限

sudo chmod a+x /etc/profile.d/synaptics_natural_scrolling.sh

大功告成。

2. 其他方法(所有触摸板通用)

xorg有个xinput命令。如果,我是说如果,你没有这个命令的话,我帮你查好了它所在的软件包名——xinput:

young@Y470:~/Documents/octopress$dpkg -S /usr/bin/xinput

xinput: /usr/bin/xinput

输入之后(不加任何参数),有如下输出:

young@Y470:~/Documents/octopress$xinput⎡ Virtual core pointerid=2[master pointer (3)]⎜ ↳ Virtual core XTEST pointerid=4[slave pointer (2)]⎜ ↳ SynPS/2 Synaptics TouchPadid=14[slave pointer (2)]⎣ Virtual core keyboardid=3[master keyboard (2)]↳ Virtual core XTEST keyboardid=5[slave keyboard (3)]↳ Power Buttonid=6[slave keyboard (3)]↳ Video Busid=7[slave keyboard (3)]↳ Power Buttonid=8[slave keyboard (3)]↳ Sleep Buttonid=9[slave keyboard (3)]↳ Video Busid=10[slave keyboard (3)]↳ Lenovo EasyCameraid=12[slave keyboard (3)]↳ AT Translated Set 2 keyboardid=13[slave keyboard (3)]↳ Ideapad extra buttonsid=15[slave keyboard (3)]↳ ACPI Virtual Keyboard Deviceid=16[slave keyboard (3)]

这里面就是各个输入设备了,看名字就猜得出来。可以使用xinput --get-button-map 显示按键映射,显示如下:

young@Y470:~/Documents/octopress$xinput --get-button-map "SynPS/2 Synaptics TouchPad"

1 2 3 4 5 6 7 8 9 10 11 12

于是下面要做的事就很明显了——改按键映射!既然有个--get-button-map参数肯定也有--set-button-map,没错,看了man手册发现真的有。经过测试各个按键的功能发现如下:

4、5、6、7四个值是控制触摸板滚动方向的,修改如下:

young@Y470:~/Documents/octopress$xinput --set-button-map "SynPS/2 Synaptics TouchPad" 1 2 3 5 4 7 6 8 9 10 11 12

为了使命令开机自动执行,可以使用方法一中介绍的两个方法。

当然方法二放在后面说是因为他有缺点——在一些少数程序比如文件管理器nautilus里面自然滚动失效的T\^T。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个Linux内核下UART触摸屏驱动的代码示例: ``` #include <linux/module.h> #include <linux/kernel.h> #include <linux/input.h> #include <linux/serio.h> #define TOUCHSCREEN_NAME "MyTouchscreen" #define TOUCHSCREEN_PHYS "mytouchscreen/input0" static struct serio *serio; static int mytouchscreen_connect(struct serio *serio, struct serio_driver *drv) { int err; printk(KERN_INFO "MyTouchscreen: Connecting to serio...\n"); // 初始化触摸屏 err = serio_open(serio, drv); if (err) { printk(KERN_ERR "MyTouchscreen: Failed to open serio: %d\n", err); return err; } // 注册输入设备 err = input_register_device(input_dev); if (err) { printk(KERN_ERR "MyTouchscreen: Failed to register input device: %d\n", err); serio_close(serio); return err; } printk(KERN_INFO "MyTouchscreen: Touchscreen successfully connected\n"); return 0; } static void mytouchscreen_disconnect(struct serio *serio) { printk(KERN_INFO "MyTouchscreen: Disconnecting from serio...\n"); // 取消注册输入设备 input_unregister_device(input_dev); // 关闭触摸屏 serio_close(serio); printk(KERN_INFO "MyTouchscreen: Touchscreen successfully disconnected\n"); } static const struct serio_device_id mytouchscreen_serio_ids[] = { { .type = SERIO_RS232, .proto = SERIO_PROTO_TOUCHSCREEN, .id = SERIO_ANY_ID, .extra = SERIO_ANY_EXTRA, }, { } }; MODULE_DEVICE_TABLE(serio, mytouchscreen_serio_ids); static struct serio_driver mytouchscreen_drv = { .driver = { .name = TOUCHSCREEN_NAME, .owner = THIS_MODULE, }, .description = "My Touchscreen Driver", .id_table = mytouchscreen_serio_ids, .connect = mytouchscreen_connect, .disconnect = mytouchscreen_disconnect, }; static int __init mytouchscreen_init(void) { int err; // 分配输入设备结构体 input_dev = input_allocate_device(); if (!input_dev) { printk(KERN_ERR "MyTouchscreen: Failed to allocate input device\n"); return -ENOMEM; } // 设置输入设备的属性 input_dev->name = TOUCHSCREEN_NAME; input_dev->phys = TOUCHSCREEN_PHYS; // 设置输入事件 input_set_capability(input_dev, EV_KEY, BTN_TOUCH); input_set_abs_params(input_dev, ABS_X, 0, 1023, 0, 0); input_set_abs_params(input_dev, ABS_Y, 0, 767, 0, 0); // 注册serio驱动 err = serio_register_driver(&mytouchscreen_drv); if (err) { printk(KERN_ERR "MyTouchscreen: Failed to register serio driver: %d\n", err); input_free_device(input_dev); return err; } printk(KERN_INFO "MyTouchscreen: Driver successfully loaded\n"); return 0; } static void __exit mytouchscreen_exit(void) { serio_unregister_driver(&mytouchscreen_drv); input_free_device(input_dev); printk(KERN_INFO "MyTouchscreen: Driver successfully unloaded\n"); } module_init(mytouchscreen_init); module_exit(mytouchscreen_exit); MODULE_AUTHOR("Your Name Here"); MODULE_DESCRIPTION("My Touchscreen Driver"); MODULE_LICENSE("GPL"); ``` 这个驱动使用了Serio子系统来与UART接口通信,并将触摸屏识别为一个输入设备。在触摸屏被连接时,将初始化输入设备并注册到输入子系统;当触摸屏被断开时,将取消注册输入设备并关闭Serio接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值