mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-20 21:43:12 -07:00
Add Buttons to Setsu
This commit is contained in:
parent
8bdf1a0003
commit
abec268ab6
3 changed files with 112 additions and 46 deletions
|
@ -90,7 +90,7 @@ void event(SetsuEvent *event, void *user)
|
||||||
case SETSU_EVENT_DEVICE_REMOVED:
|
case SETSU_EVENT_DEVICE_REMOVED:
|
||||||
LOG("Device removed: %s\n", event->path);
|
LOG("Device removed: %s\n", event->path);
|
||||||
break;
|
break;
|
||||||
case SETSU_EVENT_DOWN:
|
case SETSU_EVENT_TOUCH_DOWN:
|
||||||
LOG("Down for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id);
|
LOG("Down for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id);
|
||||||
for(size_t i=0; i<TOUCHES_MAX; i++)
|
for(size_t i=0; i<TOUCHES_MAX; i++)
|
||||||
{
|
{
|
||||||
|
@ -102,9 +102,9 @@ void event(SetsuEvent *event, void *user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SETSU_EVENT_POSITION:
|
case SETSU_EVENT_TOUCH_POSITION:
|
||||||
case SETSU_EVENT_UP:
|
case SETSU_EVENT_TOUCH_UP:
|
||||||
if(event->type == SETSU_EVENT_UP)
|
if(event->type == SETSU_EVENT_TOUCH_UP)
|
||||||
LOG("Up for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id);
|
LOG("Up for %s, tracking id %d\n", setsu_device_get_path(event->dev), event->tracking_id);
|
||||||
else
|
else
|
||||||
LOG("Position for %s, tracking id %d: %u, %u\n", setsu_device_get_path(event->dev),
|
LOG("Position for %s, tracking id %d: %u, %u\n", setsu_device_get_path(event->dev),
|
||||||
|
@ -115,11 +115,11 @@ void event(SetsuEvent *event, void *user)
|
||||||
{
|
{
|
||||||
switch(event->type)
|
switch(event->type)
|
||||||
{
|
{
|
||||||
case SETSU_EVENT_POSITION:
|
case SETSU_EVENT_TOUCH_POSITION:
|
||||||
touches[i].x = event->x;
|
touches[i].x = event->x;
|
||||||
touches[i].y = event->y;
|
touches[i].y = event->y;
|
||||||
break;
|
break;
|
||||||
case SETSU_EVENT_UP:
|
case SETSU_EVENT_TOUCH_UP:
|
||||||
touches[i].down = false;
|
touches[i].down = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -128,6 +128,11 @@ void event(SetsuEvent *event, void *user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SETSU_EVENT_BUTTON_DOWN:
|
||||||
|
case SETSU_EVENT_BUTTON_UP:
|
||||||
|
LOG("Button for %s: %llu %s\n", setsu_device_get_path(event->dev),
|
||||||
|
(unsigned long long)event->button, event->type == SETSU_EVENT_BUTTON_DOWN ? "down" : "up");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,17 +42,27 @@ typedef enum {
|
||||||
|
|
||||||
/* Touch down.
|
/* Touch down.
|
||||||
* Event will have dev and tracking_id set. */
|
* Event will have dev and tracking_id set. */
|
||||||
SETSU_EVENT_DOWN,
|
SETSU_EVENT_TOUCH_DOWN,
|
||||||
|
|
||||||
/* Touch down.
|
/* Touch down.
|
||||||
* Event will have dev and tracking_id set. */
|
* Event will have dev and tracking_id set. */
|
||||||
SETSU_EVENT_UP,
|
SETSU_EVENT_TOUCH_UP,
|
||||||
|
|
||||||
/* Touch position update.
|
/* Touch position update.
|
||||||
* Event will have dev, tracking_id, x and y set. */
|
* Event will have dev, tracking_id, x and y set. */
|
||||||
SETSU_EVENT_POSITION
|
SETSU_EVENT_TOUCH_POSITION,
|
||||||
|
|
||||||
|
/* Event will have dev and button set. */
|
||||||
|
SETSU_EVENT_BUTTON_DOWN,
|
||||||
|
|
||||||
|
/* Event will have dev and button set. */
|
||||||
|
SETSU_EVENT_BUTTON_UP
|
||||||
} SetsuEventType;
|
} SetsuEventType;
|
||||||
|
|
||||||
|
#define SETSU_BUTTON_0 (1u << 0)
|
||||||
|
|
||||||
|
typedef uint64_t SetsuButton;
|
||||||
|
|
||||||
typedef struct setsu_event_t
|
typedef struct setsu_event_t
|
||||||
{
|
{
|
||||||
SetsuEventType type;
|
SetsuEventType type;
|
||||||
|
@ -62,8 +72,15 @@ typedef struct setsu_event_t
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
SetsuDevice *dev;
|
SetsuDevice *dev;
|
||||||
SetsuTrackingId tracking_id;
|
union
|
||||||
uint32_t x, y;
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
SetsuTrackingId tracking_id;
|
||||||
|
uint32_t x, y;
|
||||||
|
};
|
||||||
|
SetsuButton button;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} SetsuEvent;
|
} SetsuEvent;
|
||||||
|
|
|
@ -69,6 +69,9 @@ typedef struct setsu_device_t
|
||||||
bool pos_dirty;
|
bool pos_dirty;
|
||||||
} slots[SLOTS_COUNT];
|
} slots[SLOTS_COUNT];
|
||||||
unsigned int slot_cur;
|
unsigned int slot_cur;
|
||||||
|
|
||||||
|
uint64_t buttons_prev;
|
||||||
|
uint64_t buttons_cur;
|
||||||
} SetsuDevice;
|
} SetsuDevice;
|
||||||
|
|
||||||
struct setsu_t
|
struct setsu_t
|
||||||
|
@ -458,6 +461,17 @@ static void poll_device(Setsu *setsu, SetsuDevice *dev, SetsuEventCb cb, void *u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint64_t button_from_evdev(int key)
|
||||||
|
{
|
||||||
|
switch(key)
|
||||||
|
{
|
||||||
|
case BTN_LEFT:
|
||||||
|
return SETSU_BUTTON_0;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void device_event(Setsu *setsu, SetsuDevice *dev, struct input_event *ev, SetsuEventCb cb, void *user)
|
static void device_event(Setsu *setsu, SetsuDevice *dev, struct input_event *ev, SetsuEventCb cb, void *user)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -467,43 +481,57 @@ static void device_event(Setsu *setsu, SetsuDevice *dev, struct input_event *ev,
|
||||||
ev->value);
|
ev->value);
|
||||||
#endif
|
#endif
|
||||||
#define S dev->slots[dev->slot_cur]
|
#define S dev->slots[dev->slot_cur]
|
||||||
if(ev->type == EV_ABS)
|
switch(ev->type)
|
||||||
{
|
{
|
||||||
switch(ev->code)
|
case EV_ABS:
|
||||||
{
|
switch(ev->code)
|
||||||
case ABS_MT_SLOT:
|
{
|
||||||
if((unsigned int)ev->value >= SLOTS_COUNT)
|
case ABS_MT_SLOT:
|
||||||
{
|
if((unsigned int)ev->value >= SLOTS_COUNT)
|
||||||
SETSU_LOG("slot too high\n");
|
{
|
||||||
|
SETSU_LOG("slot too high\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dev->slot_cur = ev->value;
|
||||||
break;
|
break;
|
||||||
}
|
case ABS_MT_TRACKING_ID:
|
||||||
dev->slot_cur = ev->value;
|
if(S.tracking_id != -1 && S.tracking_id_prev == -1)
|
||||||
break;
|
{
|
||||||
case ABS_MT_TRACKING_ID:
|
// up the tracking id
|
||||||
if(S.tracking_id != -1 && S.tracking_id_prev == -1)
|
S.tracking_id_prev = S.tracking_id;
|
||||||
{
|
// reset the rest
|
||||||
// up the tracking id
|
S.x = S.y = 0;
|
||||||
S.tracking_id_prev = S.tracking_id;
|
S.pos_dirty = false;
|
||||||
// reset the rest
|
}
|
||||||
S.x = S.y = 0;
|
S.tracking_id = ev->value;
|
||||||
S.pos_dirty = false;
|
if(ev->value != -1)
|
||||||
}
|
S.downed = true;
|
||||||
S.tracking_id = ev->value;
|
break;
|
||||||
if(ev->value != -1)
|
case ABS_MT_POSITION_X:
|
||||||
S.downed = true;
|
S.x = ev->value;
|
||||||
break;
|
S.pos_dirty = true;
|
||||||
case ABS_MT_POSITION_X:
|
break;
|
||||||
S.x = ev->value;
|
case ABS_MT_POSITION_Y:
|
||||||
S.pos_dirty = true;
|
S.y = ev->value;
|
||||||
break;
|
S.pos_dirty = true;
|
||||||
case ABS_MT_POSITION_Y:
|
break;
|
||||||
S.y = ev->value;
|
}
|
||||||
S.pos_dirty = true;
|
break;
|
||||||
|
case EV_KEY: {
|
||||||
|
uint64_t button = button_from_evdev(ev->code);
|
||||||
|
if(!button)
|
||||||
break;
|
break;
|
||||||
|
if(ev->value)
|
||||||
|
dev->buttons_cur |= button;
|
||||||
|
else
|
||||||
|
dev->buttons_cur &= ~button;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case EV_SYN:
|
||||||
|
if(ev->code == SYN_REPORT)
|
||||||
|
device_drain(setsu, dev, cb, user);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if(ev->type == EV_SYN && ev->code == SYN_REPORT)
|
|
||||||
device_drain(setsu, dev, cb, user);
|
|
||||||
#undef S
|
#undef S
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -516,21 +544,21 @@ static void device_drain(Setsu *setsu, SetsuDevice *dev, SetsuEventCb cb, void *
|
||||||
{
|
{
|
||||||
if(dev->slots[i].tracking_id_prev != -1)
|
if(dev->slots[i].tracking_id_prev != -1)
|
||||||
{
|
{
|
||||||
BEGIN_EVENT(SETSU_EVENT_UP);
|
BEGIN_EVENT(SETSU_EVENT_TOUCH_UP);
|
||||||
event.tracking_id = dev->slots[i].tracking_id_prev;
|
event.tracking_id = dev->slots[i].tracking_id_prev;
|
||||||
SEND_EVENT();
|
SEND_EVENT();
|
||||||
dev->slots[i].tracking_id_prev = -1;
|
dev->slots[i].tracking_id_prev = -1;
|
||||||
}
|
}
|
||||||
if(dev->slots[i].downed)
|
if(dev->slots[i].downed)
|
||||||
{
|
{
|
||||||
BEGIN_EVENT(SETSU_EVENT_DOWN);
|
BEGIN_EVENT(SETSU_EVENT_TOUCH_DOWN);
|
||||||
event.tracking_id = dev->slots[i].tracking_id;
|
event.tracking_id = dev->slots[i].tracking_id;
|
||||||
SEND_EVENT();
|
SEND_EVENT();
|
||||||
dev->slots[i].downed = false;
|
dev->slots[i].downed = false;
|
||||||
}
|
}
|
||||||
if(dev->slots[i].pos_dirty)
|
if(dev->slots[i].pos_dirty)
|
||||||
{
|
{
|
||||||
BEGIN_EVENT(SETSU_EVENT_POSITION);
|
BEGIN_EVENT(SETSU_EVENT_TOUCH_POSITION);
|
||||||
event.tracking_id = dev->slots[i].tracking_id;
|
event.tracking_id = dev->slots[i].tracking_id;
|
||||||
event.x = (uint32_t)(dev->slots[i].x - dev->min_x);
|
event.x = (uint32_t)(dev->slots[i].x - dev->min_x);
|
||||||
event.y = (uint32_t)(dev->slots[i].y - dev->min_y);
|
event.y = (uint32_t)(dev->slots[i].y - dev->min_y);
|
||||||
|
@ -538,6 +566,22 @@ static void device_drain(Setsu *setsu, SetsuDevice *dev, SetsuEventCb cb, void *
|
||||||
dev->slots[i].pos_dirty = false;
|
dev->slots[i].pos_dirty = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t buttons_diff = dev->buttons_prev ^ dev->buttons_cur;
|
||||||
|
for(uint64_t i=0; i<64; i++)
|
||||||
|
{
|
||||||
|
if(buttons_diff & 1)
|
||||||
|
{
|
||||||
|
uint64_t button = 1 << i;
|
||||||
|
BEGIN_EVENT((dev->buttons_cur & button) ? SETSU_EVENT_BUTTON_DOWN : SETSU_EVENT_BUTTON_UP);
|
||||||
|
event.button = button;
|
||||||
|
SEND_EVENT();
|
||||||
|
}
|
||||||
|
buttons_diff >>= 1;
|
||||||
|
if(!buttons_diff)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dev->buttons_prev = dev->buttons_cur;
|
||||||
#undef BEGIN_EVENT
|
#undef BEGIN_EVENT
|
||||||
#undef SEND_EVENT
|
#undef SEND_EVENT
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue