diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..5114842 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,45 @@ +{ + "configurations": [ + { + "name": "C Linux GTK3", + "includePath": [ + "${workspaceFolder}/**", + "/usr/lib/glib-2.0/include/", + "/usr/include/gtk-3.0", + "/usr/include/pango-1.0", + "/usr/include/glib-2.0", + "/usr/include/harfbuzz", + "/usr/include/fribidi", + "/usr/include/libpng16", + "/usr/include/cairo", + "/usr/include/pixman-1", + "/usr/include/gdk-pixbuf-2.0", + "/usr/include/libmount", + "/usr/include/blkid", + "/usr/include/gio-unix-2.0", + "/usr/include/atk-1.0", + "/usr/include/at-spi2-atk/2.0", + "/usr/include/at-spi-2.0", + "/usr/include/dbus-1.0", + "/usr/lib/dbus-1.0/include", + "/usr/local/include", + "/usr/include" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "clang-x64", + "compilerArgs": [ + "-Wall", + "-Wextra", + "-mtune=native", + "-no-pie", + "`pkg-config gtk+-3.0 --cflags`", + "`pkg-config --libs gtk+-3.0`", + "-lm" + ] + } + ], + "version": 4 + } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2296ae1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "makefile.launchConfigurations": [ + { + "cwd": "/home/arka/Documents/Dev/C/Projets/PackageSaver", + "binaryPath": "/home/arka/Documents/Dev/C/Projets/PackageSaver/PackageSaver", + "binaryArgs": [] + } + ], + "files.associations": { + "random": "c" + } +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c794ac2 --- /dev/null +++ b/Makefile @@ -0,0 +1,84 @@ +NAME := PackageSaver + +#------------------------------------------------# +# INGREDIENTS # +#------------------------------------------------# +# +# INCS header file locations +# +# SRC_DIR source directory +# SRCS source files +# +# BUILD_DIR build directory +# OBJS object files +# DEPS dependency files +# +# CC compiler +# CFLAGS compiler flags +# CPPFLAGS preprocessor flags +# LDFLAGS linker flags +# LDLIBS libraries name + +INCS := include + +SRC_DIR := src +SRCS := PkgSaver.c main.c +SRCS := $(SRCS:%=$(SRC_DIR)/%) + +BUILD_DIR := .build +OBJS := $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o) + +CC := gcc +CFLAGS := -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic +CPPFLAGS := $(addprefix -I,$(INCS)) + +#------------------------------------------------# +# UTENSILS # +#------------------------------------------------# +# RM force remove +# MAKE quietly make +# DIR_DUP duplicate directory tree + +RM := rm -f +MAKE := $(MAKE) --silent --no-print-directory +DIR_DUP = mkdir -p $(@D) + + +#------------------------------------------------# +# RECIPES # +#------------------------------------------------# +# all default goal +# $(NAME) link .o -> archive +# $(LIBS) build libraries +# %.o compilation .c -> .o +# clean remove .o +# fclean remove .o + binary +# re remake default goal +# run run the program +# info print the default goal recipe + +all: $(NAME) + +$(NAME): $(OBJS) + $(CC) $(OBJS) -o $(NAME) $(CFLAGS) + +$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c + $(DIR_DUP) + $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< + +clean: + $(RM) $(OBJS) + +fclean: clean + $(RM) $(NAME) + +re: + $(MAKE) fclean + $(MAKE) all + +#------------------------------------------------# +# SPEC # +#------------------------------------------------# + +.PHONY: clean fclean re +.SILENT: diff --git a/PackageSaver b/PackageSaver new file mode 100755 index 0000000..b81d99f Binary files /dev/null and b/PackageSaver differ diff --git a/include/PkgSaver.h b/include/PkgSaver.h new file mode 100644 index 0000000..7aa7ce2 --- /dev/null +++ b/include/PkgSaver.h @@ -0,0 +1,17 @@ +#ifndef DEF_PKGSAVER_H +#define DEF_PKGSAVER_H + +#include + +typedef struct _treeViewer treeViewer; +struct _treeViewer +{ + GtkTreeView *treeView; + GtkTreeStore *treeStore; +}; + +void init_packages(treeViewer *tv); +void on_ct2_toggled (GtkCellRendererToggle *cell, gchar *path_string, gpointer user_data); +void on_destroy(); + +#endif \ No newline at end of file diff --git a/packageManager.sh b/packageManager.sh index f5cc12d..5089509 100755 --- a/packageManager.sh +++ b/packageManager.sh @@ -82,7 +82,7 @@ do ;; #Pacman is the package manager - pacman) currPkg=$(pacman -Q | sed -n "${pkgI}p" | cut -d" " -f1) + pacman) currPkg=$(pacman -Q | sed -n "${pkgI}p" | cut -d " " -f1) ;; esac diff --git a/src/PkgSaver.c b/src/PkgSaver.c new file mode 100644 index 0000000..e45f91f --- /dev/null +++ b/src/PkgSaver.c @@ -0,0 +1,90 @@ +#include "PkgSaver.h" + +/** + * @brief Function to init the TreeStore content with the packages names + * + * @param tv TreeViewer which needs to be filled + */ +void init_packages(treeViewer *tv) +{ + FILE *fp; + char buffer[1035]; + GtkTreeIter iter; + + /* Getting all the packages */ + fp = popen("pacman -Q | cut -d ' ' -f1", "r"); + if (fp == NULL) { + fprintf(stderr, "Failed to get packages, please open an issue on github\n" ); + exit(1); + } + + /* Read the packages, and adding them into the treeStore*/ + while (fgets(buffer, sizeof(buffer), fp) != NULL) + { + gtk_tree_store_append (tv->treeStore, &iter, NULL); + gtk_tree_store_set(tv->treeStore, &iter, 0, buffer, -1); + gtk_tree_store_set(tv->treeStore, &iter, 1, FALSE, -1); + } + + /* Closing the file */ + pclose(fp); +} + +/** + * @brief Function to get the value of the selected rows + * + * @param selection Selected row + */ +void on_select_changed(GtkTreeSelection *selection) +{ + + gchar *value; + gboolean box; + GtkTreeIter iter; + GtkTreeModel *model; + + if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), &model, &iter) == FALSE) + return; + + /* Getting package column content */ + gtk_tree_model_get(model, &iter, 0, &value, -1); + printf("Select signal received: package = \"%s\"; ", value); + + /* Getting keeping ? column content */ + gtk_tree_model_get(model, &iter, 1, &box, -1); // get column 1 + printf("keeping ? = \"%d\"\n", box); +} + +/** + * @brief Function to change the toggling of a row + * + * @param cell The cell rendered (useless here) + * @param path_string The path of the row we want + * @param user_data TreeViewer which needs to be changed + */ +void on_ct2_toggled (GtkCellRendererToggle *cell, gchar *path_string, gpointer user_data) +{ + GtkTreeIter iter; + GtkTreeModel *model; + gboolean isKept = FALSE; + gchar *packageName; + treeViewer *tv = (treeViewer*) user_data; + + model = gtk_tree_view_get_model(tv->treeView); // get the tree model + + gtk_tree_model_get_iter_from_string (model, &iter, path_string); // get iter from path + + gtk_tree_model_get(model, &iter, 0, &packageName, -1); //Getting the name of the package + gtk_tree_model_get(model, &iter, 1, &isKept, -1); // Getting the value of the boolean + + if (isKept == FALSE) isKept = TRUE; else isKept = FALSE; + + gtk_tree_store_set(tv->treeStore, &iter, 1, isKept, -1); //Changing the checkbox toggling + + return; +} + +void on_destroy() +{ + gtk_main_quit(); +} \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..32b3ae3 --- /dev/null +++ b/src/main.c @@ -0,0 +1,44 @@ +#include "PkgSaver.h" + +int main(int argc, char *argv[]) +{ + /*Initialisation of the window*/ + gtk_init(&argc, &argv); + + GtkBuilder *builder = gtk_builder_new_from_file("src/packageSaver.glade"); + GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); + + g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), NULL); + gtk_builder_connect_signals(builder, NULL); + + + /*Initialisation of the component of the window*/ + treeViewer tv; + tv.treeView = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tv1")); + tv.treeStore = GTK_TREE_STORE(gtk_builder_get_object(builder, "TreeStore")); + GtkTreeViewColumn *cx1 = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "cx1")); + GtkTreeViewColumn *cx2 = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "cx2")); + GtkCellRenderer *ct1 = GTK_CELL_RENDERER(gtk_builder_get_object(builder, "ct1")); + GtkCellRenderer *ct2 = GTK_CELL_RENDERER(gtk_builder_get_object(builder, "ct2")); + GtkTreeSelection *select = GTK_TREE_SELECTION(gtk_builder_get_object(builder, "select")); + + gtk_tree_view_column_add_attribute(cx1, ct1, "text", 0); // attach renderer to column + gtk_tree_view_column_add_attribute(cx2, ct2, "active", 1); // attach renderer to column + + select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv.treeView)); + + /*Init the content of the treestore (all the name of packages)*/ + init_packages(&tv); + + /*Connection all the signal*/ + g_signal_connect (ct2, "toggled", G_CALLBACK (on_ct2_toggled), &tv); + + gtk_widget_show_all(window); + + gtk_main(); + return EXIT_SUCCESS; +} + +// TODO: free all when exiting +// saving the actions into a file ou clipboard +// adding a research by name feature \ No newline at end of file diff --git a/src/packageSaver.glade b/src/packageSaver.glade new file mode 100644 index 0000000..480fd04 --- /dev/null +++ b/src/packageSaver.glade @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + False + False + + + True + False + + + True + True + center + center + True + True + 500 + 200 + + + True + True + TreeStore + horizontal + + + + + + + + autosize + 100 + Package name + True + 0.5 + + + + + + + + 100 + Keeping ? + True + 0.5 + + + + + + + + + + + + Save in a file + 250 + 25 + True + True + True + top + + + + 200 + + + + + Save in clip board + 250 + 25 + True + True + True + top + + + + 250 + 200 + + + + + + diff --git a/src/packageSaver.glade~ b/src/packageSaver.glade~ new file mode 100644 index 0000000..a35e718 --- /dev/null +++ b/src/packageSaver.glade~ @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + False + False + + + True + False + + + True + True + center + center + True + True + 500 + 200 + + + True + True + TreeStore + horizontal + + + + + + + + autosize + 100 + Package name + True + 0.5 + + + + + + + + 100 + Keeping ? + True + 0.5 + + + + + + + + + Save in a file + 250 + 25 + True + True + True + top + + + + 200 + + + + + Save in clip board + 250 + 25 + True + True + True + top + + + + 250 + 200 + + + + + +