Qt: ^V on OSX

I can't take credit for this and still have no idea why it is
needed, but it fixes use of ^V as a command and as input to
to the regular version of yn_function().  In particular, '&'
command reports it as ^V.  Unfortunately when 'popup_dialog' is
set, no control characters seem to be accepted by the part of
NetHackQtYnDialog(Exec+KeyPressEvent) responsible for arbitrary
input.

It also causes getlin() to terminate but I can't think of any
situation where ^V would be considered to be valid input for
getlin() so won't worry about that.

I put it in as '#if MACOSX' because I don't know whether any
other Qt platforms need it.
This commit is contained in:
PatR
2021-01-08 01:37:38 -08:00
parent 6a2ac5b446
commit 2f76d0e701
4 changed files with 33 additions and 6 deletions

View File

@@ -40,10 +40,6 @@ On OSX, command+Q while a menu (which has its own key event handler)
is popped up gets ignored. It should at least close the popup like
ESC and maybe also initiate quitting.
On the map, ^V is a dead key (at least on OSX; all other ASCII control
characters from ^A through ^U, ^W through ^Z, and ^[, ^\, ^], ^^, ^_
work; no attempt to have ^@ generate NUL has been made).
Map column #0, which the core reserves for its own purposes and isn't
intended to be displayed, is displayed (as blank terrain).

View File

@@ -10,6 +10,8 @@ extern "C" {
#include "qt_pre.h"
#include <QtGui/QtGui>
#include <QtWidgets/QShortcut>
#if QT_VERSION >= 0x050000
#include <QtWidgets/QtWidgets>
#endif
@@ -548,6 +550,13 @@ NetHackQtMainWindow::NetHackQtMainWindow(NetHackQtKeyBuffer& ks) :
* setMenuRole() can be used to override this behavior.
*/
#endif
#ifdef CTRL_V_HACK
// NetHackQtBind::notify() sees all control characters except for ^V
QShortcut *c_V = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_V), this);
connect(c_V, &QShortcut::activated, this, &NetHackQtMainWindow::CtrlV);
#endif
QMenu* game=new QMenu;
QMenu* apparel=new QMenu;
QMenu* act1=new QMenu;
@@ -889,6 +898,20 @@ NetHackQtMainWindow::NetHackQtMainWindow(NetHackQtKeyBuffer& ks) :
}
}
#ifdef CTRL_V_HACK
#ifndef C
#define C(c) (0x1f & (c))
#endif
// called when ^V is typed while the main window has keyboard focus;
// all other control characters go through NetHackQtBind::notify()
void NetHackQtMainWindow::CtrlV()
{
static const char cV[] = { C('V'), '\0' };
doKeys(cV);
}
#endif
// add a toolbar button to invoke command 'name' via function '(*func)()'
void NetHackQtMainWindow::AddToolButton(QToolBar *toolbar, QSignalMapper *sm,
const char *name, int NDECL((*func)),

View File

@@ -19,6 +19,11 @@
// [Used in qt_bind.cpp and qt_main.cpp, but not referenced in qt_stat.cpp.]
#define DYNAMIC_STATUSLINES
// NetHackQtBind::notify() doesn't see ^V on OSX
#ifdef MACOSX
#define CTRL_V_HACK
#endif
namespace nethack_qt_ {
class NetHackQtInvUsageWindow;
@@ -83,6 +88,9 @@ private slots:
void zoomMap();
void raiseMessages();
void raiseStatus();
#ifdef CTRL_V_HACK
void CtrlV();
#endif
private:
void ShowIfReady();