Compare commits
10 Commits
d50d357173
...
d0013946f4
Author | SHA1 | Date | |
---|---|---|---|
d0013946f4 | |||
22364da8be | |||
0caafc793b | |||
004f5fbdcf | |||
fd6489f13f | |||
bf056066a9 | |||
4348714727 | |||
aa7521bedc | |||
f579c8be6a | |||
258afdee29 |
225
.clang-format
Normal file
225
.clang-format
Normal 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
|
||||||
|
...
|
||||||
|
|
75
Makefile
75
Makefile
@ -1,38 +1,61 @@
|
|||||||
prefix = /usr
|
|
||||||
SRCS = $(wildcard src/*.c)
|
|
||||||
HEADERS = $(wildcard src/*.h)
|
HEADERS = $(wildcard src/*.h)
|
||||||
PO_DIRS = $(wildcard locale/*/*)
|
CSRCS = $(wildcard src/*.c)
|
||||||
PO_FILES = $(wildcard locale/*/*/*.po)
|
|
||||||
|
|
||||||
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
|
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
|
mkdir -p locale
|
||||||
xgettext -k_ -c $(SRCS) -o locale/xcfg.pot
|
xgettext -k_ -c $^ -o $@
|
||||||
@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
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
mkdir -p $(DESTDIR)$(prefix)/bin
|
mkdir -pv $(DESTDIR)/$(prefix)/bin
|
||||||
install -m755 dist/xcfg $(DESTDIR)$(prefix)/bin/xcfg
|
install -v -m755 dist/xcfg $(DESTDIR)/$(prefix)/bin/xcfg
|
||||||
@for po in $(PO_DIRS) ; do \
|
@for po in $(PO_DIRS) ; do \
|
||||||
echo "installing locale: $$po/xcfg.mo" ; \
|
echo "installing locale: $$po/xcfg.mo" ; \
|
||||||
mkdir -pv $(DESTDIR)/usr/share/$$po ; \
|
install -v -Ddm755 $(DESTDIR)/usr/share/$$po ; \
|
||||||
cp $$po/xcfg.mo $(DESTDIR)/usr/share/$$po ; \
|
install -m644 $$po/xcfg.mo $(DESTDIR)/usr/share/$$po ; \
|
||||||
done
|
done
|
||||||
|
|
||||||
uninstall:
|
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
|
||||||
|
@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \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"
|
"PO-Revision-Date: 2024-02-20 20:36+0300\n"
|
||||||
"Last-Translator: <ngn@ngn.tf>\n"
|
"Last-Translator: <ngn@ngn.tf>\n"
|
||||||
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
|
"Language-Team: Turkish <gnome-turk@gnome.org>\n"
|
||||||
@ -17,67 +17,97 @@ msgstr ""
|
|||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\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
|
#, fuzzy
|
||||||
msgid "Failed to get the home directory"
|
msgid "Failed to get the home directory"
|
||||||
msgstr "Ev dizini bulmak başarısız oldu"
|
msgstr "Ev dizini bulmak başarısız oldu"
|
||||||
|
|
||||||
#: src/main.c:107
|
#: src/main.c:55
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open %s for reading"
|
msgid "Failed to open %s for reading"
|
||||||
msgstr "%s dosyasını okumak için açmak başarısız oldu"
|
msgstr "%s dosyasını okumak için açmak başarısız oldu"
|
||||||
|
|
||||||
#: src/main.c:146
|
#: src/main.c:94
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open %s for writing"
|
msgid "Failed to open %s for writing"
|
||||||
msgstr "%s dosyasını yazmak için açmak başarısız oldu"
|
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
|
#, c-format
|
||||||
msgid "Failed to write to %s"
|
msgid "Failed to write to %s"
|
||||||
msgstr "%s dosyasına yazmak başarısız oldu"
|
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!"
|
msgid "You should use this script as a regular user, not as root!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Bu betiği normal bir kullanıcı olarak kullanmalısınız, kök kullanıcı olarak "
|
"Bu betiği normal bir kullanıcı olarak kullanmalısınız, kök kullanıcı olarak "
|
||||||
"değil!"
|
"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
|
#, fuzzy
|
||||||
msgid "mp is not installed!"
|
msgid "matt is not installed!"
|
||||||
msgstr "mp kurulu değil"
|
msgstr "mp kurulu değil"
|
||||||
|
|
||||||
#: src/main.c:198
|
#: src/main.c:159
|
||||||
msgid "Install doas or sudo to use this script"
|
msgid "Install doas or sudo to use this script"
|
||||||
msgstr "Bu betiği kullanmak için doas ya da sudo kurun"
|
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"
|
msgid "Choose a desktop enviroment"
|
||||||
msgstr "Bir masaüstü ortamı seçin"
|
msgstr "Bir masaüstü ortamı seçin"
|
||||||
|
|
||||||
#: src/main.c:222
|
#: src/main.c:180
|
||||||
msgid "Yes"
|
|
||||||
msgstr "Evet"
|
|
||||||
|
|
||||||
#: src/main.c:222
|
|
||||||
msgid "No"
|
|
||||||
msgstr "Hayır"
|
|
||||||
|
|
||||||
#: src/main.c:229
|
|
||||||
msgid "Add auto-startx to shell configuration?"
|
msgid "Add auto-startx to shell configuration?"
|
||||||
msgstr "Otomatik-startx kabuk konfigürasyonu ekle?"
|
msgstr "Otomatik-startx kabuk konfigürasyonu ekle?"
|
||||||
|
|
||||||
#: src/main.c:255
|
#: src/main.c:201
|
||||||
msgid "Configuration has been saved!"
|
msgid "Configuration has been saved!"
|
||||||
msgstr "Konfigürasyon kaydedildi!"
|
msgstr "Konfigürasyon kaydedildi!"
|
||||||
|
|
||||||
#: src/main.c:257
|
#: src/main.c:203
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "Installing %s"
|
msgid "Installing %s"
|
||||||
msgstr "%s kuruluyor"
|
msgstr "%s kuruluyor"
|
||||||
|
|
||||||
#: src/main.c:263
|
#: src/main.c:207
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Installation failed"
|
msgid "Installation failed"
|
||||||
msgstr "Kurulum başarısız oldu"
|
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"
|
||||||
|
22
src/log.c
22
src/log.c
@ -1,36 +1,36 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void info(const char* msg, ...){
|
void info(const char *msg, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, msg);
|
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);
|
vprintf(msg, args);
|
||||||
printf(LOG_RESET"\n");
|
printf(C_RESET "\n");
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void error(const char* msg, ...){
|
void error(const char *msg, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, msg);
|
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);
|
vprintf(msg, args);
|
||||||
printf(LOG_RESET"\n");
|
printf(C_RESET "\n");
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void success(const char* msg, ...){
|
void success(const char *msg, ...) {
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, msg);
|
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);
|
vprintf(msg, args);
|
||||||
printf(LOG_RESET"\n");
|
printf(C_RESET "\n");
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
18
src/log.h
18
src/log.h
@ -1,9 +1,11 @@
|
|||||||
#define LOG_RED "\x1b[31m"
|
#pragma once
|
||||||
#define LOG_BOLD "\x1b[1m"
|
|
||||||
#define LOG_BLUE "\x1b[34m"
|
|
||||||
#define LOG_GREEN "\x1b[32m"
|
|
||||||
#define LOG_RESET "\x1b[0m"
|
|
||||||
|
|
||||||
void info(const char* msg, ...);
|
#define C_RED "\x1b[31m"
|
||||||
void error(const char* msg, ...);
|
#define C_BOLD "\x1b[1m"
|
||||||
void success(const char* msg, ...);
|
#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, ...);
|
||||||
|
232
src/main.c
232
src/main.c
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
* xcfg | simple xorg configuration tool
|
* 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
|
* 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
|
* 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 <curses.h>
|
||||||
|
#include <libintl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <menu.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <menu.h>
|
|
||||||
#include "util.h"
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "term.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#define _(x) gettext(x)
|
#define _(x) gettext(x)
|
||||||
|
|
||||||
int ask(char* text, ITEM** items, int sz) {
|
bool add_startx() {
|
||||||
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 ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
char* profile = ".bash_profile";
|
char *profile = ".bash_profile";
|
||||||
char* shellenv = getenv("SHELL");
|
char *shellenv = getenv("SHELL");
|
||||||
if (NULL != shellenv && endswith(shellenv, "zsh"))
|
if (NULL != shellenv && endswith(shellenv, "zsh"))
|
||||||
profile = ".zshrc";
|
profile = ".zshrc";
|
||||||
|
|
||||||
char profile_file[PATH_MAX];
|
char profile_file[PATH_MAX];
|
||||||
if(!joinhome(profile_file, profile)){
|
if (!joinhome(profile_file, profile)) {
|
||||||
error(_("Failed to get the home directory"));
|
error(_("Failed to get the home directory"));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* pf = fopen(profile_file, "r");
|
FILE *pf = fopen(profile_file, "r");
|
||||||
if(NULL==pf){
|
if (NULL == pf) {
|
||||||
error(_("Failed to open %s for reading"), profile_file);
|
error(_("Failed to open %s for reading"), profile_file);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* line = NULL, *all = NULL;
|
char *line = NULL, *all = NULL;
|
||||||
int indx = 0;
|
int indx = 0;
|
||||||
size_t sz, len;
|
size_t sz, len;
|
||||||
|
|
||||||
while((sz = getline(&line, &len, pf)) != -1) {
|
while ((sz = getline(&line, &len, pf)) != -1) {
|
||||||
if(strcmp(line, "#auto-startx \n")==0){
|
if (strcmp(line, "#auto-startx \n") == 0) {
|
||||||
ret = true;
|
ret = true;
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == all){
|
if (NULL == all) {
|
||||||
all = malloc(sz);
|
all = malloc(sz);
|
||||||
for(int i = 0; i < sz; i++){
|
for (int i = 0; i < sz; i++) {
|
||||||
all[indx] = line[i];
|
all[indx] = line[i];
|
||||||
indx++;
|
indx++;
|
||||||
}
|
}
|
||||||
}else {
|
} else {
|
||||||
all = realloc(all, indx+sz);
|
all = realloc(all, indx + sz);
|
||||||
for(int i = 0; i < sz; i++){
|
for (int i = 0; i < sz; i++) {
|
||||||
all[indx] = line[i];
|
all[indx] = line[i];
|
||||||
indx++;
|
indx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char* startx = AUTOSTARTX;
|
char *startx = AUTOSTARTX;
|
||||||
all = realloc(all, indx+strlen(startx)+10);
|
all = realloc(all, indx + strlen(startx) + 10);
|
||||||
for(int i = 0; i < strlen(startx); i++){
|
for (int i = 0; i < strlen(startx); i++) {
|
||||||
all[indx] = startx[i];
|
all[indx] = startx[i];
|
||||||
indx++;
|
indx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(pf);
|
fclose(pf);
|
||||||
pf = fopen(profile_file, "w");
|
pf = fopen(profile_file, "w");
|
||||||
if(NULL==pf){
|
if (NULL == pf) {
|
||||||
error(_("Failed to open %s for writing"), profile_file);
|
error(_("Failed to open %s for writing"), profile_file);
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
all[indx] = '\0';
|
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);
|
error(_("Failed to write to %s"), profile_file);
|
||||||
ret = true;
|
ret = true;
|
||||||
|
|
||||||
@ -159,111 +107,107 @@ END:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv, char** envp){
|
int main(int argc, char **argv, char **envp) {
|
||||||
if(getuid()==0){
|
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!"));
|
error(_("You should use this script as a regular user, not as root!"));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGINT, SIG_IGN);
|
if (argc >= 2 && strcmp(argv[1], "--version") == 0) {
|
||||||
setlocale(LC_ALL, "");
|
success(_("Simple xorg configuration tool %s"), VERSION);
|
||||||
textdomain("mp");
|
info(_("Licensed under GPLv3, see https://www.gnu.org/licenses/ for more information"));
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
struct Desktop desktops[] = {
|
struct Desktop desktops[] = {
|
||||||
{
|
{
|
||||||
.name="XFCE4",
|
.name = "XFCE4",
|
||||||
.desc="Lightweight desktop environment for UNIX-like operating systems",
|
.desc = _("Lightweight desktop environment for UNIX-like operating "
|
||||||
.pkg="xfce4",
|
"systems"),
|
||||||
.cmd="startxfce4\n",
|
.pkg = "xfce4",
|
||||||
},
|
.cmd = "startxfce4\n",
|
||||||
{
|
},
|
||||||
.name="bspwm",
|
{
|
||||||
.desc="Tiling window manager based on binary space partitioning",
|
.name = "LXDE",
|
||||||
.pkg="bspwm",
|
.desc = _("Free desktop environment with comparatively low resource "
|
||||||
.cmd="bspwm\n"
|
"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");
|
char *mpi_path = check_path("matt");
|
||||||
if(NULL==mpi_path){
|
if (NULL == mpi_path) {
|
||||||
error(_("mp is not installed!"));
|
error(_("matt is not installed!"));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
free(mpi_path);
|
free(mpi_path);
|
||||||
|
|
||||||
char* doas_path = check_path("doas");
|
char *doas_path = check_path("doas");
|
||||||
if(NULL==doas_path) {
|
if (NULL == doas_path) {
|
||||||
doas_path = check_path("sudo");
|
doas_path = check_path("sudo");
|
||||||
if(NULL==doas_path){
|
if (NULL == doas_path) {
|
||||||
error(_("Install doas or sudo to use this script"));
|
error(_("Install doas or sudo to use this script"));
|
||||||
free(mpi_path);
|
free(mpi_path);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
initscr();
|
term_init();
|
||||||
cbreak();
|
|
||||||
noecho();
|
|
||||||
keypad(stdscr, TRUE);
|
|
||||||
init_pair(1, COLOR_BLUE, COLOR_BLUE);
|
|
||||||
|
|
||||||
int sz = sizeof(desktops)/sizeof(struct Desktop);
|
int sz = sizeof(desktops) / sizeof(struct Desktop);
|
||||||
ITEM** items = (ITEM **)malloc(sizeof(ITEM *)*(sz+1));
|
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[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++)
|
for (int i = 0; i < sz; i++)
|
||||||
free_item(items[i]);
|
free_item(items[i]);
|
||||||
free(items);
|
free(items);
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
char* yn[] = {_("Yes"), _("No")};
|
bool autox = term_yn(_("Add auto-startx to shell configuration?"));
|
||||||
sz = sizeof(yn)/sizeof(char*);
|
|
||||||
items = (ITEM **)malloc(sizeof(ITEM *)*(sz+1));
|
|
||||||
|
|
||||||
for(int i = 0; i < sz; i++)
|
term_finish();
|
||||||
items[i] = new_item(yn[i], "");
|
|
||||||
|
|
||||||
bool autox = ask(_("Add auto-startx to shell configuration?"), items, sz) == 0;
|
if (autox && !add_startx())
|
||||||
for (int i = 0; i < sz; i++)
|
goto fail;
|
||||||
free_item(items[i]);
|
|
||||||
free(items);
|
|
||||||
clear();
|
|
||||||
|
|
||||||
clear();
|
|
||||||
endwin();
|
|
||||||
|
|
||||||
if(autox && !add_startx())
|
|
||||||
goto FAIL;
|
|
||||||
|
|
||||||
char xinitrc[PATH_MAX];
|
char xinitrc[PATH_MAX];
|
||||||
if(!joinhome(xinitrc, ".xinitrc")){
|
if (!joinhome(xinitrc, ".xinitrc")) {
|
||||||
error(_("Failed to get the home directory"));
|
error(_("Failed to get the home directory"));
|
||||||
goto FAIL;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* xf = fopen(xinitrc, "w");
|
FILE *xf = fopen(xinitrc, "w");
|
||||||
if(fwrite(desktops[indx].cmd, 1, strlen(desktops[indx].cmd), xf)<0){
|
if (fwrite(desktops[indx].cmd, 1, strlen(desktops[indx].cmd), xf) < 0) {
|
||||||
error(_("Failed to write to %s"), xinitrc);
|
error(_("Failed to write to %s"), xinitrc);
|
||||||
fclose(xf);
|
fclose(xf);
|
||||||
goto FAIL;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(xf);
|
fclose(xf);
|
||||||
success(_("Configuration has been saved!"));
|
success(_("Configuration has been saved!"));
|
||||||
|
|
||||||
info(_("Installing %s"), desktops[indx].name, mpi_path);
|
info(_("Installing %s"), desktops[indx].name, mpi_path);
|
||||||
char* args[] = {
|
char *args[] = {doas_path, "matt", "install", "--skip", desktops[indx].pkg, NULL};
|
||||||
doas_path, "mp-install", desktops[indx].pkg, NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
if(execvp(doas_path, args) != 0) {
|
if (execvp(doas_path, args) != 0) {
|
||||||
error(_("Installation failed"));
|
error(_("Installation failed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
FAIL:
|
fail:
|
||||||
free(doas_path);
|
free(doas_path);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
100
src/term.c
Normal file
100
src/term.c
Normal 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
7
src/term.h
Normal 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();
|
36
src/util.c
36
src/util.c
@ -1,49 +1,49 @@
|
|||||||
#include <stdbool.h>
|
#include "util.h"
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
bool joinhome(char* res, char* path){
|
bool joinhome(char *res, char *path) {
|
||||||
char* homedir = getenv("HOME");
|
char *homedir = getenv("HOME");
|
||||||
|
|
||||||
if(NULL==homedir)
|
if (NULL == homedir)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
snprintf(res, PATH_MAX, "%s/%s", homedir, path);
|
snprintf(res, PATH_MAX, "%s/%s", homedir, path);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool exists(char* path){
|
bool exists(char *path) {
|
||||||
return access(path, F_OK)==0;
|
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 strl = strlen(str);
|
||||||
int sufl = strlen(suf);
|
int sufl = strlen(suf);
|
||||||
|
|
||||||
if (sufl > strl)
|
if (sufl > strl)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return strncmp(str + strl - sufl, suf, sufl) == 0;
|
return strncmp(str + strl - sufl, suf, sufl) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* check_path(char* bin) {
|
char *check_path(char *bin) {
|
||||||
char* path = getenv("PATH");
|
char *path = getenv("PATH");
|
||||||
char* res = NULL;
|
char *res = NULL;
|
||||||
|
|
||||||
if(NULL == path)
|
if (NULL == path)
|
||||||
return NULL;
|
return NULL;
|
||||||
path = strdup(path);
|
path = strdup(path);
|
||||||
|
|
||||||
char* p = strtok(path, ":");
|
char *p = strtok(path, ":");
|
||||||
while(NULL != p) {
|
while (NULL != p) {
|
||||||
char* fp = malloc(PATH_MAX);
|
char *fp = malloc(PATH_MAX);
|
||||||
snprintf(fp, PATH_MAX, "%s/%s", p, bin);
|
snprintf(fp, PATH_MAX, "%s/%s", p, bin);
|
||||||
if(exists(fp)){
|
if (exists(fp)) {
|
||||||
res = fp;
|
res = fp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
27
src/util.h
27
src/util.h
@ -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 {
|
#define AUTOSTARTX \
|
||||||
char* name;
|
"\n#auto-startx \nif [[ \"$(tty)\" == \"/dev/tty1\" ]] && [ -z " \
|
||||||
char* desc;
|
"\"$DISPLAY\" ]; then\nexec startx\nfi\n"
|
||||||
char* pkg;
|
|
||||||
char* cmd;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool exists(char*);
|
typedef struct Desktop {
|
||||||
char* check_path(char*);
|
char *name;
|
||||||
bool joinhome(char*, char*);
|
char *desc;
|
||||||
bool endswith(const char*, const char*);
|
char *pkg;
|
||||||
|
char *cmd;
|
||||||
|
} desktop_t;
|
||||||
|
|
||||||
|
bool exists(char *);
|
||||||
|
char *check_path(char *);
|
||||||
|
bool joinhome(char *, char *);
|
||||||
|
bool endswith(const char *, const char *);
|
||||||
|
Loading…
Reference in New Issue
Block a user