Files
padkey_linux/multibutton.c
2013-03-31 14:51:46 +09:00

94 lines
2.3 KiB
C

#include "multibutton.h"
void MultiButton_initialize(struct MultiButton *this, struct Gamepad *gamepad)
{
this->buttons[0] = &gamepad->buttons[0];
this->buttons[1] = &gamepad->buttons[1];
this->buttons[2] = &gamepad->buttons[2];
this->buttons[3] = &gamepad->buttons[3];
this->buttons[4] = &gamepad->buttons[4];
this->buttons[5] = &gamepad->buttons[5];
this->buttons[6] = &gamepad->buttons[6];
this->buttons[7] = &gamepad->buttons[7];
this->size = 0;
this->available = 0;
this->sequenceSize = 0;
this->modifier = Modifier_NONE;
}
void MultiButton_reset(struct MultiButton *this)
{
this->size = 0;
this->available = 0;
}
void MultiButton_update(struct MultiButton *this, struct js_event *event)
{
int i;
for (i = 0; i < 8; i++) {
if (Button_update(this->buttons[i], event)) {
if (Button_isDown(this->buttons[i])) {
if (this->size < 8) {
this->list[this->size] = this->buttons[i];
this->size++;
}
}
}
}
}
void MultiButton_generate(struct MultiButton *this)
{
int i;
this->available = 0;
for (i = 0; i < 8; i++) {
if (Button_isUp(this->buttons[i])) {
if (this->size > 0 && this->buttons[i] == this->list[this->size - 1]) {
if (this->size == 1) {
if (this->sequenceSize < 1) {
if (this->sequenceSize < 8) {
this->sequence[this->sequenceSize] = this->buttons[i];
this->sequenceSize++;
}
} else {
this->code.modifier = this->modifier;
this->code.first = this->sequence[0]->id;
this->code.second = this->buttons[i]->id;
this->available = 1;
this->sequenceSize = 0;
this->modifier = Modifier_NONE;
}
} else {
if (this->list[0] == this->buttons[i]->shift && Button_isHolded(this->buttons[i]->shift)) {
int k;
this->modifier = Modifier_SHIFT;
for (k = 1; k < this->size; k++) {
this->list[k - 1] = this->list[k];
}
this->size--;
if (this->sequenceSize < 8) {
this->sequence[this->sequenceSize] = this->buttons[i];
this->sequenceSize++;
}
} else {
this->code.modifier = this->modifier;
this->code.first = this->list[0]->id;
this->code.second = this->buttons[i]->id;
this->available = 1;
this->sequenceSize = 0;
this->modifier = Modifier_NONE;
}
}
this->size = 0;
}
}
}
}