mirror of
https://git.outfoxxed.me/quickshell/quickshell.git
synced 2026-04-10 06:11:54 +10:00
Compare commits
5 commits
08058326f0
...
ee1100eb98
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee1100eb98 | ||
|
|
9bf752ac33 | ||
|
|
313f4e47f6 | ||
|
|
6ef86dd5aa | ||
|
|
308f1e249b |
7 changed files with 52 additions and 9 deletions
|
|
@ -129,12 +129,13 @@ QString envInfo() {
|
||||||
auto stream = QTextStream(&info);
|
auto stream = QTextStream(&info);
|
||||||
|
|
||||||
for (auto** envp = environ; *envp != nullptr; ++envp) { // NOLINT
|
for (auto** envp = environ; *envp != nullptr; ++envp) { // NOLINT
|
||||||
auto prefixes = std::array<std::string_view, 5> {
|
auto prefixes = std::array<std::string_view, 6> {
|
||||||
"QS_",
|
"QS_",
|
||||||
"QT_",
|
"QT_",
|
||||||
"QML_",
|
"QML_",
|
||||||
"QML2_",
|
"QML2_",
|
||||||
"QSG_",
|
"QSG_",
|
||||||
|
"XDG_CURRENT_DESKTOP=",
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const auto& prefix: prefixes) {
|
for (const auto& prefix: prefixes) {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,18 @@ static QVector<QsEnginePlugin*> plugins; // NOLINT
|
||||||
|
|
||||||
void QsEnginePlugin::registerPlugin(QsEnginePlugin& plugin) { plugins.push_back(&plugin); }
|
void QsEnginePlugin::registerPlugin(QsEnginePlugin& plugin) { plugins.push_back(&plugin); }
|
||||||
|
|
||||||
|
void QsEnginePlugin::preinitPluginsOnly() {
|
||||||
|
plugins.removeIf([](QsEnginePlugin* plugin) { return !plugin->applies(); });
|
||||||
|
|
||||||
|
std::ranges::sort(plugins, [](QsEnginePlugin* a, QsEnginePlugin* b) {
|
||||||
|
return b->dependencies().contains(a->name());
|
||||||
|
});
|
||||||
|
|
||||||
|
for (QsEnginePlugin* plugin: plugins) {
|
||||||
|
plugin->preinit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void QsEnginePlugin::initPlugins() {
|
void QsEnginePlugin::initPlugins() {
|
||||||
plugins.removeIf([](QsEnginePlugin* plugin) { return !plugin->applies(); });
|
plugins.removeIf([](QsEnginePlugin* plugin) { return !plugin->applies(); });
|
||||||
|
|
||||||
|
|
@ -16,6 +28,10 @@ void QsEnginePlugin::initPlugins() {
|
||||||
return b->dependencies().contains(a->name());
|
return b->dependencies().contains(a->name());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
for (QsEnginePlugin* plugin: plugins) {
|
||||||
|
plugin->preinit();
|
||||||
|
}
|
||||||
|
|
||||||
for (QsEnginePlugin* plugin: plugins) {
|
for (QsEnginePlugin* plugin: plugins) {
|
||||||
plugin->init();
|
plugin->init();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,14 @@ public:
|
||||||
virtual QString name() { return QString(); }
|
virtual QString name() { return QString(); }
|
||||||
virtual QList<QString> dependencies() { return {}; }
|
virtual QList<QString> dependencies() { return {}; }
|
||||||
virtual bool applies() { return true; }
|
virtual bool applies() { return true; }
|
||||||
|
virtual void preinit() {}
|
||||||
virtual void init() {}
|
virtual void init() {}
|
||||||
virtual void registerTypes() {}
|
virtual void registerTypes() {}
|
||||||
virtual void constructGeneration(EngineGeneration& /*unused*/) {} // NOLINT
|
virtual void constructGeneration(EngineGeneration& /*unused*/) {} // NOLINT
|
||||||
virtual void onReload() {}
|
virtual void onReload() {}
|
||||||
|
|
||||||
static void registerPlugin(QsEnginePlugin& plugin);
|
static void registerPlugin(QsEnginePlugin& plugin);
|
||||||
|
static void preinitPluginsOnly();
|
||||||
static void initPlugins();
|
static void initPlugins();
|
||||||
static void runConstructGeneration(EngineGeneration& generation);
|
static void runConstructGeneration(EngineGeneration& generation);
|
||||||
static void runOnReload();
|
static void runOnReload();
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,11 @@
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
#include <cpptrace/basic.hpp>
|
#include <cpptrace/basic.hpp>
|
||||||
#include <cpptrace/forward.hpp>
|
#include <cpptrace/forward.hpp>
|
||||||
|
#include <cpptrace/utils.hpp>
|
||||||
#include <qdatastream.h>
|
#include <qdatastream.h>
|
||||||
#include <qfile.h>
|
#include <qfile.h>
|
||||||
#include <qlogging.h>
|
#include <qlogging.h>
|
||||||
|
|
@ -58,6 +60,12 @@ void signalHandler(
|
||||||
siginfo_t* /*info*/, // NOLINT (misc-include-cleaner)
|
siginfo_t* /*info*/, // NOLINT (misc-include-cleaner)
|
||||||
void* /*context*/
|
void* /*context*/
|
||||||
) {
|
) {
|
||||||
|
// NOLINTBEGIN (misc-include-cleaner)
|
||||||
|
sigset_t set;
|
||||||
|
sigfillset(&set);
|
||||||
|
sigprocmask(SIG_UNBLOCK, &set, nullptr);
|
||||||
|
// NOLINTEND
|
||||||
|
|
||||||
if (CrashInfo::INSTANCE.traceFd != -1) {
|
if (CrashInfo::INSTANCE.traceFd != -1) {
|
||||||
auto traceBuffer = std::array<cpptrace::frame_ptr, 1024>();
|
auto traceBuffer = std::array<cpptrace::frame_ptr, 1024>();
|
||||||
auto frameCount = cpptrace::safe_generate_raw_trace(traceBuffer.data(), traceBuffer.size(), 1);
|
auto frameCount = cpptrace::safe_generate_raw_trace(traceBuffer.data(), traceBuffer.size(), 1);
|
||||||
|
|
@ -79,13 +87,9 @@ void signalHandler(
|
||||||
fail:;
|
fail:;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: coredump fork and crash reporter remain as zombies, fix
|
||||||
auto coredumpPid = fork();
|
auto coredumpPid = fork();
|
||||||
if (coredumpPid == 0) {
|
if (coredumpPid == 0) {
|
||||||
// NOLINTBEGIN (misc-include-cleaner)
|
|
||||||
sigset_t set;
|
|
||||||
sigfillset(&set);
|
|
||||||
sigprocmask(SIG_UNBLOCK, &set, nullptr);
|
|
||||||
// NOLINTEND
|
|
||||||
raise(sig);
|
raise(sig);
|
||||||
_exit(-1);
|
_exit(-1);
|
||||||
}
|
}
|
||||||
|
|
@ -131,7 +135,6 @@ void signalHandler(
|
||||||
perror("Failed to fork and launch crash reporter.\n");
|
perror("Failed to fork and launch crash reporter.\n");
|
||||||
_exit(-1);
|
_exit(-1);
|
||||||
} else if (pid == 0) {
|
} else if (pid == 0) {
|
||||||
|
|
||||||
// dup to remove CLOEXEC
|
// dup to remove CLOEXEC
|
||||||
auto dumpFdStr = std::array<char, 48>();
|
auto dumpFdStr = std::array<char, 48>();
|
||||||
auto logFdStr = std::array<char, 48>();
|
auto logFdStr = std::array<char, 48>();
|
||||||
|
|
@ -155,6 +158,21 @@ void signalHandler(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleCppTerminate() {
|
||||||
|
if (auto ptr = std::current_exception()) {
|
||||||
|
try {
|
||||||
|
std::rethrow_exception(ptr);
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
qFatal().nospace() << "Terminate called with C++ exception ("
|
||||||
|
<< cpptrace::demangle(typeid(e).name()).data() << "): " << e.what();
|
||||||
|
} catch (...) {
|
||||||
|
qFatal() << "Terminate called with non exception object";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qFatal() << "Terminate called without active C++ exception";
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void CrashHandler::init() {
|
void CrashHandler::init() {
|
||||||
|
|
@ -203,6 +221,8 @@ void CrashHandler::init() {
|
||||||
|
|
||||||
// NOLINTEND (misc-include-cleaner)
|
// NOLINTEND (misc-include-cleaner)
|
||||||
|
|
||||||
|
std::set_terminate(&handleCppTerminate);
|
||||||
|
|
||||||
qCInfo(logCrashHandler) << "Crash handler initialized.";
|
qCInfo(logCrashHandler) << "Crash handler initialized.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
#include "../core/logging.hpp"
|
#include "../core/logging.hpp"
|
||||||
#include "../core/logging_p.hpp"
|
#include "../core/logging_p.hpp"
|
||||||
#include "../core/paths.hpp"
|
#include "../core/paths.hpp"
|
||||||
|
#include "../core/plugin.hpp"
|
||||||
#include "../core/ringbuf.hpp"
|
#include "../core/ringbuf.hpp"
|
||||||
#include "interface.hpp"
|
#include "interface.hpp"
|
||||||
|
|
||||||
|
|
@ -238,6 +239,9 @@ void qsCheckCrash(int argc, char** argv) {
|
||||||
|
|
||||||
qCInfo(logCrashReporter) << "Starting crash reporter...";
|
qCInfo(logCrashReporter) << "Starting crash reporter...";
|
||||||
|
|
||||||
|
// Required platform compatibility hooks
|
||||||
|
QsEnginePlugin::preinitPluginsOnly();
|
||||||
|
|
||||||
recordCrashInfo(crashDir, info.instance);
|
recordCrashInfo(crashDir, info.instance);
|
||||||
|
|
||||||
auto gui = CrashReporterGui(crashDir.path(), crashProc);
|
auto gui = CrashReporterGui(crashDir.path(), crashProc);
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@
|
||||||
#include <EGL/egl.h>
|
#include <EGL/egl.h>
|
||||||
#include <EGL/eglext.h>
|
#include <EGL/eglext.h>
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <GLES3/gl32.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <gbm.h>
|
#include <gbm.h>
|
||||||
#include <libdrm/drm_fourcc.h>
|
#include <libdrm/drm_fourcc.h>
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,9 @@ class WaylandPlugin: public QsEnginePlugin {
|
||||||
return isWayland;
|
return isWayland;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void preinit() override { installWlProxySafeDeref(); }
|
||||||
|
|
||||||
void init() override {
|
void init() override {
|
||||||
installWlProxySafeDeref();
|
|
||||||
installPlatformMenuHook();
|
installPlatformMenuHook();
|
||||||
installPopupPositioner();
|
installPopupPositioner();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue