new: Add proper color support, move ncurses code to term.c

This commit is contained in:
ngn 2024-04-23 02:28:22 +03:00
parent bf056066a9
commit fd6489f13f
9 changed files with 271 additions and 227 deletions

View File

@ -1,9 +1,11 @@
prefix = /usr
SRCS = $(wildcard src/*.c) SRCS = $(wildcard src/*.c)
HEADERS = $(wildcard src/*.h) HEADERS = $(wildcard src/*.h)
PO_DIRS = $(wildcard locale/*/*) PO_DIRS = $(wildcard locale/*/*)
PO_FILES = $(wildcard locale/*/*/*.po) PO_FILES = $(wildcard locale/*/*/*.po)
prefix = /usr
dist/xcfg: $(SRCS) $(HEADERS) $(PO_FILES) dist/xcfg: $(SRCS) $(HEADERS) $(PO_FILES)
mkdir -p dist mkdir -p dist
gcc $(CFLAGS) $(SRCS) -o $@ -lncurses -lmenu -lm gcc $(CFLAGS) $(SRCS) -o $@ -lncurses -lmenu -lm
@ -35,4 +37,7 @@ install:
uninstall: uninstall:
rm $(DESTDIR)$(prefix)/bin/xcfg rm $(DESTDIR)$(prefix)/bin/xcfg
.PHONY: install uninstall format:
clang-format -i -style=file src/*.c src/*.h
.PHONY: install uninstall format

View File

@ -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-03-24 03:18+0300\n" "POT-Creation-Date: 2024-04-23 02:27+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,83 +17,83 @@ 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:256 #: src/main.c:49 src/main.c:185
#, 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:262 #: src/main.c:100 src/main.c:191
#, 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:112
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:175 #: src/main.c:123
msgid "Lightweight desktop environment for UNIX-like operating systems" msgid "Lightweight desktop environment for UNIX-like operating systems"
msgstr "UNIX-gibi işletim sistemleri için hafif bir masaütü" msgstr "UNIX-gibi işletim sistemleri için hafif bir masaütü"
#: src/main.c:181 #: src/main.c:130
msgid "Free desktop environment with comparatively low resource requirements" msgid "Free desktop environment with comparatively low resource requirements"
msgstr "Nispeten düşük sistem gereksinimleri olan özgür bir masaüstü ortamı" msgstr "Nispeten düşük sistem gereksinimleri olan özgür bir masaüstü ortamı"
#: src/main.c:187 #: src/main.c:136
msgid "Tiling window manager based on binary space partitioning" msgid "Tiling window manager based on binary space partitioning"
msgstr "İkili alan bölme tabanlı döşeme pencere yöneticisi" msgstr "İkili alan bölme tabanlı döşeme pencere yöneticisi"
#: src/main.c:193 #: src/main.c:140
msgid "Improved tiling window manager" msgid "Improved tiling window manager"
msgstr "Geliştirilmiş döşeme pencere yöneticisi" msgstr "Geliştirilmiş döşeme pencere yöneticisi"
#: src/main.c:201 #: src/main.c:146
#, fuzzy #, fuzzy
msgid "mp is not installed!" msgid "mp is not installed!"
msgstr "mp kurulu değil" msgstr "mp kurulu değil"
#: src/main.c:210 #: src/main.c:155
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:229 #: src/main.c:170
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:235 #: src/main.c:176
msgid "Yes"
msgstr "Evet"
#: src/main.c:235
msgid "No"
msgstr "Hayır"
#: src/main.c:242
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:268 #: src/main.c:197
msgid "Configuration has been saved!" msgid "Configuration has been saved!"
msgstr "Konfigürasyon kaydedildi!" msgstr "Konfigürasyon kaydedildi!"
#: src/main.c:270 #: src/main.c:199
#, fuzzy, c-format #, fuzzy, c-format
msgid "Installing %s" msgid "Installing %s"
msgstr "%s kuruluyor" msgstr "%s kuruluyor"
#: src/main.c:276 #: src/main.c:203
#, 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"

View File

@ -1,14 +1,14 @@
#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);
} }
@ -17,9 +17,9 @@ 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);
} }
@ -28,9 +28,9 @@ 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);
} }

View File

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

View File

@ -18,76 +18,24 @@
*/ */
#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) {
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, ">");
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; bool ret = false;
@ -172,29 +120,26 @@ int main(int argc, char** argv, char** envp){
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 "
"systems"),
.pkg = "xfce4", .pkg = "xfce4",
.cmd = "startxfce4\n", .cmd = "startxfce4\n",
}, },
{ {
.name = "LXDE", .name = "LXDE",
.desc=_("Free desktop environment with comparatively low resource requirements"), .desc = _("Free desktop environment with comparatively low resource "
"requirements"),
.pkg = "lxde", .pkg = "lxde",
.cmd = "startlxde\n", .cmd = "startlxde\n",
}, },
{ {.name = "bspwm",
.name="bspwm",
.desc = _("Tiling window manager based on binary space partitioning"), .desc = _("Tiling window manager based on binary space partitioning"),
.pkg = "bspwm", .pkg = "bspwm",
.cmd="bspwm\n" .cmd = "bspwm\n"},
}, {.name = "i3",
{
.name="i3",
.desc = _("Improved tiling window manager"), .desc = _("Improved tiling window manager"),
.pkg = "i3", .pkg = "i3",
.cmd="i3\n" .cmd = "i3\n"}};
}
};
char *mpi_path = check_path("mp-install"); char *mpi_path = check_path("mp-install");
if (NULL == mpi_path) { if (NULL == mpi_path) {
@ -213,11 +158,7 @@ int main(int argc, char** argv, char** envp){
} }
} }
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 = malloc(sizeof(ITEM *) * (sz + 1)); ITEM **items = malloc(sizeof(ITEM *) * (sz + 1));
@ -226,27 +167,15 @@ int main(int argc, char** argv, char** envp){
items[i] = new_item(desktops[i].name, desktops[i].desc); items[i] = new_item(desktops[i].name, desktops[i].desc);
items[sz] = NULL; items[sz] = NULL;
int indx = ask(_("Choose a desktop enviroment"), items, sz+1); 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"), NULL}; 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;
for (int i = 0; i < sz; i++)
free_item(items[i]);
free(items);
clear();
clear();
endwin();
if (autox && !add_startx()) if (autox && !add_startx())
goto FAIL; goto FAIL;
@ -268,9 +197,7 @@ int main(int argc, char** argv, char** envp){
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, "mp-install", 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"));

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,11 +1,11 @@
#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");
@ -17,9 +17,7 @@ bool joinhome(char* res, char* 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);

View File

@ -1,11 +1,16 @@
#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 \
"\n#auto-startx \nif [[ \"$(tty)\" == \"/dev/tty1\" ]] && [ -z " \
"\"$DISPLAY\" ]; then\nexec startx\nfi\n"
typedef struct Desktop {
char *name; char *name;
char *desc; char *desc;
char *pkg; char *pkg;
char *cmd; char *cmd;
}; } desktop_t;
bool exists(char *); bool exists(char *);
char *check_path(char *); char *check_path(char *);