-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcmd_processor.h
More file actions
85 lines (68 loc) · 2.86 KB
/
Copy pathcmd_processor.h
File metadata and controls
85 lines (68 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// cmd_processor.h
#ifndef _CMD_PROCESSOR_H
# define _CMD_PROCESSOR_H
# include "adhoc_keyseq.h"
# include "setting_builder.h"
# include "cmd_stream_reader.h"
# include "multithread.h"
# include <functional>
# include <memory>
# include <utility>
# include <vector>
class CmdProcessor
{
public:
// onCommit: passes std::shared_ptr<Setting>
using CommitCallback = std::function<void(std::shared_ptr<Setting>)>;
void onCommit(CommitCallback cb);
// onExecKeySeq: passes AdHocKeySeq
using ExecKeySeqCallback = std::function<void(AdHocKeySeq)>;
void onExecKeySeq(ExecKeySeqCallback cb);
CmdProcessor(SyncObject *soLog, std::wostream *log);
/// Read commands from cr in a loop until EOF.
void process(CmdStreamReader &cr);
// Visitor operators (public: required by std::visit)
void operator()(CmdArgsReset);
void operator()(CmdArgsRegKeySeq &);
void operator()(CmdArgsExecKeySeq &);
void operator()(CmdArgsDefKey &);
void operator()(CmdArgsDefMod &);
void operator()(CmdArgsDefSync &);
void operator()(CmdArgsDefAlias &);
void operator()(CmdArgsDefSubst &);
void operator()(CmdArgsDefOption &);
void operator()(CmdArgsDefSymbol &);
void operator()(CmdArgsDefKeymap &);
void operator()(CmdArgsAssignKey &);
void operator()(CmdArgsAssignEvent &);
void operator()(CmdArgsAssignMod &);
void operator()(CmdArgsEndKeymap);
void operator()(CmdArgsCommit);
private:
void error(const std::wstring &msg);
void warning(const std::wstring &msg);
void beginSetting();
void applyDefSubst(const CmdArgsDefSubst &data);
bool nlsScanCode(const std::wstring &item, USHORT *o_code);
void parseNlsKeys(const wstringi &value);
static bool lookupModifierType(const wstringi &name, Modifier::Type *o_mt);
static Keymap::AssignMode parseAssignMode(const wstringi &s);
SyncObject *m_soLog;
std::wostream *m_log;
// Commands whose resolution is deferred until Commit: keyseq actions may
// reference keys / keymaps / keyseqs defined later in the stream, and
// substitutes read the contents of a materialized keyseq.
std::vector<std::pair<KeySeq *, CmdArgsRegKeySeq>> m_pendingKeySeqs;
std::vector<CmdArgsDefSubst> m_pendingSubsts;
/// Keymaps displaced by a Block-scoped DefKeymap, innermost last. Only the
/// block form of `keymap`/`window` opens one, so this stays empty for a
/// stream that comes from .mayu (which only ever emits Enter).
std::vector<Keymap *> m_keymapStack;
std::shared_ptr<Setting> m_setting; ///< Setting being built (Reset .. Commit)
std::shared_ptr<Setting> m_committed; ///< last committed Setting (used by ExecKeySeq)
std::unique_ptr<SettingBuilder> m_builder; ///< valid between Reset and Commit
CommitCallback m_commitCallback;
ExecKeySeqCallback m_execKeySeqCallback;
};
#endif // !_CMD_PROCESSOR_H