1/* 2 * Copyright © 2015 Red Hat, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24#ifndef EVDEV_TABLET_PAD_H 25#define EVDEV_TABLET_PAD_H 26 27#include "evdev.h" 28 29#define LIBINPUT_BUTTONSET_AXIS_NONE 0 30 31enum pad_status { 32 PAD_NONE = 0, 33 PAD_AXES_UPDATED = bit(0), 34 PAD_BUTTONS_PRESSED = bit(1), 35 PAD_BUTTONS_RELEASED = bit(2), 36}; 37 38enum pad_axes { 39 PAD_AXIS_NONE = 0, 40 PAD_AXIS_RING1 = bit(0), 41 PAD_AXIS_RING2 = bit(1), 42 PAD_AXIS_STRIP1 = bit(2), 43 PAD_AXIS_STRIP2 = bit(3), 44}; 45 46struct button_state { 47 unsigned char bits[NCHARS(KEY_CNT)]; 48}; 49 50typedef struct { 51 uint32_t value; 52} key_or_button_map_t; 53 54#define map_init(x_) ((x_).value = (uint32_t)-1) 55#define map_is_unmapped(x_) ((x_).value == (uint32_t)-1) 56#define map_is_button(x_) (((x_).value & 0xFF000000) == 0) 57#define map_is_key(x_) (((x_).value & 0xFF000000) != 0) 58#define map_set_button_map(field_, value_) ((field_).value = value_) 59#define map_set_key_map(field_, value_) ((field_).value = value_ | 0xFF000000) 60#define map_value(x_) ((x_).value & 0x00FFFFFF) 61 62struct pad_dispatch { 63 struct evdev_dispatch base; 64 struct evdev_device *device; 65 unsigned char status; 66 uint32_t changed_axes; 67 68 struct button_state button_state; 69 struct button_state prev_button_state; 70 71 key_or_button_map_t button_map[KEY_CNT]; 72 unsigned int nbuttons; 73 74 bool have_abs_misc_terminator; 75 76 struct { 77 struct libinput_device_config_send_events config; 78 enum libinput_config_send_events_mode current_mode; 79 } sendevents; 80 81 struct { 82 struct list mode_group_list; 83 } modes; 84}; 85 86static inline struct pad_dispatch* 87pad_dispatch(struct evdev_dispatch *dispatch) 88{ 89 evdev_verify_dispatch_type(dispatch, DISPATCH_TABLET_PAD); 90 91 return container_of(dispatch, struct pad_dispatch, base); 92} 93 94static inline struct libinput * 95pad_libinput_context(const struct pad_dispatch *pad) 96{ 97 return evdev_libinput_context(pad->device); 98} 99 100int 101pad_init_leds(struct pad_dispatch *pad, struct evdev_device *device); 102void 103pad_destroy_leds(struct pad_dispatch *pad); 104void 105pad_button_update_mode(struct libinput_tablet_pad_mode_group *g, 106 unsigned int button_index, 107 enum libinput_button_state state); 108#endif 109