mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-08-22 23:43:50 -07:00
internal: reference command-line arguments instead of copying them (#11422)
Eliminates the need to copy command-line arguments into a std::vector<std::string>, reducing memory usage and improving performance by referencing the original arguments directly.
This commit is contained in:
@@ -22,11 +22,16 @@
|
||||
#include <filesystem>
|
||||
#include <hyprutils/os/Process.hpp>
|
||||
#include <hyprutils/memory/WeakPtr.hpp>
|
||||
#include <hyprutils/memory/Casts.hpp>
|
||||
using namespace Hyprutils::Memory;
|
||||
|
||||
#include <csignal>
|
||||
#include <cerrno>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
#include <print>
|
||||
#include <string_view>
|
||||
#include <span>
|
||||
|
||||
#include "Log.hpp"
|
||||
|
||||
@@ -87,97 +92,101 @@ static void help() {
|
||||
|
||||
int main(int argc, char** argv, char** envp) {
|
||||
|
||||
std::string configPath = "";
|
||||
std::string binaryPath = "";
|
||||
std::string pluginPath = std::filesystem::current_path().string();
|
||||
std::string configPath = "";
|
||||
std::string binaryPath = "";
|
||||
std::string pluginPath = std::filesystem::current_path().string();
|
||||
|
||||
std::vector<std::string> args{argv + 1, argv + argc};
|
||||
if (argc > 1) {
|
||||
std::span<char*> args{argv + 1, sc<std::size_t>(argc - 1)};
|
||||
|
||||
for (auto it = args.begin(); it != args.end(); it++) {
|
||||
if (*it == "--config" || *it == "-c") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
for (auto it = args.begin(); it != args.end(); it++) {
|
||||
std::string_view value = *it;
|
||||
|
||||
return 1;
|
||||
}
|
||||
if (value == "--config" || value == "-c") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
configPath = *std::next(it);
|
||||
|
||||
try {
|
||||
configPath = std::filesystem::canonical(configPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(configPath)) {
|
||||
throw std::exception();
|
||||
return 1;
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Config file '{}' doesn't exist!", configPath);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
configPath = *std::next(it);
|
||||
|
||||
it++;
|
||||
try {
|
||||
configPath = std::filesystem::canonical(configPath);
|
||||
|
||||
continue;
|
||||
} else if (*it == "--binary" || *it == "-b") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
if (!std::filesystem::is_regular_file(configPath)) {
|
||||
throw std::exception();
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Config file '{}' doesn't exist!", configPath);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
binaryPath = *std::next(it);
|
||||
|
||||
try {
|
||||
binaryPath = std::filesystem::canonical(binaryPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(binaryPath)) {
|
||||
throw std::exception();
|
||||
return 1;
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Binary '{}' doesn't exist!", binaryPath);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
it++;
|
||||
|
||||
it++;
|
||||
continue;
|
||||
} else if (value == "--binary" || value == "-b") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
continue;
|
||||
} else if (*it == "--plugin" || *it == "-p") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
pluginPath = *std::next(it);
|
||||
|
||||
try {
|
||||
pluginPath = std::filesystem::canonical(pluginPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(pluginPath)) {
|
||||
throw std::exception();
|
||||
return 1;
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] plugin '{}' doesn't exist!", pluginPath);
|
||||
|
||||
binaryPath = *std::next(it);
|
||||
|
||||
try {
|
||||
binaryPath = std::filesystem::canonical(binaryPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(binaryPath)) {
|
||||
throw std::exception();
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Binary '{}' doesn't exist!", binaryPath);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
it++;
|
||||
|
||||
continue;
|
||||
} else if (value == "--plugin" || value == "-p") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
pluginPath = *std::next(it);
|
||||
|
||||
try {
|
||||
pluginPath = std::filesystem::canonical(pluginPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(pluginPath)) {
|
||||
throw std::exception();
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] plugin '{}' doesn't exist!", pluginPath);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
it++;
|
||||
|
||||
continue;
|
||||
} else if (value == "--help" || value == "-h") {
|
||||
help();
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
std::println(stderr, "[ ERROR ] Unknown option '{}' !", *it);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
it++;
|
||||
|
||||
continue;
|
||||
} else if (*it == "--help" || *it == "-h") {
|
||||
help();
|
||||
|
||||
return 0;
|
||||
} else {
|
||||
std::println(stderr, "[ ERROR ] Unknown option '{}' !", *it);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
160
src/main.cpp
160
src/main.cpp
@@ -7,8 +7,10 @@
|
||||
|
||||
#include <cstdio>
|
||||
#include <hyprutils/string/String.hpp>
|
||||
#include <hyprutils/memory/Casts.hpp>
|
||||
#include <print>
|
||||
using namespace Hyprutils::String;
|
||||
using namespace Hyprutils::Memory;
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <iostream>
|
||||
@@ -16,6 +18,8 @@ using namespace Hyprutils::String;
|
||||
#include <vector>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <span>
|
||||
#include <filesystem>
|
||||
|
||||
static void help() {
|
||||
@@ -48,92 +52,96 @@ int main(int argc, char** argv) {
|
||||
setenv("MOZ_ENABLE_WAYLAND", "1", 1);
|
||||
|
||||
// parse some args
|
||||
std::string configPath;
|
||||
std::string socketName;
|
||||
int socketFd = -1;
|
||||
bool ignoreSudo = false, verifyConfig = false;
|
||||
std::string configPath;
|
||||
std::string socketName;
|
||||
int socketFd = -1;
|
||||
bool ignoreSudo = false, verifyConfig = false;
|
||||
|
||||
std::vector<std::string> args{argv + 1, argv + argc};
|
||||
if (argc > 1) {
|
||||
std::span<char*> args{argv + 1, sc<std::size_t>(argc - 1)};
|
||||
|
||||
for (auto it = args.begin(); it != args.end(); it++) {
|
||||
if (*it == "--i-am-really-stupid" && !ignoreSudo) {
|
||||
std::println("[ WARNING ] Running Hyprland with superuser privileges might damage your system");
|
||||
for (auto it = args.begin(); it != args.end(); it++) {
|
||||
std::string_view value = *it;
|
||||
|
||||
ignoreSudo = true;
|
||||
} else if (*it == "--socket") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
if (value == "--i-am-really-stupid" && !ignoreSudo) {
|
||||
std::println("[ WARNING ] Running Hyprland with superuser privileges might damage your system");
|
||||
|
||||
return 1;
|
||||
}
|
||||
ignoreSudo = true;
|
||||
} else if (value == "--socket") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
socketName = *std::next(it);
|
||||
it++;
|
||||
} else if (*it == "--wayland-fd") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
try {
|
||||
socketFd = std::stoi(*std::next(it));
|
||||
|
||||
// check if socketFd is a valid file descriptor
|
||||
if (fcntl(socketFd, F_GETFD) == -1)
|
||||
throw std::exception();
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Invalid Wayland FD!");
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
it++;
|
||||
} else if (*it == "-c" || *it == "--config") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
configPath = *std::next(it);
|
||||
|
||||
try {
|
||||
configPath = std::filesystem::canonical(configPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(configPath)) {
|
||||
throw std::exception();
|
||||
return 1;
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Config file '{}' doesn't exist!", configPath);
|
||||
|
||||
socketName = *std::next(it);
|
||||
it++;
|
||||
} else if (value == "--wayland-fd") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
try {
|
||||
socketFd = std::stoi(*std::next(it));
|
||||
|
||||
// check if socketFd is a valid file descriptor
|
||||
if (fcntl(socketFd, F_GETFD) == -1)
|
||||
throw std::exception();
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Invalid Wayland FD!");
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
it++;
|
||||
} else if (value == "-c" || value == "--config") {
|
||||
if (std::next(it) == args.end()) {
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
configPath = *std::next(it);
|
||||
|
||||
try {
|
||||
configPath = std::filesystem::canonical(configPath);
|
||||
|
||||
if (!std::filesystem::is_regular_file(configPath)) {
|
||||
throw std::exception();
|
||||
}
|
||||
} catch (...) {
|
||||
std::println(stderr, "[ ERROR ] Config file '{}' doesn't exist!", configPath);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
Debug::log(LOG, "User-specified config location: '{}'", configPath);
|
||||
|
||||
it++;
|
||||
|
||||
continue;
|
||||
} else if (value == "-h" || value == "--help") {
|
||||
help();
|
||||
|
||||
return 0;
|
||||
} else if (value == "-v" || value == "--version") {
|
||||
std::println("{}", versionRequest(eHyprCtlOutputFormat::FORMAT_NORMAL, ""));
|
||||
return 0;
|
||||
} else if (value == "--systeminfo") {
|
||||
std::println("{}", systemInfoRequest(eHyprCtlOutputFormat::FORMAT_NORMAL, ""));
|
||||
return 0;
|
||||
} else if (value == "--verify-config") {
|
||||
verifyConfig = true;
|
||||
continue;
|
||||
} else {
|
||||
std::println(stderr, "[ ERROR ] Unknown option '{}' !", value);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
Debug::log(LOG, "User-specified config location: '{}'", configPath);
|
||||
|
||||
it++;
|
||||
|
||||
continue;
|
||||
} else if (*it == "-h" || *it == "--help") {
|
||||
help();
|
||||
|
||||
return 0;
|
||||
} else if (*it == "-v" || *it == "--version") {
|
||||
std::println("{}", versionRequest(eHyprCtlOutputFormat::FORMAT_NORMAL, ""));
|
||||
return 0;
|
||||
} else if (*it == "--systeminfo") {
|
||||
std::println("{}", systemInfoRequest(eHyprCtlOutputFormat::FORMAT_NORMAL, ""));
|
||||
return 0;
|
||||
} else if (*it == "--verify-config") {
|
||||
verifyConfig = true;
|
||||
continue;
|
||||
} else {
|
||||
std::println(stderr, "[ ERROR ] Unknown option '{}' !", *it);
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user