[Ubuntu-zh] C/C++ 请教控制鼠标的库/头文件等

Guannan Ma mythmgn在gmail.com
星期六 五月 7 03:57:22 UTC 2011


有时间的时候录个视频出来跟大家share一下.
挺有趣的.


2011/5/6 Guannan Ma <mythmgn在gmail.com>:
> :-).
>
> 我是通过手机putty wifi连接到自己笔记本实现的.
> 代码如下 今天晚上写出来个大概  测试了一下  可以使用  嘿嘿
>
>
> #include <stdio.h>
> #include <termios.h>
> #include <stdlib.h>
> #include <sys/time.h>
> #include <sys/types.h>
> #include <string.h>
> #include <unistd.h>
>
> #include <xdo.h>
>
>
> #define POS_PLUS 5
> #define D_POS_PLUS 50
>
> /** !@description
>    Nokia Symbian S60 V3
>
>    Arrow key UP  ---->  27 91 65
>    Arrow key LEFT ----> 27 91 68
>              Down ---->  27 91 66
>                          Right --->  27 91 67
>
>    Confirm key----> 10 (simulate pressing enter)
>
>  *
>  *
>  *
>  *
>  *
>  */
>
> int setTTY() {
>
>    int ttyDevice = STDOUT_FILENO;
>
>    printf("%s\n","Noncanonical terminal mode is enabled");
>    /* [-]icanon
>              enable erase, kill, werase, and rprnt special characters*/
>    /*min N  with -icanon, set N characters minimum for a completed read */
>    system("stty   -icanon");
>
>    printf(">");
>    /* Make sure file descriptor is for a TTY device.   */
>    if ( ! isatty(ttyDevice) ) {
>        printf("Not a TTY device.n");
>        return(EXIT_FAILURE);
>    }
>    /* Flush both the input and output queues.          */
>    else {
>        if (tcflush(ttyDevice, TCIOFLUSH) == 0)
>            ;
>        //printf("The input and output queues have been flushed\n");
>        else
>            perror("tcflush error");
>    }
> }
> int nonCanonical(int sign) {
>    struct termios ttystate;
>    //get the terminal state
>    tcgetattr(STDIN_FILENO, &ttystate);
>    if (sign==1) {
>        /*turn off canonical mode*/
>        ttystate.c_lflag &= ~ICANON; /* To diable canonical input*/
>        ttystate.c_lflag &= ~ECHO;  // To disable user see what he types
>        /*ttystate.c_lflag &= ~ISIG;  To disable Control signals using
> control Keys
>        minimum of number input read.*/
>        ttystate.c_cc[VMIN] = 1;
>    } else {
>        /*turn on canonical mode*/
>        ttystate.c_lflag |= ICANON; /*To enable Canonical mode*/
>        ttystate.c_lflag |= ECHO;  /*To enable user see what he pressed*/
>
>    }
>    /*set the terminal attributes.*/
>    tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
>    return 1;
> }
>
> int handlerKeyPress(char *display) {
>    static fd_set rfds;
>    struct timeval tv;
>    char a,b,c;
>    char str[20];
>
>    xdo_t *p_xt=xdo_new(display);
>    while (1==1) {
>        // Set up stdin buffer probe
>        FD_ZERO(&rfds);
>        FD_SET(0, &rfds);
>
>        tv.tv_sec = 0;
>        tv.tv_usec = 0;
>        if (!select(1, &rfds, NULL, NULL, &tv)) {
>            // No input available
>            //skips++;
>        } else {
>            // Input available immediately
>            a = getchar();
>            //printf("%d\n",c);
>
>            switch(a) {
>                /**<  */
>            case 27:
>                b=getchar();
>                c=getchar();
>                switch(c) {
>                    /**< Arrow Up */
>                case 65:
>                    xdo_mousemove_relative(p_xt,0,-POS_PLUS);
>                    break;
>                    /**< Arrow Down */
>                case 66:
>                    xdo_mousemove_relative(p_xt,0,POS_PLUS);
>                    break;
>                    /**< Arrow Right */
>                case 67:
>                    xdo_mousemove_relative(p_xt,POS_PLUS,0);
>                    break;
>                    /**< Arrow Left */
>                case 68:
>                    xdo_mousemove_relative(p_xt,-POS_PLUS,0);
>                    break;
>                };
>                break;
>
>                        /**< left click */
>            case 'q':
>                xdo_click(p_xt,CURRENTWINDOW,1);
>                break;
>            case 'p':
>                        /**< right click */
>                xdo_click(p_xt,CURRENTWINDOW,3);
>                break;
>
>
>                        /**< mouse left button down  */
>            case 'w':
>                xdo_mousedown(p_xt,CURRENTWINDOW,1);
>                break;
>
>                        /**< mouse left button up */
>            case 'e':
>                xdo_mouseup(p_xt,CURRENTWINDOW,1);
>                break;
>
>                        /**< for longer distance mouse move */
>            case 'y':
>                xdo_mousemove_relative(p_xt,0,-D_POS_PLUS);
>                break;
>            case 'n':
>                xdo_mousemove_relative(p_xt,0,D_POS_PLUS);
>                break;
>            case 'g':
>                xdo_mousemove_relative(p_xt,-D_POS_PLUS,0);
>                break;
>            case 'j':
>                xdo_mousemove_relative(p_xt,D_POS_PLUS,0);
>                break;
>
>                        /**< Delete key */
>                        case 127:
>                                xdo_keysequence(p_xt,CURRENTWINDOW,"BackSpace",12000);
>                                break;
>
>                        /**< copy paste and cancel  */
>                        case 'c':
>                                xdo_keysequence(p_xt,CURRENTWINDOW,"Control_L+c",12000);
>                                break;
>                        case 'v':
>                                xdo_keysequence(p_xt,CURRENTWINDOW,"Control_L+v",12000);
>                                break;
>                        case 'z':
>                                xdo_keysequence(p_xt,CURRENTWINDOW,"Control_L+z",12000);
>            }
>        }
>    }
>
>    xdo_free(p_xt);
> }
>
> int main(int argc, char **argv) {
>
>    if(argc<=1) {
>        printf("rmctool needs a DISPLAY argument\n");
>    }
>    setTTY();
>    nonCanonical(1);
>    handlerKeyPress(argv[1]);
>    return EXIT_SUCCESS;
> }
>
>
> 2011/5/6 RLP <rhyslpratt在yahoo.com.cn>:
>> On 2011-05-06 Guannan Ma <mythmgn在gmail.com> wrote:
>>
>>>蓝牙方向键?
>>>
>>>不明白....
>>>能给出个程序名称么 或者驱动名称
>>>
>>>我的手机是nokia e5-00
>>>就是symbian s60 v3
>>>
>>>我没有蓝牙方向键相关的程序控制
>>>我的笔记本和手机倒是都支持蓝牙.
>>>
>>>
>>
>> 嘿嘿, 蓝牙, (手机)方向键, 是我的错误, 中间没有断字. 我是老手机, 爱立信自带的软件, 不知道s60上有没有类似的软件.
>> 再说了, 这只是手机这一端的, 笔记本那里就是普通的ubuntu默认的什么东西, 我是通过那个蓝牙applet控制的, 也没有什么特别的对话框, set up new device就搞定了.
>>
>> --
>> ubuntu-zh mailing list
>> ubuntu-zh在lists.ubuntu.com
>> https://lists.ubuntu.com/mailman/listinfo/ubuntu-zh
>>
>


关于邮件列表 ubuntu-zh 的更多信息