mirror of
https://github.com/Mudlet/Mudlet
synced 2026-08-13 18:26:27 -04:00
#### Brief overview of PR changes/additions - Comment-only. `git diff origin/development...HEAD` changes no statement, expression or declaration - every added and removed line is a comment. 238 comment lines become 98. - Applies the house standard to the comments added by "fix: a trigger that re-creates itself freezes Mudlet" (#9697) and "Fix user key bindings on Ctrl+1 to Ctrl+9 and Ctrl+Tab" (#9703): no historical passages, and the rest cut to what a reader cannot derive from the code. - Corrects four claims that were wrong, two of them inherited from those PRs: a fires-per-line measurement taken with a smaller budget than the one that shipped, an over-general note on `shortcutInstalledFor()`, a `KeyUnit::disableKey()` note that had the mechanism backwards, and a test comment crediting the `isEmpty()` guard for a result it does not produce. #### Motivation for adding to Mudlet Both PRs merged while their comment-reduction pass was still in flight, so the trim never landed with them. #### Other info (issues closed, discussion etc) The gotchas worth keeping survive in shorter form: why the same-line creation budget is counted per pass rather than sharing the `feedTriggers()` depth counter, why permanent triggers get `deactivate()` and not `setIsActive(false)`, why `mCleanupSet` rather than the deactivation is what stops `enableTrigger()` resurrecting a spent trigger, that `QShortcutMap` retries with consumed modifiers stripped, and the `Key_Backtab` versus `Shift+Tab` spelling. The matching trim for "fix: stop treating long-time Mudlet users as brand new players" (#9695) already landed separately as #9707, so it is not repeated here. No demo video: a comment-only change is not observable on screen. **Test case:** `ctest` in the build directory - 79/80, with `TelnetBenchmark` timing out only under parallel load (31s standalone against a 60s limit) on a path this PR does not touch. `TriggerSameLineMatchTest`, `UnitDeferredDeleteTest`, `ProfileSwitchShortcutTest` and `ExperiencedPlayerGateTest` all pass. Assisted-by: Claude:claude-opus-5
115 lines
4.4 KiB
C++
115 lines
4.4 KiB
C++
#ifndef MUDLET_KEYUNIT_H
|
|
#define MUDLET_KEYUNIT_H
|
|
|
|
/***************************************************************************
|
|
* Copyright (C) 2008-2011 by Heiko Koehn - KoehnHeiko@googlemail.com *
|
|
* Copyright (C) 2014 by Ahmed Charles - acharles@outlook.com *
|
|
* Copyright (C) 2018, 2020, 2022-2023 by Stephen Lyons *
|
|
* - slysven@virginmedia.com *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU General Public License *
|
|
* along with this program; if not, write to the *
|
|
* Free Software Foundation, Inc., *
|
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
|
***************************************************************************/
|
|
|
|
|
|
#include "utils.h"
|
|
|
|
#include <QMap>
|
|
#include <QObject>
|
|
#include <QPointer>
|
|
#include <QSet>
|
|
#include <QString>
|
|
|
|
#include <list>
|
|
|
|
class Host;
|
|
class TKey;
|
|
|
|
class KeyUnit : public QObject
|
|
{
|
|
Q_OBJECT // Needed for a couple of translations
|
|
|
|
friend class XMLexport;
|
|
friend class XMLimport;
|
|
|
|
public:
|
|
explicit KeyUnit(Host* pHost);
|
|
~KeyUnit();
|
|
|
|
std::list<TKey*> getKeyRootNodeList() { return mKeyRootNodeList; }
|
|
|
|
TKey* getKey(int id);
|
|
void removeAllTempKeys();
|
|
void compileAll();
|
|
TKey* findFirstKey(QString& name);
|
|
std::vector<int> findItems(const QString& name, const bool exactMatch, const bool caseSensitive);
|
|
bool enableKey(const QString& name);
|
|
bool disableKey(const QString& name);
|
|
bool killKey(QString& name);
|
|
bool registerKey(TKey* pT);
|
|
void unregisterKey(TKey* pT);
|
|
void reParentKey(int childID, int oldParentID, int newParentID, int parentPosition = -1, int childPosition = -1);
|
|
void reParentKey(int childID, int oldParentID, int newParentID, TreeItemInsertMode mode, int position = 0);
|
|
std::tuple<QString, int, int, int> assembleReport();
|
|
int getNewID();
|
|
QString getKeyName(const Qt::Key, const Qt::KeyboardModifiers) const;
|
|
void setupKeyNames();
|
|
void uninstall(const QString&);
|
|
void _uninstall(TKey* pChild, const QString& packageName);
|
|
bool processDataStream(const Qt::Key, const Qt::KeyboardModifiers);
|
|
// Query-only counterpart to processDataStream(), which executes what it matches
|
|
bool wouldMatch(const Qt::Key, const Qt::KeyboardModifiers) const;
|
|
void markCleanup(TKey* pT);
|
|
void doCleanup();
|
|
int processingDepth() const { return mProcessingDepth; }
|
|
void stopAllTriggers();
|
|
void reenableAllTriggers();
|
|
|
|
|
|
QMultiMap<QString, TKey*> mLookupTable;
|
|
QSet<TKey*> mCleanupSet;
|
|
QList<TKey*> uninstallList;
|
|
// Past behaviour is to only process the first key binding that matches,
|
|
// ignoring any duplicates - but changing that behaviour unconditionally
|
|
// could break things - so only do it if this flag is set:
|
|
bool mRunAllKeyMatches;
|
|
|
|
|
|
private:
|
|
KeyUnit() = default;
|
|
|
|
TKey* getKeyPrivate(int id);
|
|
void resetStats();
|
|
void assembleReport(TKey*);
|
|
void addKeyRootNode(TKey* pT, int parentPosition = -1, int childPosition = -1, bool moveKey = false);
|
|
void addKey(TKey* pT);
|
|
void removeKeyRootNode(TKey* pT);
|
|
void removeKey(TKey*);
|
|
|
|
|
|
QPointer<Host> mpHost;
|
|
QMap<int, TKey*> mKeyMap;
|
|
std::list<TKey*> mKeyRootNodeList;
|
|
int mMaxID;
|
|
bool mModuleMember;
|
|
QMap<int, QString> mKeys;
|
|
int statsItemsTotal = 0;
|
|
int statsTempItems = 0;
|
|
int statsActiveItems = 0;
|
|
// Counter for nested processing; cleanup deferred until 0
|
|
int mProcessingDepth = 0;
|
|
};
|
|
|
|
#endif // MUDLET_KEYUNIT_H
|