forked from enlightenment/efl
elput - re-enable switches (power buttons, lid etc.)
this is needed for devices that no longer produce aspi events for these. otherwise good luck getting any event on lid open/close or on pressing the power button. this also stops hiding switch events from libinput and now you can get switch events to find lid or tablet mode switching changes. @fix
This commit is contained in:
parent
10b6eb627a
commit
7a7abb043a
|
@ -38,6 +38,7 @@ typedef enum
|
|||
ELPUT_DEVICE_CAPS_TABLET_TOOL = (1 << 3),
|
||||
ELPUT_DEVICE_CAPS_TABLET_PAD = (1 << 4),
|
||||
ELPUT_DEVICE_CAPS_GESTURE = (1 << 5),
|
||||
ELPUT_DEVICE_CAPS_SWITCH = (1 << 6),
|
||||
} Elput_Device_Caps;
|
||||
|
||||
/* opaque structure to represent an input manager */
|
||||
|
@ -112,6 +113,29 @@ typedef struct Elput_Event_Pointer_Motion
|
|||
double dy_unaccel;
|
||||
} Elput_Event_Pointer_Motion;
|
||||
|
||||
/** @since 1.21 */
|
||||
typedef enum
|
||||
{
|
||||
ELPUT_SWITCH_TYPE_LID = 1,
|
||||
ELPUT_SWITCH_TYPE_TABLET_MODE,
|
||||
} Elput_Switch_Type;
|
||||
|
||||
/** @since 1.21 */
|
||||
typedef enum
|
||||
{
|
||||
ELPUT_SWITCH_STATE_OFF = 0,
|
||||
ELPUT_SWITCH_STATE_ON = 1,
|
||||
} Elput_Switch_State;
|
||||
|
||||
/** @since 1.21 */
|
||||
typedef struct _Elput_Event_Switch
|
||||
{
|
||||
Elput_Device *device;
|
||||
uint64_t time_usec;
|
||||
Elput_Switch_Type type;
|
||||
Elput_Switch_State state;
|
||||
} Elput_Event_Switch;
|
||||
|
||||
|
||||
EAPI extern int ELPUT_EVENT_SEAT_CAPS;
|
||||
EAPI extern int ELPUT_EVENT_SEAT_FRAME;
|
||||
|
@ -122,6 +146,9 @@ EAPI extern int ELPUT_EVENT_SESSION_ACTIVE;
|
|||
/** @since 1.19 */
|
||||
EAPI extern int ELPUT_EVENT_POINTER_MOTION;
|
||||
|
||||
/** @since 1.21 */
|
||||
EAPI extern int ELPUT_EVENT_SWITCH;
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief Ecore functions for dealing with libinput
|
||||
|
|
|
@ -13,6 +13,7 @@ EAPI int ELPUT_EVENT_MODIFIERS_SEND = 0;
|
|||
EAPI int ELPUT_EVENT_DEVICE_CHANGE = 0;
|
||||
EAPI int ELPUT_EVENT_SESSION_ACTIVE = 0;
|
||||
EAPI int ELPUT_EVENT_POINTER_MOTION = 0;
|
||||
EAPI int ELPUT_EVENT_SWITCH = 0;
|
||||
EAPI int elput_event_session_ready = 0;
|
||||
|
||||
EAPI int
|
||||
|
@ -41,6 +42,7 @@ elput_init(void)
|
|||
ELPUT_EVENT_DEVICE_CHANGE = ecore_event_type_new();
|
||||
ELPUT_EVENT_SESSION_ACTIVE = ecore_event_type_new();
|
||||
ELPUT_EVENT_POINTER_MOTION = ecore_event_type_new();
|
||||
ELPUT_EVENT_SWITCH = ecore_event_type_new();
|
||||
elput_event_session_ready = ecore_event_type_new();
|
||||
}
|
||||
|
||||
|
@ -71,6 +73,7 @@ elput_shutdown(void)
|
|||
ELPUT_EVENT_DEVICE_CHANGE,
|
||||
ELPUT_EVENT_SESSION_ACTIVE,
|
||||
ELPUT_EVENT_POINTER_MOTION,
|
||||
ELPUT_EVENT_SWITCH,
|
||||
elput_event_session_ready);
|
||||
|
||||
eina_log_domain_unregister(_elput_log_dom);
|
||||
|
|
|
@ -1595,6 +1595,20 @@ _tablet_tool_tip(struct libinput_device *idev, struct libinput_event_tablet_tool
|
|||
_pointer_button_send(dev, press[state]);
|
||||
}
|
||||
|
||||
static void
|
||||
_switch_toggle(struct libinput_device *idev, struct libinput_event_switch *event)
|
||||
{
|
||||
Elput_Event_Switch *ev;
|
||||
|
||||
ev = calloc(1, sizeof(Elput_Event_Switch));
|
||||
if (!ev) return;
|
||||
ev->device = libinput_device_get_user_data(idev);
|
||||
ev->time_usec = libinput_event_switch_get_time_usec(event);
|
||||
ev->type = (Elput_Switch_Type)libinput_event_switch_get_switch(event);
|
||||
ev->state = (Elput_Switch_State)libinput_event_switch_get_switch_state(event);
|
||||
ecore_event_add(ELPUT_EVENT_SWITCH, ev, NULL, NULL);
|
||||
}
|
||||
|
||||
int
|
||||
_evdev_event_process(struct libinput_event *event)
|
||||
{
|
||||
|
@ -1642,6 +1656,9 @@ _evdev_event_process(struct libinput_event *event)
|
|||
case LIBINPUT_EVENT_TABLET_TOOL_TIP: /* is this useful? */
|
||||
_tablet_tool_tip(idev, libinput_event_get_tablet_tool_event(event));
|
||||
break;
|
||||
case LIBINPUT_EVENT_SWITCH_TOGGLE:
|
||||
_switch_toggle(idev, libinput_event_get_switch_event(event));
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
break;
|
||||
|
@ -1670,7 +1687,6 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device)
|
|||
edev->refs = 1;
|
||||
edev->seat = seat;
|
||||
edev->device = device;
|
||||
edev->caps = 0;
|
||||
edev->ow = seat->manager->output_w;
|
||||
edev->oh = seat->manager->output_h;
|
||||
|
||||
|
@ -1679,13 +1695,14 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device)
|
|||
oname = libinput_device_get_name(device);
|
||||
eina_stringshare_replace(&edev->output_name, oname);
|
||||
|
||||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_SWITCH))
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_SWITCH;
|
||||
if ((libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) &&
|
||||
(libinput_device_keyboard_has_key(device, KEY_ENTER)))
|
||||
{
|
||||
_keyboard_init(seat, seat->manager->cached.keymap);
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_KEYBOARD;
|
||||
}
|
||||
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_KEYBOARD;
|
||||
if (edev->caps & (ELPUT_DEVICE_CAPS_SWITCH | ELPUT_DEVICE_CAPS_KEYBOARD))
|
||||
_keyboard_init(seat, seat->manager->cached.keymap);
|
||||
|
||||
if ((libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER) &&
|
||||
(libinput_device_pointer_has_button(device, BTN_LEFT))))
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_POINTER;
|
||||
|
@ -1694,10 +1711,7 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device)
|
|||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_PAD))
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_TABLET_PAD;
|
||||
if (edev->caps & ELPUT_DEVICE_CAPS_POINTER)
|
||||
{
|
||||
_pointer_init(seat);
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_POINTER;
|
||||
}
|
||||
_pointer_init(seat);
|
||||
|
||||
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH))
|
||||
edev->caps |= ELPUT_DEVICE_CAPS_TOUCH;
|
||||
|
@ -1706,8 +1720,6 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device)
|
|||
if (edev->caps & ELPUT_DEVICE_CAPS_TOUCH)
|
||||
_touch_init(seat);
|
||||
|
||||
if (!edev->caps) goto err;
|
||||
|
||||
libinput_device_set_user_data(device, edev);
|
||||
libinput_device_ref(edev->device);
|
||||
|
||||
|
@ -1721,7 +1733,6 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device)
|
|||
|
||||
return edev;
|
||||
|
||||
err:
|
||||
eina_stringshare_del(edev->output_name);
|
||||
free(edev);
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue