精华内容
下载资源
问答
  • Mouse

    2017-07-15 02:41:58
    A greedy mouse cici ate rat poison by mistake. To save herself, she have to drink. Cici can only walk in four ways that marked in the photoes followed and only move in the region that colored blue...
  • Mouse

    2009-10-20 01:31:00
    Mouse.CursorPos.X Mouse.CursorPos.Y

    Mouse.CursorPos.X  
    Mouse.CursorPos.Y

    展开全文
  • mouse

    2009-08-13 22:00:00
     * 在填充 urb 时将 context 指针指向 mouse 结构体数据区,在这又创建一个局部 mouse 指针指向在 probe    * 函数中为 mouse 申请的那块内存,那块内存保存着非常重要数据。    ...

    转自:

    http://blog.csdn.net/Breathomn/archive/2009/01/08/3736902.aspx

     

     

    USB 总线引出两个重要的链表!
    一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)。

    USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)的区别是什么?
    USB 设备驱动程序包含 USB 设备的一些通用特性,将与所有 USB 设备相匹配。在 USB core 定义了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的集合。

    设备是如何添加到设备链表上去的?
    在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。

    USB 设备驱动程序(usb device driver)是如何添加到驱动链表上去的?
    在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。

    接口是如何添加到设备链表上去的?
    在 USB 设备驱动程序和 USB 设备的匹配之后,USB core 会对设备进行配置,分析设备的结构之后会将设备所有接口都添加到设备链表上去。比如鼠标设备中有一个接口,USB core 对鼠标设备配置后,会将这个接口添加到设备链表上去。

    USB 驱动程序(usb driver)是如何添加到驱动链表上去的?
    在每个 USB 驱动程序的被注册时,USB 驱动程序即会添加到驱动链表上去。比如鼠标驱动程序,usb_mouse_init 函数将通过 usb_register(&usb_mouse_driver) 将鼠标驱动程序注册到 USB core 中,然后就添加到驱动链表中去了。其中 usb_mouse_driver 是描述鼠标驱动程序的结构体。

    已配置状态(configured status)之后话
    当鼠标的设备、接口都添加到设备链表,并且鼠 标驱动程序也添加到驱动链表上去了,系统就进入一种叫做已配置(configured)的状态。要达到已配置状态,将经历复杂的过程,USB core 为 USB 设备奉献着无怨无悔。在这个过程中,系统将会建立起该设备的的设备、配置、接口、设置、端点的描述信息,它们分别被 usb_device、usb_configuration、usb_interface、usb_host_interface、 usb_host_endpoint 结构体描述。
    设备达到已配置状态后,首先当然就要进行 USB 驱动程序和相应接口的配对,对于鼠标设备来说则是鼠标驱动程序和鼠标中的接口的配对。USB core 会调用 usb_device_match 函数,通过比较设备中的接口信息和 USB 驱动程序中的 id_table,来初步决定该 USB 驱动程序是不是跟相应接口相匹配。通过这一道关卡后,USB core 会认为这个设备应该由这个驱动程序负责。
    然而,仅仅这一步是不够的,接着,将会调用 USB 驱动程序中的 probe 函数对相应接口进行进一步检查。如果该驱动程序确实适合设备接口,对设备做一些初始化工作,分配 urb 准备数据传输。
    当 鼠标设备在用户空间打开时,将提交 probe 函数构建的 urb 请求块,urb 将开始为传送数据而忙碌了。urb 请求块就像一个装东西的“袋子”,USB 驱动程序把“空袋子”提交给 USB core,然后再交给主控制器,主控制器把数据放入这个“袋子”后再将装满数据的“袋子”通过 USB core 交还给 USB 驱动程序,这样一次数据传输就完成了。

    以下是完全注释后的鼠标驱动程序代码 usbmouse.c

    1. /*  
    2.  * $Id: usbmouse.c,v 1.15 2001/12/27 10:37:41 vojtech Exp $  
    3.  *  
    4.  *  Copyright (c) 1999-2001 Vojtech Pavlik  
    5.  *  
    6.  *  USB HIDBP Mouse support  
    7.  */   
    8.   
    9. #include <linux/kernel.h>    
    10. #include <linux/slab.h>    
    11. #include <linux/module.h>    
    12. #include <linux/init.h>    
    13. #include <linux/usb/input.h>    
    14. #include <linux/hid.h>    
    15.   
    16. /*  
    17.  * Version Information  
    18.  */   
    19. #define DRIVER_VERSION "v1.6"    
    20. #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"    
    21. #define DRIVER_DESC "USB HID Boot Protocol mouse driver"    
    22. #define DRIVER_LICENSE "GPL"    
    23.   
    24. MODULE_AUTHOR(DRIVER_AUTHOR);  
    25. MODULE_DESCRIPTION(DRIVER_DESC);  
    26. MODULE_LICENSE(DRIVER_LICENSE);  
    27.   
    28. /*  
    29.  * 鼠标结构体,用于描述鼠标设备。  
    30.  */   
    31. struct  usb_mouse   
    32. {  
    33.     /* 鼠标设备的名称,包括生产厂商、产品类别、产品等信息 */   
    34.     char  name[128];   
    35.     /* 设备节点名称 */   
    36.     char  phys[64];    
    37.     /* USB 鼠标是一种 USB 设备,需要内嵌一个 USB 设备结构体来描述其 USB 属性 */   
    38.     struct  usb_device *usbdev;  
    39.     /* USB 鼠标同时又是一种输入设备,需要内嵌一个输入设备结构体来描述其输入设备的属性 */   
    40.     struct  input_dev *dev;    
    41.     /* URB 请求包结构体,用于传送数据 */   
    42.     struct  urb *irq;  
    43.     /* 普通传输用的地址 */   
    44.     signed   char  *data;  
    45.     /* dma 传输用的地址 */   
    46.     dma_addr_t data_dma;          
    47. };  
    48.   
    49. /*  
    50.  * urb 回调函数,在完成提交 urb 后,urb 回调函数将被调用。  
    51.  * 此函数作为 usb_fill_int_urb 函数的形参,为构建的 urb 制定的回调函数。  
    52.  */   
    53. static   void  usb_mouse_irq( struct  urb *urb)  
    54. {  
    55.     /*  
    56.      * urb 中的 context 指针用于为 USB 驱动程序保存一些数据。比如在这个回调函数的形参没有传递在 probe  
    57.      * 中为 mouse 结构体分配的那块内存的地址指针,而又需要用到那块内存区域中的数据,context 指针则帮了  
    58.      * 大忙了!  
    59.      * 在填充 urb 时将 context 指针指向 mouse 结构体数据区,在这又创建一个局部 mouse 指针指向在 probe  
    60.      * 函数中为 mouse 申请的那块内存,那块内存保存着非常重要数据。  
    61.      * 当 urb 通过 USB core 提交给 hc 之后,如果结果正常,mouse->data 指向的内存区域将保存着鼠标的按键  
    62.      * 和移动坐标信息,系统则依靠这些信息对鼠标的行为作出反应。   
    63.      * mouse 中内嵌的 dev 指针,指向 input_dev 所属于的内存区域。  
    64.      */   
    65.     struct  usb_mouse *mouse = urb->context;  
    66.     signed   char  *data = mouse->data;  
    67.     struct  input_dev *dev = mouse->dev;  
    68.     int  status;  
    69.   
    70.     /*  
    71.      * status 值为 0 表示 urb 成功返回,直接跳出循环把鼠标事件报告给输入子系统。  
    72.      * ECONNRESET 出错信息表示 urb 被 usb_unlink_urb 函数给 unlink 了,ENOENT 出错信息表示 urb 被   
    73.      * usb_kill_urb 函数给 kill 了。usb_kill_urb 表示彻底结束 urb 的生命周期,而 usb_unlink_urb 则  
    74.      * 是停止 urb,这个函数不等 urb 完全终止就会返回给回调函数。这在运行中断处理程序时或者等待某自旋锁  
    75.      * 时非常有用,在这两种情况下是不能睡眠的,而等待一个 urb 完全停止很可能会出现睡眠的情况。  
    76.      * ESHUTDOWN 这种错误表示 USB 主控制器驱动程序发生了严重的错误,或者提交完 urb 的一瞬间设备被拔出。  
    77.      * 遇见除了以上三种错误以外的错误,将申请重传 urb。  
    78.      */   
    79.     switch  (urb->status)  
    80.     {  
    81.     case  0:      /* success */   
    82.         break ;  
    83.     case  -ECONNRESET:    /* unlink */   
    84.     case  -ENOENT:  
    85.     case  -ESHUTDOWN:  
    86.         return ;  
    87.     /* -EPIPE:  should clear the halt */   
    88.     default :         /* error */   
    89.         goto  resubmit;  
    90.     }  
    91.   
    92.     /*  
    93.      * 向输入子系统汇报鼠标事件情况,以便作出反应。  
    94.      * data 数组的第0个字节:bit 0、1、2、3、4分别代表左、右、中、SIDE、EXTRA键的按下情况;  
    95.      * data 数组的第1个字节:表示鼠标的水平位移;  
    96.      * data 数组的第2个字节:表示鼠标的垂直位移;  
    97.      * data 数组的第3个字节:REL_WHEEL位移。  
    98.      */   
    99.     input_report_key(dev, BTN_LEFT,   data[0] & 0x01);  
    100.     input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);  
    101.     input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);  
    102.     input_report_key(dev, BTN_SIDE,   data[0] & 0x08);  
    103.     input_report_key(dev, BTN_EXTRA,  data[0] & 0x10);  
    104.     input_report_rel(dev, REL_X,     data[1]);  
    105.     input_report_rel(dev, REL_Y,     data[2]);  
    106.     input_report_rel(dev, REL_WHEEL, data[3]);  
    107.   
    108.     /*  
    109.      * 这里是用于事件同步。上面几行是一次完整的鼠标事件,包括按键信息、绝对坐标信息和滚轮信息,输入子  
    110.      * 系统正是通过这个同步信号来在多个完整事件报告中区分每一次完整事件报告。示意如下:  
    111.      * 按键信息 坐标位移信息 滚轮信息 EV_SYC | 按键信息 坐标位移信息 滚轮信息 EV_SYC ...  
    112.      */   
    113.     input_sync(dev);  
    114.   
    115.     /*  
    116.      * 系统需要周期性不断地获取鼠标的事件信息,因此在 urb 回调函数的末尾再次提交 urb 请求块,这样又会  
    117.      * 调用新的回调函数,周而复始。  
    118.      * 在回调函数中提交 urb 一定只能是 GFP_ATOMIC 优先级的,因为 urb 回调函数运行于中断上下文中,在提  
    119.      * 交 urb 过程中可能会需要申请内存、保持信号量,这些操作或许会导致 USB core 睡眠,一切导致睡眠的行  
    120.      * 为都是不允许的。  
    121.      */   
    122. resubmit:  
    123.     status = usb_submit_urb (urb, GFP_ATOMIC);  
    124.     if  (status)  
    125.         err ("can't resubmit intr, %s-%s/input0, status %d" ,  
    126.                 mouse->usbdev->bus->bus_name,  
    127.                 mouse->usbdev->devpath, status);  
    128. }  
    129.   
    130. /*  
    131.  * 打开鼠标设备时,开始提交在 probe 函数中构建的 urb,进入 urb 周期。  
    132.  */   
    133. static   int  usb_mouse_open( struct  input_dev *dev)  
    134. {  
    135.     struct  usb_mouse *mouse = dev-> private ;  
    136.   
    137.     mouse->irq->dev = mouse->usbdev;  
    138.     if  (usb_submit_urb(mouse->irq, GFP_KERNEL))  
    139.         return  -EIO;  
    140.   
    141.     return  0;  
    142. }  
    143.   
    144. /*  
    145.  * 关闭鼠标设备时,结束 urb 生命周期。  
    146.  */   
    147. static   void  usb_mouse_close( struct  input_dev *dev)  
    148. {  
    149.     struct  usb_mouse *mouse = dev-> private ;  
    150.   
    151.     usb_kill_urb(mouse->irq);  
    152. }  
    153.   
    154. /*  
    155.  * 驱动程序的探测函数  
    156.  */   
    157. static   int  usb_mouse_probe( struct  usb_interface *intf,  const   struct  usb_device_id *id)  
    158. {  
    159.     /*   
    160.      * 接口结构体包含于设备结构体中,interface_to_usbdev 是通过接口结构体获得它的设备结构体。  
    161.      * usb_host_interface 是用于描述接口设置的结构体,内嵌在接口结构体 usb_interface 中。  
    162.      * usb_endpoint_descriptor 是端点描述符结构体,内嵌在端点结构体 usb_host_endpoint 中,而端点  
    163.      * 结构体内嵌在接口设置结构体中。  
    164.      */   
    165.     struct  usb_device *dev = interface_to_usbdev(intf);  
    166.     struct  usb_host_interface *interface;  
    167.     struct  usb_endpoint_descriptor *endpoint;  
    168.     struct  usb_mouse *mouse;  
    169.     struct  input_dev *input_dev;  
    170.     int  pipe, maxp;  
    171.   
    172.     interface = intf->cur_altsetting;  
    173.   
    174.     /* 鼠标仅有一个 interrupt 类型的 in 端点,不满足此要求的设备均报错 */   
    175.     if  (interface->desc.bNumEndpoints != 1)  
    176.         return  -ENODEV;  
    177.   
    178.     endpoint = &interface->endpoint[0].desc;  
    179.     if  (!usb_endpoint_is_int_in(endpoint))  
    180.         return  -ENODEV;  
    181.   
    182.     /*  
    183.      * 返回对应端点能够传输的最大的数据包,鼠标的返回的最大数据包为4个字节,数据包具体内容在 urb  
    184.      * 回调函数中有详细说明。  
    185.      */   
    186.     pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);  
    187.     maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));  
    188.   
    189.     /* 为 mouse 设备结构体分配内存 */   
    190.     mouse = kzalloc(sizeof ( struct  usb_mouse), GFP_KERNEL);  
    191.     /* input_dev */   
    192.     input_dev = input_allocate_device();  
    193.     if  (!mouse || !input_dev)  
    194.         goto  fail1;  
    195.   
    196.     /*  
    197.      * 申请内存空间用于数据传输,data 为指向该空间的地址,data_dma 则是这块内存空间的 dma 映射,  
    198.      * 即这块内存空间对应的 dma 地址。在使用 dma 传输的情况下,则使用 data_dma 指向的 dma 区域,  
    199.      * 否则使用 data 指向的普通内存区域进行传输。  
    200.      * GFP_ATOMIC 表示不等待,GFP_KERNEL 是普通的优先级,可以睡眠等待,由于鼠标使用中断传输方式,  
    201.      * 不允许睡眠状态,data 又是周期性获取鼠标事件的存储区,因此使用 GFP_ATOMIC 优先级,如果不能  
    202.      * 分配到内存则立即返回 0。  
    203.      */   
    204.     mouse->data = usb_buffer_alloc(dev, 8, GFP_ATOMIC, &mouse->data_dma);  
    205.     if  (!mouse->data)  
    206.         goto  fail1;  
    207.   
    208.     /*  
    209.      * 为 urb 结构体申请内存空间,第一个参数表示等时传输时需要传送包的数量,其它传输方式则为0。  
    210.      * 申请的内存将通过下面即将见到的 usb_fill_int_urb 函数进行填充。   
    211.      */   
    212.     mouse->irq = usb_alloc_urb(0, GFP_KERNEL);  
    213.     if  (!mouse->irq)  
    214.         goto  fail2;  
    215.   
    216.     /* 填充 usb 设备结构体和输入设备结构体 */   
    217.     mouse->usbdev = dev;  
    218.     mouse->dev = input_dev;  
    219.   
    220.     /* 获取鼠标设备的名称 */   
    221.     if  (dev->manufacturer)  
    222.         strlcpy(mouse->name, dev->manufacturer, sizeof (mouse->name));  
    223.   
    224.     if  (dev->product)   
    225.     {  
    226.         if  (dev->manufacturer)  
    227.             strlcat(mouse->name, " " sizeof (mouse->name));  
    228.         strlcat(mouse->name, dev->product, sizeof (mouse->name));  
    229.     }  
    230.   
    231.     if  (!strlen(mouse->name))  
    232.         snprintf(mouse->name, sizeof (mouse->name),  
    233.              "USB HIDBP Mouse %04x:%04x" ,  
    234.              le16_to_cpu(dev->descriptor.idVendor),  
    235.              le16_to_cpu(dev->descriptor.idProduct));  
    236.   
    237.     /*  
    238.      * 填充鼠标设备结构体中的节点名。usb_make_path 用来获取 USB 设备在 Sysfs 中的路径,格式  
    239.      * 为:usb-usb 总线号-路径名。  
    240.      */   
    241.     usb_make_path(dev, mouse->phys, sizeof (mouse->phys));  
    242.     strlcat(mouse->phys, "/input0" sizeof (mouse->phys));  
    243.   
    244.     /* 将鼠标设备的名称赋给鼠标设备内嵌的输入子系统结构体 */   
    245.     input_dev->name = mouse->name;  
    246.     /* 将鼠标设备的设备节点名赋给鼠标设备内嵌的输入子系统结构体 */   
    247.     input_dev->phys = mouse->phys;  
    248.     /*  
    249.      * input_dev 中的 input_id 结构体,用来存储厂商、设备类型和设备的编号,这个函数是将设备描述符  
    250.      * 中的编号赋给内嵌的输入子系统结构体  
    251.      */   
    252.     usb_to_input_id(dev, &input_dev->id);  
    253.     /* cdev 是设备所属类别(class device) */   
    254.     input_dev->cdev.dev = &intf->dev;  
    255.   
    256.     /* evbit 用来描述事件,EV_KEY 是按键事件,EV_REL 是相对坐标事件 */   
    257.     input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);  
    258.     /* keybit 表示键值,包括左键、右键和中键 */   
    259.     input_dev->keybit[LONG (BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);  
    260.     /* relbit 用于表示相对坐标值 */   
    261.     input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);  
    262.     /* 有的鼠标还有其它按键 */   
    263.     input_dev->keybit[LONG (BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);  
    264.     /* 中键滚轮的滚动值 */   
    265.     input_dev->relbit[0] |= BIT(REL_WHEEL);  
    266.   
    267.     /* input_dev 的 private 数据项用于表示当前输入设备的种类,这里将鼠标结构体对象赋给它 */   
    268.     input_dev->private  = mouse;  
    269.     /* 填充输入设备打开函数指针 */   
    270.     input_dev->open = usb_mouse_open;  
    271.     /* 填充输入设备关闭函数指针 */   
    272.     input_dev->close = usb_mouse_close;  
    273.   
    274.     /*  
    275.      * 填充构建 urb,将刚才填充好的 mouse 结构体的数据填充进 urb 结构体中,在 open 中递交 urb。  
    276.      * 当 urb 包含一个即将传输的 DMA 缓冲区时应该设置 URB_NO_TRANSFER_DMA_MAP。USB核心使用  
    277.      * transfer_dma变量所指向的缓冲区,而不是transfer_buffer变量所指向的。  
    278.      * URB_NO_SETUP_DMA_MAP 用于 Setup 包,URB_NO_TRANSFER_DMA_MAP 用于所有 Data 包。  
    279.      */   
    280.     usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data,  
    281.              (maxp > 8 ? 8 : maxp),  
    282.              usb_mouse_irq, mouse, endpoint->bInterval);  
    283.     mouse->irq->transfer_dma = mouse->data_dma;  
    284.     mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;  
    285.   
    286.     /* 向系统注册输入设备 */   
    287.     input_register_device(mouse->dev);  
    288.   
    289.     /*  
    290.      * 一般在 probe 函数中,都需要将设备相关信息保存在一个 usb_interface 结构体中,以便以后通过  
    291.      * usb_get_intfdata 获取使用。这里鼠标设备结构体信息将保存在 intf 接口结构体内嵌的设备结构体中  
    292.      * 的 driver_data 数据成员中,即 intf->dev->dirver_data = mouse。  
    293.      */   
    294.     usb_set_intfdata(intf, mouse);  
    295.     return  0;  
    296.   
    297. fail2:  usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);  
    298. fail1:  input_free_device(input_dev);  
    299.     kfree(mouse);  
    300.     return  -ENOMEM;  
    301. }  
    302.   
    303. /*  
    304.  * 鼠标设备拔出时的处理函数  
    305.  */   
    306. static   void  usb_mouse_disconnect( struct  usb_interface *intf)  
    307. {  
    308.     /* 获取鼠标设备结构体 */   
    309.     struct  usb_mouse *mouse = usb_get_intfdata (intf);  
    310.   
    311.     /* intf->dev->dirver_data = NULL,将接口结构体中的鼠标设备指针置空。*/   
    312.     usb_set_intfdata(intf, NULL);  
    313.     if  (mouse)  
    314.     {  
    315.         /* 结束 urb 生命周期 */   
    316.         usb_kill_urb(mouse->irq);  
    317.         /* 将鼠标设备从输入子系统中注销 */   
    318.         input_unregister_device(mouse->dev);  
    319.         /* 释放 urb 存储空间 */   
    320.         usb_free_urb(mouse->irq);  
    321.         /* 释放存放鼠标事件的 data 存储空间 */   
    322.         usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);  
    323.         /* 释放存放鼠标结构体的存储空间 */   
    324.         kfree(mouse);  
    325.     }  
    326. }  
    327.   
    328. /*  
    329.  * usb_device_id 结构体用于表示该驱动程序所支持的设备,USB_INTERFACE_INFO 可以用来匹配特定类型的接口,  
    330.  * 这个宏的参数意思为 (类别, 子类别, 协议)。  
    331.  * USB_INTERFACE_CLASS_HID 表示是一种 HID (Human Interface Device),即人机交互设备类别;  
    332.  * USB_INTERFACE_SUBCLASS_BOOT 是子类别,表示是一种 boot 阶段使用的 HID;  
    333.  * USB_INTERFACE_PROTOCOL_MOUSE 表示是鼠标设备,遵循鼠标的协议。  
    334.  */   
    335. static   struct  usb_device_id usb_mouse_id_table [] = {  
    336.     { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,  
    337.         USB_INTERFACE_PROTOCOL_MOUSE) },  
    338.     { } /* Terminating entry */   
    339. };  
    340.   
    341. /*  
    342.  * 这个宏用来让运行在用户空间的程序知道这个驱动程序能够支持的设备,对于 USB 驱动程序来说,第一个参数必须  
    343.  * 是 usb。  
    344.  */   
    345. MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);  
    346.   
    347. /*  
    348.  * 鼠标驱动程序结构体  
    349.  */   
    350. static   struct  usb_driver usb_mouse_driver = {  
    351.     .name       = "usbmouse" ,  
    352.     .probe      = usb_mouse_probe,  
    353.     .disconnect = usb_mouse_disconnect,  
    354.     .id_table   = usb_mouse_id_table,  
    355. };  
    356.   
    357. /*  
    358.  * 驱动程序生命周期的开始点,向 USB core 注册这个鼠标驱动程序。  
    359.  */   
    360. static   int  __init usb_mouse_init( void )  
    361. {  
    362.     int  retval = usb_register(&usb_mouse_driver);  
    363.     if  (retval == 0)  
    364.         info(DRIVER_VERSION ":"  DRIVER_DESC);  
    365.     return  retval;  
    366. }  
    367.   
    368. /*  
    369.  * 驱动程序生命周期的结束点,向 USB core 注销这个鼠标驱动程序。  
    370.  */   
    371. static   void  __exit usb_mouse_exit( void )  
    372. {  
    373.     usb_deregister(&usb_mouse_driver);  
    374. }  
    375.   
    376. module_init(usb_mouse_init);  
    377. module_exit(usb_mouse_exit); 
    展开全文
  • Mouse event

    2020-12-09 05:39:38
    <p>I was not able to find a model that works properly and illustrates the mouse_enter and mouse_exit <h3>System and version <p>GAMA 1.8 RC </p><p>该提问来源于开源项目:gama-platform/gama</p></...
  • mouseover ,mouseout ,mouseenter,mouseleave,都是鼠标点击而触发的事件,各自代表什么意思,有哪些区别呢?下面跟着脚本之家小编一起看看吧
  • Then the mouse-down is issued, but a mouse-up does not occur. <p>If in this position I issue: <pre><code> autopy.mouse.toggle(autopy.mouse.Button.LEFT, False) </code></pre> <p>The mouse up is given....
  • onmouse事件与mouse事件

    2018-04-08 17:41:00
    2.mouse事件:鼠标移动时:1>会有冒泡的:mouseover ,mouseout  2>没有事件冒泡的: mouseenter ,mouseleave  鼠标按下:click(enter也可以触发) dblclick(双击发生) mouseup mousedown...

    1.mouse是js,onmouse是html的,其实差别就是加了一个on

    2.mouse事件:鼠标移动时:1>会有冒泡的:mouseover ,mouseout

                 2>没有事件冒泡的: mouseenter ,mouseleave

           鼠标按下:click(enter也可以触发) dblclick(双击发生) mouseup mousedown 

    转载于:https://www.cnblogs.com/xiaobai1/p/8746332.html

    展开全文
  • Mouse input refactoring

    2021-01-07 16:45:46
    <div><p>This is the beginning of refactoring mouse input handling. The basic idea here is to simplify how widgets handle mouse input in most cases. A new mouse::events module was added that provides ...
  • Mouse event dispatch

    2021-01-12 06:15:22
    <div><p>Hi, I submitted pull request #363 with mouse support. This issue is a request for comments on how to handle mouse events across the application and widgets. <p>In my implementation of handling...
  • mouseover mouseout和mouseenter mouseleave区别 mouseover mouseout和mouseenter mouseleave区别: 前者划过子元素也会有作用 后者没有 有子元素的情况下 划上显示 划出消失适用于后者

    mouseover mouseout和mouseenter mouseleave区别

    mouseover mouseout和mouseenter mouseleave区别:
    前者划过子元素也会有作用
    后者没有
    有子元素的情况下 划上显示 划出消失适用于后者

    展开全文
  • d like to request that sokol do a mouse capture (see below). I have a bunch of cases with UI widgets, like camera navigators, where it's important that the mouse is not lost if the mouse goes out ...
  • Magic Mouse

    2018-08-25 12:01:13
    在Mac 终端里输入命令调整 Magic Mouse 的速度: 可以用终端命令来调整: 步骤: 1,打开终端 2,输入命令查看:defaults read -g com.apple.mouse.scaling 3,输入命令修改:defaults write -g ...
  • Computer mouse

    2020-02-06 23:46:02
    The use of mouse became a norm with the creation of the Graphic User Interface. GUI introduced windows, menus, dialogs and other features to the User Interface (UI), which totally transformed the func...
  • How to scroll (by mousewheel) cxGrid when mouse is over it.zip
  • <div><p>Mouse is auto(Lost mouse controll) move after iohook installation <h2>Expected Behavior <p>Normal mouse behaviour <h2>Current Behavior <p>Some times Mouse is auto(Lost mouse controll) move to ...
  • mouseover与mouseenter不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件。只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件。mouseout与mouseleave不论鼠标指针离开被选元素还是任何子元素,...
  • <div><p>This adds external mouse support to the Android input driver. It also adds support for using the touch screen as mouse in cores with mouse support (eg. ScummVM). <p>It has been tested with the...
  • <div><p>Steps: ...<p>Now the slider control follows the mouse as it still thinks mouse button is down, while it's not.</p><p>该提问来源于开源项目:IonDen/ion.rangeSlider</p></div>
  • mouseenter、mouseleave和mouseover、mouseout的区别 onmouseenter、onmouseleave:鼠标移动到自身是会触发事件,但是移动到其子元素身上不会触发事件 onmouseover、nmouseout:鼠标移动到自身时候会触发事件,同时...
  • mouseenter 鼠标移入 mouseover 鼠标移入 mouseleave 鼠标移出 mouseout 鼠标移出 mouseenter 和 mouseleave 是 一组 mouseover和mouseout 为另一组 区别: 父元素绑定 mouseenter 和 mouseleave 事件, 子元素不会...
  • Mouse Touch Stylus

    2019-10-05 09:10:10
    Mouse操作: preview mouse down, StylusDevice:null mouse down,StylusDevice:null preview mouse up, StylusDevice:null mouse up,StylusDevice:null Stylus操作: preview StylusDown , StylusDevice:2 ...
  • IMouse / Mouse refactoring

    2020-12-28 18:06:55
    <div><p>Cleaning up the Mouse Classes and Interfaces This 'should' not break current implementation. It's just separating some of the code into manageable chunks. <p>BareMetalMouse - ...
  • Settings for enabling mouse

    2020-12-28 12:56:26
    <div><p>Enabling mouse support disables the possibility to select text using the mouse in the terminal window. This commit adds a setting, <code>handle_mouse, that can be used to turn off mouse ...
  • 3rd Party Mouse Drivers

    2020-11-24 14:55:35
    <div><p><strong>Describe the ...Thinking if I can upload default mouse driver and use MS Mouse to solve some unexpected mouse behavior.</p><p>该提问来源于开源项目:joncampbell123/dosbox-x</p></div>
  • <div><p>I am not able to get the <code>on_mouse_entered, <code>on_mouse_moved</code> and <code>on_mouse_exited</code> events to fire within my layer: <pre><code> ruby class HeroLayer < Joybox::Core...
  • mouseover和mouseenter区别 mouseover 一直以来,只认为是光标移入元素的触碰事件,和离开元素的事件。 特地做了个测试,才发现没那么单纯。 当鼠标进入元素时候触发事件。 进入子元素时,又触发了一次事件 鼠标...
  • <div><p>Host cursor is visible while Windows 3.1 is using the DOSBox Integration Device (should be hidden as long as Windows within is reading the host mouse position). <p>I also noticed a problem ...
  • <div><p>The timeout value only applies to the method called on mouseout, and not the method called on mouseenter. So if you have several elements with mouseenter/out behaviors (example a menu where ...
  • Mouse-move improvements

    2020-11-22 01:50:16
    <p>Turn on mouse-move. Hold an attack button until a creature dies; your hero immediately starts moving. <p>Because I'm allowing holding the mouse button for continual attacks (instead of ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,986
精华内容 19,194
关键字:

mouse