diff --git a/.gitignore b/.gitignore
index c6127b3..8480e34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
*.d
# Object files
+.build/
*.o
*.ko
*.obj
@@ -50,3 +51,5 @@ modules.order
Module.symvers
Mkfile.old
dkms.conf
+
+PackageSaver
\ No newline at end of file
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/README.md b/README.md
index df18f6a..f55896d 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,8 @@ A GUI is in work in progress build, check the GUI branch.
## How to use it ?
+### If you want to use the command line
+
1) Make sure you have the correct permission to use it
> chmod 777 packageManager.sh
@@ -27,6 +29,16 @@ A GUI is in work in progress build, check the GUI branch.
> ./packageManager.sh
+### If you want to use the GUI
+
+1) Compile the project
+
+> make
+
+2) Run the programs, check packages you want to keeps, and after click on the "Save in a file" button.
+
+> ./PackageSaver
+
## How to contribute ?
Everyone is free to contribute, just clone the project, make your modification and make a pull request with an explanaition of your changes
diff --git a/assets/glade/packageSaver.glade b/assets/glade/packageSaver.glade
new file mode 100644
index 0000000..c1708e1
--- /dev/null
+++ b/assets/glade/packageSaver.glade
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
diff --git a/include/PkgSaver.h b/include/PkgSaver.h
new file mode 100644
index 0000000..4e0b6bf
--- /dev/null
+++ b/include/PkgSaver.h
@@ -0,0 +1,18 @@
+#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_saveFile_clicked (GtkButton *btn, 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..5b3ffd4
--- /dev/null
+++ b/src/PkgSaver.c
@@ -0,0 +1,136 @@
+#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;
+}
+
+/**
+ * @brief Function to save packageName into a file
+ *
+ * @param btn button clicked
+ * @param user_data treeView in which data is
+ */
+void on_saveFile_clicked (GtkButton *btn, gpointer user_data)
+{
+ treeViewer *tv = (treeViewer*) user_data;
+ GtkTreeModel *model = gtk_tree_view_get_model(tv->treeView);
+ GtkTreeIter iter;
+ gtk_tree_model_get_iter_first(model, &iter);
+ FILE *fp;
+
+ fp = fopen("packageToKeep.txt", "w");
+ if (fp == NULL)
+ {
+ fprintf(stderr, "Error opening the file, please open an issue on github!");
+ exit(1);
+ }
+ int row = 0;
+
+ while (1)
+ {
+ gchar *pkgName;
+ gboolean isKept = FALSE;
+
+ gtk_tree_model_get(model, &iter, 1, &isKept, -1); //Getting the bool of the row
+ //fprintf(stderr, "row %d\n",row);
+ /* Checking if the user asked to keep the row or not */
+ if (isKept == TRUE)
+ {
+ gtk_tree_model_get(model, &iter, 0, &pkgName, -1); // Getting the packageName
+ fputs(pkgName, fp);
+ }
+
+ if (gtk_tree_model_iter_next (model, &iter) == FALSE)
+ {
+ break;
+ }
+ row++;
+ }
+ fclose(fp);
+ //fprintf(stderr, "File closed");
+}
+
+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..5292f12
--- /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("assets/glade/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"));
+ GtkButton *saveFileButton = GTK_BUTTON(gtk_builder_get_object(builder, "SaveInFile"));
+
+
+ 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);
+ g_signal_connect (saveFileButton, "clicked", G_CALLBACK (on_saveFile_clicked), &tv);
+
+ gtk_widget_show_all(window);
+
+ gtk_main();
+ return EXIT_SUCCESS;
+}
+