Added logic to configure gamepad buttons. Still needs more testing.
This commit is contained in:
parent
ee02883ac7
commit
002e9e0f34
|
@ -32,24 +32,41 @@ gameWin_t::gameWin_t(QWidget *parent)
|
||||||
|
|
||||||
gameTimer->setTimerType( Qt::PreciseTimer );
|
gameTimer->setTimerType( Qt::PreciseTimer );
|
||||||
gameTimer->start( 10 );
|
gameTimer->start( 10 );
|
||||||
|
|
||||||
|
gamePadConfWin = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
gameWin_t::~gameWin_t(void)
|
gameWin_t::~gameWin_t(void)
|
||||||
{
|
{
|
||||||
|
if ( gamePadConfWin != NULL )
|
||||||
|
{
|
||||||
|
gamePadConfWin->closeWindow();
|
||||||
|
}
|
||||||
fceuWrapperClose();
|
fceuWrapperClose();
|
||||||
|
|
||||||
delete viewport;
|
delete viewport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gameWin_t::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
printf("Main Window Close Event\n");
|
||||||
|
if ( gamePadConfWin != NULL )
|
||||||
|
{
|
||||||
|
printf("Command Game Pad Close\n");
|
||||||
|
gamePadConfWin->closeWindow();
|
||||||
|
}
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
void gameWin_t::keyPressEvent(QKeyEvent *event)
|
void gameWin_t::keyPressEvent(QKeyEvent *event)
|
||||||
{
|
{
|
||||||
//printf("Key Press: 0x%x \n", event->key() );
|
printf("Key Press: 0x%x \n", event->key() );
|
||||||
pushKeyEvent( event, 1 );
|
pushKeyEvent( event, 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void gameWin_t::keyReleaseEvent(QKeyEvent *event)
|
void gameWin_t::keyReleaseEvent(QKeyEvent *event)
|
||||||
{
|
{
|
||||||
//printf("Key Release: 0x%x \n", event->key() );
|
printf("Key Release: 0x%x \n", event->key() );
|
||||||
pushKeyEvent( event, 0 );
|
pushKeyEvent( event, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,8 +182,20 @@ void gameWin_t::closeROMCB(void)
|
||||||
|
|
||||||
void gameWin_t::openGamePadConfWin(void)
|
void gameWin_t::openGamePadConfWin(void)
|
||||||
{
|
{
|
||||||
|
if ( gamePadConfWin != NULL )
|
||||||
|
{
|
||||||
|
printf("GamePad Config Window Already Open\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
printf("Open GamePad Config Window\n");
|
printf("Open GamePad Config Window\n");
|
||||||
GamePadConfDialog_t gpConf(this);
|
gamePadConfWin = new GamePadConfDialog_t(this);
|
||||||
|
|
||||||
|
gamePadConfWin->show();
|
||||||
|
gamePadConfWin->exec();
|
||||||
|
|
||||||
|
delete gamePadConfWin;
|
||||||
|
gamePadConfWin = NULL;
|
||||||
|
printf("GamePad Config Window Destroyed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void gameWin_t::aboutQPlot(void)
|
void gameWin_t::aboutQPlot(void)
|
||||||
|
@ -177,12 +206,12 @@ void gameWin_t::aboutQPlot(void)
|
||||||
|
|
||||||
void gameWin_t::runGameFrame(void)
|
void gameWin_t::runGameFrame(void)
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
//struct timespec ts;
|
||||||
double t;
|
//double t;
|
||||||
|
|
||||||
clock_gettime( CLOCK_REALTIME, &ts );
|
//clock_gettime( CLOCK_REALTIME, &ts );
|
||||||
|
|
||||||
t = (double)ts.tv_sec + (double)(ts.tv_nsec * 1.0e-9);
|
//t = (double)ts.tv_sec + (double)(ts.tv_nsec * 1.0e-9);
|
||||||
//printf("Run Frame %f\n", t);
|
//printf("Run Frame %f\n", t);
|
||||||
|
|
||||||
fceuWrapperUpdate();
|
fceuWrapperUpdate();
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
|
||||||
#include "GameViewer.h"
|
#include "GameViewer.h"
|
||||||
|
#include "GamePadConf.h"
|
||||||
|
|
||||||
class gameWin_t : public QMainWindow
|
class gameWin_t : public QMainWindow
|
||||||
{
|
{
|
||||||
|
@ -41,7 +42,10 @@ class gameWin_t : public QMainWindow
|
||||||
|
|
||||||
QTimer *gameTimer;
|
QTimer *gameTimer;
|
||||||
|
|
||||||
|
GamePadConfDialog_t *gamePadConfWin;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void closeEvent(QCloseEvent *event);
|
||||||
void keyPressEvent(QKeyEvent *event);
|
void keyPressEvent(QKeyEvent *event);
|
||||||
void keyReleaseEvent(QKeyEvent *event);
|
void keyReleaseEvent(QKeyEvent *event);
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,26 @@
|
||||||
// GamePadConf.cpp
|
// GamePadConf.cpp
|
||||||
//
|
//
|
||||||
#include "GamePadConf.h"
|
#include "GamePadConf.h"
|
||||||
|
#include "main.h"
|
||||||
|
#include "input.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "keyscan.h"
|
||||||
|
#include "fceuWrapper.h"
|
||||||
|
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
|
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
|
||||||
: QDialog( parent )
|
: QDialog( parent )
|
||||||
{
|
{
|
||||||
QHBoxLayout *hbox1, *hbox2;
|
QHBoxLayout *hbox1;
|
||||||
QCheckBox *efs_chkbox;
|
QGridLayout *grid;
|
||||||
|
QCheckBox *efs_chkbox, *udlr_chkbox;
|
||||||
|
QGroupBox *frame;
|
||||||
|
QPushButton *closebutton;
|
||||||
|
|
||||||
|
portNum = 0;
|
||||||
|
buttonConfigStatus = 1;
|
||||||
|
|
||||||
|
setWindowTitle("GamePad Config");
|
||||||
|
|
||||||
hbox1 = new QHBoxLayout();
|
hbox1 = new QHBoxLayout();
|
||||||
|
|
||||||
|
@ -16,25 +29,202 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
|
||||||
hbox1->addWidget( label );
|
hbox1->addWidget( label );
|
||||||
hbox1->addWidget( portSel );
|
hbox1->addWidget( portSel );
|
||||||
|
|
||||||
hbox2 = new QHBoxLayout();
|
portSel->addItem( tr("1"), 0 );
|
||||||
|
portSel->addItem( tr("2"), 1 );
|
||||||
|
portSel->addItem( tr("3"), 2 );
|
||||||
|
portSel->addItem( tr("4"), 3 );
|
||||||
|
|
||||||
efs_chkbox = new QCheckBox("Enable Four Score");
|
efs_chkbox = new QCheckBox("Enable Four Score");
|
||||||
hbox2->addWidget( efs_chkbox );
|
udlr_chkbox = new QCheckBox("Allow Up+Down/Left+Right");
|
||||||
|
|
||||||
|
frame = new QGroupBox(tr("Buttons:"));
|
||||||
|
grid = new QGridLayout();
|
||||||
|
|
||||||
|
grid-> setHorizontalSpacing(50);
|
||||||
|
|
||||||
|
//frame->setFrameStyle( QFrame::Box );
|
||||||
|
frame->setLayout( grid );
|
||||||
|
|
||||||
|
for (int i=0; i<10; i++)
|
||||||
|
{
|
||||||
|
char text[64];
|
||||||
|
const char *keyNameStr;
|
||||||
|
QLabel *buttonName;
|
||||||
|
|
||||||
|
sprintf( text, "%s:", GamePadNames[i] );
|
||||||
|
|
||||||
|
//hbox2 = new QHBoxLayout();
|
||||||
|
|
||||||
|
//hbox2->setAlignment(Qt::AlignCenter);
|
||||||
|
|
||||||
|
keyNameStr = ButtonName( &GamePadConfig[portNum][i], portNum );
|
||||||
|
|
||||||
|
buttonName = new QLabel(tr(text));
|
||||||
|
keyName[i] = new QLabel(tr(keyNameStr));
|
||||||
|
button[i] = new QPushButton(tr("Change"));
|
||||||
|
|
||||||
|
grid->addWidget( buttonName, i, 0, Qt::AlignCenter );
|
||||||
|
grid->addWidget( keyName[i], i, 1, Qt::AlignCenter );
|
||||||
|
grid->addWidget( button[i] , i, 2, Qt::AlignCenter );
|
||||||
|
}
|
||||||
|
closebutton = new QPushButton(tr("Close"));
|
||||||
|
|
||||||
|
connect(button[0], SIGNAL(clicked()), this, SLOT(changeButton0(void)) );
|
||||||
|
connect(button[1], SIGNAL(clicked()), this, SLOT(changeButton1(void)) );
|
||||||
|
connect(button[2], SIGNAL(clicked()), this, SLOT(changeButton2(void)) );
|
||||||
|
connect(button[3], SIGNAL(clicked()), this, SLOT(changeButton3(void)) );
|
||||||
|
connect(button[4], SIGNAL(clicked()), this, SLOT(changeButton4(void)) );
|
||||||
|
connect(button[5], SIGNAL(clicked()), this, SLOT(changeButton5(void)) );
|
||||||
|
connect(button[6], SIGNAL(clicked()), this, SLOT(changeButton6(void)) );
|
||||||
|
connect(button[7], SIGNAL(clicked()), this, SLOT(changeButton7(void)) );
|
||||||
|
connect(button[8], SIGNAL(clicked()), this, SLOT(changeButton8(void)) );
|
||||||
|
connect(button[9], SIGNAL(clicked()), this, SLOT(changeButton9(void)) );
|
||||||
|
connect(closebutton, SIGNAL(clicked()), this, SLOT(closeWindow(void)) );
|
||||||
|
|
||||||
QVBoxLayout *mainLayout = new QVBoxLayout();
|
QVBoxLayout *mainLayout = new QVBoxLayout();
|
||||||
|
|
||||||
mainLayout->addLayout( hbox1 );
|
mainLayout->addLayout( hbox1 );
|
||||||
mainLayout->addWidget( efs_chkbox );
|
mainLayout->addWidget( efs_chkbox );
|
||||||
//mainLayout->addLayout( hbox2 );
|
mainLayout->addWidget( udlr_chkbox );
|
||||||
|
mainLayout->addWidget( frame );
|
||||||
|
mainLayout->addWidget( closebutton, Qt::AlignRight );
|
||||||
|
|
||||||
setLayout( mainLayout );
|
setLayout( mainLayout );
|
||||||
|
|
||||||
show();
|
//show();
|
||||||
exec();
|
//exec();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
GamePadConfDialog_t::~GamePadConfDialog_t(void)
|
GamePadConfDialog_t::~GamePadConfDialog_t(void)
|
||||||
{
|
{
|
||||||
|
buttonConfigStatus = 0;
|
||||||
|
}
|
||||||
|
void GamePadConfDialog_t::keyPressEvent(QKeyEvent *event)
|
||||||
|
{
|
||||||
|
//printf("Key Press: 0x%x \n", event->key() );
|
||||||
|
pushKeyEvent( event, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void GamePadConfDialog_t::keyReleaseEvent(QKeyEvent *event)
|
||||||
|
{
|
||||||
|
//printf("Key Release: 0x%x \n", event->key() );
|
||||||
|
pushKeyEvent( event, 0 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton(int padNo, int x)
|
||||||
|
{
|
||||||
|
int configNo = 0;
|
||||||
|
char buf[256];
|
||||||
|
std::string prefix;
|
||||||
|
const char *keyNameStr;
|
||||||
|
|
||||||
|
if ( buttonConfigStatus == 2 )
|
||||||
|
{
|
||||||
|
buttonConfigStatus = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
buttonConfigStatus = 2;
|
||||||
|
|
||||||
|
ButtonConfigBegin ();
|
||||||
|
|
||||||
|
button[x]->setText("Waiting" );
|
||||||
|
|
||||||
|
snprintf (buf, sizeof(buf)-1, "SDL.Input.GamePad.%d.", padNo);
|
||||||
|
prefix = buf;
|
||||||
|
DWaitButton (NULL, &GamePadConfig[padNo][x], configNo, &buttonConfigStatus );
|
||||||
|
|
||||||
|
g_config->setOption (prefix + GamePadNames[x],
|
||||||
|
GamePadConfig[padNo][x].ButtonNum[configNo]);
|
||||||
|
|
||||||
|
if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_KEYBOARD)
|
||||||
|
{
|
||||||
|
g_config->setOption (prefix + "DeviceType", "Keyboard");
|
||||||
|
}
|
||||||
|
else if (GamePadConfig[padNo][x].ButtType[0] == BUTTC_JOYSTICK)
|
||||||
|
{
|
||||||
|
g_config->setOption (prefix + "DeviceType", "Joystick");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_config->setOption (prefix + "DeviceType", "Unknown");
|
||||||
|
}
|
||||||
|
g_config->setOption (prefix + "DeviceNum",
|
||||||
|
GamePadConfig[padNo][x].DeviceNum[configNo]);
|
||||||
|
|
||||||
|
keyNameStr = ButtonName( &GamePadConfig[padNo][x], padNo );
|
||||||
|
|
||||||
|
keyName[x]->setText( keyNameStr );
|
||||||
|
button[x]->setText("Change");
|
||||||
|
|
||||||
|
ButtonConfigEnd ();
|
||||||
|
|
||||||
|
buttonConfigStatus = 1;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
printf("GamePad Close Window Event\n");
|
||||||
|
buttonConfigStatus = 0;
|
||||||
|
done(0);
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::closeWindow(void)
|
||||||
|
{
|
||||||
|
printf("Close Window\n");
|
||||||
|
buttonConfigStatus = 0;
|
||||||
|
done(0);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton0(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 0 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton1(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 1 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton2(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 2 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton3(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 3 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton4(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 4 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton5(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 5 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton6(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 6 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton7(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 7 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton8(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 8 );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void GamePadConfDialog_t::changeButton9(void)
|
||||||
|
{
|
||||||
|
changeButton( portNum, 9 );
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
|
|
@ -11,18 +11,42 @@
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
#include <QFrame>
|
||||||
|
#include <QGroupBox>
|
||||||
|
|
||||||
class GamePadConfDialog_t : public QDialog
|
class GamePadConfDialog_t : public QDialog
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GamePadConfDialog_t(QWidget *parent = 0);
|
GamePadConfDialog_t(QWidget *parent = 0);
|
||||||
~GamePadConfDialog_t(void);
|
~GamePadConfDialog_t(void);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QComboBox *portSel;
|
QComboBox *portSel;
|
||||||
|
QPushButton *button[10];
|
||||||
|
QLabel *keyName[10];
|
||||||
|
|
||||||
|
int portNum;
|
||||||
|
int buttonConfigStatus;
|
||||||
|
|
||||||
|
void changeButton( int port, int button );
|
||||||
|
void keyPressEvent(QKeyEvent *event);
|
||||||
|
void keyReleaseEvent(QKeyEvent *event);
|
||||||
|
void closeEvent(QCloseEvent *bar);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void closeWindow(void);
|
||||||
private slots:
|
private slots:
|
||||||
|
void changeButton0(void);
|
||||||
|
void changeButton1(void);
|
||||||
|
void changeButton2(void);
|
||||||
|
void changeButton3(void);
|
||||||
|
void changeButton4(void);
|
||||||
|
void changeButton5(void);
|
||||||
|
void changeButton6(void);
|
||||||
|
void changeButton7(void);
|
||||||
|
void changeButton8(void);
|
||||||
|
void changeButton9(void);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -52,6 +52,7 @@ extern bool bindSavestate, frameAdvanceLagSkip, lagCounterDisplay;
|
||||||
static int UsrInputType[NUM_INPUT_DEVICES];
|
static int UsrInputType[NUM_INPUT_DEVICES];
|
||||||
static int CurInputType[NUM_INPUT_DEVICES];
|
static int CurInputType[NUM_INPUT_DEVICES];
|
||||||
static int cspec = 0;
|
static int cspec = 0;
|
||||||
|
static int buttonConfigInProgress = 0;
|
||||||
|
|
||||||
extern int gametype;
|
extern int gametype;
|
||||||
|
|
||||||
|
@ -963,7 +964,7 @@ UpdatePhysicalInput ()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int bcpv, bcpj;
|
static int bcpv=0, bcpj=0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begin configuring the buttons by placing the video and joystick
|
* Begin configuring the buttons by placing the video and joystick
|
||||||
|
@ -981,6 +982,8 @@ int ButtonConfigBegin ()
|
||||||
// initialize the joystick subsystem
|
// initialize the joystick subsystem
|
||||||
InitJoysticks ();
|
InitJoysticks ();
|
||||||
|
|
||||||
|
buttonConfigInProgress = 1;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1004,6 +1007,7 @@ ButtonConfigEnd ()
|
||||||
{
|
{
|
||||||
InitJoysticks ();
|
InitJoysticks ();
|
||||||
}
|
}
|
||||||
|
buttonConfigInProgress = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1197,6 +1201,10 @@ void FCEUD_UpdateInput ()
|
||||||
int x;
|
int x;
|
||||||
int t = 0;
|
int t = 0;
|
||||||
|
|
||||||
|
if ( buttonConfigInProgress )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
UpdatePhysicalInput ();
|
UpdatePhysicalInput ();
|
||||||
KeyboardCommands ();
|
KeyboardCommands ();
|
||||||
|
|
||||||
|
@ -1622,6 +1630,7 @@ int DWaitButton (const uint8 * text, ButtConfig * bc, int wb, int *buttonConfigS
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
static int32 LastAx[64][64];
|
static int32 LastAx[64][64];
|
||||||
int x, y;
|
int x, y;
|
||||||
|
int timeout_ms = 10000;
|
||||||
|
|
||||||
if (text)
|
if (text)
|
||||||
{
|
{
|
||||||
|
@ -1643,6 +1652,16 @@ int DWaitButton (const uint8 * text, ButtConfig * bc, int wb, int *buttonConfigS
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int done = 0;
|
int done = 0;
|
||||||
|
|
||||||
|
usleep(10000);
|
||||||
|
timeout_ms -= 10;
|
||||||
|
|
||||||
|
if ( timeout_ms <= 0 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
QCoreApplication::processEvents();
|
||||||
//#ifdef _GTK
|
//#ifdef _GTK
|
||||||
// while (gtk_events_pending ())
|
// while (gtk_events_pending ())
|
||||||
// gtk_main_iteration_do (FALSE);
|
// gtk_main_iteration_do (FALSE);
|
||||||
|
@ -1653,6 +1672,7 @@ int DWaitButton (const uint8 * text, ButtConfig * bc, int wb, int *buttonConfigS
|
||||||
switch (event.type)
|
switch (event.type)
|
||||||
{
|
{
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
|
//printf("SDL KeyDown:%i \n", event.key.keysym.sym );
|
||||||
bc->ButtType[wb] = BUTTC_KEYBOARD;
|
bc->ButtType[wb] = BUTTC_KEYBOARD;
|
||||||
bc->DeviceNum[wb] = 0;
|
bc->DeviceNum[wb] = 0;
|
||||||
bc->ButtonNum[wb] = event.key.keysym.sym;
|
bc->ButtonNum[wb] = event.key.keysym.sym;
|
||||||
|
|
Loading…
Reference in New Issue