wxMaxima
Loading...
Searching...
No Matches
Maxima.h
Go to the documentation of this file.
1// -*- mode: c++; c-file-style: "linux"; c-basic-offset: 2; indent-tabs-mode: nil -*-
2//
3// Copyright (C) 2004-2015 Andrej Vodopivec <andrej.vodopivec@gmail.com>
4// (C) 2014-2018 Gunter Königsmann <wxMaxima@physikbuch.de>
5// (C) 2020 Kuba Ober <kuba@bertec.com>
6//
7// This program is free software; you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation; either version 2 of the License, or
10// (at your option) any later version.
11//
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21//
22// SPDX-License-Identifier: GPL-2.0+
23
24#ifndef WXMAXIMA_MAXIMA_H
25#define WXMAXIMA_MAXIMA_H
26
32#include <wx/defs.h>
33#include <wx/buffer.h>
34#include <wx/event.h>
35#include <wx/sckstrm.h>
36#include <wx/txtstrm.h>
37#include <wx/socket.h>
38#include <wx/string.h>
39#include <wx/timer.h>
40#include <memory>
41#include <thread>
42#include <atomic>
43#include <mutex>
44#include "Configuration.h"
45#include "Compat.h"
46
47// TEMPORARY shutdown tracing to find where wxMaxima wedges during teardown on
48// the Windows CI (the hang happens after wxLog::EnableLogging(false), so it uses
49// raw fprintf(stderr) rather than wxLogMessage). Silent unless the
50// WXM_SHUTDOWN_TRACE environment variable is set, so it is a no-op in normal use
51// on every platform. Remove once the teardown hang is fixed.
52void WxmShutdownTrace(const char *where);
53
69class Maxima : public wxEvtHandler
70{
71public:
74 explicit Maxima(wxSocketBase *socket, Configuration *config);
75 virtual ~Maxima() override;
76
82 static wxString EscapeVarnameForMaxima(wxString var);
84 static wxString InvertCase(const wxString &var);
86 static wxString MaximaVarnameToLisp(wxString var);
87
88 wxSocketBase *Socket() const { return m_socket.get(); }
89
91 bool IsConnected() const { return m_socket->IsConnected(); }
92
94 static void SetPipeToStdErr(bool pipe) { m_pipeToStderr = pipe; }
96 static void GetPipeToStdErr(bool pipe) { m_pipeToStderr = pipe; }
97 static bool GetPipeToStdErr() { return m_pipeToStderr; }
98
107 bool Write(const void *buffer, std::size_t length);
108
111 void ReadSocket();
112
115 void ClearFirstPrompt() { m_firstPrompt = false; }
116
122 XML_PROMPT,
123 XML_SUPPRESSOUTPUT,
124 XML_WXXMLSYMBOLS,
125 XML_VARIABLES,
126 XML_WATCH_VARIABLES_ADD,
127 XML_STATUSBAR,
128 XML_HTML_MANUAL_KEYWORDS,
129 XML_MATHS,
130 XML_TOOLONGMATHS,
131 XML_WXXML_KEY,
138 STRING_FOR_XMLINSPECTOR,
139 };
140 void XmlInspectorActive(bool active){m_xmlInspector = active;}
141private:
143 std::atomic_bool m_xmlInspector{false};
144
146 Configuration *m_configuration;
147
149 jthread m_workerThread;
151 std::atomic_bool m_readPendingQueued;
152
154 void SocketEvent(wxSocketEvent &event);
156 void TimerEvent(wxTimerEvent &event);
158 void OnIdle(wxIdleEvent &event);
159
160 std::unique_ptr<wxSocketBase> m_socket;
162 std::mutex m_socketMutex;
164 wxSocketInputStream m_socketInput;
173 wxTextInputStream m_textInput;
174
179 wxString m_socketInputData;
180
184 wxString m_processingBuffer;
185
189 std::vector<std::vector<char>> m_outputQueue;
190 std::mutex m_outputQueueMutex;
191
194 struct InterpretedItem {
195 EventCause cause;
196 wxString data;
197 };
198 std::vector<InterpretedItem> m_interpretedQueue;
199 std::mutex m_interpretedQueueMutex;
200
206 wxMemoryBuffer m_socketOutputData;
207
209 bool m_firstPrompt = true;
211 static bool m_pipeToStderr;
212
218 void WorkerThread(stop_token stopToken);
219
230 void ProcessData(stop_token stopToken);
239 wxTimer m_readIdleTimer{this};
241 static std::unordered_map<wxString, EventCause, wxStringHash> m_knownTags;
242 static std::mutex m_knownTagsMutex;
243};
244
245wxDECLARE_EVENT(EVT_MAXIMA, wxThreadEvent);
246#endif
Small C++ standard-library compatibility shims.
The configuration storage for the current worksheet.
Definition: Configuration.h:88
Interface to the Maxima process.
Definition: Maxima.h:70
EventCause
Definition: Maxima.h:117
@ WRITE_PENDING
A write to Maxima is still ongoing. We use this event to keep the traffic indicator alive.
Definition: Maxima.h:135
@ READ_PENDING
There's still pending data coming from Maxima. The Data member is empty at the moment.
Definition: Maxima.h:119
@ WRITE_ERROR
The transmission has failed - this is an unrecoverable error, most likely.
Definition: Maxima.h:137
@ DISCONNECTED
Maxima has disconnected (possibly because the process had died).
Definition: Maxima.h:133
@ READ_MISC_TEXT
Maxima has sent non-XML text.
Definition: Maxima.h:121
void ReadSocket()
Read whatever data is in the socket. This is normally handled by the event handler,...
Definition: Maxima.cpp:140
static void GetPipeToStdErr(bool pipe)
Tells if the user wants all data to maxima to be copied to StdErr.
Definition: Maxima.h:96
static wxString MaximaVarnameToLisp(wxString var)
Convert a human-readable maxima variable name to one lisp understands.
Definition: Maxima.cpp:397
static wxString InvertCase(const wxString &var)
Invert case of chars that have inverted case in lisp.
Definition: Maxima.cpp:320
static void SetPipeToStdErr(bool pipe)
Tells us if the user wants all data to maxima to be copied to StdErr.
Definition: Maxima.h:94
bool IsConnected() const
Are we connected to Maxima?
Definition: Maxima.h:91
static wxString EscapeVarnameForMaxima(wxString var)
Convert a human-readable maxima variable name to one maxima understands.
Definition: Maxima.cpp:335
bool Write(const void *buffer, std::size_t length)
Write more data to be sent to maxima.
Definition: Maxima.cpp:123
void ClearFirstPrompt()
Clear the first prompt state, based on what was read from maxima. This is called from prompt recogniz...
Definition: Maxima.h:115
Definition: Compat.h:54
Definition: Compat.h:43