From b1e16da5ca6d6d0150df92497b57422ee23e4fc7 Mon Sep 17 00:00:00 2001 From: speedie Date: Mon, 25 Sep 2023 18:18:00 +0200 Subject: [PATCH] libspmenu: Integrate libspmenu into main project --- README.md | 2 +- packaging/spmenu.PKGBUILD | 29 +++-- scripts/spmenu_make | 39 +++++- src/libspmenu/libspmenu.cpp | 239 ++++++++++++++++++++++++++++++++++++ src/libspmenu/libspmenu.hpp | 153 +++++++++++++++++++++++ src/libspmenu/meson.build | 18 +++ src/libspmenu/test.cpp | 14 +++ 7 files changed, 478 insertions(+), 16 deletions(-) create mode 100644 src/libspmenu/libspmenu.cpp create mode 100644 src/libspmenu/libspmenu.hpp create mode 100644 src/libspmenu/meson.build create mode 100644 src/libspmenu/test.cpp diff --git a/README.md b/README.md index 65e573d..c30170f 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ directory**. If you want to generate a pacman package, run When creating a release, do the following: -1. Bump version in meson.build (optional) +1. Bump version in meson.build and src/libspmenu/meson.build (optional) 2. Run `scripts/spmenu_make docs`. This will generate new documentation. 3. `git commit -a` to bump version 4. Run `scripts/spmenu_make dist`. This will generate a tarball, along diff --git a/packaging/spmenu.PKGBUILD b/packaging/spmenu.PKGBUILD index 07be5bc..bd9e61f 100644 --- a/packaging/spmenu.PKGBUILD +++ b/packaging/spmenu.PKGBUILD @@ -1,6 +1,7 @@ # Maintainer: speedie -pkgname=spmenu +pkgname=('spmenu' 'libspmenu') +pkgbase="spmenu" pkgver=VERSION pkgrel=1 pkgdesc="Fancy dynamic menu for X11 and Wayland, compatible with dmenu!" @@ -29,15 +30,13 @@ makedepends=( optdepends=( 'wl-clipboard: Clipboard support on Wayland' + 'libspmenu: C++ library for spmenu' ) provides=($pkgname) -conflicts=($pkgname) source=( - "$pkgname-$pkgver.tar.gz" - "$pkgname-$pkgver.tar.gz.sig" - #"https://ls.speedie.site/releases/$pkgname/$pkgver/$pkgname-$pkgver.tar.gz" - #"https://ls.speedie.site/releases/$pkgname/$pkgver/$pkgname-$pkgver.tar.gz.sig" + "$pkgbase-$pkgver.tar.gz" + "$pkgbase-$pkgver.tar.gz.sig" ) md5sums=( @@ -50,15 +49,19 @@ sha256sums=( 'SKIP' ) -build(){ - cd $pkgname-$pkgver - mkdir -p build/ +package_spmenu() { + cd "$pkgbase-$pkgver" meson setup --reconfigure --prefix=${pkgdir}/usr build - ninja -C build + cd build/ + meson install } -package() { - cd "$pkgname-$pkgver" +package_libspmenu() { + pkgdesc="C++ library for spmenu" + optdepends=() - meson install -C build + cd "$pkgbase-$pkgver/src/libspmenu" + meson setup --reconfigure --prefix=${pkgdir}/usr build + cd build/ + meson install } diff --git a/scripts/spmenu_make b/scripts/spmenu_make index 5e94892..d0353f2 100755 --- a/scripts/spmenu_make +++ b/scripts/spmenu_make @@ -11,6 +11,7 @@ wayland=${wayland:-true} x11=${x11:-true} regex=${regex:-true} fifo=${fifo:-true} +library=${library:-true} prefix="${prefix:-/usr}" @@ -19,7 +20,7 @@ static=${static:-false} clean() { clean_headers - rm -rf ./*.zst* ./*.tar* ./*.sig* *.PKGBUILD *.ebuild *.ebuild* build/ + rm -rf ./*.zst* ./*.tar* ./*.sig* *.PKGBUILD *.ebuild *.ebuild* build/ PKGBUILD } check_correct_dir() { @@ -158,12 +159,27 @@ gen_gentoo_pkg() { sha256sum spmenu-${version}.ebuild | cut -d ' ' -f 1 > spmenu-${version}.ebuild.sha256 fi fi + + if [ -f "packaging/libspmenu.ebuild" ] && [ "$library" != "false" ]; then + cp packaging/libspmenu.ebuild libspmenu-${version}.ebuild + + if [ -x "$(command -v gpg)" ]; then + gpg --detach-sign --yes --local-user $(whoami) libspmenu-${version}.ebuild + fi + + if [ -x "$(command -v md5sum)" ]; then + md5sum libspmenu-${version}.ebuild | cut -d ' ' -f 1 > libspmenu-${version}.ebuild.md5 + fi + + if [ -x "$(command -v sha256sum)" ]; then + sha256sum libspmenu-${version}.ebuild | cut -d ' ' -f 1 > libspmenu-${version}.ebuild.sha256 + fi + fi } gen_arch_pkg() { [ "$(id -u)" = "0" ] && printf "Do not run as root.\n" && exit 1 [ ! -x "$(command -v makepkg)" ] && printf "makepkg required for this action.\n" && exit 1 - [ -f "packaging/spmenu.PKGBUILD" ] || exit 1 rm -f PKGBUILD @@ -188,10 +204,14 @@ gen_arch_pkg() { # generate MD5 checksum [ -x "$(command -v md5sum)" ] && \ md5sum spmenu-${version}-1-x86_64.pkg.tar.zst | cut -d ' ' -f 1 > spmenu-${version}-1-x86_64.pkg.tar.zst.md5 + [ -x "$(command -v md5sum)" ] && \ + md5sum libspmenu-${version}-1-x86_64.pkg.tar.zst | cut -d ' ' -f 1 > libspmenu-${version}-1-x86_64.pkg.tar.zst.md5 # generate SHA256 checksum [ -x "$(command -v sha256sum)" ] && \ sha256sum spmenu-${version}-1-x86_64.pkg.tar.zst | cut -d ' ' -f 1 > spmenu-${version}-1-x86_64.pkg.tar.zst.sha256 + [ -x "$(command -v sha256sum)" ] && \ + sha256sum libspmenu-${version}-1-x86_64.pkg.tar.zst | cut -d ' ' -f 1 > libspmenu-${version}-1-x86_64.pkg.tar.zst.sha256 } generate_theme() { @@ -325,6 +345,13 @@ build() { [ "$cp_build" = "true" ] && cp meson.build meson.build.used mv -f meson.build.orig meson.build + + if [ "$library" != "false" ]; then + cd src/libspmenu/ || exit 1 + meson setup --prefix "$prefix" build || exit 1 + ninja -C build + cd ../../ || exit 1 + fi } install() { @@ -335,6 +362,14 @@ install() { cd .. || exit 1 [ "$reconfigure" = "true" ] && rm -rf build/ [ "$reconfigure" = "true" ] && clean_headers + + if [ "$library" != "false" ]; then + cd src/libspmenu/build/ || exit 1 + meson install + cd .. + [ "$reconfigure" = "true" ] && rm -rf build/ + cd ../../ + fi } help() { diff --git a/src/libspmenu/libspmenu.cpp b/src/libspmenu/libspmenu.cpp new file mode 100644 index 0000000..ab4db0c --- /dev/null +++ b/src/libspmenu/libspmenu.cpp @@ -0,0 +1,239 @@ +/* libspmenu + * spmenu C++ library + * + * See LICENSE file for copyright and license details. + */ + +#include +#include +#include +#include +#include +#include "libspmenu.hpp" + +bool spmenu::checkBool(bool Bool) { + return (Bool == 0 || Bool == 1); +} + +std::string spmenu::addArgument(std::string Argument, std::string Value) { + std::string str; + + str += " " + Argument + " \"" + Value + "\""; + + return str; +} + +std::string spmenu::addArgument(std::string enabledArgument, std::string disabledArgument, bool Value) { + std::string str{}; + + std::cout << spmenu::checkBool(Value) << std::endl; + if (!spmenu::checkBool(Value)) { + return str; + } + + if (disabledArgument.empty() || enabledArgument.empty()) { + return str; + } + + str += " " + (Value ? enabledArgument : disabledArgument); + + return str; +} + +std::string spmenu::generateArguments(spmenu::spmenuSettings *settings) { + std::string argList; + + argList += (settings->promptText.empty()) ? "" : (spmenu::addArgument("--prompt", settings->promptText)); + argList += (settings->preText.empty()) ? "" : (spmenu::addArgument("--pretext", settings->preText)); + argList += (settings->inputText.empty()) ? "" : (spmenu::addArgument("--input", settings->inputText)); + argList += (settings->normalModeText.empty()) ? "" : (spmenu::addArgument("--normal-mode-text", settings->normalModeText)); + argList += (settings->insertModeText.empty()) ? "" : (spmenu::addArgument("--insert-mode-text", settings->insertModeText)); + argList += (settings->capsLockOnText.empty()) ? "" : (spmenu::addArgument("--caps-lock-on-text", settings->capsLockOnText)); + argList += (settings->capsLockOffText.empty()) ? "" : (spmenu::addArgument("--caps-lock-off-text", settings->capsLockOffText)); + argList += (settings->leftArrowText.empty()) ? "" : (spmenu::addArgument("--left-arrow-symbol", settings->leftArrowText)); + argList += (settings->rightArrowText.empty()) ? "" : (spmenu::addArgument("--right-arrow-symbol", settings->rightArrowText)); + argList += (settings->lineHeight.empty()) ? "" : (spmenu::addArgument("--line-height", settings->lineHeight)); + argList += (settings->centerWidth.empty()) ? "" : (spmenu::addArgument("--center-width", settings->centerWidth)); + argList += (settings->Lines.empty()) ? "" : (spmenu::addArgument("--lines", settings->Lines)); + argList += (settings->Columns.empty()) ? "" : (spmenu::addArgument("--columns", settings->Columns)); + argList += (settings->minLines.empty()) ? "" : (spmenu::addArgument("--min-lines", settings->minLines)); + argList += spmenu::addArgument("--generate-cache", "--no-generate-cache", settings->generateCache); + argList += (settings->maxCache.empty()) ? "" : (spmenu::addArgument("--max-cache", settings->maxCache)); + argList += (settings->cacheDir.empty()) ? "" : (spmenu::addArgument("--cache-dir", settings->cacheDir)); + argList += spmenu::addArgument("--print-index", "--no-print-index", settings->printIndex); + argList += spmenu::addArgument("--fast", "", settings->Fast); + argList += spmenu::addArgument("--incremental", "--no-incremental", settings->Incremental); + argList += spmenu::addArgument("--require-match", "--no-require-match", settings->requireMatch); + argList += spmenu::addArgument("--mark-items", "--no-mark-items", settings->markItems); + argList += spmenu::addArgument("--fuzzy", "--no-fuzzy", settings->Fuzzy); + argList += spmenu::addArgument("--regex", "--no-regex", settings->Regex); + argList += spmenu::addArgument("--password", "--no-password", settings->Password); + argList += spmenu::addArgument("--indent", "--no-indent", settings->Indent); + argList += spmenu::addArgument("--color-items", "--no-color-items", settings->colorItems); + argList += spmenu::addArgument("--sgr", "--no-sgr", settings->Sgr); + argList += spmenu::addArgument("--alpha", "--no-alpha", settings->Alpha); + argList += spmenu::addArgument("--allow-typing", "--no-allow-typing", settings->allowTyping); + argList += spmenu::addArgument("--override-lines", "--no-override-lines", settings->allowOverrideLines); + argList += spmenu::addArgument("--override-columns", "--no-override-columns", settings->allowOverrideColumns); + argList += (settings->X.empty()) ? "" : (spmenu::addArgument("--x-position", settings->X)); + argList += (settings->Y.empty()) ? "" : (spmenu::addArgument("--y-position", settings->Y)); + argList += (settings->W.empty()) ? "" : (spmenu::addArgument("--width", settings->W)); + argList += (settings->H.empty()) ? "" : (spmenu::addArgument("--min-lines", settings->H)); + argList += (settings->Preselect.empty()) ? "" : (spmenu::addArgument("--preselect", settings->Preselect)); + argList += (settings->borderWidth.empty()) ? "" : (spmenu::addArgument("--border-width", settings->borderWidth)); + argList += spmenu::addArgument("--sort", "--no-sort", settings->Sort); + argList += (settings->Priority.empty()) ? "" : (spmenu::addArgument("--priority", settings->Priority)); + argList += spmenu::addArgument("--case-sensitive", "--case-insensitive", settings->caseSensitive); + argList += spmenu::addArgument("--normal", "--insert", settings->defaultMode); + argList += spmenu::addArgument("--hide-mode", "--show-mode", settings->hideMode); + argList += spmenu::addArgument("--hide-match-count", "--show-match-count", settings->hideMatchCount); + argList += spmenu::addArgument("--hide-left-arrow", "--show-left-arrow", settings->hideLeftArrow); + argList += spmenu::addArgument("--hide-right-arrow", "--show-right-arrow", settings->hideRightArrow); + argList += spmenu::addArgument("--hide-item", "--show-item", settings->hideItem); + argList += spmenu::addArgument("--hide-prompt", "--show-prompt", settings->hidePrompt); + argList += spmenu::addArgument("--hide-pretext", "--show-pretext", settings->hidePretext); + argList += spmenu::addArgument("--hide-input", "--show-input", settings->hideInput); + argList += spmenu::addArgument("--hide-powerline", "--show-powerline", settings->hidePowerline); + argList += spmenu::addArgument("--hide-caret", "--show-caret", settings->hideCaret); + argList += spmenu::addArgument("--hide-highlighting", "--show-highlighting", settings->hideHighlighting); + argList += spmenu::addArgument("--hide-image", "--show-image", settings->hideImage); + argList += spmenu::addArgument("--hide-caps", "--show-caps", settings->hideCaps); + argList += spmenu::addArgument("--xrdb", "--no-xrdb", settings->Xrdb); + argList += (settings->Monitor.empty()) ? "" : (spmenu::addArgument("--monitor", settings->Monitor)); + argList += (settings->Embed.empty()) ? "" : (spmenu::addArgument("--embed", settings->Embed)); + argList += (settings->histFile.empty()) ? "" : (spmenu::addArgument("--hist-file", settings->histFile)); + argList += (settings->listFile.empty()) ? "" : (spmenu::addArgument("--list-file", settings->listFile)); + argList += (settings->configFile.empty()) ? "" : (spmenu::addArgument("--config-file", settings->configFile)); + argList += (settings->bindsFile.empty()) ? "" : (spmenu::addArgument("--bind-file", settings->bindsFile)); + argList += (settings->themeFile.empty()) ? "" : (spmenu::addArgument("--theme-file", settings->themeFile)); + argList += (settings->imageGaps.empty()) ? "" : (spmenu::addArgument("--image-gaps", settings->imageGaps)); + argList += (settings->imageSize.empty()) ? "" : (spmenu::addArgument("--image-size", settings->imageSize)); + argList += spmenu::addArgument("--display-image", "--display-icons", settings->imageType); + argList += spmenu::addArgument("--image-resize", "--no-image-resize", settings->imageResize); + argList += (settings->textPadding.empty()) ? "" : (spmenu::addArgument("--text-padding", settings->textPadding)); + argList += (settings->verticalPadding.empty()) ? "" : (spmenu::addArgument("--vertical-padding", settings->verticalPadding)); + argList += (settings->horizontalPadding.empty()) ? "" : (spmenu::addArgument("--horizontal-padding", settings->horizontalPadding)); + argList += (settings->verticalMargin.empty()) ? "" : (spmenu::addArgument("--vertical-margin", settings->verticalMargin)); + argList += (settings->horizontalMargin.empty()) ? "" : (spmenu::addArgument("--horizontal-margin", settings->horizontalMargin)); + argList += spmenu::addArgument("--managed", "--unmanaged", settings->Managed); + argList += spmenu::addArgument("--wayland", "-x11", settings->displayProtocol); + argList += spmenu::addArgument("--load-config", "--no-load-config", settings->loadConfig); + argList += spmenu::addArgument("--load-binds", "--no-load-binds", settings->loadBinds); + argList += spmenu::addArgument("--load-theme", "--no-load-theme", settings->loadTheme); + argList += (settings->Font.empty()) ? "" : (spmenu::addArgument("--font", settings->Font)); + argList += (settings->normalItemForegroundColor.empty()) ? "" : (spmenu::addArgument("--normal-item-foreground", settings->normalItemForegroundColor)); + argList += (settings->normalItemBackgroundColor.empty()) ? "" : (spmenu::addArgument("--normal-item-background", settings->normalItemBackgroundColor)); + argList += (settings->selectedItemForegroundColor.empty()) ? "" : (spmenu::addArgument("--selected-item-foreground", settings->selectedItemForegroundColor)); + argList += (settings->selectedItemBackgroundColor.empty()) ? "" : (spmenu::addArgument("--selected-item-background", settings->selectedItemBackgroundColor)); + argList += (settings->normalNextItemForegroundColor.empty()) ? "" : (spmenu::addArgument("--normal-next-item-foreground", settings->normalNextItemForegroundColor)); + argList += (settings->normalNextItemBackgroundColor.empty()) ? "" : (spmenu::addArgument("--normal-next-item-background", settings->normalNextItemBackgroundColor)); + argList += (settings->normalItemPriorityForegroundColor.empty()) ? "" : (spmenu::addArgument("--normal-item-priority-foreground", settings->normalItemPriorityForegroundColor)); + argList += (settings->normalItemPriorityBackgroundColor.empty()) ? "" : (spmenu::addArgument("--normal-item-priority-background", settings->normalItemPriorityBackgroundColor)); + argList += (settings->selectedItemPriorityForegroundColor.empty()) ? "" : (spmenu::addArgument("--selected-item-priority-foreground", settings->selectedItemPriorityForegroundColor)); + argList += (settings->selectedItemPriorityBackgroundColor.empty()) ? "" : (spmenu::addArgument("--selected-item-priority-background", settings->selectedItemPriorityBackgroundColor)); + argList += (settings->promptForegroundColor.empty()) ? "" : (spmenu::addArgument("--prompt-foreground", settings->promptForegroundColor)); + argList += (settings->promptBackgroundColor.empty()) ? "" : (spmenu::addArgument("--prompt-background", settings->promptBackgroundColor)); + argList += (settings->inputForegroundColor.empty()) ? "" : (spmenu::addArgument("--input-foreground", settings->inputForegroundColor)); + argList += (settings->inputBackgroundColor.empty()) ? "" : (spmenu::addArgument("--input-background", settings->inputBackgroundColor)); + argList += (settings->preTextForegroundColor.empty()) ? "" : (spmenu::addArgument("--preText-foreground", settings->preTextForegroundColor)); + argList += (settings->preTextBackgroundColor.empty()) ? "" : (spmenu::addArgument("--preText-background", settings->preTextBackgroundColor)); + argList += (settings->windowColor.empty()) ? "" : (spmenu::addArgument("--menu-background", settings->windowColor)); + argList += (settings->normalHighlightForegroundColor.empty()) ? "" : (spmenu::addArgument("--normal-highlight-foreground", settings->normalHighlightForegroundColor)); + argList += (settings->normalHighlightBackgroundColor.empty()) ? "" : (spmenu::addArgument("--normal-highlight-background", settings->normalHighlightBackgroundColor)); + argList += (settings->selectedHighlightForegroundColor.empty()) ? "" : (spmenu::addArgument("--selected-highlight-foreground", settings->selectedHighlightForegroundColor)); + argList += (settings->selectedHighlightBackgroundColor.empty()) ? "" : (spmenu::addArgument("--selected-highlight-background", settings->selectedHighlightBackgroundColor)); + argList += (settings->numberForegroundColor.empty()) ? "" : (spmenu::addArgument("--number-foreground", settings->numberForegroundColor)); + argList += (settings->numberBackgroundColor.empty()) ? "" : (spmenu::addArgument("--number-background", settings->numberBackgroundColor)); + argList += (settings->modeForegroundColor.empty()) ? "" : (spmenu::addArgument("--mode-foreground", settings->modeForegroundColor)); + argList += (settings->modeBackgroundColor.empty()) ? "" : (spmenu::addArgument("--mode-background", settings->modeBackgroundColor)); + argList += (settings->leftArrowForegroundColor.empty()) ? "" : (spmenu::addArgument("--left-arrow-foreground", settings->leftArrowForegroundColor)); + argList += (settings->leftArrowBackgroundColor.empty()) ? "" : (spmenu::addArgument("--left-arrow-background", settings->leftArrowBackgroundColor)); + argList += (settings->rightArrowForegroundColor.empty()) ? "" : (spmenu::addArgument("--right-arrow-foreground", settings->rightArrowForegroundColor)); + argList += (settings->rightArrowBackgroundColor.empty()) ? "" : (spmenu::addArgument("--right-arrow-background", settings->rightArrowBackgroundColor)); + argList += (settings->caretForegroundColor.empty()) ? "" : (spmenu::addArgument("--caret-foreground", settings->caretForegroundColor)); + argList += (settings->caretBackgroundColor.empty()) ? "" : (spmenu::addArgument("--caret-background", settings->caretBackgroundColor)); + argList += (settings->borderColor.empty()) ? "" : (spmenu::addArgument("--border-background", settings->borderColor)); + argList += (settings->sgr0Color.empty()) ? "" : (spmenu::addArgument("--sgr0", settings->sgr0Color)); + argList += (settings->sgr1Color.empty()) ? "" : (spmenu::addArgument("--sgr1", settings->sgr1Color)); + argList += (settings->sgr2Color.empty()) ? "" : (spmenu::addArgument("--sgr2", settings->sgr2Color)); + argList += (settings->sgr3Color.empty()) ? "" : (spmenu::addArgument("--sgr3", settings->sgr3Color)); + argList += (settings->sgr4Color.empty()) ? "" : (spmenu::addArgument("--sgr4", settings->sgr4Color)); + argList += (settings->sgr5Color.empty()) ? "" : (spmenu::addArgument("--sgr5", settings->sgr5Color)); + argList += (settings->sgr6Color.empty()) ? "" : (spmenu::addArgument("--sgr6", settings->sgr6Color)); + argList += (settings->sgr7Color.empty()) ? "" : (spmenu::addArgument("--sgr7", settings->sgr7Color)); + argList += (settings->sgr8Color.empty()) ? "" : (spmenu::addArgument("--sgr8", settings->sgr8Color)); + argList += (settings->sgr9Color.empty()) ? "" : (spmenu::addArgument("--sgr9", settings->sgr9Color)); + argList += (settings->sgr10Color.empty()) ? "" : (spmenu::addArgument("--sgr10", settings->sgr10Color)); + argList += (settings->sgr11Color.empty()) ? "" : (spmenu::addArgument("--sgr11", settings->sgr11Color)); + argList += (settings->sgr12Color.empty()) ? "" : (spmenu::addArgument("--sgr12", settings->sgr12Color)); + argList += (settings->sgr13Color.empty()) ? "" : (spmenu::addArgument("--sgr13", settings->sgr13Color)); + argList += (settings->sgr14Color.empty()) ? "" : (spmenu::addArgument("--sgr14", settings->sgr14Color)); + argList += (settings->sgr15Color.empty()) ? "" : (spmenu::addArgument("--sgr15", settings->sgr15Color)); + + if (!settings->windowPosition.empty()) { + std::string argument = ""; + if (settings->windowPosition.compare("Top")) { + argument = "--top"; + } else if (settings->windowPosition.compare("Bottom")) { + argument = "--bottom"; + } else if (settings->windowPosition.compare("Center")) { + argument = "--center"; + } + + argList += " " + argument; + } + + if (!settings->itemPosition.empty()) { + std::string argument = ""; + if (settings->itemPosition.compare("Top")) { + argument = "--item-top"; + } else if (settings->itemPosition.compare("Bottom")) { + argument = "--item-bottom"; + } + + argList += " " + argument; + } + + if (!settings->imagePosition.empty()) { + std::string argument = ""; + if (settings->imagePosition.compare("Top")) { + argument = "--image-top"; + } else if (settings->imagePosition.compare("Bottom")) { + argument = "--image-bottom"; + } else if (settings->imagePosition.compare("Center")) { + argument = "--image-center"; + } else if (settings->imagePosition.compare("Top Center")) { + argument = "--image-topcenter"; + } + + argList += " " + argument; + } + + return argList; +} + +std::string spmenu::Run(spmenu::spmenuSettings *settings) { + const int bufferSize{ sizeof(settings->standardInput) }; + std::ostringstream command; + std::string ret; + std::array buf; + + std::string Arguments; + + Arguments = spmenu::generateArguments(settings); + + command << "printf \"" << settings->standardInput << "\" | spmenu " << Arguments << " " << settings->userArguments; + + std::unique_ptr pipe(popen(command.str().c_str(), "r"), pclose); + + if (!pipe) { + std::cerr << "Failed to popen()\n"; + return ret; + } + + while (fgets(buf.data(), buf.size(), pipe.get()) != NULL) { + ret += buf.data(); + } + + return ret; +} diff --git a/src/libspmenu/libspmenu.hpp b/src/libspmenu/libspmenu.hpp new file mode 100644 index 0000000..c7166e5 --- /dev/null +++ b/src/libspmenu/libspmenu.hpp @@ -0,0 +1,153 @@ +#ifndef LIBSPMENU_HPP +#define LIBSPMENU_HPP + +#include + +namespace spmenu { + using Integer = std::string; + using String = std::string; + using Bool = bool; + class spmenuSettings { + public: + String userArguments{}; + String standardInput{}; + + String promptText{}; // -p + String preText{}; // -pt + String inputText{}; // -It + String normalModeText{}; // -nmt + String insertModeText{}; // -imt + String capsLockOnText{}; // -clon + String capsLockOffText{}; // -clof + String leftArrowText{}; // -la + String rightArrowText{}; // -ra + Integer lineHeight; // -mh + Integer centerWidth; // -cw + Integer Lines; // -l + Integer Columns; // -g + Integer minLines; // -ml + Bool generateCache; // -gc, -ngc + Integer maxCache; // -mc + String cacheDir{}; // -cd + Bool printIndex; // -ix, -nix + Bool Fast; // -f + Bool Incremental; // -r, -nr + Bool requireMatch; // -rm, -nrm + Bool markItems; // -ma, -nma + Bool Fuzzy; // -F, -NF + Bool Regex; // -R, -NR + Bool Password; // -P, -nP + Bool Indent; // -ip, -nip + Bool colorItems; // -ci, -nci + Bool Sgr; // -sgr, -nsgr + Bool Alpha; // -a, -na + Bool allowTyping; // -tp, -nt + Bool allowOverrideLines; // -ol, -nol + Bool allowOverrideColumns; // -oc, -noc + Integer X; // -x + Integer Y; // -y + Integer W; // -z + Integer H; // -ml + Integer Preselect; // -n + Integer borderWidth; // -bw + Bool Sort; // -so, -nso + String Priority{}; // -pri + Bool caseSensitive; // -s, -ns + Bool defaultMode; // -nm, -im + Integer windowPosition; // -t, -b, -c + Integer itemPosition; // -itt, -itb + Integer imagePosition; // -it, -ib, -ic, -itc + Bool hideMode; // -hm + Bool hideMatchCount; // -hmc + Bool hideLeftArrow; // -hla + Bool hideRightArrow; // -hra + Bool hideItem; // -hit + Bool hidePrompt; // -hpr + Bool hidePretext; // -hpt + Bool hideInput; // -hip + Bool hidePowerline; // -hpl + Bool hideCaret; // -hc + Bool hideHighlighting; // -hhl + Bool hideImage; // -hi + Bool hideCaps; // -hcl + Bool Xrdb; // -xrdb, -nxrdb + Integer Monitor; // -m + Integer Embed; // -w + String histFile{}; // -H + String listFile{}; // -lf + String configFile{}; // -cf + String bindsFile{}; // -bf + String themeFile{}; // -tm + Integer imageGaps; // -ig + Integer imageSize; // -is + Bool imageType; // -di, -df + Bool imageResize; // -ir, -nir + Integer textPadding; // -txp + Integer verticalPadding; // -lp + Integer horizontalPadding; // -hp + Integer verticalMargin; // -vem + Integer horizontalMargin; // -hom + Bool Managed; // -wm, -nwm + Bool displayProtocol; // -x11, -wl + Bool loadConfig; // -lcfg, -ncfg + Bool loadBinds; // -lbi, -nlbi + Bool loadTheme; // -ltm, -nltm + String Font; // -fn + String normalItemForegroundColor{}; // -nif + String normalItemBackgroundColor{}; // -nib + String normalNextItemForegroundColor{}; // -nnif + String normalNextItemBackgroundColor{}; // -nnib + String selectedItemForegroundColor{}; // -sif + String selectedItemBackgroundColor{}; // -sib + String normalItemPriorityForegroundColor{}; // -npf + String normalItemPriorityBackgroundColor{}; // -npb + String selectedItemPriorityForegroundColor{}; // -spf + String selectedItemPriorityBackgroundColor{}; // -spb + String promptForegroundColor{}; // -pfg + String promptBackgroundColor{}; // -pbg + String inputForegroundColor{}; // -ifg + String inputBackgroundColor{}; // -ibg + String preTextForegroundColor{}; // -ptfg + String preTextBackgroundColor{}; // -ptbg + String windowColor{}; // -mnbg + String normalHighlightForegroundColor{}; // -nhf + String normalHighlightBackgroundColor{}; // -nhb + String selectedHighlightForegroundColor{}; // -shf + String selectedHighlightBackgroundColor{}; // -shb + String numberForegroundColor{}; // -nfg + String numberBackgroundColor{}; // -nbg + String modeForegroundColor{}; // -mfg + String modeBackgroundColor{}; // -mbg + String leftArrowForegroundColor{}; // -laf + String leftArrowBackgroundColor{}; // -lab + String rightArrowForegroundColor{}; // -raf + String rightArrowBackgroundColor{}; // -rab + String caretForegroundColor{}; // -cfc + String caretBackgroundColor{}; // -cbg + String borderColor{}; // -bc + String sgr0Color{}; // -sgr0 + String sgr1Color{}; // -sgr1 + String sgr2Color{}; // -sgr2 + String sgr3Color{}; // -sgr3 + String sgr4Color{}; // -sgr4 + String sgr5Color{}; // -sgr5 + String sgr6Color{}; // -sgr6 + String sgr7Color{}; // -sgr7 + String sgr8Color{}; // -sgr8 + String sgr9Color{}; // -sgr9 + String sgr10Color{}; // -sgr10 + String sgr11Color{}; // -sgr11 + String sgr12Color{}; // -sgr12 + String sgr13Color{}; // -sgr13 + String sgr14Color{}; // -sgr14 + String sgr15Color{}; // -sgr15 + }; + + std::string Run(spmenuSettings *settings); + std::string generateArguments(spmenuSettings *settings); + std::string addArgument(std::string Argument, std::string Value); + std::string addArgument(std::string enabledArgument, std::string disabledArgument, Bool Value); + Bool checkBool(bool); +} + +#endif diff --git a/src/libspmenu/meson.build b/src/libspmenu/meson.build new file mode 100644 index 0000000..6482354 --- /dev/null +++ b/src/libspmenu/meson.build @@ -0,0 +1,18 @@ +# libspmenu +project('spmenu', 'cpp', version : '3.4') +cc = meson.get_compiler('cpp') + +project_source_files = [ + 'libspmenu.cpp', +] + +project_dependencies = [ +] + +build_args = [ + '-DVERSION=' + meson.project_version(), +] + +so_version = meson.project_version() + +lib_shared = shared_library('spmenu', project_source_files, version : so_version, install : true) diff --git a/src/libspmenu/test.cpp b/src/libspmenu/test.cpp new file mode 100644 index 0000000..d3aba54 --- /dev/null +++ b/src/libspmenu/test.cpp @@ -0,0 +1,14 @@ +#include +#include "libspmenu.hpp" +#include "libspmenu.cpp" + +int main() { + spmenu::spmenuSettings settings; + + settings.promptText = "libspmenu test"; + settings.windowPosition = "Bottom"; + settings.itemPosition = "Top"; + settings.standardInput = "Item1\nItem2\nItem3\n"; + + std::cout << spmenu::Run(&settings); +}