Merge pull request #10 from xmaciek/master

Fix bug for not being able to read user input when creating new layout
This commit is contained in:
Mathias Panzenböck
2016-04-02 21:46:12 +01:00
6 changed files with 119 additions and 9 deletions

View File

@ -40,7 +40,7 @@ if(PLAIN_KEYS)
endif() endif()
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -pedantic -Wno-deprecated-declarations -Wno-variadic-macros") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -pedantic -Wno-variadic-macros")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
endif() endif()

View File

@ -11,12 +11,12 @@ set(qjoypad_SOURCES
buttonw.cpp buttonw.cpp
event.cpp event.cpp
flash.cpp flash.cpp
getkey.cpp
icon.cpp icon.cpp
joypad.cpp joypad.cpp
joypadw.cpp joypadw.cpp
joyslider.cpp joyslider.cpp
keycode.cpp keycode.cpp
keydialog.cpp
layout.cpp layout.cpp
layout_edit.cpp layout_edit.cpp
main.cpp main.cpp
@ -30,12 +30,12 @@ set(qjoypad_QOBJECT_HEADERS
button.h button.h
buttonw.h buttonw.h
flash.h flash.h
getkey.h
icon.h icon.h
joypad.h joypad.h
joypadw.h joypadw.h
joyslider.h joyslider.h
keycode.h keycode.h
keydialog.hpp
layout_edit.h layout_edit.h
layout.h layout.h
quickset.h) quickset.h)

View File

@ -1,6 +1,7 @@
#include <QX11Info> #include <QX11Info>
#include "keycode.h" #include "keycode.h"
#include "getkey.h" #include "keydialog.hpp"
#include <X11/XKBlib.h>
const QString ktos( int keycode ) const QString ktos( int keycode )
{ {
@ -8,7 +9,7 @@ const QString ktos( int keycode )
if (keycode == 0) return "[NO KEY]"; if (keycode == 0) return "[NO KEY]";
QString xname = XKeysymToString(XKeycodeToKeysym(QX11Info::display(), keycode,0)); QString xname = XKeysymToString( XkbKeycodeToKeysym( QX11Info::display(), keycode, 0, 0 ) );
//this section of code converts standard X11 keynames into much nicer names //this section of code converts standard X11 keynames into much nicer names
//which are prettier, fit the dialogs better, and are more readily understandable. //which are prettier, fit the dialogs better, and are more readily understandable.
@ -90,7 +91,7 @@ KeyButton::KeyButton( QString name, int val, QWidget* parent, bool m, bool nowMo
void KeyButton::onClick() { void KeyButton::onClick() {
//when clicked, ask for a key! //when clicked, ask for a key!
int retValue = GetKey::getKey(buttonname, mouse, &mouseClicked, this->window()); int retValue = KeyDialog::getKey(buttonname, mouse, &mouseClicked, this->window());
// -1 is a special value meaning that the window was simply // -1 is a special value meaning that the window was simply
// closed so we can ignore this // closed so we can ignore this
if (retValue < 0) { if (retValue < 0) {

82
src/keydialog.cpp Normal file
View File

@ -0,0 +1,82 @@
#include "keydialog.hpp"
#include <QGuiApplication>
#include <QPointer>
KeyDialog::KeyDialog( const QString& button, bool m, QWidget* parent ) :
QDialog( parent ),
m_acceptMouse( m ),
m_text( this ),
m_isMouse( false ),
m_value( 0 )
{
setWindowTitle( "Choose a key" );
m_text.setText( QString( "Choose a new key %1for %2\n(Ctrl-X for no key)" ).
arg( m ? "or mouse button " : "" ).arg( button ) );
m_text.adjustSize();
setFixedSize( m_text.width() + 20, m_text.height() + 20 );
m_text.move( 10, 10 );
}
int KeyDialog::getKey( const QString& button, bool acceptMouse, bool* mouseOut, QWidget* parent ) {
bool isMouse = false;
quint32 value = 0;
QPointer<KeyDialog> dialog = new KeyDialog( button, acceptMouse, parent );
if ( dialog->exec() != QDialog::Accepted ) {
delete dialog;
return -1;
}
if ( !dialog ) {
return -1;
}
isMouse = dialog->m_isMouse;
value = dialog->m_value;
delete dialog;
if ( mouseOut ) {
*mouseOut = isMouse;
}
return value;
}
void KeyDialog::keyReleaseEvent( QKeyEvent* event ) {
if ( event->key() != Qt::Key_Control ) {
return;
}
m_value = event->nativeScanCode();
m_isMouse = false;
accept();
}
void KeyDialog::keyPressEvent( QKeyEvent* event ) {
if ( event->key() == Qt::Key_Control ) {
return;
}
if ( event->key() == Qt::Key_X && QGuiApplication::keyboardModifiers() == Qt::ControlModifier ) {
m_value = 0;
} else {
m_value = event->nativeScanCode();
}
m_isMouse = false;
accept();
}
static quint32 qtMouseButtonToXButton( Qt::MouseButton button ) {
switch ( button ) {
case Qt::LeftButton: return 1;
case Qt::MiddleButton: return 2;
case Qt::RightButton: return 3;
default: return 0;
}
}
void KeyDialog::mouseReleaseEvent( QMouseEvent* event ) {
if ( !m_acceptMouse ) {
return;
}
m_value = qtMouseButtonToXButton( event->button() );
m_isMouse = true;
accept();
}

27
src/keydialog.hpp Normal file
View File

@ -0,0 +1,27 @@
#pragma once
#include <QDialog>
#include <QString>
#include <QLabel>
#include <QKeyEvent>
#include <QMouseEvent>
class KeyDialog : public QDialog {
Q_OBJECT
protected:
bool m_acceptMouse;
QLabel m_text;
bool m_isMouse;
quint32 m_value;
KeyDialog( const QString& button, bool m = false, QWidget* parent = 0 );
void keyPressEvent( QKeyEvent* );
void keyReleaseEvent( QKeyEvent* );
void mouseReleaseEvent( QMouseEvent* );
public:
static int getKey( const QString& button, bool acceptMouse = false, bool* mousePressed = 0, QWidget* parent = 0 );
};

View File

@ -1,5 +1,5 @@
#include "quickset.h" #include "quickset.h"
#include "getkey.h" #include "keydialog.hpp"
//build the dialog //build the dialog
QuickSet::QuickSet( JoyPad* jp, QWidget *parent) QuickSet::QuickSet( JoyPad* jp, QWidget *parent)
@ -31,7 +31,7 @@ void QuickSet::jsevent(const js_event &msg ) {
//go into setting mode and request a key/mousebutton //go into setting mode and request a key/mousebutton
setting = true; setting = true;
bool isMouse = false; bool isMouse = false;
int code = GetKey::getKey(button->getName(), true, &isMouse, this); int code = KeyDialog::getKey(button->getName(), true, &isMouse, this);
setting = false; setting = false;
if (code >= 0) { if (code >= 0) {
@ -49,7 +49,7 @@ void QuickSet::jsevent(const js_event &msg ) {
//grab a keycode for that axis and that direction //grab a keycode for that axis and that direction
setting = true; setting = true;
bool isMouse = false; bool isMouse = false;
int code = GetKey::getKey((msg.value >= 0 ? tr("%1, positive") : tr("%1, negative")).arg(axis->getName()), true, &isMouse, this); int code = KeyDialog::getKey((msg.value >= 0 ? tr("%1, positive") : tr("%1, negative")).arg(axis->getName()), true, &isMouse, this);
setting = false; setting = false;
//assign the key to the axis. //assign the key to the axis.