美文网首页我用 Linux
fcitx与禁用触摸板

fcitx与禁用触摸板

作者: 秋水涟漪 | 来源:发表于2016-09-04 11:45 被阅读0次

    1.1 起因

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

    1.2 解决方法

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

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

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

    #!/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 <unistd.h>  //execl
    #include <fcntl.h>   //open, dup2
    #include <signal.h>
    #include <stdlib.h>  //exit
    #include <stdio.h>   //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与禁用触摸板

        本文链接:https://www.haomeiwen.com/subject/gkuxettx.html