123 lines
3.1 KiB
C
123 lines
3.1 KiB
C
/*
|
|
* Released into the public domain
|
|
* by Aki Goto <tyatsumi@gmail.com>
|
|
*/
|
|
|
|
#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 if (this->list[0] == this->buttons[i]->control && Button_isHolded(this->buttons[i]->control)) {
|
|
int k;
|
|
|
|
this->modifier = Modifier_CONTROL;
|
|
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 if (this->list[0] == this->buttons[i]->alt && Button_isHolded(this->buttons[i]->alt)) {
|
|
int k;
|
|
|
|
this->modifier = Modifier_ALT;
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|