#ifndef _WSMOUSEINPUT_H_
#define _WSMOUSEINPUT_H_
#ifdef _KERNEL
struct position {
int x;
int y;
int dx;
int dy;
int acc_dx;
int acc_dy;
};
struct btn_state {
u_int buttons;
u_int sync;
};
struct motion_state {
int dx;
int dy;
int dz;
int dw;
struct position pos;
u_int sync;
};
#define SYNC_DELTAS (1 << 0)
#define SYNC_X (1 << 1)
#define SYNC_Y (1 << 2)
#define SYNC_POSITION (SYNC_X | SYNC_Y)
struct touch_state {
int pressure;
int contacts;
int width;
u_int sync;
int min_pressure;
int prev_contacts;
};
#define SYNC_PRESSURE (1 << 0)
#define SYNC_CONTACTS (1 << 1)
#define SYNC_TOUCH_WIDTH (1 << 2)
struct mt_slot {
struct position pos;
int pressure;
int id;
};
#define MTS_TOUCH 0
#define MTS_X 1
#define MTS_Y 2
#define MTS_PRESSURE 3
#define MTS_SIZE 4
struct mt_state {
u_int touches;
u_int frame;
int num_slots;
struct mt_slot *slots;
u_int sync[MTS_SIZE];
int num_touches;
u_int ptr;
u_int ptr_cycle;
u_int prev_ptr;
u_int ptr_mask;
int *matrix;
};
struct axis_filter {
int scale;
int rmdr;
int inv;
int hysteresis;
int avg;
int avg_rmdr;
int mag_scale;
int dclr_rmdr;
int dmax;
};
struct interval {
long avg;
long sum;
int samples;
struct timespec ts;
int track;
};
struct wsmouseinput {
u_int flags;
struct btn_state btn;
struct btn_state sbtn;
struct motion_state motion;
struct touch_state touch;
struct mt_state mt;
struct {
struct axis_filter h;
struct axis_filter v;
int dclr;
int mag;
u_int mode;
int ratio;
int swapxy;
int tracking_maxdist;
int pressure_lo;
int pressure_hi;
} filter;
struct wsmousehw hw;
struct interval intv;
struct wstpad *tp;
struct wseventvar **evar;
};
#define TPAD_COMPAT_MODE (1 << 0)
#define TPAD_NATIVE_MODE (1 << 1)
#define MT_TRACKING (1 << 2)
#define REVERSE_SCROLLING (1 << 3)
#define RESYNC (1 << 16)
#define TRACK_INTERVAL (1 << 17)
#define CONFIGURED (1 << 18)
#define LOG_INPUT (1 << 19)
#define LOG_EVENTS (1 << 20)
#define SMOOTHING_MASK 7
#define FILTER_MODE_DEFAULT 0
struct evq_access {
struct wseventvar *evar;
struct timespec ts;
int put;
int result;
};
#define EVQ_RESULT_OVERFLOW -1
#define EVQ_RESULT_NONE 0
#define EVQ_RESULT_SUCCESS 1
void wsmouse_evq_put(struct evq_access *, int, int);
void wsmouse_log_events(struct wsmouseinput *, struct evq_access *);
int wsmouse_hysteresis(struct wsmouseinput *, struct position *);
void wsmouse_input_reset(struct wsmouseinput *);
void wsmouse_input_cleanup(struct wsmouseinput *);
void wstpad_compat_convert(struct wsmouseinput *, struct evq_access *);
void wstpad_init_deceleration(struct wsmouseinput *);
int wstpad_configure(struct wsmouseinput *);
void wstpad_reset(struct wsmouseinput *);
void wstpad_cleanup(struct wsmouseinput *);
int wstpad_get_param(struct wsmouseinput *, int, int *);
int wstpad_set_param(struct wsmouseinput *, int, int);
#define FOREACHBIT(v, i) \
for ((i) = ffs(v) - 1; (i) != -1; (i) = ffs((v) & (~1 << (i))) - 1)
#define DELTA_X_EV(input) ((input)->filter.swapxy ? \
WSCONS_EVENT_MOUSE_DELTA_Y : WSCONS_EVENT_MOUSE_DELTA_X)
#define DELTA_Y_EV(input) ((input)->filter.swapxy ? \
WSCONS_EVENT_MOUSE_DELTA_X : WSCONS_EVENT_MOUSE_DELTA_Y)
#define ABS_X_EV(input) ((input)->filter.swapxy ? \
WSCONS_EVENT_MOUSE_ABSOLUTE_Y : WSCONS_EVENT_MOUSE_ABSOLUTE_X)
#define ABS_Y_EV(input) ((input)->filter.swapxy ? \
WSCONS_EVENT_MOUSE_ABSOLUTE_X : WSCONS_EVENT_MOUSE_ABSOLUTE_Y)
#define DELTA_Z_EV WSCONS_EVENT_MOUSE_DELTA_Z
#define DELTA_W_EV WSCONS_EVENT_MOUSE_DELTA_W
#define VSCROLL_EV WSCONS_EVENT_VSCROLL
#define HSCROLL_EV WSCONS_EVENT_HSCROLL
#define ABS_Z_EV WSCONS_EVENT_TOUCH_PRESSURE
#define ABS_W_EV WSCONS_EVENT_TOUCH_CONTACTS
#define BTN_DOWN_EV WSCONS_EVENT_MOUSE_DOWN
#define BTN_UP_EV WSCONS_EVENT_MOUSE_UP
#define SYNC_EV WSCONS_EVENT_SYNC
#define MATRIX_SIZE(slots) (((slots) + 6) * (slots) * sizeof(int))
#define IS_TOUCHPAD(input) \
((input)->hw.hw_type == WSMOUSEHW_TOUCHPAD \
|| (input)->hw.hw_type == WSMOUSEHW_CLICKPAD)
#define LOGTIME(tsp) \
((int) (((tsp)->tv_sec % 10) * 1000 + ((tsp)->tv_nsec / 1000000)))
#define DEVNAME(input) ((char *) (input) \
- offsetof(struct wsmouse_softc, sc_input) \
+ offsetof(struct device, dv_xname))
#endif
#endif