namespace nethack_qt_ {
+// convert a Qt key event into a simple ASCII character
+uchar keyValue(QKeyEvent *key_event)
+{
+ // key_event manipulation derived from NetHackQtBind::notify();
+ // used for menus and text windows in qt_menu.cpp, also for
+ // extended commands in xcmd.cpp and popup yn_function in qt_yndlg.cpp
+
+ const int k = key_event->key();
+ Qt::KeyboardModifiers mod = key_event->modifiers();
+ const QString &txt = key_event->text();
+ QChar ch = !txt.isEmpty() ? txt.at(0) : 0;
+
+ if (ch >= 128)
+ ch = 0;
+ // on OSX, ascii control codes are not sent, force them
+ if (ch == 0 && (mod & Qt::ControlModifier) != 0) {
+ if (k >= Qt::Key_A && k <= Qt::Key_Underscore)
+ ch = QChar((k - (Qt::Key_A - 1)));
+ }
+
+ uchar result = (uchar) ch.cell();
+ //raw_printf("kV: k=%d, ch=%u", k, (unsigned) result);
+ return result;
+}
+
NetHackQtKeyBuffer::NetHackQtKeyBuffer() :
in(0), out(0)
{
}
-bool NetHackQtKeyBuffer::Empty() const { return in==out; }
-bool NetHackQtKeyBuffer::Full() const { return (in+1)%maxkey==out; }
+bool NetHackQtKeyBuffer::Empty() const
+{
+ return (in == out);
+}
+
+bool NetHackQtKeyBuffer::Full() const
+{
+ return (((in + 1) % maxkey) == out);
+}
void NetHackQtKeyBuffer::Put(int k, int a, uint kbstate)
{
//raw_printf("k:%3d a:'%s' s:0x%08x", k, visctrl((char) a), kbstate);
- if ( Full() ) return; // Safety
+ if (Full())
+ return; // Safety
key[in] = k;
ascii[in] = a;
state[in] = (Qt::KeyboardModifiers) kbstate;
namespace nethack_qt_ {
+// not part of any class; used in qt_menu.cpp, qt_xcmd.cpp, qt_yndlg.cpp
+extern uchar keyValue(QKeyEvent *key_event);
+
class NetHackQtKeyBuffer {
public:
NetHackQtKeyBuffer();
#include "qt_post.h"
#include "qt_menu.h"
#include "qt_menu.moc"
+#include "qt_key.h" // for keyValue()
#include "qt_glyph.h"
#include "qt_set.h"
#include "qt_streq.h"
void centerOnMain( QWidget* w );
// end temporary
-uchar keyValue(QKeyEvent *key_event)
-{
- // key_event manipulation derived from NetHackQtBind::notify()
- const int k = key_event->key();
- Qt::KeyboardModifiers mod = key_event->modifiers();
- QChar ch = !key_event->text().isEmpty() ? key_event->text().at(0) : 0;
- if (ch >= 128)
- ch = 0;
- // on OSX, ascii control codes are not sent, force them
- if (ch == 0 && (mod & Qt::ControlModifier) != 0) {
- if (k >= Qt::Key_A && k <= Qt::Key_Underscore)
- ch = QChar((k - (Qt::Key_A - 1)));
- }
- uchar result = (uchar) ch.cell();
- //raw_printf("kV: k=%d, ch=%d", k, result);
- return result;
-}
-
QSize NetHackQtTextListBox::sizeHint() const
{
QScrollBar *hscroll = horizontalScrollBar();
namespace nethack_qt_ {
-extern uchar keyValue(QKeyEvent *key_event); // also used in qt_xcmd.cpp
-
class NetHackQtTextListBox : public QListWidget {
public:
NetHackQtTextListBox(QWidget* parent = NULL) : QListWidget(parent) { }
#include "qt_post.h"
#include "qt_xcmd.h"
#include "qt_xcmd.moc"
+#include "qt_key.h" // for keyValue()
#include "qt_bind.h"
#include "qt_set.h"
#include "qt_str.h"
#include "qt_post.h"
#include "qt_yndlg.h"
#include "qt_yndlg.moc"
+#include "qt_key.h" // for keyValue()
#include "qt_str.h"
// temporary
}
}
-void NetHackQtYnDialog::keyPressEvent(QKeyEvent* event)
+void NetHackQtYnDialog::keyPressEvent(QKeyEvent *event)
{
- keypress = '\0';
- QString text(event->text());
- if (text.isEmpty()) /* && event->modifiers()) */
+ keypress = keyValue(event);
+ if (!keypress)
return;
- keypress = text.at(0).cell();
char *p = NULL;
if (*alt_answer && (p = strchr(alt_answer, keypress)) != 0)
keypress = alt_result[p - alt_answer];
int where = QString::fromLatin1(choices).indexOf(QChar(keypress));
if (allow_count && strchr("#0123456789", keypress)) {
- if (text == "#") {
+ if (keypress == '#') {
// 0 will be preselected; typing anything replaces it
le->setText(QString("0"));
le->home(true);
} else {
// digit will not be preselected; typing another appends
- le->setText(text);
+ le->setText(QChar(keypress));
le->end(false);
}
// (don't know whether this actually does anything useful)