Compare commits

...

10 Commits

10 changed files with 576 additions and 240 deletions

225
.clang-format Normal file
View File

@ -0,0 +1,225 @@
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: DontAlign
AlignArrayOfStructures: Left
AlignConsecutiveAssignments:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: true
AlignConsecutiveBitFields:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveDeclarations:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments:
Kind: Always
OverEmptyLines: 0
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: true
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
AttributeMacros:
- __capability
BinPackArguments: false
BinPackParameters: true
BitFieldColonSpacing: Both
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterExternBlock: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAfterAttributes: Never
BreakAfterJavaFieldAnnotations: false
BreakArrays: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: Always
BreakBeforeBraces: Attach
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseBlocks: false
IndentCaseLabels: false
IndentExternBlock: AfterExternBlock
IndentGotoLabels: true
IndentPPDirectives: None
IndentRequiresClause: true
IndentWidth: 2
IndentWrappedFunctionNames: false
InsertBraces: false
InsertNewlineAtEOF: false
InsertTrailingCommas: None
IntegerLiteralSeparator:
Binary: 0
BinaryMinDigits: 0
Decimal: 0
DecimalMinDigits: 0
Hex: 0
HexMinDigits: 0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: Signature
LineEnding: DeriveLF
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PackConstructorInitializers: BinPack
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyIndentedWhitespace: 0
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
PPIndentWidth: -1
QualifierAlignment: Leave
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: false
RemoveSemicolon: false
RequiresClausePosition: OwnLine
RequiresExpressionIndentation: OuterScope
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: LexicographicNumeric
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 8
UseTab: Never
WhitespaceSensitiveMacros:
- BOOST_PP_STRINGIZE
- CF_SWIFT_NAME
- NS_SWIFT_NAME
- PP_STRINGIZE
- STRINGIZE
...

View File

@ -1,38 +1,61 @@
prefix = /usr
SRCS = $(wildcard src/*.c)
HEADERS = $(wildcard src/*.h)
PO_DIRS = $(wildcard locale/*/*)
PO_FILES = $(wildcard locale/*/*/*.po)
CSRCS = $(wildcard src/*.c)
dist/xcfg: $(SRCS) $(HEADERS) $(PO_FILES)
PO_SRCS = $(wildcard locale/*/*/*.po)
PO_OUTS = $(patsubst locale/%.po,locale/%.mo,$(PO_SRCS))
PO_DIRS = $(wildcard locale/*/*)
CFLAGS = -fstack-protector-strong -fcf-protection=full -fstack-clash-protection
LIBS = -lncurses -lmenu -lm
prefix = /usr
CC = gcc
VERSION = 24.08
all: dist/xcfg $(PO_OUTS)
dist/xcfg: $(CSRCS) $(HEADERS)
mkdir -p dist
gcc $(CFLAGS) $(SRCS) -o $@ -lncurses -lmenu -lm
$(CC) $(CFLAGS) -DVERSION=\"$(VERSION)\" $(CSRCS) -o $@ $(LIBS)
locale/%.mo: locale/%.po
msgfmt $^ -o $@
locale/%.po: locale/xcfg.pot
cp $@ $@.old
if msgmerge $@ $^ -o $@ ; then \
rm $@.old ; \
echo "merge success: $@" ; \
else \
echo "merge failed: $@" ; \
install -m644 $@.old $@ ; \
fi; \
locale/xcfg.pot: $(CSRCS)
mkdir -p locale
xgettext -k_ -c $(SRCS) -o locale/xcfg.pot
@for po in $(PO_DIRS) ; do \
mv $$po/xcfg.po $$po/mp.old.po ; \
if msgmerge $$po/mp.old.po locale/xcfg.pot -o $$po/xcfg.po ; then \
rm $$po/mp.old.po ; \
echo "merge success: $$po/xcfg.po" ; \
else \
echo "merge failed: $$po/xcfg.po" ; \
mv $$po/mp.old.po $$po/xcfg.po ; \
fi; \
done
@for po in $(PO_DIRS) ; do \
msgfmt $$po/xcfg.po -o $$po/xcfg.mo ; \
done
xgettext -k_ -c $^ -o $@
install:
mkdir -p $(DESTDIR)$(prefix)/bin
install -m755 dist/xcfg $(DESTDIR)$(prefix)/bin/xcfg
mkdir -pv $(DESTDIR)/$(prefix)/bin
install -v -m755 dist/xcfg $(DESTDIR)/$(prefix)/bin/xcfg
@for po in $(PO_DIRS) ; do \
echo "installing locale: $$po/xcfg.mo" ; \
mkdir -pv $(DESTDIR)/usr/share/$$po ; \
cp $$po/xcfg.mo $(DESTDIR)/usr/share/$$po ; \
install -v -Ddm755 $(DESTDIR)/usr/share/$$po ; \
install -m644 $$po/xcfg.mo $(DESTDIR)/usr/share/$$po ; \
done
uninstall:
rm $(DESTDIR)$(prefix)/bin/xcfg
rm -v $(DESTDIR)/$(prefix)/bin/xcfg
.PHONY: install uninstall
clean:
rm -v dist/xcfg
rm -v locale/xcfg.pot
@for po in $(PO_DIRS) ; do \
rm $$po/xcfg.mo ; \
done
format:
clang-format -i -style=file $(HEADERS) $(CSRCS)
.PHONY: install uninstall clean

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-22 20:30+0300\n"
"POT-Creation-Date: 2024-08-15 04:33+0300\n"
"PO-Revision-Date: 2024-02-20 20:36+0300\n"
"Last-Translator: <ngn@ngn.tf>\n"
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
@ -17,67 +17,97 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: src/main.c:101 src/main.c:243
#: src/main.c:49 src/main.c:189
#, fuzzy
msgid "Failed to get the home directory"
msgstr "Ev dizini bulmak başarısız oldu"
#: src/main.c:107
#: src/main.c:55
#, c-format
msgid "Failed to open %s for reading"
msgstr "%s dosyasını okumak için açmak başarısız oldu"
#: src/main.c:146
#: src/main.c:94
#, c-format
msgid "Failed to open %s for writing"
msgstr "%s dosyasını yazmak için açmak başarısız oldu"
#: src/main.c:152 src/main.c:249
#: src/main.c:100 src/main.c:195
#, c-format
msgid "Failed to write to %s"
msgstr "%s dosyasına yazmak başarısız oldu"
#: src/main.c:164
#: src/main.c:116
msgid "You should use this script as a regular user, not as root!"
msgstr ""
"Bu betiği normal bir kullanıcı olarak kullanmalısınız, kök kullanıcı olarak "
"değil!"
#: src/main.c:189
#: src/main.c:121
#, c-format
msgid "Simple xorg configuration tool %s"
msgstr ""
#: src/main.c:122
msgid ""
"Licensed under GPLv3, see https://www.gnu.org/licenses/ for more information"
msgstr ""
#: src/main.c:129
msgid "Lightweight desktop environment for UNIX-like operating systems"
msgstr "UNIX-gibi işletim sistemleri için hafif bir masaütü"
#: src/main.c:136
msgid "Free desktop environment with comparatively low resource requirements"
msgstr "Nispeten düşük sistem gereksinimleri olan özgür bir masaüstü ortamı"
#: src/main.c:142
msgid "Tiling window manager based on binary space partitioning"
msgstr "İkili alan bölme tabanlı döşeme pencere yöneticisi"
#: src/main.c:145
msgid "Improved tiling window manager"
msgstr "Geliştirilmiş döşeme pencere yöneticisi"
#: src/main.c:150
#, fuzzy
msgid "mp is not installed!"
msgid "matt is not installed!"
msgstr "mp kurulu değil"
#: src/main.c:198
#: src/main.c:159
msgid "Install doas or sudo to use this script"
msgstr "Bu betiği kullanmak için doas ya da sudo kurun"
#: src/main.c:216
#: src/main.c:174
msgid "Choose a desktop enviroment"
msgstr "Bir masaüstü ortamı seçin"
#: src/main.c:222
msgid "Yes"
msgstr "Evet"
#: src/main.c:222
msgid "No"
msgstr "Hayır"
#: src/main.c:229
#: src/main.c:180
msgid "Add auto-startx to shell configuration?"
msgstr "Otomatik-startx kabuk konfigürasyonu ekle?"
#: src/main.c:255
#: src/main.c:201
msgid "Configuration has been saved!"
msgstr "Konfigürasyon kaydedildi!"
#: src/main.c:257
#: src/main.c:203
#, fuzzy, c-format
msgid "Installing %s"
msgstr "%s kuruluyor"
#: src/main.c:263
#: src/main.c:207
#, fuzzy
msgid "Installation failed"
msgstr "Kurulum başarısız oldu"
#: src/term.c:82
msgid "Yes"
msgstr "Evet"
#: src/term.c:82
msgid "No"
msgstr "Hayır"
#, fuzzy
#~ msgid "Feiled to get the home directory"
#~ msgstr "Ev dizini bulmak başarısız oldu"

View File

@ -1,36 +1,36 @@
#include <stdio.h>
#include <stdarg.h>
#include "log.h"
#include <stdarg.h>
#include <stdio.h>
void info(const char* msg, ...){
void info(const char *msg, ...) {
va_list args;
va_start(args, msg);
printf(LOG_BOLD LOG_BLUE">>> "LOG_RESET LOG_BOLD);
printf(C_BOLD C_BLUE ">>> " C_RESET C_BOLD);
vprintf(msg, args);
printf(LOG_RESET"\n");
printf(C_RESET "\n");
va_end(args);
}
void error(const char* msg, ...){
void error(const char *msg, ...) {
va_list args;
va_start(args, msg);
printf(LOG_BOLD LOG_RED">>> "LOG_RESET LOG_BOLD);
printf(C_BOLD C_RED ">>> " C_RESET C_BOLD);
vprintf(msg, args);
printf(LOG_RESET"\n");
printf(C_RESET "\n");
va_end(args);
}
void success(const char* msg, ...){
void success(const char *msg, ...) {
va_list args;
va_start(args, msg);
printf(LOG_BOLD LOG_GREEN">>> "LOG_RESET LOG_BOLD);
printf(C_BOLD C_GREEN ">>> " C_RESET C_BOLD);
vprintf(msg, args);
printf(LOG_RESET"\n");
printf(C_RESET "\n");
va_end(args);
}

View File

@ -1,9 +1,11 @@
#define LOG_RED "\x1b[31m"
#define LOG_BOLD "\x1b[1m"
#define LOG_BLUE "\x1b[34m"
#define LOG_GREEN "\x1b[32m"
#define LOG_RESET "\x1b[0m"
#pragma once
void info(const char* msg, ...);
void error(const char* msg, ...);
void success(const char* msg, ...);
#define C_RED "\x1b[31m"
#define C_BOLD "\x1b[1m"
#define C_BLUE "\x1b[34m"
#define C_GREEN "\x1b[32m"
#define C_RESET "\x1b[0m"
void info(const char *msg, ...);
void error(const char *msg, ...);
void success(const char *msg, ...);

View File

@ -1,7 +1,7 @@
/*
* xcfg | simple xorg configuration tool
* MatterLinux 2024 (https://matterlinux.xyz)
* MatterLinux 2023-2024 (https://matterlinux.xyz)
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -18,137 +18,85 @@
*/
#include <sys/wait.h>
#include <stdbool.h>
#include <libintl.h>
#include <locale.h>
#include <limits.h>
#include <curses.h>
#include <libintl.h>
#include <limits.h>
#include <locale.h>
#include <menu.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <menu.h>
#include "util.h"
#include "log.h"
#include "term.h"
#include "util.h"
#define _(x) gettext(x)
int ask(char* text, ITEM** items, int sz) {
attron(COLOR_PAIR(1) | A_BOLD);
mvprintw(1, 1, "%s", text);
char line[strlen(text)+5];
int i = 0;
for (; i < strlen(text); i++){
line[i] = '#';
}
line[i] = '\0';
mvprintw(2, 1, "%s", line);
attroff(COLOR_PAIR(1) | A_BOLD);
refresh();
WINDOW* swin = newwin(LINES-3, COLS-1, 3, 1);
keypad(swin, TRUE);
MENU* menu = new_menu((ITEM **)items);
set_menu_win(menu, swin);
set_menu_sub(menu, swin);
set_menu_mark(menu, ">");
post_menu(menu);
wrefresh(swin);
bool done = false;
int indx = 0, c = 0;
while((c = wgetch(swin))){
switch(c){
case KEY_DOWN:
if (indx != (sz+1))
indx++;
menu_driver(menu, REQ_DOWN_ITEM);
break;
case KEY_UP:
if (indx != 0)
indx--;
menu_driver(menu, REQ_UP_ITEM);
break;
case '\n':
done = true;
break;
}
wrefresh(swin);
if(done)
break;
}
free_menu(menu);
return indx;
}
bool add_startx(){
bool add_startx() {
bool ret = false;
char* profile = ".bash_profile";
char* shellenv = getenv("SHELL");
char *profile = ".bash_profile";
char *shellenv = getenv("SHELL");
if (NULL != shellenv && endswith(shellenv, "zsh"))
profile = ".zshrc";
char profile_file[PATH_MAX];
if(!joinhome(profile_file, profile)){
if (!joinhome(profile_file, profile)) {
error(_("Failed to get the home directory"));
return ret;
}
FILE* pf = fopen(profile_file, "r");
if(NULL==pf){
FILE *pf = fopen(profile_file, "r");
if (NULL == pf) {
error(_("Failed to open %s for reading"), profile_file);
return ret;
}
char* line = NULL, *all = NULL;
int indx = 0;
char *line = NULL, *all = NULL;
int indx = 0;
size_t sz, len;
while((sz = getline(&line, &len, pf)) != -1) {
if(strcmp(line, "#auto-startx \n")==0){
while ((sz = getline(&line, &len, pf)) != -1) {
if (strcmp(line, "#auto-startx \n") == 0) {
ret = true;
goto END;
}
if (NULL == all){
if (NULL == all) {
all = malloc(sz);
for(int i = 0; i < sz; i++){
for (int i = 0; i < sz; i++) {
all[indx] = line[i];
indx++;
}
}else {
all = realloc(all, indx+sz);
for(int i = 0; i < sz; i++){
} else {
all = realloc(all, indx + sz);
for (int i = 0; i < sz; i++) {
all[indx] = line[i];
indx++;
}
}
}
char* startx = AUTOSTARTX;
all = realloc(all, indx+strlen(startx)+10);
for(int i = 0; i < strlen(startx); i++){
char *startx = AUTOSTARTX;
all = realloc(all, indx + strlen(startx) + 10);
for (int i = 0; i < strlen(startx); i++) {
all[indx] = startx[i];
indx++;
}
fclose(pf);
pf = fopen(profile_file, "w");
if(NULL==pf){
if (NULL == pf) {
error(_("Failed to open %s for writing"), profile_file);
goto END;
goto END;
}
all[indx] = '\0';
if(fwrite(all, 1, indx, pf)<=0)
if (fwrite(all, 1, indx, pf) <= 0)
error(_("Failed to write to %s"), profile_file);
ret = true;
@ -159,111 +107,107 @@ END:
return ret;
}
int main(int argc, char** argv, char** envp){
if(getuid()==0){
int main(int argc, char **argv, char **envp) {
signal(SIGINT, SIG_IGN);
setlocale(LC_ALL, "");
textdomain("xcfg");
if (getuid() == 0) {
error(_("You should use this script as a regular user, not as root!"));
return EXIT_FAILURE;
}
signal(SIGINT, SIG_IGN);
setlocale(LC_ALL, "");
textdomain("mp");
if (argc >= 2 && strcmp(argv[1], "--version") == 0) {
success(_("Simple xorg configuration tool %s"), VERSION);
info(_("Licensed under GPLv3, see https://www.gnu.org/licenses/ for more information"));
return EXIT_SUCCESS;
}
struct Desktop desktops[] = {
{
.name="XFCE4",
.desc="Lightweight desktop environment for UNIX-like operating systems",
.pkg="xfce4",
.cmd="startxfce4\n",
},
{
.name="bspwm",
.desc="Tiling window manager based on binary space partitioning",
.pkg="bspwm",
.cmd="bspwm\n"
}
{
.name = "XFCE4",
.desc = _("Lightweight desktop environment for UNIX-like operating "
"systems"),
.pkg = "xfce4",
.cmd = "startxfce4\n",
},
{
.name = "LXDE",
.desc = _("Free desktop environment with comparatively low resource "
"requirements"),
.pkg = "lxde",
.cmd = "startlxde\n",
},
{.name = "bspwm",
.desc = _("Tiling window manager based on binary space partitioning"),
.pkg = "bspwm",
.cmd = "bspwm\n"},
{.name = "i3", .desc = _("Improved tiling window manager"), .pkg = "i3", .cmd = "i3\n"}
};
char* mpi_path = check_path("mp-install");
if(NULL==mpi_path){
error(_("mp is not installed!"));
char *mpi_path = check_path("matt");
if (NULL == mpi_path) {
error(_("matt is not installed!"));
return EXIT_FAILURE;
}
free(mpi_path);
char* doas_path = check_path("doas");
if(NULL==doas_path) {
char *doas_path = check_path("doas");
if (NULL == doas_path) {
doas_path = check_path("sudo");
if(NULL==doas_path){
if (NULL == doas_path) {
error(_("Install doas or sudo to use this script"));
free(mpi_path);
return EXIT_FAILURE;
}
}
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
init_pair(1, COLOR_BLUE, COLOR_BLUE);
term_init();
int sz = sizeof(desktops)/sizeof(struct Desktop);
ITEM** items = (ITEM **)malloc(sizeof(ITEM *)*(sz+1));
int sz = sizeof(desktops) / sizeof(struct Desktop);
ITEM **items = malloc(sizeof(ITEM *) * (sz + 1));
for(int i = 0; i < sz; i++)
for (int i = 0; i < sz; i++)
items[i] = new_item(desktops[i].name, desktops[i].desc);
items[sz] = NULL;
int indx = ask(_("Choose a desktop enviroment"), items, sz);
int indx = term_ask(_("Choose a desktop enviroment"), items, sz + 1);
for (int i = 0; i < sz; i++)
free_item(items[i]);
free(items);
clear();
char* yn[] = {_("Yes"), _("No")};
sz = sizeof(yn)/sizeof(char*);
items = (ITEM **)malloc(sizeof(ITEM *)*(sz+1));
bool autox = term_yn(_("Add auto-startx to shell configuration?"));
for(int i = 0; i < sz; i++)
items[i] = new_item(yn[i], "");
term_finish();
bool autox = ask(_("Add auto-startx to shell configuration?"), items, sz) == 0;
for (int i = 0; i < sz; i++)
free_item(items[i]);
free(items);
clear();
if (autox && !add_startx())
goto fail;
clear();
endwin();
if(autox && !add_startx())
goto FAIL;
char xinitrc[PATH_MAX];
if(!joinhome(xinitrc, ".xinitrc")){
if (!joinhome(xinitrc, ".xinitrc")) {
error(_("Failed to get the home directory"));
goto FAIL;
goto fail;
}
FILE* xf = fopen(xinitrc, "w");
if(fwrite(desktops[indx].cmd, 1, strlen(desktops[indx].cmd), xf)<0){
FILE *xf = fopen(xinitrc, "w");
if (fwrite(desktops[indx].cmd, 1, strlen(desktops[indx].cmd), xf) < 0) {
error(_("Failed to write to %s"), xinitrc);
fclose(xf);
goto FAIL;
goto fail;
}
fclose(xf);
success(_("Configuration has been saved!"));
info(_("Installing %s"), desktops[indx].name, mpi_path);
char* args[] = {
doas_path, "mp-install", desktops[indx].pkg, NULL
};
char *args[] = {doas_path, "matt", "install", "--skip", desktops[indx].pkg, NULL};
if(execvp(doas_path, args) != 0) {
if (execvp(doas_path, args) != 0) {
error(_("Installation failed"));
}
FAIL:
fail:
free(doas_path);
return EXIT_FAILURE;
}

100
src/term.c Normal file
View File

@ -0,0 +1,100 @@
#include <libintl.h>
#include <menu.h>
#include <ncurses.h>
#include <string.h>
#define _(x) gettext(x)
void term_init() {
initscr();
if (has_colors()) {
use_default_colors();
start_color();
}
cbreak();
noecho();
keypad(stdscr, TRUE);
init_pair(1, COLOR_GREEN, -1);
init_pair(2, COLOR_BLUE, -1);
start_color();
}
int term_ask(char *text, ITEM **items, int sz) {
attron(COLOR_PAIR(1) | A_BOLD);
mvprintw(1, 1, "%s", text);
char line[strlen(text) + 5];
for (int i = 0; i < strlen(text); i++) {
line[i] = '=';
line[i + 1] = '\0';
}
mvprintw(2, 1, "%s", line);
attroff(COLOR_PAIR(1) | A_BOLD);
refresh();
WINDOW *swin = newwin(LINES - 3, COLS - 1, 3, 1);
keypad(swin, TRUE);
MENU *menu = new_menu(items);
set_menu_win(menu, swin);
set_menu_sub(menu, swin);
set_menu_mark(menu, ">>> ");
set_menu_fore(menu, COLOR_PAIR(2));
post_menu(menu);
curs_set(0);
wrefresh(swin);
bool done = false;
int indx = 0, c = 0;
while ((c = wgetch(swin))) {
switch (c) {
case KEY_DOWN:
if (indx != (sz + 1))
indx++;
menu_driver(menu, REQ_DOWN_ITEM);
break;
case KEY_UP:
if (indx != 0)
indx--;
menu_driver(menu, REQ_UP_ITEM);
break;
case '\n':
done = true;
break;
}
wrefresh(swin);
if (done)
break;
}
curs_set(1);
free_menu(menu);
return indx;
}
bool term_yn(char *text) {
char *yn[] = {_("Yes"), _("No"), NULL};
int sz = sizeof(yn) / sizeof(char *);
ITEM *items[sz + 1];
for (int i = 0; i < sz; i++)
items[i] = new_item(yn[i], "");
bool res = term_ask(_(text), items, sz) == 0;
for (int i = 0; i < sz; i++)
free_item(items[i]);
clear();
return res;
}
void term_finish() {
clear();
endwin();
}

7
src/term.h Normal file
View File

@ -0,0 +1,7 @@
#pragma once
#include <menu.h>
void term_init();
int term_ask(char *, ITEM **, int);
bool term_yn(char *);
void term_finish();

View File

@ -1,49 +1,49 @@
#include <stdbool.h>
#include "util.h"
#include <dirent.h>
#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include "util.h"
bool joinhome(char* res, char* path){
char* homedir = getenv("HOME");
bool joinhome(char *res, char *path) {
char *homedir = getenv("HOME");
if(NULL==homedir)
if (NULL == homedir)
return false;
snprintf(res, PATH_MAX, "%s/%s", homedir, path);
return true;
}
bool exists(char* path){
return access(path, F_OK)==0;
bool exists(char *path) {
return access(path, F_OK) == 0;
}
bool endswith(const char *str, const char *suf){
bool endswith(const char *str, const char *suf) {
int strl = strlen(str);
int sufl = strlen(suf);
if (sufl > strl)
if (sufl > strl)
return false;
return strncmp(str + strl - sufl, suf, sufl) == 0;
}
char* check_path(char* bin) {
char* path = getenv("PATH");
char* res = NULL;
char *check_path(char *bin) {
char *path = getenv("PATH");
char *res = NULL;
if(NULL == path)
if (NULL == path)
return NULL;
path = strdup(path);
char* p = strtok(path, ":");
while(NULL != p) {
char* fp = malloc(PATH_MAX);
char *p = strtok(path, ":");
while (NULL != p) {
char *fp = malloc(PATH_MAX);
snprintf(fp, PATH_MAX, "%s/%s", p, bin);
if(exists(fp)){
if (exists(fp)) {
res = fp;
break;
}

View File

@ -1,13 +1,18 @@
#define AUTOSTARTX "\n#auto-startx \nif [[ \"$(tty)\" == \"/dev/tty1\" ]] && [ -z \"$DISPLAY\" ]; then\nexec startx\nfi\n"
#pragma once
#include <stdbool.h>
struct Desktop {
char* name;
char* desc;
char* pkg;
char* cmd;
};
#define AUTOSTARTX \
"\n#auto-startx \nif [[ \"$(tty)\" == \"/dev/tty1\" ]] && [ -z " \
"\"$DISPLAY\" ]; then\nexec startx\nfi\n"
bool exists(char*);
char* check_path(char*);
bool joinhome(char*, char*);
bool endswith(const char*, const char*);
typedef struct Desktop {
char *name;
char *desc;
char *pkg;
char *cmd;
} desktop_t;
bool exists(char *);
char *check_path(char *);
bool joinhome(char *, char *);
bool endswith(const char *, const char *);