Ignore:
Timestamp:
2021-10-25T17:51:10Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
91ece11b
Parents:
805a149
Message:

Support double-click

Needed to open Navigator entries using the mouse.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/input/proto/mousedev.c

    r805a149 r8edec53  
    11/*
     2 * Copyright (c) 2021 Jiri Svoboda
    23 * Copyright (c) 2011 Martin Decky
    34 * All rights reserved.
     
    4344#include <loc.h>
    4445#include <stdlib.h>
     46#include <time.h>
    4547#include "../mouse.h"
    4648#include "../mouse_port.h"
     
    4850#include "../input.h"
    4951
     52enum {
     53        /** Default double-click speed in milliseconds */
     54        dclick_delay_ms = 500
     55};
     56
    5057/** Mousedev softstate */
    5158typedef struct {
    5259        /** Link to generic mouse device */
    5360        mouse_dev_t *mouse_dev;
     61        /** Button number of last button pressed (or -1 if none) */
     62        int press_bnum;
     63        /** Time at which button was last pressed */
     64        struct timespec press_time;
    5465} mousedev_t;
    5566
     
    6172
    6273        mousedev->mouse_dev = mdev;
     74        mousedev->press_bnum = -1;
    6375
    6476        return mousedev;
     
    6880{
    6981        free(mousedev);
     82}
     83
     84static void mousedev_press(mousedev_t *mousedev, int bnum)
     85{
     86        struct timespec now;
     87        nsec_t ms_delay;
     88
     89        getuptime(&now);
     90
     91        /* Same button was pressed previously */
     92        if (mousedev->press_bnum == bnum) {
     93                /* Compute milliseconds since previous press */
     94                ms_delay = ts_sub_diff(&now, &mousedev->press_time) / 1000000;
     95
     96                if (ms_delay <= dclick_delay_ms) {
     97                        mouse_push_event_dclick(mousedev->mouse_dev, bnum);
     98                        mousedev->press_bnum = -1;
     99                        return;
     100                }
     101        }
     102
     103        /* Record which button was last pressed and at what time */
     104        mousedev->press_bnum = bnum;
     105        mousedev->press_time = now;
    70106}
    71107
     
    103139                        mouse_push_event_button(mousedev->mouse_dev,
    104140                            ipc_get_arg1(&call), ipc_get_arg2(&call));
     141                        if (ipc_get_arg2(&call) != 0)
     142                                mousedev_press(mousedev, ipc_get_arg1(&call));
    105143                        retval = EOK;
    106144                        break;
Note: See TracChangeset for help on using the changeset viewer.