fcitx与禁用触摸板

1.1 起因

ubuntu自带 打字时禁用触摸板 对fcitx输入法并不起作用, 不带鼠标时很容易误触.

1.2 解决方法

在wiki.archlinux.org找到了相应解决办法:

# -i 2 打字时禁用触摸板2s
# -d 以后台daemon方式执行
syndaemon -i 2 -d

但是总不能每次登陆后,都在shell中敲命令吧,所以需要登陆后自动执行
有一下几种方式可以实现自启动:

  • wiki.archlinux.org介绍的xinitrc
  • ubuntu autostart xsessioin
  • 在/etc/init.d/ 添加守护进程
  • 在~/.bashrc 添加命令自启动
    水平有限,对linux启动部分不了解,采用的是最后一种方法. 自启动的脚本参考用于检测进程的脚本总结,如下
#!/bin/bash
# file: 自启动脚本
_pgrep="/usr/bin/pgrep"
found="true"
$_pgrep syndaemon >/dev/null || { found="false" ;  echo "not found"; }

if [[ "$found" == "false" ]]; then
    /usr/bin/syndaemon -i 2 -d

接下来就简单了,将上脚本保存,并利用chmod改为可执行后, 在~/.bashrc 执行即可.

#假设该脚本为 ~/.config/autostart/mystart.sh
. ~/.config/autostart/mystart.sh

不足之处:
.bashrc不是开机生效的,需要你打开shell才生效

1.3 守护进程(还没成功...找工作中,挖坑待填)

1.3.1 将下面的 syndaemon.cpp 编译成可执行文件复制到/etc/init.d/下面
1.3.2 执行 update-rc.d命令, 可以参数设置可以参考这里和这里

//file syndaemon.cpp
#include   //execl
#include    //open, dup2
#include 
#include   //exit
#include    //perror
int daemonize();
const char syndaemon[]="/usr/bin/syndaemon";
int main(int argc, char* argv[])
{
    /*
     * 由于syndaemon 本身就是一个守护进程所以不需要 
     * 调用daemonize函数了
     * 写着里主要是方便回顾知识
     * */
    //daemonize();
    execl(syndaemon, "-i 2","-d");
    exit(1);
}
int daemonize()
{
    int fd;
    struct sigaction sa;
    switch (fork()) {
    case -1:
        return (-1);
    case 0:
        break;
    default:
        //close parent process;
        //let child process become orphan process;
        _exit(EXIT_SUCCESS);
    }
    //成为 leader of session and of process group
    setsid();
    /*
     * Ensure future opens won't allocate controlling TTYs.
     */
     
    sa.sa_handler = SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGHUP, &sa, NULL) < 0)
        exit(1);
    if (setsid() == -1) 
        return (-1);
    if ((fd = open("/dev/null", O_RDWR)) != -1) {
        close(STDIN_FILENO); //close stdin 0
        //将stdout 重定义到 fd
        if(dup2(fd, STDOUT_FILENO) < 0) {
            perror("dup2 stdout");
            return (-1);
        }
        //将 stderr 重定义到 fd
        //不会记录error log
        if(dup2(fd, STDERR_FILENO) < 0) {
            perror("dup2 stderr");
            return (-1);
        }
    }
    return (0);
}
#!/bin/bash
syndaemon -i 2 -d

你可能感兴趣的:(fcitx与禁用触摸板)