struct avctp_passthrough_handler *handler;
uint8_t key_quirks[256];
- struct key_pressed *key;
+ struct key_pressed key;
};
struct avctp_passthrough_handler {
uint8_t *subunit, uint8_t *operands,
size_t operand_count, void *user_data)
{
- struct key_pressed *key = session->key;
struct avctp_passthrough_handler *handler = session->handler;
const char *status;
int pressed, i;
pressed = 1;
}
- if (key == NULL && handler != NULL) {
+ if (session->key.timer == 0 && handler != NULL) {
if (handler->cb(session, operands[0] & 0x7F,
pressed, handler->user_data))
goto done;
break;
}
- if (pressed) {
- if (key == NULL)
- key = g_new0(struct key_pressed, 1);
- key->op = key_map[i].avc;
- session->key = key;
- } else if (key && key->op == key_map[i].avc) {
- g_free(key);
- session->key = NULL;
- }
+ if (pressed)
+ session->key.op = key_map[i].avc;
send_key(session->uinput, key_map[i].uinput, pressed);
break;
session->auth_id = 0;
}
- if (session->key != NULL) {
- if (session->key->timer > 0)
- g_source_remove(session->key->timer);
- g_free(session->key);
- }
+ if (session->key.timer > 0)
+ g_source_remove(session->key.timer);
if (session->uinput >= 0) {
char address[18];
static gboolean repeat_timeout(gpointer user_data)
{
struct avctp *session = user_data;
- struct key_pressed *key = session->key;
- avctp_passthrough_release(session, key->op);
- avctp_passthrough_press(session, key->op);
+ avctp_passthrough_release(session, session->key.op);
+ avctp_passthrough_press(session, session->key.op);
return TRUE;
}
static void release_pressed(struct avctp *session)
{
- struct key_pressed *key = session->key;
-
- avctp_passthrough_release(session, key->op);
+ avctp_passthrough_release(session, session->key.op);
- if (key->timer > 0)
- g_source_remove(key->timer);
+ if (session->key.timer > 0)
+ g_source_remove(session->key.timer);
- g_free(key);
- session->key = NULL;
+ session->key.timer = 0;
}
static bool set_pressed(struct avctp *session, uint8_t op)
{
- struct key_pressed *key;
-
- if (session->key != NULL) {
- if (session->key->op == op)
+ if (session->key.timer > 0) {
+ if (session->key.op == op)
return TRUE;
release_pressed(session);
}
if (op != AVC_FAST_FORWARD && op != AVC_REWIND)
return FALSE;
- key = g_new0(struct key_pressed, 1);
- key->op = op;
- key->timer = g_timeout_add_seconds(2, repeat_timeout, session);
-
- session->key = key;
+ session->key.op = op;
+ session->key.timer = g_timeout_add_seconds(2, repeat_timeout, session);
return TRUE;
}
int avctp_send_passthrough(struct avctp *session, uint8_t op)
{
/* Auto release if key pressed */
- if (session->key != NULL)
+ if (session->key.timer > 0)
release_pressed(session);
return avctp_passthrough_press(session, op);