blob: 952a2ad8a002d1b4eeef7688678248a3a2e3f1a2 [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1 */
/*
* Copyright (C) 2017 VMware Inc, Yordan Karadzhov <ykaradzhov@vmware.com>
*/
/**
* @file KsMainWindow.hpp
* @brief KernelShark GUI main window.
*/
#ifndef _KS_MAINWINDOW_H
#define _KS_MAINWINDOW_H
// Qt
#include <QMainWindow>
#include <QLocalServer>
// KernelShark
#include "KsTraceViewer.hpp"
#include "KsTraceGraph.hpp"
#include "KsWidgetsLib.hpp"
#include "KsPlugins.hpp"
#include "KsSession.hpp"
#include "KsUtils.hpp"
/**
* The KsMainWindow class provides Main window for the KernelShark GUI.
*/
class KsMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit KsMainWindow(QWidget *parent = nullptr);
~KsMainWindow();
void loadDataFile(const QString &fileName);
void appendDataFile(const QString &fileName);
void loadSession(const QString &fileName);
QString lastSessionFile();
/**
* @brief Register a list of plugins.
*
* @param plugins: Provide here the names of the plugin (as in the
* CMake-generated header file) or the names of the
* plugin's library files (.so including path).
* The names must be comma separated.
*/
void registerPlugins(const QString &plugins)
{
_plugins.registerPlugins(plugins);
}
/**
* @brief Unregister a list pf plugins.
*
* @param pluginNames: Provide here a comma separated list of plugin
* names (as in the CMake-generated header file).
*/
void unregisterPlugins(const QString &pluginNames)
{
_plugins.unregisterPlugins(pluginNames);
}
/**
* @brief Register a given plugin to given Data streams.
*
* @param pluginName: The name of the plugin to register.
* @param streamIds: Vector of Data stream identifiers.
*/
void registerPluginToStream(const QString &pluginName, QVector<int> streamIds)
{
_plugins.registerPluginToStream(pluginName, streamIds);
}
/**
* @brief Unregister a given plugin from given Data streams.
*
* @param pluginName: The name of the plugin to unregister.
* @param streamIds: Vector of Data stream identifiers.
*/
void unregisterPluginFromStream(const QString &pluginName, QVector<int> streamIds)
{
_plugins.unregisterPluginFromStream(pluginName, streamIds);
}
void setCPUPlots(int sd, QVector<int> cpus);
void setTaskPlots(int sd, QVector<int> pids);
void resizeEvent(QResizeEvent* event);
/** Set the Full Screen mode. */
void setFullScreenMode(bool f) {
if ((!isFullScreen() && f) || (isFullScreen() && !f) )
_changeScreenMode();
}
void addPluginMenu(QString place, pluginActionFunc action);
/** Get the KsTraceGraph object. */
KsTraceGraph *graphPtr() {return &_graph;}
/** Get the KsTraceViewer object. */
KsTraceViewer *viewPtr() {return &_view;}
/** Get the KsWorkInProgress object. */
KsWidgetsLib::KsWorkInProgress *wipPtr() {return &_workInProgress;}
void markEntry(ssize_t row, DualMarkerState st);
void markEntry(const kshark_entry *e, DualMarkerState st);
private:
QSplitter _splitter;
/** GUI session. */
KsSession _session;
/** Data Manager. */
KsDataStore _data;
/** Widget for reading and searching in the trace data. */
KsTraceViewer _view;
/** Widget for graphical visualization of the trace data. */
KsTraceGraph _graph;
/** Dual Marker State Machine. */
KsDualMarkerSM _mState;
/** Plugin manager. */
KsPluginManager _plugins;
/** The process used to record trace data. */
QProcess _capture;
/** Local Server used for comunucation with the Capture process. */
QLocalServer _captureLocalServer;
// File menu.
QAction _openAction;
QAction _appendAction;
QAction _restoreSessionAction;
QAction _importSessionAction;
QAction _exportSessionAction;
QAction _quitAction;
// Filter menu.
QCheckBox *_graphFilterSyncCBox;
QCheckBox *_listFilterSyncCBox;
QAction _showEventsAction;
QAction _showTasksAction;
QAction _showCPUsAction;
QAction _advanceFilterAction;
QAction _clearAllFilters;
// Plots menu.
QAction _cpuSelectAction;
QAction _taskSelectAction;
// Tools menu.
QAction _managePluginsAction;
QAction _addPluginsAction;
QAction _captureAction;
QAction _addOffcetAction;
QWidgetAction _colorAction;
QWidget _colSlider;
QSlider _colorPhaseSlider;
QAction _fullScreenModeAction;
// Help menu.
QAction _aboutAction;
QAction _contentsAction;
QAction _bugReportAction;
QShortcut _deselectShortcut;
QString _lastDataFilePath, _lastConfFilePath, _lastPluginFilePath;
QSettings _settings;
QMetaObject::Connection _captureErrorConnection;
// Status bar.
KsWidgetsLib::KsWorkInProgress _workInProgress;
bool _updateSessionSize;
void _load(const QString& fileName, bool append);
void _open();
void _append();
void _restoreSession();
void _importSession();
void _exportSession();
void _listFilterSync(int state);
void _graphFilterSync(int state);
void _presetCBWidget(kshark_hash_id *showFilter,
kshark_hash_id *hideFilter,
KsWidgetsLib::KsCheckBoxWidget *cbw);
void _applyFilter(int sd, QVector<int> all, QVector<int> show,
std::function<void(int, QVector<int>)> posFilter,
std::function<void(int, QVector<int>)> negFilter);
void _showEvents();
void _showTasks();
void _showCPUs();
void _advancedFiltering();
void _clearFilters();
void _cpuSelect();
void _taskSelect();
void _pluginSelect();
void _pluginUpdate(int sd, QVector<int> pluginStates);
void _pluginAdd();
void _record();
void _offset();
void _setColorPhase(int);
void _changeScreenMode();
void _aboutInfo();
void _contents();
void _bugReport();
void _captureStarted();
void _captureError(QProcess::ProcessError error);
void _captureErrorMessage(QProcess *capture);
void _readSocket();
void _splitterMoved(int pos, int index);
void _createActions();
void _createMenus();
void _initCapture();
void _updateSession();
inline void _resizeEmpty() {resize(SCREEN_WIDTH * .5, FONT_HEIGHT * 3);}
void _error(const QString &text,
const QString &errCode,
bool resize);
void _deselectActive();
void _deselectA();
void _deselectB();
void _rootWarning();
void _updateFilterMenu();
void _filterSyncCBoxUpdate(kshark_context *kshark_ctx);
QString _getCacheDir();
private slots:
void _captureFinished(int, QProcess::ExitStatus);
};
#endif // _KS_MAINWINDOW_H