diff --git a/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp b/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp index 194a9d00cb..0ff955a2c4 100644 --- a/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp @@ -234,6 +234,7 @@ void IOWindow::CreateMainLayout() m_operators_combo->addItem(tr("> Greater-than")); m_operators_combo->addItem(tr("< Less-than")); m_operators_combo->addItem(tr("& And")); + m_operators_combo->addItem(tr("^ Xor")); } m_operators_combo->addItem(tr("| Or")); if (m_type == Type::Input) diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp index 00afc5e036..8e9b154bf7 100644 --- a/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp +++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.cpp @@ -136,6 +136,8 @@ Token Lexer::NextToken() return Token(TOK_GTHAN); case ',': return Token(TOK_COMMA); + case '^': + return Token(TOK_XOR); case '\'': return GetDelimitedLiteral(); case '$': @@ -278,6 +280,12 @@ public: lhs->GetValue(); return rhs->GetValue(); } + case TOK_XOR: + { + const auto lval = lhs->GetValue(); + const auto rval = rhs->GetValue(); + return std::max(std::min(1 - lval, rval), std::min(lval, 1 - rval)); + } default: assert(false); return 0; @@ -621,12 +629,14 @@ private: return 3; case TOK_AND: return 4; - case TOK_OR: + case TOK_XOR: return 5; - case TOK_ASSIGN: + case TOK_OR: return 6; - case TOK_COMMA: + case TOK_ASSIGN: return 7; + case TOK_COMMA: + return 8; default: assert(false); return 0; diff --git a/Source/Core/InputCommon/ControlReference/ExpressionParser.h b/Source/Core/InputCommon/ControlReference/ExpressionParser.h index cab6096c0e..c0d807bf17 100644 --- a/Source/Core/InputCommon/ControlReference/ExpressionParser.h +++ b/Source/Core/InputCommon/ControlReference/ExpressionParser.h @@ -39,6 +39,7 @@ enum TokenType TOK_LTHAN, TOK_GTHAN, TOK_COMMA, + TOK_XOR, TOK_BINARY_OPS_END, };