diff --git a/Makefile b/Makefile
index 84477f0..b03a7d3 100644
--- a/Makefile
+++ b/Makefile
@@ -112,29 +112,35 @@ install: check uninstall
msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \
done
@for SIZE in 16 32 48; do \
- install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \
- rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+ install -dm755 "${DESTDIR}/usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \
+ rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}/usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
done
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-symbolic.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-green-symbolic.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-red-symbolic.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-symbolic.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-symbolic.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-green-symbolic.svg"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-green-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-red-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-green-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.folder-red-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.document-sign-error-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.chain-error-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.chain-symbolic.svg"
+ @install -Dm755 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "crypt-key.csv"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
@install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
@install -Dm644 "com.ublinux.${PKGNAME}.policy" "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy"
@sed -e '\|annotate key=|s|/usr/bin|${PREFIX}/bin|' -e '/action id=/s/\.run/${PKGIDENT}\.run/' -i ${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy
@if [ -z ${DESTDIR} ]; then \
- [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+ [ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/share/icons/hicolor/" &>/dev/null || true; \
update-desktop-database --quiet &>/dev/null || true; \
- [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+ [ -d "${DESTDIR}/usr/share/applications" ] && touch "${DESTDIR}/usr/share/applications" &>/dev/null || true; \
fi
@echo "Install: OK"
diff --git a/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg b/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg
new file mode 100644
index 0000000..464e9b8
--- /dev/null
+++ b/com.ublinux.ubl-settings-repomanager.chain-error-symbolic.svg
@@ -0,0 +1,36 @@
+
+
diff --git a/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg b/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg
new file mode 100644
index 0000000..20437e2
--- /dev/null
+++ b/com.ublinux.ubl-settings-repomanager.chain-symbolic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg
new file mode 100644
index 0000000..851beea
--- /dev/null
+++ b/com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic.svg
@@ -0,0 +1,62 @@
+
+
diff --git a/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg
index a11cbf1..994f24a 100644
--- a/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg
+++ b/com.ublinux.ubl-settings-repomanager.document-sign-symbolic.svg
@@ -47,10 +47,12 @@
id="stop490" />
\ No newline at end of file
diff --git a/crypt-key.csv b/crypt-key.csv
new file mode 100644
index 0000000..5c8e385
--- /dev/null
+++ b/crypt-key.csv
@@ -0,0 +1,7 @@
+KEY_NAME;KEY_DESCRIPTION;KEY_ALGO_NAME
+RSA;RSA/RSA;RSA
+DSA ElGamal;DSA/ELG;ELG
+DSA (sign only);DSA;DSA
+RSA (sign only);RSA;RSA
+GOST R 34.10-2012;GOST3410-2012;GOST3410-2012
+GOST R 34.10-2001;GOST3410-2001;GOST3410-2001
\ No newline at end of file
diff --git a/gresource.xml b/gresource.xml
index 58afa6e..1dd3f75 100644
--- a/gresource.xml
+++ b/gresource.xml
@@ -2,7 +2,11 @@
ubl-settings-repomanager.glade
- ubl-settings-repomanager-windows.glade
+ ubl-settings-repomanager-add.glade
+ ubl-settings-repomanager-configuration.glade
+ ubl-settings-repomanager-repo-block.glade
+ ubl-settings-repomanager-filechooser.glade
+ ubl-settings-repomanager-key.glade
ubl-settings-repomanager-sign.glade
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 4eb002d..65f3e99 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -8,6 +8,11 @@ include_directories(${GTK_INCLUDE_DIRS})
link_directories(${GTK_LIBRARY_DIRS})
add_definitions(${GTK_CFLAGS_OTHER})
+pkg_check_modules(VTE291 REQUIRED vte-2.91)
+include_directories(${VTE291_INCLUDE_DIRS})
+link_directories(${VTE291_LIBRARY_DIRS})
+add_definitions(${VTE291_CFLAGS_OTHER})
+
find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
option(WEBKIT_FOUND "No" OFF)
@@ -31,8 +36,12 @@ add_custom_target(GLADE ubl-settings-repomanager.glade)
set(DEPENDFILES
../ubl-settings-repomanager.glade
- ../ubl-settings-repomanager-windows.glade
+ ../ubl-settings-repomanager-add.glade
+ ../ubl-settings-repomanager-configuration.glade
+ ../ubl-settings-repomanager-filechooser.glade
+ ../ubl-settings-repomanager-key.glade
../ubl-settings-repomanager-sign.glade
+ ../ubl-settings-repomanager-repo-block.glade
../gresource.xml
../ubl-settings-repomanager-banner.png
../ubl-settings-repomanager.css
@@ -70,15 +79,17 @@ set(SOURCE_FILES
ubl-settings-repomanager.c
ubl-settings-repomanager.h
ubl-strings.h
- ubl-utils.h
- ubl-utils.c
${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h
)
set(LIBRARIES
${GTK_LIBRARIES}
${WEBKIT_LIBRARIES}
- pthread)
+ ${VTE291_LIBRARIES}
+ pthread
+ ublsettings
+ ublsettings-gtk3
+ ublsettingsui-gtk3)
add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})
diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c
index 0abdd92..e5ea13b 100644
--- a/source/ubl-settings-repomanager.c
+++ b/source/ubl-settings-repomanager.c
@@ -2,766 +2,1267 @@
config main_config;
-/**on_close_subwindow(GtkWidget *self)
- * [EN]
- * Closes window in which [self] is contained.
- * [RU]
- * Закрывает окно, в котором расположен виджет [self].
-*/
-void on_close_subwindow(GtkWidget *self){
- gtk_widget_destroy(gtk_widget_get_toplevel(self));
-}
-
-/**yon_open_browser(GtkWidget *self, char *link)
- * [EN]
- * Opens browser with [link] link.
- * [RU]
- * Открывает браузер с [link] ссылкой.
-*/
-void yon_open_browser(GtkWidget *self, char *link){
- yon_ubl_browser_window_open(link,TITLE_LABEL);
-}
-
-/**on_open_documentation_confirmation(GtkWidget *self, char *link)
- * [EN]
- * Opens confirmation window for [link] link.
- * [RU]
- * Открывает окно подтверждение перехода по ссылке [link].
-*/
-void on_open_documentation_confirmation(GtkWidget *self, char *link){
- if (main_config.always_open_documentation==0){
- GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
- documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window));
- widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow");
- widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton");
- widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton");
- widgets->HatText = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel");
- widgets->HeaderText = yon_gtk_builder_get_widget(builder,"helpHeader");
- widgets->InfoText = yon_gtk_builder_get_widget(builder,"helpText");
- widgets->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox");
- gtk_label_set_text(GTK_LABEL(widgets->HatText),TITLE_LABEL);
- gtk_label_set_text(GTK_LABEL(widgets->HeaderText),HELP_TITLE_LABEL);
- gtk_label_set_text(GTK_LABEL(widgets->InfoText),HELP_INFO_LABEL);
- gtk_button_set_label(GTK_BUTTON(widgets->AcceptButton),OPEN_HELP_LABEL);
- gtk_button_set_label(GTK_BUTTON(widgets->AlwaysOpenCheck),HELP_ALWAYS_OPEN_LABEL);
- gtk_button_set_label(GTK_BUTTON(widgets->CloseButton),CANCEL_LABEL);
- gtk_widget_show_all(widgets->Window);
- g_signal_connect(G_OBJECT(widgets->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
- g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link));
- g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
-
-
- } else {
- yon_open_browser(self,link);
- }
-}
-
-/**on_link(GtkWidget *self, char* uri, gpointer user_data)
- * [EN]
- * Signal for hadnling AboutDialog links.
- * Connect to "activate-link" signal.
- * [self] is AboutDialog window;
- * [uri] is activated link;
- * [user_data] is pointer for user data, hasn't used in standard handler;
- * [RU]
- * Функция для обработки сигнала нажатия на ссылку окна AboutDialog.
- * Присоединять к сигналу "activate-link".
- * [self] - окно AboutDialog;
- * [uri] - ссылка, по которой совершается переход;
- * [user_data] - указатель на любые другие данные, не используется в стандартном обработчике;
-*/
-void on_link(GtkWidget *self, char* uri, gpointer user_data){
- gtk_widget_destroy(self);
- on_open_documentation_confirmation(self,uri);
-}
-
-/**on_about()
- * [EN]
- * Function for setting up and showing AboutDialog.
- * Connect it to "activate" signal of Documentation MenuItem.
- * [RU]
- * Функиця для настройки и показа окна AboutDialog.
- * Присоединять к сигналу "activate" кнопки справки типа MenuItem.
-*/
-void on_about(){
- GtkBuilder *builder=gtk_builder_new_from_resource(glade_path);
- GtkWidget *window=yon_gtk_builder_get_widget(builder,"AboutWindow");
- GtkWidget *title=yon_gtk_builder_get_widget(builder,"headerAboutTopic");
- GtkWidget *hideButtonBox=yon_gtk_builder_get_widget(builder,"buttonBoxHide");
- gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window),version_application);
- gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window),PROJECT_HOME_LABEL);
- gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),TITLE_LABEL);
- gtk_label_set_text(GTK_LABEL(title),TITLE_LABEL);
- g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL);
- gtk_widget_set_visible(hideButtonBox,0);
- gtk_widget_destroy(hideButtonBox);
- gtk_widget_show(window);
-}
-
-void on_load(){
- gsize size=0;
- gsize sigsize=0;
- config_str repos = yon_window_config_get_section("repos",&size);
- config_str signatures = yon_window_config_get_section("signatures",&sigsize);
- gtk_tree_store_clear(main_config.tree_store);
- for (int i=0;iStoragePathCombo));
+ if (!yon_char_is_empty(id)){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id);
+ int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter);
+ for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){
+ char *target;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,2,&target,-1);
+ if (!strcmp(target,repo)){
+ gtk_tree_store_remove(window->storages_copy,&itar);
+ break;
}
- else
- for (int j=0;jStoragePathCombo));
+ if (!yon_char_is_empty(id)){
+ GtkTreeIter iter,itar;
+ int size;
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id);
+ char *storage_path;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&iter,3,&storage_path,-1);
+ config_str repos = yon_tree_store_get_all_at_level(window->storages_copy,&iter,&size,2,2);
+ int found = yon_char_parsed_check_exist(repos,size,target_repo);
+ if (found>-1){
+ char *child_id = yon_char_unite((char*)id,":",yon_char_from_int(found),NULL);
+ if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,child_id)){
+ if (!yon_char_is_empty(sign)){
+ gtk_tree_store_set(window->storages_copy,&itar,6,1,5,sign,-1);
+ if (system(yon_sign_repo(storage_path,target_repo,sign))){
+ gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget*)g_list_nth_data(list,2)),0);
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),REPO_SIGN_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
}
- gtk_tree_store_append(main_config.tree_store,&packIter,&iter);
- gtk_tree_store_set(main_config.tree_store,&packIter,0,document_no_edits,1,yon_char_unite(packname,"-",packver,"-",packarch,NULL),2,yon_char_unite(path,"/pool/overlay/",parameter_string,NULL),3,0,4,0,9,packname,10,packver,11,packarch,12,packdepends,13,pack_signed,-1);
+ }else
+ gtk_tree_store_set(window->storages_copy,&itar,6,-1,5,NULL,-1);
+ }
+ }
+ }
+}
+void yon_storage_config_update(storage_config_window *window){
+ GList *children = gtk_container_get_children(GTK_CONTAINER(window->ReposBox));
+ for (int i=0;iStoragePathCombo));
+ if (id){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id);
+ if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter)){
+ int valid = 1;
+ for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){
+ char *repo;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,2,&repo,-1);
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_block);
+ GtkWidget *box = yon_gtk_builder_get_widget(builder,"MainBox");
+ gtk_box_pack_start(GTK_BOX(window->ReposBox),box,0,0,0);
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(gtk_builder_get_object(builder,"SignatureCombo")));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(builder,"SignatureCombo")),0);
+ g_signal_connect(gtk_builder_get_object(builder,"SignatureButton"),"clicked",G_CALLBACK(on_repo_signed),window);
+ g_signal_connect(gtk_builder_get_object(builder,"RepoRemoveButton"),"clicked",G_CALLBACK(on_repo_removed),window);
+ gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object(builder,"RepoNameEntry")),repo);
+ char *storage = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->StoragePathCombo));
+ int sign_size;
+ char *command = yon_repo_get_signature(storage,repo);
+ yon_debug_output("%s\n",command);
+ config_str sign = yon_config_load(command,&sign_size);
+ if (sign_size>0){
+ yon_char_remove_last_symbol(sign[2],'\n');
+ char *mail = strstr(sign[2],"\"");
+ if (!yon_char_is_empty(mail)){
+ char *email = yon_char_new(mail);
+ yon_char_remove_brackets(email);
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(gtk_builder_get_object(builder,"SignatureCombo")),email);
+ free(email);
+ }
+ yon_char_parsed_free(sign,sign_size);
}
+ g_signal_connect(gtk_builder_get_object(builder,"SignatureButton"),"clicked",G_CALLBACK(on_repo_sign_changed),window);
+ }
}
}
}
-void on_save(){
- char *command = "repo-manager";
- dictionary *pack_groups=NULL;
- GtkTreeIter iter, childIter, *deleteIter;
- int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.tree_store),&iter);
- for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&iter)){
- char *remove_command=NULL;
- char *add_signed_command=NULL;
- char *add_command=NULL;
+// filechooser window section
- char *remove_flagged = NULL;
- char *add_flagged = NULL;
- char *origin_flagged = NULL;
- char *name_flagged = NULL;
-
- char *packnames = NULL;
- char *sign_flagged = NULL;
- char *repo_sign_flagged = NULL;
- char *repo_sign_flagged_full = NULL;
- int repostatus=0;
- gboolean renamed=0;
- char *old_name=NULL;
-
- char *add_packages=NULL;
- char *signed_packages=NULL;
- char *remove_packages=NULL;
-
- gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,1,&name_flagged,2,&origin_flagged,3,&repostatus,4,&old_name,5,&renamed,13,&repo_sign_flagged,-1);
- repo_sign_flagged_full = yon_char_new(repo_sign_flagged);
- yon_char_divide_search(repo_sign_flagged,"<",-1);
- repo_sign_flagged=yon_char_divide_search(repo_sign_flagged,">",-1);
- if (repostatus == 1) gtk_tree_store_set(main_config.tree_store,&iter,0,folder_no_edits,3,0,-1);
- else if (repostatus == -1){
- yon_launch(yon_char_unite("rm -rfd ",origin_flagged,NULL));
- yon_window_config_erase_custom_parameter(origin_flagged,"repos");
- GtkTreeIter *deleteIter = gtk_tree_iter_copy(&iter);
- if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){
- gtk_tree_iter_free(deleteIter);
- deleteIter = gtk_tree_iter_copy(&iter);
- if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){
- gtk_tree_iter_free(deleteIter);
- deleteIter = gtk_tree_iter_copy(&iter);
- gtk_tree_store_remove(main_config.tree_store,deleteIter);
- break;
- } else {
- gtk_tree_store_remove(main_config.tree_store,&iter);
- }
- } else {
- gtk_tree_store_remove(main_config.tree_store,&iter);
+void on_file_chooser_entry_changed(GtkEntry *self, file_chooser_window *window){
+ const char *text = gtk_entry_get_text(self);
+ GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(window->FileChooserWidget));
+ gtk_file_chooser_remove_filter(GTK_FILE_CHOOSER(window->FileChooserWidget),filter);
+ filter = gtk_file_filter_new();
+ char *pattern = !yon_char_is_empty(text)?yon_char_unite("*",text,"*.pkg.tar*[^.sig]",NULL) : "*.pkg.tar*[^.sig]";
+ gtk_file_filter_add_pattern(filter,pattern);
+ gtk_file_filter_set_name(filter,"*.pkg.tar*");
+ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(window->FileChooserWidget),filter);
+ if (!yon_char_is_empty(text)) free(pattern);
+}
- }
- continue;
- }
- gboolean valid_child=gtk_tree_model_iter_children(GTK_TREE_MODEL(main_config.tree_store),&childIter,&iter);
- for (;valid_child;valid_child=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&childIter)){
- char *pack_name, *pack_path;
- char *pack_old_repo, *pack_new_repo;
- char *pack_code_name, *pack_version, *pack_arch, *pack_depends;
- int pack_status=0;
- gboolean moved=0;
- char *icon;
- char *pack_sign;
- gboolean pack_signed=0;
-
- gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,0,&icon,1,&pack_name,2,&pack_path,3,&pack_status,4,&pack_old_repo,5,&pack_new_repo,6,&moved,9,&pack_code_name,10,&pack_version,11,&pack_arch,12,&pack_depends,13,&pack_sign,14,&pack_signed,-1);
- if (!pack_path) continue;
- char *pack_sign_paths;
- pack_sign_paths = yon_char_new(pack_path);
- yon_char_divide(pack_sign_paths,yon_char_find_last(pack_sign_paths,'/'));
- packnames = yon_char_unite(packnames ? yon_char_append(packnames," "):"",pack_sign_paths,NULL);
- if (pack_sign&&pack_signed==1){
- char *package_full_name = yon_char_new(pack_path);
- yon_char_divide(package_full_name,yon_char_find_last(package_full_name,'/'));
- yon_window_config_add_custom_parameter(package_full_name,"signatures",yon_char_new(pack_sign),YON_TYPE_STRING);
- yon_char_divide_search(pack_sign,"<",-1);
- pack_sign=yon_char_divide_search(pack_sign,">",-1);
- if (!pack_groups||!(yon_dictionary_get(&pack_groups,pack_sign))){
- dictionary *dict = yon_dictionary_new();
- dict->key = pack_sign_paths;
- yon_dictionary_add_or_create_if_exists_with_data(pack_groups,yon_char_new(pack_sign),dict);
- } else {
- dictionary *dict = yon_dictionary_new();
- dict->key = pack_sign_paths;
- yon_dictionary_add_or_create_if_exists_with_data(pack_groups->data,yon_char_new(pack_sign),dict);
- }
- }
- printf("%d\n",pack_status);
- if (pack_status==1||!strcmp(icon,document_added)){
- add_packages = yon_char_unite(add_packages ? yon_char_append(add_packages,",") : "",pack_path,NULL);
- yon_char_divide(pack_path,yon_char_find_last(pack_path,'/'));
- pack_path = yon_char_unite(origin_flagged,"/pool/overlay/",pack_path,NULL);
- gtk_tree_store_set(main_config.tree_store,&childIter,2,pack_path,-1);
- repostatus=1;
- } else if (pack_status==-1||!strcmp(icon,document_deleted)){
- remove_packages = yon_char_unite(remove_packages ? yon_char_append(remove_packages,",") : "",pack_code_name,NULL);
- }
- if (pack_status==1||!strcmp(icon,document_added)) gtk_tree_store_set(main_config.tree_store,&childIter,0,document_no_edits,3,0,-1);
- if (pack_status == -1||!strcmp(icon,document_deleted)){
- GtkTreeIter *deleteIter = gtk_tree_iter_copy(&childIter);
- if (!gtk_tree_model_iter_previous(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){
- gtk_tree_iter_free(deleteIter);
- deleteIter = gtk_tree_iter_copy(&childIter);
- if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),deleteIter)){
- gtk_tree_iter_free(deleteIter);
- deleteIter = gtk_tree_iter_copy(&childIter);
- gtk_tree_store_remove(main_config.tree_store,deleteIter);
- break;
- } else {
- gtk_tree_store_remove(main_config.tree_store,&childIter);
+void on_file_chooser_file_activate(GtkFileChooser *self, repo_add_window *window){
+ GtkTreeIter iter;
+ GSList *list = gtk_file_chooser_get_filenames(self);
+ for (int i=0;iPackagesList,&iter);
+ gtk_list_store_set(window->PackagesList,&iter,1,filename,2,path,-1);
+ free(filename);
+ g_slist_free(list);
+ }
+ gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(self)));
+}
+
+file_chooser_window *yon_file_chooser_window_new(){
+ file_chooser_window *window = malloc(sizeof(file_chooser_window));
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_filechooser);
+ window->Window = yon_gtk_builder_get_widget(builder,"Window");
+ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
+ window->HeadLabel = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel2");
+ window->ChooseButton = yon_gtk_builder_get_widget(builder,"ChooseButton");
+ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
+ window->NameEntry = yon_gtk_builder_get_widget(builder,"NameEntry");
+ window->FileChooserWidget = yon_gtk_builder_get_widget(builder,"FileChooserWidget");
+ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+ g_signal_connect(G_OBJECT(window->NameEntry),"changed",G_CALLBACK(on_file_chooser_entry_changed),window);
+
+ return window;
+}
+
+// storage-configure window section
+
+void on_storage_open(GtkWidget *self, storage_config_window *window){
+ GtkWidget *dialog = gtk_file_chooser_dialog_new(CHOSE_FOLDER_TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
+ yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),CHOSE_FOLDER_TITLE_LABEL,icon_path,"file_chooser");
+ int responce = gtk_dialog_run(GTK_DIALOG(dialog));
+ if (responce == GTK_RESPONSE_ACCEPT){
+ char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+ if (!yon_char_is_empty(path)){
+ int size;
+ config_str files = yon_file_list_dirs(path,&size);
+ if (!files){
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_FOLDER_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ gtk_widget_destroy(dialog);
+ return;
+ } else {
+ yon_char_parsed_free(files,size);
+ GtkTreeIter iter, itar;
+ gtk_tree_store_append(window->storages_copy,&iter,NULL);
+ char *name = yon_char_new(path);
+ free(yon_char_divide(name,yon_char_find_last(name,'/')));
+ gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1);
+ gtk_entry_set_text(GTK_ENTRY(window->AddEntry),"");
+ char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path);
+ char *repos=NULL;
+ int repos_size=0;
+ g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window);
+ yon_gtk_combo_box_text_find(window->StoragePathCombo,path);
+ g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window);
+ yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING);
+ config_str repos_list = yon_file_list_dirs(path,&repos_size);
+ for (int i=0;iAddEntry),render_name);
+ on_repo_add(self,window);
+ free(render_name);
}
- } else {
- gtk_tree_store_remove(main_config.tree_store,&childIter);
}
+ yon_char_parsed_free(repos_list,repos_size);
}
+
}
- if (origin_flagged&&name_flagged){
- if (add_packages){
- char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL;
- add_command = yon_char_unite(command, " add -d \"",origin_flagged,"\" -r \"",name_flagged, sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" ," -p ", add_packages,NULL);
+ }
+ yon_storage_config_update(window);
+ gtk_widget_destroy(dialog);
+}
+
+void on_storage_create(GtkWidget *self, storage_config_window *window){
+ GtkWidget *dialog = gtk_file_chooser_dialog_new(CHOSE_FOLDER_TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
+ yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),CHOSE_FOLDER_TITLE_LABEL,icon_path,"file_chooser");
+ int responce = gtk_dialog_run(GTK_DIALOG(dialog));
+ if (responce == GTK_RESPONSE_ACCEPT){
+ char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+ if (!yon_char_is_empty(path)){
+ int size;
+ config_str files = yon_file_list_dirs(path,&size);
+ if (files){
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),FILES_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ gtk_widget_destroy(dialog);
+ return;
+ } else {
+ yon_char_parsed_free(files,size);
+ GtkTreeIter iter;
+ gtk_tree_store_append(window->storages_copy,&iter,NULL);
+ char *name = yon_char_new(path);
+ free(yon_char_divide(name,yon_char_find_last(name,'/')));
+ gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1);
+ char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path);
+ g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window);
+ yon_gtk_combo_box_text_find(window->StoragePathCombo,path);
+ g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window);
+ gtk_entry_set_text(GTK_ENTRY(window->AddEntry),"");
+ yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING);
}
- if (remove_packages){
- char *sign_check = repo_sign_flagged ? yon_char_new(repo_sign_flagged) : NULL;
- remove_command = yon_char_unite(command, " remove -d \"",origin_flagged,"\" -r \"",name_flagged, sign_flagged ? yon_char_append("\" --sign-repo ",sign_flagged):"\"" , " -p ", remove_packages,NULL);
+ }
+ }
+ yon_storage_config_update(window);
+ gtk_widget_destroy(dialog);
+}
+
+void on_storage_disable(GtkWidget *self, storage_config_window *window){
+ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data));
+ data->action_text=DISABLE_CONFIRMATION_LABEL;
+ data->function=NULL;
+ data->data=NULL;
+ GtkTreeIter iter,itar;
+ if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){
+ if (yon_confirmation_dialog_call(self,data)){
+ char *storage;
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
+ if (id){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1);
+ char *repos;
+ yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING);
+ int repo_size;
+ config_str repo_list = yon_char_parse(repos,&repo_size,",");
+ for (int i=0;istorages_copy,&itar);
+ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo)));
+ }
+ }
+ yon_storage_config_update(window);
+ }
+}
+void on_storage_remove(GtkWidget *self, storage_config_window *window){
+ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data));
+ data->action_text=REMOVE_CONFIRMATION_LABEL;
+ data->function=NULL;
+ data->data=NULL;
+ if (yon_confirmation_dialog_call(self,data)){
+ GtkTreeIter itar;
+ char *storage;
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
+ if (id){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1);
+ char *repos;
+ yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING);
+ int repo_size;
+ config_str repo_list = yon_char_parse(repos,&repo_size,",");
+ for (int i=0;ikey,NULL);
+ if (repo_size)
+ yon_char_parsed_free(repo_list,repo_size);
+ yon_window_config_erase_instant_parameter(storage,"storage_info");
+ yon_dir_remove(storage);
+ gtk_tree_store_remove(window->storages_copy,&itar);
+ gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo)));
+ }
+ }
+ yon_storage_config_update(window);
+}
+
+void on_repo_add(GtkWidget *self, storage_config_window *window){
+ char *new_repo = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->AddEntry)));
+ gtk_entry_set_text(GTK_ENTRY(window->AddEntry),"");
+ if (yon_char_is_empty(new_repo)){
+ yon_ubl_status_highlight_incorrect(window->AddEntry);
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_NAME_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ GtkTreeIter iter,itar, childiter;
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
+ if (id){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id);
+ char *path;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&path,-1);
+ char *child_path = yon_char_unite(path,"/",new_repo,NULL);
+ gtk_tree_store_append(window->storages_copy,&childiter,&itar);
+ gtk_tree_store_set(window->storages_copy,&childiter,2,new_repo,3,child_path,-1);
+ yon_storage_config_update(window);
+ char *old;
+ yon_window_config_get_parameter("storage_info",path,&old,YON_TYPE_STRING);
+ int old_repos_size;
+ config_str old_repos_parsed = yon_char_parse(old,&old_repos_size,",");
+ if (yon_char_parsed_check_exist(old_repos_parsed,old_repos_size,child_path)==-1){
+ yon_char_parsed_add_or_create_if_exists(old_repos_parsed,&old_repos_size,child_path);
+ }
+ yon_window_config_add_instant_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING);
+ yon_char_parsed_free(old_repos_parsed,old_repos_size);
+ yon_debug_output("%s\n",create_storage_command(path, new_repo));
+ yon_launch(create_storage_command(path, new_repo));
+ int size;
+ config_str dirs = yon_file_list_dirs(child_path,&size);
+ for (int i=0;istorages_copy,&iter,&childiter);
+ gtk_tree_store_set(window->storages_copy,&iter,2,dirs[i],3,arch_path,-1);
+
+ if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){
+ config_str final = NULL;
+ int final_size=0;
+ DIR *current_dir = opendir(arch_path);
+ struct dirent* cur_dir;
+ while ((cur_dir=readdir(current_dir))){
+ if (strlen(cur_dir->d_name)>8){
+ char *extension = yon_char_new(cur_dir->d_name);
+ free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4));
+ if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){
+ yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name);
+ }
+ }
}
- char *sign_command = yon_char_unite(command, " add -f -d ",origin_flagged," -r ",name_flagged," --sign-pkg ", dct->key," -p $(find ",origin_flagged,"/pool/overlay -name ", signed_packs,")",NULL);
- yon_launch(sign_command);
+ closedir(current_dir);
+ if (size)
+ yon_window_config_add_instant_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,final_size,","),YON_TYPE_STRING);
}
+ }
+ yon_char_parsed_free(dirs,size);
+ }
+ free(new_repo);
+}
+
+void on_storage_accept(GtkWidget *self, dictionary *dict){
+ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
+ storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL);
+ gtk_tree_store_clear(main_config.tree_store);
+ yon_gtk_tree_store_copy_full(window->storages_copy,main_config.tree_store);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(main_config.tree_store));
+ yon_window_config_save_instant();
+ GtkTreeIter iter;
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo));
+ if (!yon_char_is_empty(id)){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id);
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id));
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter);
+ on_main_tree_selection_changed(NULL,widgets);
+ }
+ on_subwindow_close(self);
+ yon_config_load_update(widgets);
+ yon_ubl_status_box_render(STORAGES_SAVED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+}
+gboolean yon_storage_filter_func(GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data);
+
+void on_storage_changed(GtkWidget *self, storage_config_window *window){
+ yon_storage_config_update(window);
+}
+
+storage_config_window *yon_storage_config_window_new(){
+ storage_config_window *window = malloc(sizeof(storage_config_window));
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_storage_config);
+ window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow");
+ window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel");
+ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
+ window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton");
+ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
+ window->StoragePathCombo = yon_gtk_builder_get_widget(builder,"StoragePathCombo");
+ window->OpenExistingButton = yon_gtk_builder_get_widget(builder,"OpenExistingButton");
+ window->CreateNewButton = yon_gtk_builder_get_widget(builder,"CreateNewButton");
+ window->DisableButton = yon_gtk_builder_get_widget(builder,"DisableButton");
+ window->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton");
+ window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox");
+ window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry");
+ window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton");
+ window->storages_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT);
+ yon_gtk_tree_store_copy_full(main_config.tree_store,window->storages_copy);
+ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+ g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window);
+ g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window);
+ g_signal_connect(G_OBJECT(window->DisableButton),"clicked",G_CALLBACK(on_storage_disable),window);
+ g_signal_connect(G_OBJECT(window->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window);
+ g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window);
+ g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window);
+
+
+ return window;
+}
+
+void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){
+ storage_config_window *window = yon_storage_config_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),MANAGE_STORAGES_TITLE_LABEL,icon_path,"storage-configuration-window");
+ gtk_label_set_text(GTK_LABEL(window->HeadLabel),MANAGE_STORAGES_TITLE_LABEL);
+ gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window));
+ GtkTreeIter iter,itar;
+ for_iter(window->storages_copy,&iter){
+ char *storage;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&iter,3,&storage,-1);
+ char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),id,storage);
+ }
+
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict);
+ gtk_widget_show(window->MainWindow);
+}
+
+//repo-move window
+
+
+//repo-add window section
+gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data){
+ GtkTreeIter parent;
+ if (gtk_tree_model_iter_parent(model, &parent, iter))
+ return 0;
+ return 1;
+ }
+
+config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level){
+ (*size)=0;
+ config_str final = NULL;
+ GtkTreePath *path=NULL, *parent_path=NULL;
+ GtkTreeIter iter;
+ if (parent){
+ parent_path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),parent);
+ }
+ int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,parent);
+ for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){
+ path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),&iter);
+ if (path && gtk_tree_path_get_depth(path)==level&&(!parent_path||gtk_tree_path_is_descendant(path,parent_path))){
+ char *append=NULL;
+ gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,column,&append,-1);
+ yon_char_parsed_add_or_create_if_exists(final,size,append);
+ }
+ gtk_tree_path_free(path);
+ }
+ return final;
+}
+
+void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window){
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->RepositoryCombo));
+ char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo));
+ if (!yon_char_is_empty(path_str)){
+ GtkTreeIter iter, itar;
+ GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){
+
+ int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter);
+ for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){
+ char *current;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,-1);
+ if (!yon_char_is_empty(current)){
+ char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->RepositoryCombo),path_str,current);
+ }
}
- if (repo_sign_flagged){
- char *repo_sign_command = yon_char_unite(command, " add -f -d ",origin_flagged, " -r ", name_flagged, " --sign-repo ", repo_sign_flagged ,NULL);
- yon_window_config_add_custom_parameter(yon_char_unite(origin_flagged,NULL),"signatures",repo_sign_flagged_full,YON_TYPE_STRING);
- yon_launch(repo_sign_command);
+ }
+
+ }
+}
+
+void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *window){
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo));
+ char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo));
+ if (!yon_char_is_empty(path_str)){
+ GtkTreeIter iter, itar;
+ GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){
+
+ int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter);
+ for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){
+ char *current, *current_path;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,3,¤t_path,-1);
+ if (!yon_char_is_empty(current)){
+ char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo),path_str,current);
+
+ }
}
}
+ gtk_widget_set_sensitive(window->RepoSignCombo,1);
+
+ } else {
+ gtk_widget_set_sensitive(window->RepoSignCombo,0);
+
}
- yon_ubl_status_box_render(SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
}
-void on_search(GtkCellEditable *self, main_window *widgets){
- GtkTreeIter iter, childIter;
- char *name=NULL;
- int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.tree_store),&iter);
- for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&iter)){
- gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,1,&name,-1);
- if (strstr(name,gtk_entry_get_text(GTK_ENTRY(widgets->Finder)))) {
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter);
- return;
+void on_arch_chosen(GtkWidget *target,repo_add_window *window){
+ char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo));
+ if (!yon_char_is_empty(path_str)){
+ gtk_widget_set_sensitive(window->PackageSignCombo,1);
+ } else {
+ gtk_widget_set_sensitive(window->PackageSignCombo,0);
+ }
+}
+
+void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){
+ gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList));
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))==-1){
+ gtk_widget_set_sensitive(window->AddPackageButton,0);
+ } else {
+ gtk_widget_set_sensitive(window->AddPackageButton,1);
+ }
+}
+
+void on_move_storage_changed(GtkWidget *self, repo_add_window *window){
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry));
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry));
+ GtkTreeIter iter,itar;
+ char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self));
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveTargetStorageEntry),id);
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id);
+ int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter);
+ for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){
+ char *target;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1);
+ char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry),child_id,target);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry),child_id,target);
+ }
+}
+
+void on_move_repo_changed(GtkWidget *self, repo_add_window *window){
+ GtkWidget *ArchCombo = NULL;
+ ArchCombo = self==window->MoveSourceRepoEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry;
+
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(ArchCombo));
+ GtkTreeIter iter,itar;
+ char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self));
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id);
+ int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter);
+ for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){
+ char *target;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1);
+ char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(ArchCombo),child_id,target);
+ }
+
+}
+
+void on_move_arch_changed(GtkWidget *self, repo_add_window *window){
+ GtkWidget *TargetArchCombo = self==window->MoveTargetArchEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry;
+ GtkWidget *TargetRepoCombo = self==window->MoveTargetArchEntry?window->MoveSourceRepoEntry:window->MoveTargetRepoEntry;
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(self))>-1){
+
+ const char *current = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(self));
+ const char *repo_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(TargetRepoCombo));
+
+ if (!yon_char_is_empty(current)&&!yon_char_is_empty(repo_id)){
+
+ GtkTreeIter iter, itar;
+
+ g_signal_handlers_block_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window);
+ if (yon_gtk_combo_box_text_find(TargetArchCombo,(char*)current)==-1){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,repo_id);
+ gtk_tree_store_append(window->tree_copy,&itar,&iter);
+ char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar);
+ yon_debug_output("%s\n","arch");
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(TargetArchCombo),id,current);
+ }
+ g_signal_handlers_unblock_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window);
+ gtk_widget_set_sensitive(window->MoveTargetArchEntry,0);
+ gtk_widget_set_sensitive(window->AddPackageButton,1);
}
- gtk_tree_view_expand_row(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),&iter),1);
- int child_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(main_config.tree_store),&childIter,&iter);
- for (;child_valid;child_valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&childIter)){
- gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,1,&name,-1);
- if (strstr(name,gtk_entry_get_text(GTK_ENTRY(widgets->Finder)))) {
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&childIter);
+ }
+}
+
+void on_add_accept(GtkWidget *self, dictionary *dict){
+ repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*);
+ file_chooser_window *dialog = yon_dictionary_get_data(dict->first->next,file_chooser_window*);
+ char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo));
+ char *path,*arch_name;
+ GtkTreeIter iter,itar,itor;
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&arch_name,3,&path,-1);
+ char *packages;
+ yon_window_config_get_parameter("package_info",path,&packages,YON_TYPE_STRING);
+ int size;
+ config_str parsed = yon_char_parse(packages,&size,",");
+ GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget));
+ for (int i=0;iStatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
return;
}
-
+ yon_char_remove_last_symbol(name[0],'\n');
+ if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){
+ if (name_size<=0){
+ yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ gtk_list_store_append(window->PackagesList,&itar);
+ gtk_list_store_set(window->PackagesList,&itar,1,name[0],2,current,3,1,-1);
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ }
+ yon_char_parsed_free(name,name_size);
}
- gtk_tree_view_expand_row(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),&iter),0);
}
- yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ gtk_widget_destroy(dialog->Window);
+ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){
+ gtk_widget_set_sensitive(window->StorageCombo,0);
+ gtk_widget_set_sensitive(window->RepositoryCombo,0);
+ gtk_widget_set_sensitive(window->ArchitectureCombo,0);
+ }
}
-void on_tree_selection_changed(GtkWidget *self,main_window *widgets){
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- GtkTreeIter iter;
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- char *codeName=NULL,*version=NULL,*architecture=NULL, *dependeces=NULL, *signature=NULL;
- int serverType=0,trusted=0,published=0;
- gtk_tree_model_get(model,&iter,9,&codeName,10,&version,11,&architecture,12,&dependeces,13,&signature,-1);
- gtk_label_set_text(GTK_LABEL(widgets->CodeNameInfoLabel),codeName ? codeName : "");
- gtk_label_set_text(GTK_LABEL(widgets->VersionInfoLabel),version ? version : "");
- gtk_label_set_text(GTK_LABEL(widgets->ArchitectureInfoLabel),architecture ? architecture : "");
- gtk_label_set_text(GTK_LABEL(widgets->DependencesInfoLabel),dependeces ? dependeces : "");
- gtk_label_set_text(GTK_LABEL(widgets->SignatureInfoLabel),signature ? signature : ABSENT_LABEL);
- int depth = gtk_tree_store_iter_depth(main_config.tree_store,&iter);
- if (depth == 0){
- gtk_widget_set_sensitive(widgets->CreateButton,1);
- gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1);
- gtk_widget_set_sensitive(widgets->ConfigureButton,1);
- gtk_widget_set_sensitive(widgets->DeleteButton,1);
- gtk_widget_set_sensitive(widgets->AddPackageButton,1);
- gtk_widget_set_sensitive(widgets->RemovePackageButton,0);
- gtk_widget_set_sensitive(widgets->SignButton,1);
- gtk_widget_set_visible(widgets->NameBox,1);
- gtk_widget_set_visible(widgets->DependenceBox,0);
- gtk_widget_set_visible(widgets->VersionBox,0);
- gtk_widget_set_visible(widgets->ArchitectureBox,0);
- gtk_widget_set_visible(widgets->SignatureBox,1);
- } else if (depth == 1){
- gtk_widget_set_sensitive(widgets->CreateButton,1);
- gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1);
- gtk_widget_set_sensitive(widgets->ConfigureButton,0);
- gtk_widget_set_sensitive(widgets->DeleteButton,0);
- gtk_widget_set_sensitive(widgets->AddPackageButton,1);
- gtk_widget_set_sensitive(widgets->RemovePackageButton,1);
- gtk_widget_set_sensitive(widgets->SignButton,1);
- gtk_widget_set_visible(widgets->NameBox,1);
- gtk_widget_set_visible(widgets->DependenceBox,1);
- gtk_widget_set_visible(widgets->VersionBox,1);
- gtk_widget_set_visible(widgets->ArchitectureBox,1);
- gtk_widget_set_visible(widgets->SignatureBox,1);
+void on_add_package(GtkWidget *self, repo_add_window *window){
+ file_chooser_window *dialog = yon_file_chooser_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"filechooserWindow");
+ gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL);
+ gtk_widget_show(dialog->Window);
+ GtkFileFilter *filter = gtk_file_filter_new();
+ gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]");
+ gtk_file_filter_set_name(filter,"*.pkg.tar*");
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog);
+ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter);
+ g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+ g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_add_accept),dict);
+ g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),window);
+}
+
+void on_remove_package(GtkWidget *self, repo_add_window *window){
+ char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo));
+ char *storage = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo));
+ char *repo;
+ char *path;
+ GtkTreeModel *model;
+ GtkTreeIter iter,itar,itor;
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,storage);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&storage,-1);
+
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id);
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&itar)){
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&repo,3,&path,-1);
+ gtk_list_store_remove(window->PackagesList,&itar);
}
+ if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){
+ gtk_widget_set_sensitive(window->StorageCombo,1);
+ gtk_widget_set_sensitive(window->RepositoryCombo,1);
+ gtk_widget_set_sensitive(window->ArchitectureCombo,1);
+ }
+}
+
+void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){
+ gtk_label_set_text(GTK_LABEL(window->InfoLabel),"");
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){
+ gtk_widget_set_sensitive(window->RemoveButton,1);
+ char *target;
+ gtk_tree_model_get(model,&iter,2,&target,-1);
+ int size;
+ config_str info = yon_config_load(get_package_info_command(target),&size);
+ char *result = yon_char_parsed_to_string(info,size,"");
+ gtk_label_set_text(GTK_LABEL(window->InfoLabel),result);
+ yon_char_parsed_free(info,size);
+ free(result);
} else {
- gtk_widget_set_sensitive(widgets->CreateButton,1);
- gtk_widget_set_sensitive(widgets->LoadFromLocalButton,1);
- gtk_widget_set_sensitive(widgets->ConfigureButton,0);
- gtk_widget_set_sensitive(widgets->DeleteButton,0);
- gtk_widget_set_sensitive(widgets->AddPackageButton,0);
- gtk_widget_set_sensitive(widgets->RemovePackageButton,0);
- gtk_widget_set_sensitive(widgets->SignButton,0);
- gtk_widget_set_visible(widgets->NameBox,0);
- gtk_widget_set_visible(widgets->DependenceBox,0);
- gtk_widget_set_visible(widgets->VersionBox,0);
- gtk_widget_set_visible(widgets->ArchitectureBox,0);
- gtk_widget_set_visible(widgets->SignatureBox,0);
- }
-}
-
-void on_repo_add_new(GtkWidget *self, dictionary *dict){
+ gtk_widget_set_sensitive(window->RemoveButton,0);
+ }
+}
+
+
+void on_add_packages_accept(GtkWidget *self, dictionary *dict){
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
- repo_create_window *window = yon_dictionary_get_data(dict->first->next,repo_create_window*);
- if (!window->path){ yon_ubl_status_box_render(CHOOSE_PATH_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); return;}
- char *name=NULL;
-
- name = window->path;
- if (!name||strcmp(name,"")!=0){
- GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE);
- if (iter){
- struct dirent *de;
- GtkTreeIter child;
- char *reponame = yon_char_new(name);
- yon_char_divide(reponame,yon_char_find_last(reponame,'/'));
- char *searchpath = yon_char_unite(name,"/",reponame,"/x86_64/",NULL);
- DIR *directory = opendir(searchpath);
- if (directory){
- char *found_packages = NULL;
- while ((de = readdir(directory)))
- {
- if (strstr(de->d_name,"pkg.tar.")&&!strstr(de->d_name,".sig")){
- char *filename = yon_char_unite(searchpath,"/",de->d_name,NULL);
- FILE *file = popen(get_package_info_command(filename),"r");
- char *cur_string=g_malloc0(sizeof(char)*4096);
- char *packname=NULL, *packver=NULL, *packarch=NULL, *packdepends=NULL;
- while (fgets(cur_string,4096,file)){
- char *stringe = yon_char_divide_search(cur_string,"\n",-1);
- char *p = yon_char_divide_search(stringe,":",-1);
- if (strstr(p,"Name")) packname = yon_char_new(stringe);
- else if (strstr(p,"Version")) packver = yon_char_new(stringe);
- else if (strstr(p,"Architecture")) packarch = yon_char_new(stringe);
- else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe);
- else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe);
- }
- gtk_tree_store_append(main_config.tree_store,&child,iter);
- gtk_tree_store_set(main_config.tree_store,&child,0,document_no_edits,1,yon_char_unite(packname,"-",packver,"-",packarch,NULL),2,filename,3,0,9,packname,10,packver,11,packarch,12,packdepends,-1);
- found_packages = yon_char_unite(found_packages ? yon_char_append(found_packages," ") : "",de->d_name,NULL);
- }
- }
- yon_window_config_add_custom_parameter(window->path,"repos",found_packages,YON_TYPE_STRING);
- gtk_tree_store_set(main_config.tree_store,iter,0,folder_no_edits,2,window->path,3,0,9,reponame,-1);
- } else {
- gtk_tree_store_set(main_config.tree_store,iter,0,folder_added,2,window->path,3,1,9,reponame,-1);
+ repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*);
+ GtkTreeIter iter, itar;
+ char *storage;
+ if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->tree_copy),&itar)){
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&storage,-1);
+ const char *repo = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo));
+ const char *arch = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo));
+ GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList);
+ int size=0;
+ config_str packages=NULL;
+ int valid = gtk_tree_model_get_iter_first(model,&iter);
+ for (;valid;valid=gtk_tree_model_iter_next(model,&iter)){
+ char *target;
+ gtk_tree_model_get(model,&iter,2,&target,-1);
+ yon_char_parsed_add_or_create_if_exists(packages,&size,target);
+ free(target);
+ }
+ if (size>0){
+ char *command = NULL;
+ int repo_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->RepoSignCombo));
+ int pack_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->PackageSignCombo));
+ if (repo_sign&&pack_sign){
+ command = add_packages_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," "));
+ } else if (repo_sign){
+ command = add_packages_repo_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),yon_char_parsed_to_string(packages,size," "));
+ } else if (pack_sign){
+ command = add_packages_package_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," "));
+ } else {
+ command = add_packages_command(storage,arch,repo,yon_char_parsed_to_string(packages,size," "));
+ }
+ yon_debug_output("%s\n",command);
+ if (!system(command)){
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL);
+ gtk_tree_store_clear(widgets->RepoList);
+ yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList));
+
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo));
+ if (!yon_char_is_empty(id)){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id);
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id));
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter);
+ on_main_tree_selection_changed(NULL,widgets);
}
+ gtk_widget_destroy(window->MainWindow);
+ yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ yon_config_load_update(widgets);
+ }
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
}
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
}
}
-char *on_choose_repo_folder(GtkWidget *self,repo_create_window *window){
- GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
- gtk_window_set_icon_name(GTK_WINDOW(chooser),icon_path);
- int res = gtk_dialog_run(GTK_DIALOG(chooser));
- if (res==GTK_RESPONSE_ACCEPT){
-
- char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
- window->path=yon_char_new(filename);
+void on_repo_sign_load(GtkWidget *self, repo_add_window *window){
+ GtkTreeIter iter;
+ yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(self),GTK_TREE_MODEL(window->tree_copy),&iter);
+ char *sign;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,5,&sign,-1);
+ if (!yon_char_is_empty(sign))
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepoSignCombo),sign);
+}
+
+repo_add_window *yon_repo_add_window_new(){
+ repo_add_window *window = malloc(sizeof(repo_add_window));
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_add);
+ window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow");
+ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
+ window->StorageCombo = yon_gtk_builder_get_widget(builder,"StorageCombo");
+ window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel");
+ window->RepositoryCombo = yon_gtk_builder_get_widget(builder,"RepositoryCombo");
+ window->ArchitectureCombo = yon_gtk_builder_get_widget(builder,"ArchitectureCombo");
+ window->MoveSourceFrame = yon_gtk_builder_get_widget(builder,"MoveSourceFrame");
+ window->MoveSourceStorageEntry = yon_gtk_builder_get_widget(builder,"MoveSourceStorageEntry");
+ window->MoveSourceRepoEntry = yon_gtk_builder_get_widget(builder,"MoveSourceRepoEntry");
+ window->MoveSourceArchEntry = yon_gtk_builder_get_widget(builder,"MoveSourceArchEntry");
+ window->MoveTargetFrame = yon_gtk_builder_get_widget(builder,"MoveTargetFrame");
+ window->MoveTargetStorageEntry = yon_gtk_builder_get_widget(builder,"MoveTargetStorageEntry");
+ window->MoveTargetRepoEntry = yon_gtk_builder_get_widget(builder,"MoveTargetRepoEntry");
+ window->MoveTargetArchEntry = yon_gtk_builder_get_widget(builder,"MoveTargetArchEntry");
+ window->PackageSignCombo = yon_gtk_builder_get_widget(builder,"PackageSignCombo");
+ window->RepoSignCombo = yon_gtk_builder_get_widget(builder,"RepoSignCombo");
+ window->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton");
+ window->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton");
+ window->PackagesTree = yon_gtk_builder_get_widget(builder,"PackagesTree");
+ window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel");
+ window->PackagesToAddLabel = yon_gtk_builder_get_widget(builder,"PackagesToAddLabel");
+ window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton");
+ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
+ window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList"));
+ window->tree_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT);
+ yon_gtk_tree_store_copy_full(main_config.tree_store,window->tree_copy);
+
+ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+ g_signal_connect(G_OBJECT(window->PackagesTree),"cursor-changed",G_CALLBACK(on_add_window_tree_changed),window);
+
+ window->added_packages_archs = NULL;
+ window->removed_packages_archs = NULL;
+
+ return window;
+}
+
+void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){
+ GtkTreeIter iter;
+
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){
+
+ char *target = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoList),&iter);
+ int mod = yon_char_count(target,":")+1;
+ char *arc=NULL;
+ char *repo=NULL;
+ char *stor=NULL;
+ if (mod ==3){
+ arc = yon_char_new(target);
+ char *temp = yon_char_new(target);
+ repo = yon_char_divide(temp,yon_char_find_last(temp,':'));
+ free(temp);
+ temp = yon_char_new(repo);
+ stor = yon_char_divide(temp,yon_char_find_last(temp,':'));
+ free(temp);
+ } else if (mod>=2){
+ repo = yon_char_new(target);
+ char *temp = yon_char_new(target);
+ stor = yon_char_divide(temp,yon_char_find_last(temp,':'));
+ free(temp);
+ } else if (mod>=1){
+ stor = yon_char_new(target);
+ }
+
+ if (stor)
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StorageCombo),stor);
+ if (repo)
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepositoryCombo),repo);
+ if (arc)
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->ArchitectureCombo),arc);
}
- on_close_subwindow(chooser);
}
-void on_repo_new (GtkWidget *self, main_window *widgets){
- repo_create_window *window = new(repo_create_window);
- window->path=NULL;
- on_choose_repo_folder(self,window);
- dictionary *dict = yon_dictionary_new_with_data("",widgets);
- dict = yon_dictionary_append_with_data(dict,"",window);
- on_repo_add_new(self,dict);
+// main window
+void on_add_clicked(GtkWidget *self, main_window *widgets){
+ repo_add_window *window = yon_repo_add_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),ADD_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window");
+ gtk_label_set_text(GTK_LABEL(window->HeadLabel),ADD_PACKAGES_TITLE_LABEL);
+ GtkTreeIter iter;
+ for_iter (window->tree_copy,&iter){
+ char *current;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1);
+ if (!yon_char_is_empty(current)){
+ char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current);
+ }
+ }
+
+
+ yon_sign_list_update();
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo));
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo));
+
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->PackageSignCombo),0);
+
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+
+ g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window);
+ g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window);
+ g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_arch_chosen),window);
+ g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_add_target_package_selection_changed),window);
+ g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_add_packages_accept),dict);
+ g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_add_package),window);
+ g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_remove_package),window);
+ g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window);
+ yon_add_window_set_selected(widgets,window);
+ GtkTreeModel *model;
+ GList *list = NULL;
+ char *full_path;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&full_path,-1);
+ if (list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoPackagesTree)),&model)){
+ for (int i=0; iPackagesList,&itar);
+ char *temp = yon_char_unite(full_path,"/",path,NULL);
+ free(full_path);
+ full_path = temp;
+ gtk_list_store_set(window->PackagesList,&itar,1,path,2,full_path,-1);
+ }
+ }
+ }
+ gtk_widget_show(window->MainWindow);
}
-void on_repo_add_file(GtkWidget *self, main_window *widgets){
- yon_add_file(widgets);
+void on_folder_changed(GtkFileChooser *self, file_chooser_window *dialog){
+ const char *current = gtk_file_chooser_get_current_folder(self);
+ if (!strstr(current,dialog->root_path)){
+ gtk_file_chooser_set_current_folder(self,dialog->root_path);
+ }
}
-void on_repo_remove_package(GtkWidget *self, main_window *widgets){
- yon_repo_remove_package(widgets);
+void on_move_add_accept(GtkWidget *self, dictionary *dict){
+ repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*);
+ file_chooser_window *dialog = yon_dictionary_get_data(dict->first->next,file_chooser_window*);
+ GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget));
+ for (int i=0;iPackagesList,&iter);
+ gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,files[k],-1);
+ }
+ }
+ } else {
+ GtkTreeIter iter;
+ int temp_size;
+ config_str name = yon_config_load(yon_get_package_name_from_filename(path),&temp_size);
+ if (temp_size<=0){
+ yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ yon_char_remove_last_symbol(name[0],'\n');
+ if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){
+ gtk_list_store_append(window->PackagesList,&iter);
+ gtk_list_store_set(window->PackagesList,&iter,1,name[0],2,path,-1);
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ }
+
+ }
+ }
+ gtk_widget_destroy(dialog->Window);
+ free(dialog);
+ GtkTreeIter iter;
+ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){
+ gtk_widget_set_sensitive(window->MoveSourceStorageEntry,0);
+ gtk_widget_set_sensitive(window->MoveSourceRepoEntry,0);
+ gtk_widget_set_sensitive(window->MoveSourceArchEntry,0);
+
+ gtk_widget_set_sensitive(window->MoveTargetRepoEntry,0);
+ gtk_widget_set_sensitive(window->MoveTargetArchEntry,0);
+
+ if (window->StorageCombo&&window->RepositoryCombo&&window->ArchitectureCombo){
+ gtk_widget_set_sensitive(window->StorageCombo,0);
+ gtk_widget_set_sensitive(window->RepositoryCombo,0);
+ gtk_widget_set_sensitive(window->ArchitectureCombo,0);
+ }
+ }
}
-void on_repo_remove(GtkWidget *self, main_window *widgets){
- yon_repo_remove(widgets);
+void on_move_add_package(GtkWidget *self, repo_add_window *window){
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->MoveTargetArchEntry))>-1&>k_combo_box_get_active(GTK_COMBO_BOX(window->MoveSourceStorageEntry))>-1){
+ file_chooser_window *dialog = yon_file_chooser_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow");
+ gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL);
+ GtkFileFilter *filter = gtk_file_filter_new();
+ gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]");
+ gtk_file_filter_set_name(filter,"*.pkg.tar.*");
+ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter);
+ GtkTreeIter iter,itar;
+ yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveSourceArchEntry),GTK_TREE_MODEL(window->tree_copy),&iter);
+ char *target;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&target,3,&dialog->root_path,-1);
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->FileChooserWidget),target);
+
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog);
+
+ g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"current-folder-changed",G_CALLBACK(on_folder_changed),dialog);
+ g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_move_add_accept),dict);
+ g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),window);
+ gtk_widget_show(dialog->Window);
+ }
}
-void on_sign_save(GtkWidget *self, dictionary *dict){
+void on_move_remove_package(GtkWidget *self, repo_add_window *window){
GtkTreeIter iter;
+ GtkTreeModel *model;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){
+ gtk_list_store_remove(window->PackagesList,&iter);
+ }
+ if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->PackagesList),&iter)){
+
+ gtk_widget_set_sensitive(window->MoveSourceStorageEntry,1);
+ gtk_widget_set_sensitive(window->MoveSourceRepoEntry,1);
+ gtk_widget_set_sensitive(window->MoveSourceArchEntry,1);
+
+ gtk_widget_set_sensitive(window->MoveTargetRepoEntry,1);
+ if (window->StorageCombo&&window->RepositoryCombo&&window->ArchitectureCombo){
+ gtk_widget_set_sensitive(window->StorageCombo,1);
+ gtk_widget_set_sensitive(window->RepositoryCombo,1);
+ gtk_widget_set_sensitive(window->ArchitectureCombo,1);
+ }
+ }
+}
+
+void on_move_accept(GtkWidget *self, dictionary *dict){
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
- repo_sign_window *window = yon_dictionary_get_data(dict->first->next,repo_sign_window*);
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- char *key = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->KeysCombo));
- gtk_tree_store_set(main_config.tree_store,&iter,13,key,14,1,-1);
- }
- on_tree_selection_changed(self,widgets);
- yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
- on_close_subwindow(self);
-}
-
-void on_repo_sign(GtkWidget *self, main_window *widgets){
- repo_sign_window *window = g_malloc(sizeof(repo_sign_window));
- GtkBuilder *builder = gtk_builder_new_from_resource(glade_sign_path);
- window->Window = yon_gtk_builder_get_widget(builder,"repoSignWindow");
- window->HeaderLabel = yon_gtk_builder_get_widget(builder,"signHeaderNameLabel");
- window->KeysCombo = yon_gtk_builder_get_widget(builder,"repoSignKeysCombo");
-
- window->SaveButton = yon_gtk_builder_get_widget(builder,"repoSignSaveButton");
- window->CloseButton = yon_gtk_builder_get_widget(builder,"repoSignCancelButton");
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- GtkTreeIter iter;
- gtk_window_set_title(GTK_WINDOW(window->Window),TITLE_LABEL);
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- if (gtk_tree_store_iter_depth(main_config.tree_store,&iter)==1)
- gtk_label_set_text(GTK_LABEL( window->HeaderLabel),yon_char_unite(DIGITAL_SIGNATURE_LABEL," - ",PACKAGE_LABEL,NULL));
- else
- gtk_label_set_text(GTK_LABEL( window->HeaderLabel),yon_char_unite(DIGITAL_SIGNATURE_LABEL," - ",REPOSITORY_LABEL,NULL));
- int size=0;
- config_str ret = yon_config_load(get_gpg_keys_command,&size);
- for (int i=0;iKeysCombo),ret[i]);
- }
- dictionary *dict = yon_dictionary_new_with_data("",widgets);
- dict = yon_dictionary_append_with_data(dict,"",window);
- g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_sign_save),dict);
- g_signal_connect(G_OBJECT(window->CloseButton),"clicked", G_CALLBACK(on_close_subwindow),NULL);
-
- gtk_widget_show(window->Window);
+ repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*);
+
+ int size = 0;
+ config_str packages = NULL;
+ GtkTreeIter iter,itar;
+ for_iter(GTK_TREE_MODEL(window->PackagesList),&iter){
+ char *target=NULL;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&iter,2,&target,-1);
+ if (!yon_char_is_empty(target)){
+ free(yon_char_divide(target,yon_char_find_last(target,'/')));
+ yon_char_parsed_add_or_create_if_exists(packages,&size,target);
+ free(target);
+ }
+ }
+ if (size){
+ char *arch = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->MoveSourceArchEntry));
+ yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry),GTK_TREE_MODEL(window->tree_copy),&iter);
+ yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->MoveTargetRepoEntry),GTK_TREE_MODEL(window->tree_copy),&itar);
+ char *source_path, *source_repo, *target_path, *target_repo;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&source_repo,-1);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&target_repo,-1);
+ source_path = yon_char_divide(source_repo,yon_char_find_last(source_repo,'/'));
+ target_path = yon_char_divide(target_repo,yon_char_find_last(target_repo,'/'));
+ char *command = yon_move_packages_command(source_path,arch,source_repo, target_repo, yon_char_parsed_to_string(packages,size," "));
+ yon_debug_output("%s\n",command);
+ if (!system(command)){
+ yon_ubl_status_box_render(PACKAGES_MOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL);
+ gtk_tree_store_clear(widgets->RepoList);
+ yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList));
+
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo));
+ if (!yon_char_is_empty(id)){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id);
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id));
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter);
+ on_main_tree_selection_changed(NULL,widgets);
+ }
+ yon_config_load_update(widgets);
+ on_subwindow_close(window->MainWindow);
+ }
} else {
- yon_ubl_status_box_render(SIGN_CHOOSE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
}
}
-void on_repo_configure(GtkWidget *self, main_window *widgets){
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
+repo_add_window *on_move_clicked(GtkWidget *self, main_window *widgets){
+ repo_add_window *window = yon_repo_add_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),MOVE_PACKAGES_TITLE_LABEL,icon_path,"move-repo-window");
+ gtk_label_set_text(GTK_LABEL(window->HeadLabel),MOVE_PACKAGES_TITLE_LABEL);
+ gtk_button_set_label(GTK_BUTTON(window->AddButton),MOVE_LABEL);
+ gtk_label_set_text(GTK_LABEL(window->PackagesToAddLabel),MOVE_PACKAGES_LABEL);
+ gtk_widget_show(window->MoveSourceFrame);
+ gtk_widget_show(window->MoveTargetFrame);
+ gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo));
GtkTreeIter iter;
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- GtkBuilder *builder = gtk_builder_new_from_resource(glade_repo_path);
- repo_create_window *window = new(repo_create_window);
- window->Window=yon_gtk_builder_get_widget(builder,"repoEditWindow");
- window->NameEntry=yon_gtk_builder_get_widget(builder,"repoEditNameEntry");
- window->CancelButton=yon_gtk_builder_get_widget(builder,"repoEditCancelButton");
- window->SaveButton=yon_gtk_builder_get_widget(builder,"repoEditSaveButton");
- window->BranchesTree=yon_gtk_builder_get_widget(builder,"repoEditBranchTree");
- window->BranchesListStore=GTK_LIST_STORE(gtk_builder_get_object(builder,"curRepoEditList"));
- gtk_widget_show(window->Window);
- dictionary *dict = yon_dictionary_new_with_data("",widgets);
- dict = yon_dictionary_append_with_data(dict,"",window);
- g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_repo_configure_done),dict);
- g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
- gtk_list_store_clear(window->BranchesListStore);
- } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
-}
-
-void on_repo_configure_done(GtkWidget *self, dictionary *dict){
- main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
- repo_create_window *window = yon_dictionary_get_data(dict->first->next,repo_create_window*);
- GtkTreeIter iter, parentIter;
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(main_config.tree_store),&parentIter,&iter))
- iter=parentIter;
- char *oldname=NULL;
- int status=0;
- char *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry));
- gtk_tree_model_get(model,&iter,1,&oldname,3,&status,-1);
- if (status==0)
- gtk_tree_store_set(main_config.tree_store,&iter,1,name,4,oldname,6,1,-1);
- else if (status==1)
- gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1);
- }
- yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
- on_close_subwindow(self);
-}
-
-void on_repo_load_local(GtkWidget *self, main_window *widgets){
- GtkFileFilter *file_filter = gtk_file_filter_new();
- GtkWidget *chooser = gtk_file_chooser_dialog_new(LOAD_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
- gtk_window_set_icon_name(GTK_WINDOW(chooser),"com.ublinux.ubl-settings-repomanager");
- int res = gtk_dialog_run(GTK_DIALOG(chooser));
- if (res==GTK_RESPONSE_ACCEPT){
-
- char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
- yon_repo_append(widgets,filename,YON_REPO_LINE_REPO_TYPE);
- }
- on_close_subwindow(chooser);
-}
-
-GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYPE type){
- GtkTreeIter *retIter=g_malloc0(sizeof(GtkTreeIter));
- GtkTreeIter iter,parentIter;
- GtkIconTheme *theme = gtk_icon_theme_get_default();
- char *name_short = yon_char_new(name);
- gboolean fls = 0;
- while(1){
- yon_char_divide_search(name_short,"/",-1);
- if (!strstr(name_short,"/")) break;
- }
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&parentIter)){
- if (type==YON_REPO_LINE_REPO_TYPE){
- GtkTreeIter ater;
- char *repo_path;
- int valid = gtk_tree_model_get_iter_first(model,&ater);
- for (;valid;valid=gtk_tree_model_iter_next(model,&ater)){
- gtk_tree_model_get(model,&ater,2,&repo_path,-1);
- if (!strcmp(repo_path,name)){
- yon_ubl_status_box_render(REPO_ALREADY_EXISTS_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
- return NULL;
- }
- }
- gtk_tree_store_append(main_config.tree_store,&iter,NULL);
- gtk_tree_store_set(main_config.tree_store,&iter,0, folder_no_edits, 1, name_short,2,name,3,1,4,fls,-1);
- retIter = gtk_tree_iter_copy(&iter);
- }
- else if (type==YON_REPO_LINE_FILE_TYPE){
- GtkTreeIter branch;
- if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){
- GtkTreeIter repo;
- char *filename;
- int valid = gtk_tree_model_iter_nth_child(model,&repo,&branch,0);
- for (;valid;valid=gtk_tree_model_iter_next(model,&repo)){
- gtk_tree_model_get(model,&repo,1,&filename,-1);
- if (!strcmp(yon_char_divide_search(yon_char_new(name_short),".pkg.tar",-1), filename)){
- yon_ubl_status_box_render(ALREADY_EXIST,BACKGROUND_IMAGE_FAIL_TYPE);
- return NULL;
- }
- free(filename);
- }
- gtk_tree_store_append(main_config.tree_store,&iter,&branch);
- gtk_tree_store_set(main_config.tree_store,&iter,0, document_no_edits, 1, name_short,2,name,3,1,4,fls,-1);
- retIter = gtk_tree_iter_copy(&iter);
-
- } else {
- GtkTreeIter repo;
- char *filename;
- int valid = gtk_tree_model_iter_nth_child(model,&repo,&parentIter,0);
- for (;valid;valid=gtk_tree_model_iter_next(model,&repo)){
- gtk_tree_model_get(model,&repo,1,&filename,-1);
- if (!strcmp(yon_char_divide_search(yon_char_new(name_short),".pkg.tar",-1), filename)){
- yon_ubl_status_box_render(ALREADY_EXIST,BACKGROUND_IMAGE_FAIL_TYPE);
- return NULL;
- }
- free(filename);
- }
- gtk_tree_store_append(main_config.tree_store,&iter,&parentIter);
- gtk_tree_store_set(main_config.tree_store,&iter,0, document_no_edits, 1, name_short,2,name,3,1,4,fls,-1);
- retIter = gtk_tree_iter_copy(&iter);
- }
- yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ for_iter (window->tree_copy,&iter){
+ char *current;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1);
+ if (!yon_char_is_empty(current)){
+ char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveSourceStorageEntry),path,current);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetStorageEntry),path,current);
}
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter);
}
- else if (type==YON_REPO_LINE_REPO_TYPE){
- gtk_tree_store_append(main_config.tree_store,&iter,NULL);
- gtk_tree_store_set(main_config.tree_store,&iter,0, folder_no_edits, 1, name_short,2,name,3,1,4,fls,9,name_short,-1);
- retIter = gtk_tree_iter_copy(&iter);
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter);
+
+ yon_sign_list_update();
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo));
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->PackageSignCombo),0);
+
+ gtk_widget_destroy(gtk_widget_get_parent(window->StorageCombo));
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ g_signal_connect(G_OBJECT(window->MoveSourceStorageEntry),"changed",G_CALLBACK(on_move_storage_changed),window);
+ g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window);
+ g_signal_connect(G_OBJECT(window->MoveSourceArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window);
+
+ g_signal_connect(G_OBJECT(window->MoveTargetRepoEntry),"changed",G_CALLBACK(on_move_repo_changed),window);
+ g_signal_connect(G_OBJECT(window->MoveTargetArchEntry),"changed",G_CALLBACK(on_move_arch_changed),window);
+
+ g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_move_add_package),window);
+ g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window);
+ g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_move_accept),dict);
+ g_signal_connect(G_OBJECT(window->MoveSourceRepoEntry),"changed",G_CALLBACK(on_repo_sign_load),window);
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){
+
+ char *target = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoList),&iter);
+ int mod = yon_char_count(target,":")+1;
+ char *arc=NULL;
+ char *repo=NULL;
+ char *stor=NULL;
+ if (mod ==3){
+ arc = yon_char_new(target);
+ char *temp = yon_char_new(target);
+ repo = yon_char_divide(temp,yon_char_find_last(temp,':'));
+ free(temp);
+ temp = yon_char_new(repo);
+ stor = yon_char_divide(temp,yon_char_find_last(temp,':'));
+ free(temp);
+ } else if (mod>=2){
+ repo = yon_char_new(target);
+ char *temp = yon_char_new(target);
+ stor = yon_char_divide(temp,yon_char_find_last(temp,':'));
+ free(temp);
+ } else if (mod>=1){
+ stor = yon_char_new(target);
+ }
+
+ if (stor)
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceStorageEntry),stor);
+ if (repo)
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceRepoEntry),repo);
+ if (arc)
+ gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveSourceArchEntry),arc);
+ }
+ gtk_widget_show(window->MainWindow);
+ return window;
+}
+
+void on_remove_add_package(GtkWidget *self, repo_add_window *window){
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))>-1){
+ file_chooser_window *dialog = yon_file_chooser_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"ChooseMoveFileChooserWindow");
+ gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL);
+ GtkFileFilter *filter = gtk_file_filter_new();
+ gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]");
+ gtk_file_filter_set_name(filter,"*.pkg.tar.*");
+ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter);
+ GtkTreeIter iter,itar;
+ yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->ArchitectureCombo),GTK_TREE_MODEL(window->tree_copy),&iter);
+ char *target;
+ int temp_size=0;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&target,-1);
+ yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->ArchitectureCombo),GTK_TREE_MODEL(window->tree_copy),&itar);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&dialog->root_path,-1);
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->FileChooserWidget),target);
+
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog);
+
+ g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"current-folder-changed",G_CALLBACK(on_folder_changed),dialog);
+ g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_move_add_accept),dict);
+ g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),window);
+ gtk_widget_show(dialog->Window);
+ }
+}
+
+void on_remove_arch_selection_changed(GtkWidget *self, repo_add_window *window){
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))==-1){
+ gtk_widget_set_sensitive(window->AddPackageButton,0);
} else {
- yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
+ gtk_widget_set_sensitive(window->AddPackageButton,1);
}
- return retIter;
}
-void yon_repo_remove_package(main_window *widgets){
+void on_remove_accept(GtkWidget *self, dictionary *dict){
+ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
+ repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*);
+ GtkTreeModel *model;
GtkTreeIter iter;
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- GtkTreeIter iterparent;
- if (gtk_tree_model_iter_parent(model,&iterparent,&iter)){
- int status = 0;
- gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&status,-1);
- if (status != 1){
- gtk_tree_store_set(main_config.tree_store,&iter,3,-1,-1);
- gtk_tree_store_set(main_config.tree_store,&iter,0,document_deleted,-1);
- } else gtk_tree_store_remove(main_config.tree_store,&iter);
- yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
- }else yon_ubl_status_box_render(CHOOSE_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
- }
-}
-
-void yon_repo_remove(main_window *widgets){
- GtkTreeIter iter, childIter, *deletecopy;
- GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store);
- if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&iter)){
- if(gtk_tree_store_iter_depth(main_config.tree_store,&iter)==0){
- int repostatus=0;
- gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&repostatus,-1);
- if (repostatus ==0){
- gtk_tree_store_set(main_config.tree_store,&iter,3,-1,0,folder_deleted,-1);
- int valid=gtk_tree_model_iter_children(model,&childIter,&iter);
- for (;valid;valid=gtk_tree_model_iter_next(model,&childIter)){
- int status=5;
- gtk_tree_model_get(model,&childIter,3,&status,-1);
- if (status==1){
- deletecopy = gtk_tree_iter_copy(&childIter);
- gtk_tree_model_iter_previous(model,&childIter);
- gtk_tree_store_remove(main_config.tree_store,deletecopy);
- } else if (status == 0){
- gtk_tree_store_set(main_config.tree_store,&childIter, 0,document_deleted,3,-1,-1);
- }
- }
- } else if (repostatus == 1) {
- gtk_tree_store_remove(main_config.tree_store,&iter);
+ const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo));
+ char *storage_path;
+ char *repo = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo));
+ char *arch = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo));
+
+ if (!yon_char_is_empty(storage_id)){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,storage_id);
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,&storage_path,-1);
+ int size=0;
+ config_str packages=NULL;
+ for_iter(GTK_TREE_MODEL(window->PackagesList),&iter){
+ char *target;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->PackagesList),&iter,1,&target,-1);
+ yon_char_parsed_add_or_create_if_exists(packages,&size,target);
+ }
+ if (size){
+ char *sign = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo));
+ char *command;
+ if (yon_char_is_empty(sign)){
+ command = yon_delete_packages_command(storage_path,arch,repo,yon_char_parsed_to_string(packages,size," "));
+ } else {
+ command = yon_delete_packages_sign_command(storage_path,arch,repo,sign,yon_char_parsed_to_string(packages,size," "));
}
- }else yon_ubl_status_box_render(CHOOSE_REPO_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
- } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
-}
+ yon_debug_output("%s\n",command);
+ if (!system(command)){
+ yon_ubl_status_box_render(PACKAGES_REMOVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL);
+ gtk_tree_store_clear(widgets->RepoList);
+ yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList));
-gboolean yon_check_file_pattern(GtkFileFilterInfo *info){
- if (!strstr(info->filename,".sig")&&strstr(info->filename,".pkg.tar."))
- return 1;
- else return 0;
+ const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo));
+ if (!yon_char_is_empty(id)){
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id);
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id));
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter);
+ on_main_tree_selection_changed(NULL,widgets);
+ }
+ }
+ yon_config_load_update(widgets);
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ }else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ gtk_widget_destroy(window->MainWindow);
}
-void yon_add_file(main_window *widgets){
- GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_OPEN,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL);
- GtkFileFilter *file_filter = gtk_file_filter_new();
- file_filter = gtk_file_filter_new();
- gtk_file_filter_add_custom(file_filter,GTK_FILE_FILTER_FILENAME,(GtkFileFilterFunc)yon_check_file_pattern,NULL,NULL);
- gtk_file_filter_set_name(file_filter,".pkg.tar.*");
- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter);
- file_filter = gtk_file_filter_new();
- gtk_file_filter_add_pattern(file_filter,"*");
- gtk_file_filter_set_name(file_filter,"All");
- gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter);
- gtk_window_set_icon_name(GTK_WINDOW(chooser),"com.ublinux.ubl-settings-repomanager");
- int res = gtk_dialog_run(GTK_DIALOG(chooser));
- if (res==GTK_RESPONSE_ACCEPT){
- char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
- FILE *file = popen(get_package_info_command(filename),"r");
- char *cur_string=g_malloc0(sizeof(char)*4096);
- char *packname=NULL, *packver=NULL, *packarch=NULL, *packdepends=NULL;
- while (fgets(cur_string,4096,file)){
- char *stringe = yon_char_divide_search(cur_string,"\n",-1);
- char *p = yon_char_divide_search(stringe,":",-1);
- if (strstr(p,"Name")) packname = yon_char_new(stringe);
- else if (strstr(p,"Version")) packver = yon_char_new(stringe);
- else if (strstr(p,"Architecture")) packarch = yon_char_new(stringe);
- else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe);
- else if (strstr(p,"Depends On")) packdepends = yon_char_new(stringe);
- }
- int add = 1;
- GtkTreeIter *iter = yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE);
- if (iter){
- gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),iter));
- gtk_tree_store_set(main_config.tree_store,iter,0,document_added,1,yon_char_unite(packname,"-",packver,"-",packarch,NULL),2,filename,3,add,9,packname,10,packver,11,packarch,12,packdepends,-1);
+repo_add_window *on_remove_clicked(GtkWidget *self, main_window *widgets){
+ repo_add_window *window = yon_repo_add_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),REMOVE_PACKAGES_TITLE_LABEL,icon_path,"add-repo-window");
+ gtk_label_set_text(GTK_LABEL(window->HeadLabel),REMOVE_PACKAGES_TITLE_LABEL);
+ GtkTreeIter iter;
+ for_iter (window->tree_copy,&iter){
+ char *current;
+ gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,3,¤t,-1);
+ if (!yon_char_is_empty(current)){
+ char *path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&iter);
+ gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StorageCombo),path,current);
}
}
- on_tree_selection_changed(NULL,widgets);
- on_close_subwindow(chooser);
+ gtk_label_set_text(GTK_LABEL(window->PackagesToAddLabel),REMOVE_PACKAGES_LABEL);
+ yon_sign_list_update();
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->RepoSignCombo));
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->PackageSignCombo));
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->RepoSignCombo),0);
+ gtk_widget_hide(gtk_widget_get_parent(window->PackageSignCombo));
+ gtk_button_set_label(GTK_BUTTON(window->AddButton),REMOVE_LABEL);
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_arch_chosen),window);
+ g_signal_connect(G_OBJECT(window->StorageCombo),"changed",G_CALLBACK(on_add_target_repo_selection_changed),window);
+ g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_add_target_arch_selection_changed),window);
+ g_signal_connect(G_OBJECT(window->ArchitectureCombo),"changed",G_CALLBACK(on_remove_arch_selection_changed),window);
+ g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_remove_accept),dict);
+ g_signal_connect(G_OBJECT(window->AddPackageButton),"clicked",G_CALLBACK(on_remove_add_package),window);
+ g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_move_remove_package),window);
+ g_signal_connect(G_OBJECT(window->RepositoryCombo),"changed",G_CALLBACK(on_repo_sign_load),window);
+ yon_add_window_set_selected(widgets,window);
+ gtk_widget_show(window->MainWindow);
+ return window;
}
-
/* setup functions */
void config_init(){
main_config.tree_store=NULL;
main_config.always_open_documentation=0;
- main_config.win_height=0;
- main_config.win_width=0;
- main_config.win_pos_x=0;
- main_config.win_pos_y=0;
main_config.socket_id=-1;
main_config.save_socket_id=-1;
main_config.load_socket_id=-1;
@@ -770,237 +1271,609 @@ void config_init(){
main_config.lock_load_global=0;
main_config.lock_save_global=0;
main_config.lock_save_local=0;
+ main_config.signs=NULL;
+ main_config.signs_size=0;
+ yon_sign_list_update();
+ main_config.last_selection = NULL;
}
-main_window *setup_window(){
- /* Widgets getting | Получение виджетов */
- main_window *widgets = malloc(sizeof(main_window));
- GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
- widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow");
- widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic");
- widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox");
- widgets->MovePaned = yon_gtk_builder_get_widget(builder,"MovePaned");
-
- widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay");
- widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage");
- widgets->HeadBox = yon_gtk_builder_get_widget(builder,"HeaderBox");
- widgets->HeadTitleLabel = yon_gtk_builder_get_widget(builder,"HeaderTitleLabel");
- widgets->HeadInfoLabel = yon_gtk_builder_get_widget(builder,"HeaderInfoLabel");
-
- widgets->StatusBox = yon_gtk_builder_get_widget(builder,"mainStatusBox");
- widgets->StatusIcon = yon_gtk_builder_get_widget(builder,"mainStatusIcon");
- widgets->StatusLabel = yon_gtk_builder_get_widget(builder,"mainStatusLabel");
-
- widgets->SaveLabel = yon_gtk_builder_get_widget(builder,"headerSaveConfigLabel");
- widgets->SaveMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalLocalConfigurationMenuItem");
- widgets->SaveGlobalMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalConfigurationMenuItem");
- widgets->SaveLocalMenuItem = yon_gtk_builder_get_widget(builder,"SaveLocalConfigurationMenuItem");
- widgets->RightBox = yon_gtk_builder_get_widget(builder,"HeaderRightBox");
-
- widgets->LoadLabel = yon_gtk_builder_get_widget(builder,"headerLoadConfigLabel");
- widgets->LoadGlobalMenuItem = yon_gtk_builder_get_widget(builder,"LoadGlobalConfigurationMenuItem");
- widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem");
- widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox");
-
- widgets->GeneralTabLabel = yon_gtk_builder_get_widget(builder,"GeneralTabLabel");
- widgets->PublicationTabLabel = yon_gtk_builder_get_widget(builder,"PublicationTabLabel");
- widgets->CreateButton = yon_gtk_builder_get_widget(builder,"CreateButton");
- widgets->LoadFromNetButton = yon_gtk_builder_get_widget(builder,"LoadNetButton");
- widgets->ConfigureButton = yon_gtk_builder_get_widget(builder,"ConfigureButton");
- widgets->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton");
- widgets->LoadFromLocalButton = yon_gtk_builder_get_widget(builder,"LoadLocalButton");
- widgets->SwitchPublishButton = yon_gtk_builder_get_widget(builder,"SwitchPublishButton");
- widgets->CheckDependencesButton = yon_gtk_builder_get_widget(builder,"CheckDependencesButton");
- widgets->SignButton = yon_gtk_builder_get_widget(builder,"SignButton");
- widgets->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton");
- widgets->RemovePackageButton = yon_gtk_builder_get_widget(builder,"RemovePackageButton");
- widgets->RepoTree = yon_gtk_builder_get_widget(builder,"RepoTree");
- widgets->TrustedRepoCheck = yon_gtk_builder_get_widget(builder,"TrustedCheck");
- widgets->ServerTypeLabel = yon_gtk_builder_get_widget(builder,"ServerLabel");
- widgets->ServerTypeCombo = yon_gtk_builder_get_widget(builder,"ServerCombo");
- widgets->IpAdressLabel = yon_gtk_builder_get_widget(builder,"IpAdresslabel");
- widgets->IpAdressCombo = yon_gtk_builder_get_widget(builder,"IpAdressCombo");
- widgets->PortLabel = yon_gtk_builder_get_widget(builder,"PortLabel");
- widgets->PortSpin = yon_gtk_builder_get_widget(builder,"PortSpin");
- widgets->OutputEntry = yon_gtk_builder_get_widget(builder,"OutputEntry");
- widgets->CopyButton = yon_gtk_builder_get_widget(builder,"CopyButton");
- widgets->PublishButton = yon_gtk_builder_get_widget(builder,"PublishButton");
- widgets->CodeNameLabel = yon_gtk_builder_get_widget(builder,"CodeNameLabel");
- widgets->CodeNameInfoLabel = yon_gtk_builder_get_widget(builder,"CodeNameInfoLabel");
- widgets->BranchLabel = yon_gtk_builder_get_widget(builder,"BranchLabel");
- widgets->BranchInfoLabel = yon_gtk_builder_get_widget(builder,"BranchInfoLabel");
- widgets->VersionLabel = yon_gtk_builder_get_widget(builder,"VersionLabel");
- widgets->VersionInfoLabel = yon_gtk_builder_get_widget(builder,"VersionInfoLabel");
- widgets->ArchitectureLabel = yon_gtk_builder_get_widget(builder,"ArchitectureLabel");
- widgets->ArchitectureInfoLabel = yon_gtk_builder_get_widget(builder,"ArchitectureInfoLabel");
- widgets->ComponentsLabel = yon_gtk_builder_get_widget(builder,"ComponentsLabel");
- widgets->DependencesInfoLabel = yon_gtk_builder_get_widget(builder,"DependencesInfoLabel");
- widgets->SignatureLabel = yon_gtk_builder_get_widget(builder,"SignatureLabel");
- widgets->SignatureInfoLabel = yon_gtk_builder_get_widget(builder,"SignatureInfoLabel");
- widgets->Finder = yon_gtk_builder_get_widget(builder,"RepoFinder");
- widgets->NameBox = yon_gtk_builder_get_widget(builder,"nameBox");
- widgets->VersionBox = yon_gtk_builder_get_widget(builder,"versionBox");
- widgets->ArchitectureBox = yon_gtk_builder_get_widget(builder,"archBox");
- widgets->DependenceBox = yon_gtk_builder_get_widget(builder,"dependBox");
- widgets->SignatureBox = yon_gtk_builder_get_widget(builder,"signatureBox");
- widgets->SaveButton = yon_gtk_builder_get_widget(builder,"mainSaveButton");
- main_config.tree_store = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore"));
-
- widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL);
- widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL);
-
- gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL);
+void yon_config_load_update(main_window *widgets){
+ gtk_tree_store_clear(widgets->RepoList);
+ gsize size=0;
+ config_str storages = yon_window_config_get_section("storage_info",&size);
+ GtkTreeIter iter,itar,childiter;
+ for (int i=0;iRepoList,&iter,NULL);
+ gtk_tree_store_set(widgets->RepoList,&iter,0,folder_no_edits,2,name,3,storages[i],-1);
+ free(name);
+ yon_window_config_get_parameter("storage_info",storages[i],&name,YON_TYPE_STRING);
+ if (!yon_char_is_empty(name)){
+ int parsed_size;
+ config_str name_parsed = yon_char_parse(name,&parsed_size,",");
+ for (int j=0;jRepoList,&itar,&iter);
+ gtk_tree_store_set(widgets->RepoList,&itar,2,nm,3,name_parsed[j],-1);
+ int size;
+ config_str dirs = yon_file_list_dirs(name_parsed[j],&size);
+ for (int k=0;kRepoList,&childiter,&itar);
+ gtk_tree_store_set(widgets->RepoList,&childiter,0,sign_status_image,2,dirs[k],3,arch_path,-1);
+ }
+ }
+ free(nm);
+ }
+ yon_char_parsed_free(name_parsed,parsed_size);
+ }
+
+ }
+ if (size)
+ yon_char_parsed_free(storages,size);
+}
- GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2");
- gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem);
-
- if (main_config.lock_load_global == 1){
- gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0);
- }
- if (main_config.lock_save_global == 1&&main_config.lock_save_local == 1){
- gtk_widget_set_sensitive(gtk_widget_get_parent(gtk_widget_get_parent(widgets->SaveLabel)),0);
- }else{
- if (main_config.lock_save_global == 1){
- gtk_widget_set_sensitive(widgets->SaveGlobalMenuItem,0);
- gtk_widget_set_sensitive(widgets->SaveMenuItem,0);
- }
- if (main_config.lock_save_local == 1){
- gtk_widget_set_sensitive(widgets->SaveLocalMenuItem,0);
- gtk_widget_set_sensitive(widgets->SaveMenuItem,0);
- }
- }
-
-
- /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */
- yon_window_config_add_listener(widgets->MovePaned,"pane_position","position",YON_TYPE_INT);
-
- /* Signal connection | Присоединение сигналов */
- g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
- g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK);
- g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL);
- g_signal_connect(G_OBJECT(widgets->CreateButton),"clicked",G_CALLBACK(on_repo_new),widgets);
- g_signal_connect(G_OBJECT(widgets->AddPackageButton),"clicked",G_CALLBACK(on_repo_add_file),widgets);
- g_signal_connect(G_OBJECT(widgets->RemovePackageButton),"clicked",G_CALLBACK(on_repo_remove_package),widgets);
- g_signal_connect(G_OBJECT(widgets->DeleteButton),"clicked",G_CALLBACK(on_repo_remove),widgets);
- g_signal_connect(G_OBJECT(widgets->LoadFromLocalButton),"clicked",G_CALLBACK(on_repo_load_local),widgets);
- g_signal_connect(G_OBJECT(widgets->ConfigureButton),"clicked",G_CALLBACK(on_repo_configure),widgets);
- g_signal_connect(G_OBJECT(widgets->SignButton),"clicked",G_CALLBACK(on_repo_sign),widgets);
- g_signal_connect(G_OBJECT(widgets->SaveButton),"clicked",G_CALLBACK(on_save),widgets);
- g_signal_connect(G_OBJECT(widgets->RepoTree),"cursor-changed",G_CALLBACK(on_tree_selection_changed),widgets);
- g_signal_connect(G_OBJECT(widgets->Finder),"changed",G_CALLBACK(on_search),widgets);
-
- /* Localisation | Локализация */
- gtk_widget_show(widgets->Window);
+config_str yon_tree_store_storage_get_archs(GtkTreeStore *target, GtkTreeIter *storage, int *size){
+ config_str final = NULL;
+ GtkTreeIter iter,itar;
+ int repos_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,storage);
+ for (;repos_valid;repos_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){
+ int archs_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&itar,&iter);
+ for (;archs_valid;archs_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&itar)){
+ char *current;
+ gtk_tree_model_get(GTK_TREE_MODEL(target),&itar,2,¤t,-1);
+ if (yon_char_parsed_check_exist(final,*size,current)==-1)
+ yon_char_parsed_add_or_create_if_exists(final,size,current);
+ }
+ }
+ return final;
+}
+config_str yon_tree_store_repo_get_archs(GtkTreeStore *target, GtkTreeIter *repo, int *size){
+ config_str final = NULL;
+ GtkTreeIter iter;
+ int repos_valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,repo);
+ for (;repos_valid;repos_valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){
+ char *current;
+ gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,2,¤t,-1);
+ if (yon_char_parsed_check_exist(final,*size,current)==-1)
+ yon_char_parsed_add_or_create_if_exists(final,size,current);
+ }
+ return final;
+}
- return widgets;
+char *yon_signature_get(GtkTreeView *target, GtkTreeIter *iter){
+ GtkTreeIter itar;
+ GtkTreeModel *model = gtk_tree_view_get_model(target);
+ char *full_path = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(model),iter);
+ int size;
+ config_str parsed = yon_char_parse(full_path,&size,":");
+ if (size==2){
+ char *storage_path = parsed[0];
+ char *repo_path = yon_char_unite(parsed[0],":",parsed[1],NULL);
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model),&itar,storage_path);
+ char *path;
+ gtk_tree_model_get(GTK_TREE_MODEL(model),&itar,3,&path,-1);
+ char *repo;
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model),&itar,repo_path);
+ gtk_tree_model_get(GTK_TREE_MODEL(model),&itar,2,&repo,-1);
+ int status_size;
+ config_str status = yon_config_load(yon_repo_get_signature(path,repo),&status_size);
+ char *final_string = NULL;
+ if (status_size>4){
+ final_string = yon_char_unite(status[0],status[1],status[2],status[3],NULL);
+ }
+ free(full_path);
+ free(path);
+ free(repo);
+ yon_char_parsed_free(parsed,size);
+ yon_char_parsed_free(status,status_size);
+
+ return final_string;
+ }
+ return NULL;
}
-int main(int argc, char *argv[]){
- local=setlocale(LC_ALL, "");
- textdomain (LocaleName);
- config_init();
- int option_index=0;
- int show_help=0;
- int debug_mode=0;
- {
- struct option long_options[] = {
- {"help", 0, 0, 'h'},
- {"version", 0, 0, 'V'},
- {"lock-help", 0,0, 1},
- {"lock-save", 0,0, 2},
- {"lock-save-local", 0,0, 3},
- {"lock-save-global", 0,0, 4},
- {"lock-load-global", 0,0, 5},
- {"socket-id", 1, 0, 's'},
- {"socket-ext-id", 1,0, 'e'},
- {"socket-trd-id", 1,0, 't'},
- {"debug", 0,0, 'd'},
- {"clean-config", 0,0, 'c'},
- { NULL, 0, NULL, 0 }
- };
- for (int i=0;iInformationLabel),"");
+ gtk_list_store_clear(widgets->RepoFileList);
+ gtk_list_store_clear(widgets->RepoPackagesList);
+ GtkTreeIter iter,itar;
+ GtkTreeModel *model=NULL;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){
+ GtkTreePath *path = gtk_tree_model_get_path(model,&iter);
+ int depth = gtk_tree_path_get_depth(path);
+ char *target, *name;
+ gtk_tree_model_get(model, &iter,2,&name,3,&target,-1);
+ switch (depth){
+ case 1:{
+ int size, arch_size;
+ config_str repos = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&size,2,2);
+ config_str archs = yon_tree_store_storage_get_archs(widgets->RepoList,&iter,&arch_size);
+ if (size>0&&arch_size>0){
+ char *repo_string = yon_char_parsed_to_string(repos,size,", ");
+ char *archs_string = yon_char_parsed_to_string(archs,arch_size,", ");
+ char *info = get_storage_info_label(target,repo_string,archs_string);
+ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),info);
+ int lvlsize;
+ config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,2);
+ for (int i=0;iRepoFileList,&itar);
+ gtk_list_store_set(widgets->RepoFileList,&itar,1,level[i],-1);
+ }
+ free(repo_string);
+ free(archs_string);
+ free(info);
+ yon_char_parsed_free(repos,size);
+ yon_char_parsed_free(archs,arch_size);
+ }
}
- }
- if (show_help==1&&main_config.lock_help!=1){
- printf("%s\n",HELP_LABEL);
- exit(0);
+ break;
+ case 2:{
+ int size, arch_size;
+ config_str archs = yon_tree_store_repo_get_archs(widgets->RepoList,&iter,&arch_size);
+ char *archs_string = yon_char_parsed_to_string(archs,arch_size,", ");
+ char *sign = yon_signature_get(GTK_TREE_VIEW(widgets->ReposTree),&iter);
+ char *info = get_repo_info_label(name,archs_string,sign);
+ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),info);
+ int lvlsize;
+ config_str level = yon_tree_store_get_all_at_level(widgets->RepoList,&iter,&lvlsize,2,3);
+ for (int i=0;iRepoFileList,&itar);
+ gtk_list_store_set(widgets->RepoFileList,&itar,1,level[i],-1);
+ }
+ free(archs_string);
+ free(info);
+ yon_char_parsed_free(archs,arch_size);
+
}
+ break;
+ case 3:{
+ GtkTreeIter itor;
+ gtk_tree_model_iter_parent(GTK_TREE_MODEL(widgets->RepoList),&itor,&iter);
+ char *trg;
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&itor,2,&trg,-1);
+ char *info = get_arch_info_label(trg,name);
+ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),info);
+ char *packages;
+ int size;
+ char *arch = yon_char_new(target);
+ char *repo = yon_char_divide(arch,yon_char_find_last(arch,'/'));
+ char *storage = yon_char_divide(repo,yon_char_find_last(repo,'/'));
+ char *command = yon_get_packages_command(storage,repo,arch);
+ yon_debug_output("%s\n",command);
+ config_str parsed = yon_config_load(command,&size);
+ for (int i=0;i0){
+ yon_char_remove_last_symbol(load[0],'\n');
+ int package_status = system(yon_debug_output("%s\n",yon_repo_get_signature_status(storage,repo,arch,load[0])));
+ char *sign_status_icon = "";
+ if (!package_status)
+ sign_status_icon = package_signature_icon_name;
+ else
+ sign_status_icon = package_signature_error_icon_name;
+ gtk_list_store_append(widgets->RepoFileList,&itar);
+ gtk_list_store_set(widgets->RepoFileList,&itar,0,sign_status_icon,1,line[0],2,line[1],-1);
+ yon_char_parsed_free(load,load_size);
+ }
+ } else {
+ gtk_list_store_append(widgets->RepoPackagesList,&itar);
+ gtk_list_store_set(widgets->RepoPackagesList,&itar,0,package_signature_error_icon_name,1,line[1],-1);
+ }
+ }
+ free(info);
+ }
+ break;
+ }
+ if (main_config.last_selection){
+ if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoFileList),&itar,main_config.last_selection))
+ gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&itar);
+ }
}
+}
- if (getuid()!=0){
- main_config.lock_load_global=1;
- main_config.lock_save_global=1;
- main_config.lock_save_local=1;
- main_config.lock_root=1;
+void on_package_selection_changed(GtkWidget *self, main_window *widgets){
+ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),"");
+ GtkTreeIter iter,itar;
+ GtkTreeModel *model, *model2;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model,&iter)){
+ if (main_config.last_selection) free(main_config.last_selection);
+ main_config.last_selection = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoFileList),&iter);
+ gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model2,&itar);
+ switch (gtk_tree_store_iter_depth(widgets->RepoList,&itar)){
+ case 0:
+ break;
+ case 1:
+ break;
+ case 2:
+ char *path, *filename;
+ gtk_tree_model_get(model,&iter,2,&filename,-1);
+ gtk_tree_model_get(model2,&itar,3,&path,-1);
+ int size;
+ char *command = get_package_info_command(yon_char_unite(path,"/",filename,NULL));
+ yon_debug_output("%s\n",command);
+ config_str parsed = yon_config_load(command,&size);
+ char *full = yon_char_parsed_to_string(parsed,size,"");
+ gtk_label_set_text(GTK_LABEL(widgets->InformationLabel),full);
+ yon_char_parsed_free(parsed,size);
+ free(full);
+ break;
+ }
}
- gtk_init(&argc,&argv);
-
+}
+
+void yon_combo_box_text_set_signs(GtkComboBoxText *target){
+ g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target));
+ gtk_combo_box_text_remove_all(target);
+ gtk_combo_box_text_append_text(target,DO_NOT_SIGN_LABEL);
+ for (int i=0;i');
+ gtk_combo_box_text_append(target,temp,main_config.signs[i]);
+ free(temp);
+ }
+}
+
+void yon_sign_list_update(){
+ if (main_config.signs&&main_config.signs_size) yon_char_parsed_free(main_config.signs,main_config.signs_size);
+ main_config.signs = yon_config_load(get_gpg_keys_command,&main_config.signs_size);
+ for (int i=0;iExpireEntry),self);
+}
+
+void on_key_generate_accept(GtkWidget *self, key_creation_window* window){
+ const char *name = gtk_entry_get_text(GTK_ENTRY(window->NameEntry));
+ const char *type = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->EncryptionCombo));
+ const char *email = gtk_entry_get_text(GTK_ENTRY(window->EmailEntry));
+ char *strength = yon_char_from_long(gtk_spin_button_get_value(GTK_SPIN_BUTTON(window->KeyStrengthSpin)));
+ const char *comment = gtk_entry_get_text(GTK_ENTRY(window->CommentsEntry));
+ GtkWidget *highlight_target=NULL;
+ if (yon_char_is_empty(name)){
+ highlight_target=window->NameEntry;
+ } else if (yon_char_is_empty(type)){
+ highlight_target=window->EncryptionCombo;
+ } else if (yon_char_is_empty(email)){
+ highlight_target=window->EmailEntry;
+ } else if (yon_char_is_empty(strength)){
+ highlight_target=window->KeyStrengthSpin;
+ } else if (yon_char_is_empty(comment)){
+ highlight_target=window->CommentsEntry;
+ }
+ if (highlight_target){
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ yon_ubl_status_highlight_incorrect(highlight_target);
+ return;
+ }
+ char *expire = NULL;
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ExpireCombo))==1){
+ expire = yon_char_from_int(yon_calendar_get_last_date());
+ }
+ const char *password = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry));
+ const char *password_confirm = gtk_entry_get_text(GTK_ENTRY(window->PasswordConfirmationEntry));
+ int ex_status=0;
+ if (yon_char_is_empty(password)&&yon_char_is_empty(password_confirm)){
+ yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password));
+ ex_status = system(yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password));
+ } else if (!strcmp(password,password_confirm)){
+ yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password));
+ ex_status = system(yon_generate_key_command(type,name,email,strength,comment,expire,password));
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_INCORRECT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ if (!ex_status)
+ yon_ubl_status_box_render(KEY_CREATION_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ else
+ yon_ubl_status_box_render(KEY_CREATION_FAILURE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ gtk_widget_destroy(window->Window);
+ yon_sign_list_update();
+}
+
+key_creation_window *yon_key_creation_window_new(){
+ key_creation_window *window = malloc(sizeof(key_creation_window));
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_key);
+ window->Window = yon_gtk_builder_get_widget(builder,"MainWindow");
+ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
+ window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel");
+ window->NameEntry = yon_gtk_builder_get_widget(builder,"NameEntry");
+ window->EmailEntry = yon_gtk_builder_get_widget(builder,"EmailEntry");
+ window->CommentsEntry = yon_gtk_builder_get_widget(builder,"CommentsEntry");
+ window->EncryptionCombo = yon_gtk_builder_get_widget(builder,"EncryptionCombo");
+ window->KeyStrengthSpin = yon_gtk_builder_get_widget(builder,"KeyStrengthSpin");
+ window->ExpireCombo = yon_gtk_builder_get_widget(builder,"ExpireCombo");
+ window->ExpireEntry = yon_gtk_builder_get_widget(builder,"ExpireEntry");
+ window->ExpireButton = yon_gtk_builder_get_widget(builder,"ExpireButton");
+ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
+ window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton");
+ window->PasswordEntry = yon_gtk_builder_get_widget(builder,"PasswordEntry");
+ window->PasswordConfirmationEntry = yon_gtk_builder_get_widget(builder,"PasswordConfirmationEntry");
+
+ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+ g_signal_connect(G_OBJECT(window->ExpireButton),"clicked",G_CALLBACK(on_calendar_open),window);
+ g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_key_generate_accept),window);
+
+ int size;
+ config_str encription_keys = yon_file_open(key_encription_path,&size);
+ window->expire_time=0;
+
+ for (int i=1;iEncryptionCombo),parsed[2],parsed[0]);
+ yon_char_parsed_free(parsed,parsed_size);
+ }
+ return window;
+}
+
+void on_key_clicked(GtkWidget *self, main_window *widgets){
+ key_creation_window *window = yon_key_creation_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),KEY_CREATION_TITLE_LABEL,icon_path,"key-create-window");
+ gtk_label_set_text(GTK_LABEL(window->HeadLabel),KEY_CREATION_TITLE_LABEL);
+ gtk_widget_show(window->Window);
+}
+
+void on_tree_view_activate(GtkWidget *self, GtkTreePath* path, GtkTreeViewColumn* column, main_window *widgets){
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),path);
+
+}
+
+void on_repo_item_activate(GtkWidget *self, GtkTreePath *path, GtkTreeViewColumn *column, main_window *widgets){
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree));
+ gtk_tree_selection_get_selected(tree_selection,&model,&iter);
+ if (gtk_tree_store_iter_depth(GTK_TREE_STORE(widgets->RepoList),&iter)<2){
+ char *path_id = gtk_tree_model_get_string_from_iter(model,&iter);
+ char *target_id = gtk_tree_path_to_string(path);
+ char *selection = yon_char_unite(path_id,":",target_id,NULL);
+ GtkTreePath *new_selection = gtk_tree_path_new_from_string(selection);
+ gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),new_selection);
+ gtk_tree_selection_select_path(tree_selection,new_selection);
+ // on_package_selection_changed(NULL,widgets);
+ g_signal_emit_by_name(G_OBJECT(widgets->ReposTree),"cursor-changed",widgets,G_TYPE_NONE,NULL);
+ }
+}
+
+void on_update_clicked(GtkWidget *self, main_window *widgets){
+ yon_config_load_update(widgets);
+}
+
+void on_sign_window_accept(GtkWidget *self, dictionary *dict){
+ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
+ sign_window *window = yon_dictionary_get_data(dict->first->next,sign_window*);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter)){
+ char *arch;
+ char *repo;
+ char *storage;
+ char *signature = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->SignCombo));
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoList),&iter,3,&arch,-1);
+ char *full_path = yon_char_new(arch);
+ repo = yon_char_divide(arch,yon_char_find_last(arch,'/'));
+ storage = yon_char_divide(repo,yon_char_find_last(repo,'/'));
+ storage = yon_char_append(storage,"/");
+ GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),NULL);
+ char *targets = "";
+ for (int i=0;iRepoFileList),&iter,(GtkTreePath*)g_list_nth_data(list,i));
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->RepoFileList),&iter,2,&pack,-1);
+ char *temp = yon_char_unite(targets, " ", full_path,"/",pack,NULL);
+ if (!yon_char_is_empty(targets)) free(targets);
+ targets=temp;
+ }
+ if (!system(yon_debug_output("%s\n",yon_sign_package(storage,repo,arch,targets,signature)))){
+ yon_ubl_status_box_render(SIGN_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ }
+ on_subwindow_close(window->Window);
+ }
+}
+
+sign_window *yon_sign_window_new(){
+ sign_window *window = malloc(sizeof(sign_window));
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_sign);
+
+ window->Window = yon_gtk_builder_get_widget(builder,"MainWindow");
+ window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
+ window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel");
+ window->SignCombo = yon_gtk_builder_get_widget(builder,"SignCombo");
+ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
+ window->SignButton = yon_gtk_builder_get_widget(builder,"SignButton");
+
+ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+
+ return window;
+}
+
+void on_packages_sign(GtkWidget *self, main_window *widgets){
+ sign_window *window = yon_sign_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),SIGNATURE_TITLE_LABEL,icon_path,"sign-window");
+ yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(window->SignCombo));
+ dictionary *dict = NULL;
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
+ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window);
+ g_signal_connect(G_OBJECT(window->SignButton),"clicked",G_CALLBACK(on_sign_window_accept),dict);
+ gtk_widget_show(window->Window);
+}
+
+int yon_tree_is_selected(void *widget){
+ main_window *widgets = (main_window*)widget;
+ GtkTreeModel *model;
+ GtkTreeIter iter, itar;
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model,&iter)){
+ gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&itar);
+ if (gtk_tree_store_iter_depth(widgets->RepoList,&itar)==2){
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void on_rmb_move(GtkWidget *self, main_window *widgets){
+ repo_add_window *window = on_move_clicked(NULL,widgets);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *path;
+ gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter);
+ gtk_tree_model_get(model,&iter,3,&path,-1);
+ GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model);
+ for (int i=0;iPackagesList,&itar);
+ gtk_list_store_set(window->PackagesList,&itar,1,name,2,full_path,-1);
+ free(full_path);
+ free(filename);
+ free(name);
+ }
+}
+
+void on_rmb_remove(GtkWidget *self, main_window *widgets){
+
+ repo_add_window *window = on_remove_clicked(NULL,widgets);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ char *path;
+ gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&model,&iter);
+ gtk_tree_model_get(model,&iter,3,&path,-1);
+ GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&model);
+ for (int i=0;iPackagesList,&itar);
+ gtk_list_store_set(window->PackagesList,&itar,1,name,2,full_path,-1);
+ free(full_path);
+ free(filename);
+ free(name);
+ }
+}
+
+main_window *yon_main_window_complete(main_window *widgets){
+ widgets = yon_remalloc(widgets,sizeof(main_window));
+ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
+ gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0);
+ // Custom widgets configuration
+ {
+ widgets->UpdateButton = yon_gtk_builder_get_widget(builder,"UpdateButton");
+ widgets->DBConfigurationButton = yon_gtk_builder_get_widget(builder,"DBConfigurationButton");
+ widgets->AddButton = yon_gtk_builder_get_widget(builder,"AddButton");
+ widgets->MoveButton = yon_gtk_builder_get_widget(builder,"MoveButton");
+ widgets->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton");
+ widgets->CloudButton = yon_gtk_builder_get_widget(builder,"CloudButton");
+
+ widgets->ReposTree = yon_gtk_builder_get_widget(builder,"ReposTree");
+ widgets->SearchEntry = yon_gtk_builder_get_widget(builder,"SearchEntry");
+ widgets->RepoFileTree = yon_gtk_builder_get_widget(builder,"RepoFileTree");
+ widgets->RepoPackagesTree = yon_gtk_builder_get_widget(builder,"RepoPackagesTree");
+ widgets->InformationLabel = yon_gtk_builder_get_widget(builder,"InformationLabel");
+
+ widgets->RepoList = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore"));
+ widgets->RepoFileList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoFileList"));
+ widgets->RepoPackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"RepoPackageList"));
+ {
+ widgets->KeyMenuItem = gtk_menu_item_new();
+ gtk_menu_shell_prepend(GTK_MENU_SHELL(gtk_widget_get_parent(widgets->AboutMenuItem)),widgets->KeyMenuItem);
+ GtkWidget *icon = gtk_image_new_from_icon_name(key_icon_name,GTK_ICON_SIZE_BUTTON);
+ GtkWidget *label = gtk_label_new(KEY_LABEL);
+ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
+ gtk_box_pack_start(GTK_BOX(box),icon,0,0,5);
+ gtk_box_pack_start(GTK_BOX(box),label,0,0,5);
+ gtk_container_add(GTK_CONTAINER(widgets->KeyMenuItem),box);
+ gtk_widget_show_all(widgets->KeyMenuItem);
+ gtk_style_context_add_class(gtk_widget_get_style_context(widgets->KeyMenuItem),"menuitemtop");
+ gtk_style_context_remove_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemtop");
+ gtk_style_context_add_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemmiddle");
+ g_signal_connect(G_OBJECT(widgets->KeyMenuItem),"activate",G_CALLBACK(on_key_clicked),widgets);
+ }
+ main_config.tree_store = widgets->RepoList;
- main_window *widgets = setup_window();
- yon_ubl_header_setup_resource(widgets->HeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path);
- yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel);
- yon_ubl_status_box_render(LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
- yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id);
- yon_window_config_setup(GTK_WINDOW(widgets->Window));
- yon_window_config_load(config_path);
-
- /*Check for null config parameter | Проверка на отсутствующий в конфигурации параметр */
- GValue *val = g_malloc0(sizeof(GValue));
- g_object_get_property(G_OBJECT(widgets->MovePaned),"position",val);
- int paned_size = g_value_get_int(val);
- if (paned_size<100)
- gtk_paned_set_position(GTK_PANED(widgets->MovePaned),400);
-
- on_load();
- GtkTreeIter *iter = g_malloc0(sizeof(GtkTreeIter));
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.tree_store),iter))
- gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),iter);
- GtkCssProvider *css=gtk_css_provider_new();
- gtk_css_provider_load_from_resource(css,CssPath);
- gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
- GTK_STYLE_PROVIDER(css),
- -1);
+ rmb_menu_window *rmb = yon_rmb_menu_setup(widgets->RepoFileTree, yon_tree_is_selected,widgets,
+ SIGN_LABEL,lib_key_icon_name,G_CALLBACK(on_packages_sign),widgets,
+ MOVE_PACKAGES_TITLE_LABEL,move_icon,G_CALLBACK(on_rmb_move),widgets,
+ REMOVE_PACKAGES_TITLE_LABEL,remove_icon,G_CALLBACK(on_rmb_remove),widgets,
+ NULL);
+
+ g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets);
+ g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_add_clicked),widgets);
+ g_signal_connect(G_OBJECT(widgets->MoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets);
+ g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets);
+ g_signal_connect(G_OBJECT(widgets->ReposTree),"cursor-changed",G_CALLBACK(on_main_tree_selection_changed),widgets);
+ g_signal_connect(G_OBJECT(widgets->CloudButton),"clicked",G_CALLBACK(on_ubl_settings_update_launch),widgets);
+ g_signal_connect(G_OBJECT(widgets->RepoFileTree),"cursor-changed",G_CALLBACK(on_package_selection_changed),widgets);
+ g_signal_connect(G_OBJECT(widgets->ReposTree),"row-activated",G_CALLBACK(on_tree_view_activate),widgets);
+ g_signal_connect(G_OBJECT(widgets->RepoFileTree),"row-activated",G_CALLBACK(on_repo_item_activate),widgets);
+ g_signal_connect(G_OBJECT(widgets->UpdateButton),"clicked",G_CALLBACK(on_update_clicked),widgets);
+ yon_calendar_set_date_orientation(1);
+ gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL);
+
+ gtk_tree_view_set_search_entry(GTK_TREE_VIEW(widgets->RepoFileTree),GTK_ENTRY(widgets->SearchEntry));
+
+ /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */
+ /* Localisation | Локализация */
+ gtk_widget_show(widgets->Window);
+ return widgets;
+ }
+}
+
+int main(int argc, char *argv[]){
+ local=setlocale(LC_ALL, "");
+ textdomain (LocaleName);
+ config_init();
+
+ yon_ubl_connect_config((_template_config*)&main_config);
+ yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK);
+ config_str unfound = NULL;
+ int size=0;
+ yon_ubl_setup_arguments(argc,argv,&unfound,&size,NULL);
+ gtk_init(&argc,&argv);
+ template_main_window *widgets = yon_ubl_window_setup();
+ gtk_widget_hide(gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(widgets->SaveMenuItem))));
+ gtk_widget_hide(gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(widgets->LoadGlobalMenuItem))));
+ widgets = (template_main_window*)yon_main_window_complete((main_window*)widgets);
+ char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL);
+ yon_window_config_load(path);
+ yon_config_load_update((main_window*)widgets);
+ yon_ubl_status_box_render(DATA_LOADED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
gtk_main();
+ return 0;
}
\ No newline at end of file
diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h
index 70d39a9..bf5b62e 100644
--- a/source/ubl-settings-repomanager.h
+++ b/source/ubl-settings-repomanager.h
@@ -1,6 +1,5 @@
#include
#include
-#include "ubl-utils.h"
#include
#include
#include
@@ -10,7 +9,9 @@
#include
#include
#include
-#include "../compile/ubl-cmake.h"
+#include
+#include
+#include
#ifdef WEBKIT_FOUND
#include
#endif
@@ -21,171 +22,259 @@
#define _(String) gettext(String)
#define glade_path "/com/ublinux/ui/ubl-settings-repomanager.glade"
-#define glade_repo_path "/com/ublinux/ui/ubl-settings-repomanager-windows.glade"
-#define glade_sign_path "/com/ublinux/ui/ubl-settings-repomanager-sign.glade"
+#define glade_path_repo_add "/com/ublinux/ui/ubl-settings-repomanager-add.glade"
+#define glade_path_storage_config "/com/ublinux/ui/ubl-settings-repomanager-configuration.glade"
+#define glade_path_repo_block "/com/ublinux/ui/ubl-settings-repomanager-repo-block.glade"
+#define glade_path_filechooser "/com/ublinux/ui/ubl-settings-repomanager-filechooser.glade"
+#define glade_path_key "/com/ublinux/ui/ubl-settings-repomanager-key.glade"
+#define glade_path_sign "/com/ublinux/ui/ubl-settings-repomanager-sign.glade"
#define banner_path "/com/ublinux/images/ubl-settings-repomanager-banner.png"
#define CssPath "/com/ublinux/css/ubl-settings-repomanager.css"
#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL)
#define icon_path "com.ublinux.ubl-settings-repomanager"
-#define folder_no_edits "com.ublinux.ubl-settings-repomanager.folder-symbolic"
-#define folder_deleted "com.ublinux.ubl-settings-repomanager.folder-red-symbolic"
-#define folder_added "com.ublinux.ubl-settings-repomanager.folder-green-symbolic"
-#define document_no_edits "com.ublinux.ubl-settings-repomanager.document-symbolic"
-#define document_deleted "com.ublinux.ubl-settings-repomanager.document-red-symbolic"
-#define document_added "com.ublinux.ubl-settings-repomanager.document-green-symbolic"
+#define folder_no_edits "com.ublinux.libublsettingsui-gtk3.folder-symbolic"
+#define document_no_edits "com.ublinux.libublsettingsui-gtk3.key-symbolic"
+#define document_deleted "com.ublinux.ubl-settings-repomanager.key-red-symbolic"
+#define document_added "com.ublinux.ubl-settings-repomanager.key-green-symbolic"
+
+#define move_icon "com.ublinux.libublsettingsui-gtk3.arrows-left-right-symbolic"
+#define remove_icon "com.ublinux.libublsettingsui-gtk3.trash-symbolic"
#define LocalePath "/usr/share/locale"
#define LocaleName "ubl-settings-repomanager"
+
+#define lib_key_icon_name "com.ublinux.libublsettingsui-gtk3.key-symbolic"
+#define key_icon_name "com.ublinux.ubl-settings-repomanager.document-sign-symbolic"
+#define key_error_icon_name "com.ublinux.ubl-settings-repomanager.document-sign-error-symbolic"
+
+#define package_signature_icon_name "com.ublinux.ubl-settings-repomanager.chain-symbolic"
+#define package_signature_error_icon_name "com.ublinux.ubl-settings-repomanager.chain-error-symbolic"
+
+#define warning_icon_name "com.ublinux.ubl-settings-repomanager.warning-symbolic"
+
+#define package_linked_icon "com.ublinux.ubl-settings-repomanager.package-linked-symbolic"
+#define package_unlinked_icon "com.ublinux.ubl-settings-repomanager.package-unlinked-symbolic"
+
+#define key_encription_path "/usr/share/ubl-settings-repomanager/csv/crypt-key.csv"
typedef char* string;
-#define get_package_info_command(filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL)
-#define get_saved_package_info_command(path,filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file $(find \"",path,"\" -name \"*",filename,"*\" -not -name *.sig |head -n 1)|sed -e 's/ */ /g' -e 's/ : /:/g' -e 's/\\n/ /g'",NULL)
+#define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL)
+
+#define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL)
+#define add_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL)
+#define add_packages_sign_command(path,arch,name,repo_sign,pack_sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",repo_sign,"' -s '",pack_sign,"' ",packages_path,NULL)
+#define add_packages_package_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -s '",sign,"' ",packages_path,NULL)
+#define add_packages_repo_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",sign,"' ",packages_path,NULL)
+#define remove_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL)
+
+#define yon_move_packages_command(storage,arch, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -a '",arch,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,NULL)
+#define yon_delete_packages_command(storage,arch, target_repo, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' ", packages,NULL)
+#define yon_delete_packages_sign_command(storage,arch, target_repo,sign, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' -S '",sign,"' ", packages,NULL)
+
+#define ubl_settings_update_command "ubl-settings-update"
+
+#define yon_get_packages_command(path,repo,arch) yon_char_unite("repo-manager show --quiet -d ",path," -a ",arch," -r ",repo," | sed -E 's/(\\S+)(\\s+)(\\S+)/\\1 \\3/g'",NULL)
+
+#define yon_repo_get_signature(path, repo) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," . 2>&1 | cut -d: -f2 |sed -E 's/ *//g'",NULL)
+#define yon_repo_get_signature_status(path,repo,arch, package) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," ",package,NULL)
+#define yon_repo_get_signature_status_arch(path,repo,arch) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," .",NULL)
+#define yon_repo_get_signature_status_packages(path,repo,arch) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo,NULL)
+
+#define yon_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL)
+
+#define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL)
#define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL)
+#define yon_sign_package(storage,repo,arch,target,sign) yon_char_unite("repo-manager add -r '",repo,"' -a '",arch,"' -d '", storage,"' -s '",sign,"' ",target,NULL)
+#define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage,"' --sign-repo='",sign,"'",NULL)
+
+#define get_package_info_command(filename) yon_char_unite("pacman -Q --info --file ",filename," 2>/dev/null|sed -e 's/ */ /g' -e 's/ : /: /g' -e 's/\\n/ /g' -e 's/^ /\\t/g'",NULL)
+
+#define get_storage_info_label(path, repos, archs) yon_char_unite(STORAGE_PATH_LABEL,": ", path,"\n\n", REPOS_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,NULL)
+
+#define get_repo_info_label(repos, archs,sign) yon_char_unite(REPO_NAME_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,"\n\n",sign,NULL)
+
+#define get_arch_info_label(repos, archs) yon_char_unite(REPO_NAME_LABEL,": ",repos,"\n\n",ARCHS_LABEL,": ",archs,NULL)
+
+#define yon_generate_key_command(type,name,email,strength,comment,expire,password) yon_char_unite("gpg --batch --gen-key <data = NULL;
- dict->key = NULL;
- dict->next = NULL;
- dict->prev = NULL;
- dict->first = dict;
- dict->data_type = DICTIONARY_OTHER_TYPE;
- return dict;
-}
-
-/**yon_dictionary_copy(dictionary *dict)
- * [EN]
- *
- * [RU]
- * Создаёт и возвращает копию элемента словаря [dict]
-*/
-dictionary *yon_dictinoary_copy(dictionary *dict){
- dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data);
- dct->data_type= dict->data_type;
- return dct;
-}
-
-/**yon_dictionary_copy_deep(dictionary *dict)
- * [EN]
- *
- * [RU]
- * Создаёт полную копию словаря [dict] и возвращает первый элемент
-*/
-dictionary *yon_dictionary_copy_deep(dictionary *dict){
- dictionary *dct = NULL;
- dictionary *newone=NULL;
- for_dictionaries(dct,dict){
- yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data);
- newone->data_type=dct->data_type;
- }
- return newone->first;
-}
-
-/**int yon_dictionary_set_data(dictionary *dict, void *data)
- * [EN]
- *
- * [RU]
- * Установить элементу словаря [dict] значение [data]
-*/
-int yon_dictionary_set_data(dictionary *dict, void *data){
- dict->data=data;
-}
-
-/**int yon_dictionary_set_key(dictionary *dict, char *key)
- * [EN]
- *
- * [RU]
- * Изменяет ключ элемента словаря [dict] на [key]
-*/
-int yon_dictionary_set_key(dictionary *dict, char *key){
- dict->key=key;
- return 1;
-}
-
-/** int yon_dictionary_set(dictionary *dict, char *key, void *data)
- * [EN]
- *
- * [RU]
-* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data]
-*/
-int yon_dictionary_set(dictionary *dict, char *key, void *data){
- dict->key=key;
- dict->data=data;
- return 1;
-}
-
-/**int yon_dictionary_empty(dictionary *dict)
- * [EN]
- *
- * [RU]
- * Очищает элемент словаря [dict] от данных
-*/
-int yon_dictionary_empty(dictionary *dict){
- dict->data=NULL;
- dict->data_type=DICTIONARY_OTHER_TYPE;
- return 1;
-}
-
-/**yon_dictionary_switch_to_last(dictionary **dict)
- * [EN]
- *
- * [RU]
- * Переключает словарь [dict] на последний элемент.
-*/
-void yon_dictionary_switch_to_last(dictionary **dict)
-{
- dictionary *dct=NULL, *dact=*dict;
- for_dictionaries(dct,dact);
-}
-
-/**yon_dictionary_create_conneced(dictionary *targetdict)
- * [EN]
- *
- * [RU]
- * Создаёт новый элемент словаря [targetdict]
-*/
-dictionary *yon_dictionary_append(dictionary *targetdict)
-{
- targetdict = yon_dictionary_get_last(targetdict);
- targetdict->next = yon_dictionary_new();
- targetdict->next->prev = targetdict;
- targetdict->next->first = targetdict->first;
- targetdict->next->data_type = DICTIONARY_OTHER_TYPE;
- return targetdict->next;
-}
-
-/**yon_dictionary_get_last(dictionary *dict)
- * [EN]
- *
- * [RU]
- * Возвращает последний элемент словаря [dict].
- * В отличае от yon_dictionary_switch_to_last()
- * словарь [dict] остаётся на прежнем элементе.
-*/
-dictionary *yon_dictionary_get_last(dictionary *dict)
-{
- if (dict->next){
- dictionary *dct = NULL;
- for_dictionaries(dct,dict);
- return dct;
- } else return dict;
-}
-
-/**yon_dictionary_switch_places(dictionary *dict, int aim)
- * [EN]
- *
- * [RU]
- * Меняет элемент словаря [dict] местами с другим элементом.
- * если [aim]<0 элемент меняется местами с левым элементом;
- * если [aim]>0 элемент меняется местами с правым элементом;
-*/
-dictionary *yon_dictionary_swap(dictionary *dict, int aim)
-{
- if (aim < 0)
- {
- if (dict->prev)
- {
- if (dict->prev->prev)
- {
- dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev;
- if (next)
- {
- preprev->next = dict;
- dict->prev = preprev;
- dict->next = prev;
- prev->prev = dict;
- prev->next = next;
- next->prev = prev;
- }
- else
- {
- preprev->next = dict;
- dict->prev = preprev;
- dict->next = prev;
- prev->prev = dict;
- prev->next = NULL;
- }
- return prev;
- }
- else
- {
- dictionary *next = dict->next, *prev = dict->prev;
- if (next)
- {
- yon_dictionary_make_first(dict);
- dict->prev = NULL;
- dict->next = prev;
- prev->prev = dict;
- prev->next = next;
- next->prev = prev;
- }
- else
- {
- dict->prev = NULL;
- dict->next = prev;
- prev->prev = dict;
- prev->next = NULL;
- }
- return prev;
- }
- }
- }
- else if (aim > 0)
- {
- if (dict->next)
- {
- if (dict->next->next)
- {
- dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next;
- if (prev)
- {
- prev->next = next;
- next->prev = prev;
- next->next = dict;
- dict->prev = next;
- dict->next = afnext;
- afnext->prev = dict;
- }
- else
- {
- yon_dictionary_make_first(next);
- next->prev = NULL;
- next->next = dict;
- dict->prev = next;
- dict->next = afnext;
- afnext->prev = dict;
- }
- return next;
- }
- else
- {
- dictionary *next = dict->next, *prev = dict->prev;
- if (prev)
- {
- prev->next = next;
- next->prev = prev;
- next->next = dict;
- dict->prev = next;
- dict->next = NULL;
- }
- else
- {
- next->prev = NULL;
- next->next = dict;
- dict->prev = next;
- dict->next = NULL;
- }
- }
- }
- }
-}
-
-/**yon_dictionary_make_first(dictionary *dict)
- * [EN]
- *
- * [RU]
- * Устанавливает указатель первого элемента словаря [dict]
- * на текущий элемент. Не использовать.
-*/
-void yon_dictionary_make_first(dictionary *dict)
-{
- for (dictionary *dct = dict->first; dct != NULL; dct = dct->next)
- {
- dct->first = dict;
- }
-}
-
-/**yon_dictionary_make_nth(dictionary *dict, int nth)
- * [EN]
- *
- * [RU]
- * Перемещает элемент словаря [dict] на позицию [nth].
-*/
-void yon_dictionary_make_nth(dictionary *dict, int nth)
-{
- dictionary *dct = dict->first;
- for (int i = 0; i < nth; i++)
- {
- if (dct == NULL)
- return;
- else
- dct = dct->next;
- }
- yon_dictionary_rip(dict);
- dictionary *prev = dct->prev;
- prev->next = dict;
- dict->prev = prev;
- dict->next = dct;
- dct->prev = dict;
-}
-
-/**yon_dictionary_create_with_data(char *key, void *data)
- * [EN]
- *
- * [RU]
- * Создаёт новый словарь с ключом [key] и указателем на данные [data]
-*/
-dictionary *yon_dictionary_new_with_data(char *key, void *data)
-{
- dictionary *dct = yon_dictionary_new();
- dct->key = yon_char_new(key);
- dct->data = data;
- dct->data_type = DICTIONARY_OTHER_TYPE;
- return dct;
-}
-
-/** void *yon_dictionary_free_all(dictionary *dictionary,void *data_manipulation)
- * [EN]
- * Frees whole [dictionary] and activates [data_manipulation] function if not NULL with [dictionary]->data argument for each dictionary.
- * [RU]
- * Освобождает память для всех элементов словаря [dictionary] и активирует функцию [data_manipulation], если она была передана, с аргументом [dictionary]->data на каждый элемент словаря.
-*/
-void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){
- dictionary *dict=NULL;
- for_dictionaries(dict,dictionary_to_free){
- if(data_manipulation)
- data_manipulation(dict->data);
- if(dict->prev)
- free(dict->prev);
- }
- free(dict);
- return NULL;
-}
-
-/**yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data)
- * [EN]
- *
- * [RU]
- * Создаёт новый элемент словаря, присоединяемый в конец словаря [dict]
- * с ключом [key] и указателем на данные [data]
-*/
-dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data)
-{
- dictionary *dct = yon_dictionary_append(dict);
- dct->key = yon_char_new(key);
- dct->data = data;
- dct->data_type = DICTIONARY_OTHER_TYPE;
- return dct;
-}
-
-/**yon_dictionary_connect(dictionary *old, dictionary *toconnect)
- * [EN]
- *
- * [RU]
- * Присоединяет словарь [toconnect] в конец словаря [old].
-*/
-dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect)
-{
- dictionary *dict = yon_dictionary_get_last(old);
- dict->next = toconnect;
- toconnect->prev = dict;
- toconnect->first = dict->first;
- return toconnect;
-}
-
-/**yon_dictionary_get(dictionary **dict, char *key)
- * [EN]
- *
- * [RU]
- * Возвращает элемент словаря [dict] с ключом [key].
- * Если такого элемента не было обнаружено, возвращается NULL
-*/
-dictionary *yon_dictionary_get(dictionary **dict, char *key)
-{
- dictionary *dct = *dict;
- for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next)
- {
- if (strcmp(pointer->key, key) == 0)
- {
- *dict = pointer;
- return pointer;
- }
- }
- return NULL;
-}
-
-/**yon_dictionary_rip(dictionary *dict)
- * [EN]
- *
- * [RU]
- * Вырезает элемент из словаря и возвращает вырезанный элемент.
-*/
-dictionary *yon_dictionary_rip(dictionary *dict)
-{
- if (!dict->next&&!dict->prev) return NULL;
- else if (!dict->next)
- {
- dictionary *prev = dict->prev;
- if (prev)
- {
- prev->next = NULL;
- return prev;
- }
- else
- return dict;
- }
- else if (!dict->prev)
- {
- dictionary *next = dict->next;
- if (next)
- {
- yon_dictionary_make_first(next);
- next->prev = NULL;
- return next;
- }
- else
- return dict;
- }
- else
- {
- dictionary *next = dict->next, *prev = dict->prev;
- next->prev = prev;
- prev->next = next;
- return next;
- }
-}
-
-/**yon_dictionary_get_nth(dictionary *dict, int place)
- * [EN]
- *
- * [RU]
- * Возвращает [place]-й элемент словаря [dict]
-*/
-dictionary *yon_dictionary_get_nth(dictionary *dict, int place)
-{
- if (dict){
- dict = dict->first;
- int i = 0;
- for (i = 0; i < place; i++)
- if (dict->next)
- dict = dict->next;
- else
- break;
- if (i == place)
- return dict;
- else
- return NULL;
- } else return NULL;
-}
-
-// char functions
-
-int yon_char_find_last(char *source, char find){
- int size = strlen(source);
- int i=size;
- for (;source[i]!=find&&i>0;i--);
- return i;
-}
-
-/**[EN]
- *
- * creates new char string by combining two char strings.
- */
-char *yon_char_append(char *source, char *append)
-{
- if (source && append)
- {
- int size = strlen(source) + strlen(append) + 1;
- char *final = malloc(size);
- memset(final, 0, size);
- if (strstr(source, "%%"))
- sprintf(final, source, append);
- else
- sprintf(final, "%s%s", source, append);
- return final;
- }
- else
- return NULL;
-}
-
-/**[EN]
- *
- * creates new char string by copying another char.
- */
-char *yon_char_new(char *chr)
-{
- if (chr){
- char *newchar = malloc(strlen(chr) + 1);
- memset(newchar, 0, strlen(chr) + 1);
- memcpy(newchar, chr, strlen(chr));
- return newchar;
- } else
- return NULL;
-}
-
-/**yon_char_unite(char *source, ...)
- * [En]
- *
- * [RU]
- * Объединяет строку [source] со всеми строками, написанными в [...]
-*/
-char *yon_char_unite(char *source, ...){
- va_list arglist;
- char *new_char=NULL;
- char *unite_char=NULL;
- new_char=yon_char_new(source);
- va_start(arglist,source);
- unite_char = va_arg(arglist,char*);
- while(unite_char){
- new_char = yon_char_append(new_char,unite_char);
- unite_char = va_arg(arglist,char*);
- }
- va_end(arglist);
- return new_char;
-}
-
-/**yon_cut(char *source, int size, int startpos)
- * [EN]
- * cuts source string by size length from startpos position.
- */
-char *yon_cut(char *source, int size, int startpos)
-{
- char *cut = NULL;
- cut = malloc(size + 1);
- memset(cut, 0, size + 1);
- memcpy(cut, source + startpos, size);
- return cut;
-}
-
-/**yon_char_divide(char *source, int dividepos)
- * [EN]
- * divides source string in dividepos position,
- * returning left part of divided string and
- * inserting right part to source string.
- */
-char *yon_char_divide(char *source, int dividepos)
-{
- char *cut = malloc(dividepos + 1);
- memset(cut, 0, dividepos + 1);
- memcpy(cut, source, dividepos);
- char *left = malloc(strlen(source) - strlen(cut));
- memset(left, 0, strlen(source) - strlen(cut));
- memcpy(left, source + dividepos + 1, (strlen(source) - dividepos));
- memset(source, 0, strlen(source));
- memcpy(source, left, strlen(left));
- return cut;
-}
-
-/**yon_char_find_count(char *source, char *find)
- * [EN]
- *
- * [RU]
- * Считает количество символов [find] в строке [source]
-*/
-int yon_char_find_count(char *source, char *find){
- char *working_string=yon_char_new(source);
- int i=0;
- int size=0;
- int pos=0;
- config_str rtn = yon_char_parse(working_string,&size,"\n");
- for (int j=0;j= 10; i++)
- {
- convert_check = convert_check / 10;
- }
- char *ch = g_malloc0(i * sizeof(char) + 1);
- sprintf(ch, "%d", int_to_convert);
- return ch;
-}
-
-/**yon_char_replace(char *source, char *find, char*replace)
- * [EN]
- *
- * [RU]
- * Заменяет в строке [source] все вхождения строки [find] на [replace]
-*/
-char *yon_char_replace(char *source, char *find, char*replace){
- if (!strstr(replace,find)){
-
-
- char *final=NULL;
- char *temp=NULL;
- if(!strstr(replace,find)){
- while ((final=strstr(source,find))){
- temp=malloc(strlen(source)-strlen(final));
- memset(temp,0,strlen(source)-strlen(final)+strlen(replace));
- memcpy(temp,source,strlen(source)-strlen(final));
- temp=yon_char_append(temp,replace);
- source=yon_char_append(temp,final+1);
- }
-
- }
- }
- return source;
-}
-
-/**yon_char_parse(char *parameters, int *size, char *divider)
- * [EN]
- * Parses string [parameters], divided by [divider],
- * then returns parsed string array and sets [size] to
- * size of returned array
-*/
-char **yon_char_parse(char *parameters, int *size, char *divider){
- char **string=NULL;
- int i=1;
- string=malloc(sizeof(char*));
- char *paramline=yon_char_new(parameters);
- char *param;
- if (!strstr(parameters,divider)) return NULL;
- while ((param=yon_char_divide_search(paramline,divider,1))){
- if (strcmp(param,paramline)==0||param[0]=='\0') break;
- string=realloc(string,sizeof(char*)*i);
- string[i-1]=yon_char_new(param);
- i++;
- }
- string=realloc(string,sizeof(char*)*i);
- string[i-1]=yon_char_new(paramline);
- i++;
- *size=i-1;
- return string;
-}
-
-/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete)
- * [EN]
- *
- * [RU]
- * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size]
- * Возвращает получившийся массив, в [size] загружается размер нового массива.
-*/
-char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete){
- char **new_char_parsed=NULL;
- new_char_parsed=malloc(sizeof(char*)*((*size)-1));
- int flag = 0;
- for (int i=0;i < (*size);i++){
- if (i==item_to_delete) {
- flag = 1;
- }
- if (flag == 0) {
- new_char_parsed[i]=yon_char_new(char_string[i]);
- }
- else if (flag == 1 && i!=item_to_delete) {
- new_char_parsed[i-1]=yon_char_new(char_string[i]);
- }
- }
- (*size)=(*size)-1;
- return new_char_parsed;
-}
-
-/**yon_char_parsed_check_exist(char **parameters, int size, char *param)
- * [EN]
- * Checks if [parameters] string array of length [size]
- * has [param] element;
- * [RU]
- * Проверяет есть ли в массиве строк [parameters], размера [size]
- * элемент [param]
-*/
-int yon_char_parsed_check_exist(char **parameters, int size, char *param){
-
- for (int i=0;id_name);
- file = fopen(path, "r");
- if (strlen(de->d_name) > 9)
- {
- char *extension = strstr(path, ".");
- if (extension != NULL)
- {
- if (strcmp(extension, ".desktop") == 0)
- {
- apps tempapp;
- GKeyFile *gfile = g_key_file_new();
- GError *err = NULL;
- g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL);
- char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err);
- if (err)
- {
- printf("%s\n", err->message);
- }
- if (strcmp(Type, "Application") == 0)
- tempapp.Type = 1;
- else if (strcmp(Type, "pyApplication") == 0)
- tempapp.Type = 2;
- else
- continue;
- tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL);
- if (tempapp.Name == NULL)
- continue;
- tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL);
- if (tempapp.Categories == NULL)
- continue;
- tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL);
- if (tempapp.Exec == NULL)
- continue;
- tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL);
- if (tempapp.Icon == NULL)
- continue;
- tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL);
- if (!tempapp.Pluggable)
- tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL);
- if (tempapp.Pluggable)
- tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL);
- if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0)
- if (size == 0)
- {
- applist = (apps *)malloc(size + 1 * sizeof(apps));
- applist[0].Name = yon_char_new(tempapp.Name);
- applist[0].Categories = yon_char_new(tempapp.Categories);
- applist[0].Exec = yon_char_new(tempapp.Exec);
- applist[0].Icon = yon_char_new(tempapp.Icon);
- applist[0].Type = tempapp.Type;
- applist[0].Pluggable = tempapp.Pluggable;
- applist[0].DualPluggable = tempapp.DualPluggable;
- size++;
- }
- else
- {
- applist = (apps *)realloc(applist, (size + 1) * sizeof(apps));
- applist[size].Name = yon_char_new(tempapp.Name);
- applist[size].Categories = yon_char_new(tempapp.Categories);
- applist[size].Exec = yon_char_new(tempapp.Exec);
- applist[size].Icon = yon_char_new(tempapp.Icon);
- applist[size].Pluggable = tempapp.Pluggable;
- applist[size].DualPluggable = tempapp.DualPluggable;
- applist[size].Type = tempapp.Type;
- size++;
- }
- }
- }
- }
- }
- }
- *sizef = size;
- return applist;
-};
-
-void yon_apps_sort(apps *applist, int size)
-{
- apps tmp;
- if (size > 2)
- {
- for (int i = 1; i < size; i++)
- {
- for (int j = 1; j < size; j++)
- {
- if (strcmp(applist[j].Name, applist[j - 1].Name) < 0)
- {
- tmp = applist[j];
- applist[j] = applist[j - 1];
- applist[j - 1] = tmp;
- };
- }
- };
- }
-};
-
-apps *yon_apps_get_by_name(apps *applist, char *name, int size)
-{
- for (int i = 0; i < size; i++)
- {
- if (strcmp(applist[i].Name, name) == 0)
- return &applist[i];
- }
- return NULL;
-};
-
-//config functions
-
-/**yon_config_load_register(char *command)
- * [EN]
- *
- * [RU]
- * Выполняет команду [command].
- * Полученные данные парсятся и регистрируются в конфиг.
-*/
-int yon_config_load_register(char *command){
- if (__yon__config__strings){
- __yon__config__strings = yon_dictionary_free_all(__yon__config__strings,NULL);
- }
- FILE *output = popen(command, "r");
- char **output_strings = NULL;
- output_strings = malloc(sizeof(char));
- int i = 0;
- char str[4096];
- memset(str, 0, 4096);
- while (fgets(str, 4096, output))
- {
- if (strcmp(str, "") != 0&& strcmp(str,"(null)\n")!=0)
- {
- char *key = yon_char_divide_search(str,"=",-1);
- yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,str);
- __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE;
- }
- }
- check_config
- return 0;
- else return 1;
-}
-
-/**yon_config_remove_by_key(char *key)
- * [EN]
- *
- * [RU]
- * Удаляет параметр конфига по ключу [key]
-*/
-int yon_config_remove_by_key(char *key){
- check_config{
- dictionary *dict = yon_dictionary_get(&__yon__config__strings,key);
- if (dict){
- yon_dictionary_rip(dict);
- return 1;
- }else return 0;
- }
- return 0;
-}
-
-/**yon_config_remove_by_data(void *data)
- * [EN]
- *
- * [RU]
- * Производит поиск по конфигу на наличие параметра со значением [data] и удаляет найденное значение из конфига.
-*/
-int yon_config_remove_by_data(void *data){
- check_config{
- dictionary *dict = NULL;
- for_dictionaries(dict,__yon__config__strings){
- if (dict->data==data){
- yon_dictionary_rip(dict);
- return 1;
- }
- }
- return 0;
- }
- return 0;
-}
-
-/**yon_config_remove_element(char *key, char *deleted)
- * [EN]
- *
- * [RU]
- * Удаляет элемент [deleted] из массива параметров с ключом [key]
-*/
-int yon_config_remove_element(char *key, char *deleted){
- check_config{
- dictionary *dict = yon_dictionary_get(&__yon__config__strings,key);
- char *data = (char*)dict->data;
- char *found = strstr(data,deleted);
- int size=strlen(data)-strlen(found)+1;
- char *new_data = malloc(size);
- memset(new_data,0,size);
- if (strlen(found)!=strlen(deleted)){
- memcpy(new_data,data,size-1);
- new_data = yon_char_append(new_data,found+strlen(deleted)+1);
- } else {
- memcpy(new_data,data,size-2);
- new_data = yon_char_append(new_data,found+strlen(deleted));
- }
- dict->data=(void*)(new_data);
- free(data);
- dict->flag1=1;
- return 1;
- } else return 0;
-}
-
-/**yon_config_get_by_key(char *key)
- * [EN]
- *
- * [RU]
- * Возвращает значение параметра конфига с ключом [key]
-*/
-void *yon_config_get_by_key(char *key){
- check_config{
- dictionary *dict = NULL;
- for_dictionaries(dict, __yon__config__strings){
- if (strcmp(dict->key,key)==0){
- return dict->data;
- }
- }
- }
- return NULL;
-}
-
-/**yon_config_get_key_by_data(char *data)
- * [EN]
- *
- * [RU]
- * Возвращает ключ параметра конфига со значением [data].
- * Если параметр с таким значением не найден, возвращается NULL
-*/
-char *yon_config_get_key_by_data(char *data){
- check_config{
- dictionary *dict = NULL;
- for_dictionaries(dict, __yon__config__strings){
- if (strcmp(((char*)dict->data),data)==0){
- return dict->key;
- }
- }
- }
- return NULL;
-}
-
-/**yon_config_set(char *key, void *data)
- * [EN]
- *
- * [RU]
- * Производит поиск по конфигу и заменяет значение параметра с ключом [key] на новое значение [data];
-*/
-int yon_config_set(char *key, void *data){
- check_config{
- dictionary *dict = yon_dictionary_get(&__yon__config__strings,key);
- dict->data=data;
- return 1;
- } else return 0;
-}
-
-/**yon_config_clean()
- * [EN]
- * Erase all parameters from config;
- * [RU]
- * Удаляет все параметры из конфига;
-*/
-int yon_config_clean(){
- check_config{
- __yon__config__strings = yon_dictionary_free_all(__yon__config__strings, NULL);
- return 1;
- }
- else return 0;
-}
-
-/**yon_config_register(char *key, void *data)
- * [EN]
- *
- * [RU]
- * Регистрирует новый параметр конфига.
- * [key] - ключ параметра;
- * [data] - значение параметра;
-*/
-void yon_config_register(char *key, void *data){
- yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,data);
- __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE;
-}
-
-/**yon_config_load(char *command, int *str_len)
- * [EN]
- *
- * [RU]
- * Выполняет команду [command] и возвращает распаршеный результат выполнения команды.
- * В [str_len] возвращается длина возвращаемого массива
-*/
-config_str yon_config_load(char *command, int *str_len){
- FILE *output = popen(command, "r");
- char **output_strings = NULL;
- output_strings = malloc(sizeof(char));
- int i = 0;
- char str[4096];
- memset(str, 0, 4096);
- while (fgets(str, 4096, output))
- {
- if (strcmp(str, "") != 0)
- {
- output_strings = realloc(output_strings, sizeof(char *) * (i + 1));
- // printf("%s\n", str);
- output_strings[i] = NULL;
- output_strings[i] = yon_char_new(str);
- memset(str, 0, 4096);
- i++;
- }
- }
- if (i>0){
- *str_len = i;
- return output_strings;
- } else{
- *str_len=-1;
- return NULL;
- }
-}
-
-/**int yon_config_save(char *command)
- * [EN]
- * Saves config with [command]
- * [RU]
- * Выполняет команду [command], добавляя в конец все записи конфига в таком виде:
- * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]"
-*/
-int yon_config_save_registered(char *command){
- check_config{
- dictionary *dict = NULL;
- for_dictionaries(dict,__yon__config__strings){
- command = yon_char_unite(command, " ", yon_dictionary_get_data(dict,char*), NULL);
- }
- if (popen(command, "r")) return 1;
- else return 0;
- } else return 0;
-}
-
-/**yon_config_get_all(int *size)
- * [EN]
- *
- * [RU]
- * Возвращает массив со всеми параметрами конфига, оканчивающаяся NULL
- * [size] - указатель, в который выгружается длина массива
-*/
-config_str yon_config_get_all(int *size){
- check_config{
- *size = 1;
- config_str conf = NULL;
- dictionary *dict = NULL;
- for_dictionaries(dict,__yon__config__strings){
- conf = yon_remalloc(conf,sizeof(char*)*(*size));
- conf[(*size)-1] = yon_char_unite(dict->key,"=",(char*)dict->data,NULL);
- size++;
- }
- conf = yon_remalloc(conf,sizeof(char*)*(*size+1));
- conf[*size] = NULL;
- return conf;
- } else return NULL;
-}
-
-/**char *yon_config_get_parameter(config parameters, int size, char *param)
- * [EN]
- * Gets parameter [param] from parameter list [parameters] of size [size];
- * or NULL if nothing were found
- * [RU]
- * Возвращает параметр [param] из массива строк [parameters] размером [size]
- * или NULL если такой не был найден
-*/
-char *yon_config_get_parameter(config_str parameters, int size, char *param)
-{
- if (param[0]==' ')
- yon_char_divide_search(param," ",-1);
- param=yon_char_divide_search(yon_char_new(param)," ",-1);
-
- char *str = NULL;
- for (int j = 0; j < size; j++)
- {
- char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1);
- if (name)
- {
- if (strcmp(name, param) == 0)
- {
- str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1);
- if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0)
- return str;
- else
- return NULL;
- }
- }
- }
- return NULL;
-}
-
-
-
-// terminal-using functions
-
-/**yon_launch_app_with_arguments(char *name, char *args)
- * [EN]
- * Execute [command] in separate thread;
- * [RU]
- * Выполнить команду [command] в отдельном потоке;
-*/
-int yon_launch_app_with_arguments(char *name, char *args)
-{
- char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL);
- pthread_t thread_id;
- char *command = NULL;
- command = path;
- pthread_create(&thread_id, NULL, (void *)yon_launch, command);
-};
-
-/**yon_launch(char *command)
- * [EN]
- * Execute command [command]
- * [RU]
- * Выполнить команду [command]
-*/
-void yon_launch(char *command)
-{
- system(command);
-}
-
-// Gtk functions
-
-
-#ifdef __GTK_H__
-
-
-static render_data render;
-
-#ifdef VTE_TERMINAL
-
-static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data)
-{
- if (!terminal) return;
- if (pid == -1) printf("Error\n\n\n");
- else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data));
-}
-
-/**
- * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument)
- * [EN]
- * launches terminal with specific [command],
- * terminal is shown in [place_to_show] container,
- * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument.
- * [RU]
- * Запускает терминал с командой [command],
- * терминал добавляется в контейнер [place_to_show] виджета,
- * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument].
-*/
-void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument){
- char **commands=new_arr(char*,2);
- gchar **envp = g_get_environ();
- commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL"));
- commands[1]=NULL;
- char **env=new_arr(char*,2);
- env[0]="";
- env[1]=NULL;
- GtkWidget *terminal = vte_terminal_new();
- vte_terminal_set_size(VTE_TERMINAL(terminal),10,15);
- VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL);
- vte_terminal_set_pty(VTE_TERMINAL(terminal),pty);
- gtk_container_add(GTK_CONTAINER(place_to_show),terminal);
- char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL);
- printf("%s\n",install_command);
- if(endwork_function)
- g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument);
- vte_terminal_spawn_async(VTE_TERMINAL(terminal),
- VTE_PTY_DEFAULT,
- NULL,
- commands,
- NULL,
- 0,
- NULL, NULL,
- NULL,
- -1,
- NULL,
- child_ready,
- install_command);
- vte_pty_spawn_async(pty,
- NULL,
- commands,
- NULL,
- 0,
- NULL, NULL,
- NULL,
- -1,
- NULL,
- NULL,
- NULL);
- vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1);
- vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE);
- vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE);
- gtk_widget_show_all(terminal);
- }
-
-/**yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument)
- * [EN]
- * launches terminal with specific [command],
- * terminal is shown in [place_to_show] container,
- * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument.
- * [RU]
- * Запускает терминал с командой [command],
- * терминал добавляется в контейнер [place_to_show] виджета,
- * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument].
-*/
-void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){
- char **commands=new_arr(char*,2);
- gchar **envp = g_get_environ();
- commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL"));
- commands[1]=NULL;
- char **env=new_arr(char*,2);
- env[0]="";
- env[1]=NULL;
- vte_terminal_set_size(VTE_TERMINAL(terminal),10,15);
- VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL);
- vte_terminal_set_pty(VTE_TERMINAL(terminal),pty);
- char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL);
- if(endwork_function)
- g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument);
- vte_terminal_spawn_async(VTE_TERMINAL(terminal),
- VTE_PTY_DEFAULT,
- NULL,
- commands,
- NULL,
- 0,
- NULL, NULL,
- NULL,
- -1,
- NULL,
- child_ready,
- install_command);
- vte_pty_spawn_async(pty,
- NULL,
- commands,
- NULL,
- 0,
- NULL, NULL,
- NULL,
- -1,
- NULL,
- NULL,
- NULL);
- vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100);
- vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE);
- vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE);
- gtk_widget_show_all(terminal);
- }
-#endif
-
- // Window config functions
-
- #define check_window_config_setup if(__yon_window_config_target_window)
-
- typedef struct {
- char *parameter_name;
- enum YON_TYPE containing_type;
- GtkWidget *track_widget;
- char *property_name;
- } __yon_listener_parameter;
-
- typedef struct {
- char *parameter_name;
- char *section;
- enum YON_TYPE containing_type;
- void *property;
- } __yon_custom_parameter;
-
- struct {
- int x;
- int y;
- int width;
- int height;
- int fullscreen;
- dictionary *custom_listeners;
- dictionary *custom_parameters;
- dictionary *deleted_parameters;
- } __yon_main_window_config;
-
- static GtkWindow *__yon_window_config_target_window = NULL;
- static GKeyFile *__yon_window_config_file = NULL;
- static char *__yon_window_config_path = NULL;
-
- void yon_window_config_save(){
- g_key_file_set_integer(__yon_window_config_file,"window","WindowPosX",__yon_main_window_config.x);
- g_key_file_set_integer(__yon_window_config_file,"window","WindowPosY",__yon_main_window_config.y);
- g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width);
- g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height);
- g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen);
- dictionary *dict=NULL;
- if (__yon_main_window_config.custom_listeners)
- for_dictionaries(dict,__yon_main_window_config.custom_listeners){
- __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*);
- GValue *val = g_malloc0(sizeof(GValue));
- g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val);
- switch(param->containing_type){
- case YON_TYPE_STRING:
- g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val));
- break;
- case YON_TYPE_INT:
- g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val));
- break;
- case YON_TYPE_BOOLEAN:
- g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val));
- break;
- case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break;
- }
- }
- if (__yon_main_window_config.custom_parameters)
- for_dictionaries(dict,__yon_main_window_config.custom_parameters){
- __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*);
- switch (param->containing_type){
- case YON_TYPE_STRING:
- g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property);
- break;
- case YON_TYPE_INT:
- g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property);
- break;
- case YON_TYPE_BOOLEAN:
- g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property);
- break;
- default:
- break;
- }
- }
- if (__yon_main_window_config.deleted_parameters)
- for_dictionaries(dict,__yon_main_window_config.deleted_parameters){
- __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*);
- g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL);
- }
- g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL);
- }
-
- void yon_get_is_fullscreen(){
- gtk_window_is_maximized(__yon_window_config_target_window);
- __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window);
- if (!__yon_main_window_config.fullscreen) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y);
- }
-
- /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event)
- * [EN]
- *
- * [RU]
- * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается.
- */
- void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){
- check_window_config_setup{
- yon_get_is_fullscreen();
- yon_window_config_save();
- }
- gtk_main_quit();
- }
-
- void __yon_window_config_on_resize(){
- int max=0;
- max=gtk_window_is_maximized(__yon_window_config_target_window);
- if(max==0){
- gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height);
- gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y);
- }
- }
-
- /**yon_window_config_setup(GtkWindow *window)
- * [EN]
- *
- * [RU]
- * Устанавливает указатель на окно для отслеживания его положения и размера
- */
- void yon_window_config_setup(GtkWindow *window){
- __yon_window_config_target_window = window;
- g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL);
- g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL);
- }
-
- void _yon_maximize(void *data){
- g_usleep(G_USEC_PER_SEC/10);
- if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window);
- }
-
- /**yon_window_config_load(char *path)
- * [EN]
- *
- * [RU]
- * Загружает конфиг окна и инициализирует отслеживание его параметров
- */
- int yon_window_config_load(char *path){
- __yon_window_config_file = g_key_file_new();
- __yon_window_config_path=yon_char_new(path);
- if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){
- struct stat st;
- int size;
- char *path = yon_char_divide(yon_char_new(__yon_window_config_path),yon_char_find_last(__yon_window_config_path,'/'));
- if (stat(path, &st) == -1) {
- mkdir(path, 0777);
- }
- FILE *fp;
- fp=fopen(__yon_window_config_path,"w");
- fclose(fp);
- g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL);
- }
- __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL);
- __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL);
- __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL);
- __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL);
- __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL);
- dictionary *dict=NULL;
- if (__yon_main_window_config.custom_listeners)
- for_dictionaries(dict,__yon_main_window_config.custom_listeners){
- __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*);
- GValue *val = g_malloc0(sizeof(GValue));
- g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val);
- switch(param->containing_type){
- case YON_TYPE_STRING:
- g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL));
- break;
- case YON_TYPE_INT:
- g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL));
- break;
- case YON_TYPE_BOOLEAN:
- gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL);
- g_value_set_boolean(val,res);
- break;
- default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break;
- }
- g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val);
- }
- if (__yon_main_window_config.width==0) __yon_main_window_config.width=800;
- if (__yon_main_window_config.height==0) __yon_main_window_config.height=600;
- gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height);
- gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y);
- pthread_t tid;
- pthread_create(&tid,NULL,(void *)_yon_maximize,NULL);
- return 1;
- }
-
- void yon_window_config_apply(){
- dictionary *dict=NULL;
- gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y);
- gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height);
- }
-
- config_str yon_window_config_get_section(char *section, gsize *size){
- config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL);
- return key;
- }
-
- /**yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type)
- * [EN]
- *
- * [RU]
- * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name].
- */
- void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){
- __yon_listener_parameter *param = NULL;
- param = yon_remalloc(param,sizeof(__yon_listener_parameter));
- param->parameter_name = yon_char_new(param_name);
- param->track_widget = widget;
- param->property_name = yon_char_new(widget_property);
- param->containing_type = val_type;
- yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param);
- }
-
- void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){
- __yon_custom_parameter *param = NULL;
- param = yon_remalloc(param,sizeof(__yon_custom_parameter));
- param->parameter_name = yon_char_new(param_name);
- param->section=section;
- param->property = tracked_value;
- param->containing_type = val_type;
- yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param);
- }
-
- void yon_window_config_erase_custom_parameter(char *param_name, char *section){
- __yon_custom_parameter *param = NULL;
- param = yon_remalloc(param,sizeof(__yon_custom_parameter));
- param->parameter_name=param_name;
- param->section=section;
- yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param);
- }
-
- int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){
- GError *err=NULL;
- switch (type){
- case YON_TYPE_BOOLEAN:
- *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err);
- if (err) return 0; else return 1;
- break;
- case YON_TYPE_INT:
- *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err);
- if (err) return 0; else return 1;
- break;
- case YON_TYPE_STRING:
- *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err);
- if (err) return 0; else return 1;
- break;
- case YON_TYPE_STRING_LIST:
- gsize size=0;
- *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err);
- *((char***)return_value)=yon_remalloc(return_value,size+1);
- *((char***)return_value)[size]=NULL;
- if (err) return 0; else return 1;
- break;
- }
- }
-
-GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){
- GtkWidget *menu_item = gtk_menu_item_new();
- gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom");
- GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
- GtkWidget *label = gtk_label_new(buttonname);
- GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON);
- gtk_label_set_xalign(GTK_LABEL(label),0.0);
- gtk_box_pack_start(GTK_BOX(box),image,0,0,5);
- gtk_box_pack_start(GTK_BOX(box),label,0,0,5);
- gtk_container_add(GTK_CONTAINER(menu_item),box);
- gtk_widget_show_all(menu_item);
- return menu_item;
-}
-
-GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){
- GtkWidget *menu_item = gtk_menu_item_new();
- gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop");
- GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
- GtkWidget *label = gtk_label_new(buttonname);
- GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON);
- gtk_label_set_xalign(GTK_LABEL(label),0.0);
- gtk_box_pack_start(GTK_BOX(box),image,0,0,5);
- gtk_box_pack_start(GTK_BOX(box),label,0,0,5);
- gtk_container_add(GTK_CONTAINER(menu_item),box);
- gtk_widget_show_all(menu_item);
- return menu_item;
-}
-
-
-// other Gtk functions
-
-/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size)
- * [EN]
- *
- * [RU]
- * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size]
-*/
-int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){
- if (combo&¶meters){
- for (int i=0;imessage);
- g_error_free(err);
- }
- if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type)
- {
- gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError");
- gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK");
- gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
- }
- else if (type == BACKGROUND_IMAGE_FAIL_TYPE)
- {
- gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK");
- gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError");
- gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
- }
- if (text)
- gtk_label_set_text(GTK_LABEL(data.label), text);
-}
-
-void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){
- _yon_ubl_status_box_render(text,type);
-}
-
-/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id)
- * [EN]
- * Set up plugs for using with GtkSockets insine ubl-settings-manager.
- * [main_window] is container widget, which holds main application functionality.
- * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header.
- * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header.
- * [socket_main_id] is id of socket for [main_window].
- * [socket_left_id] is id of socket for [left_window].
- * [socket_right_id] is id of socket for [right_window].
- * [RU]
- * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager.
- * [main_window] - контейнер основного интерфейса приложения.
- * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager.
- * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager.
- * [socket_main_id] - id сокета для [main_window].
- * [socket_left_id] - id сокета для [left_window].
- * [socket_right_id] - id сокета для [right_window].
-*/
-void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){
- if (main_window&&socket_main_id>-1){
- gtk_widget_hide(gtk_widget_get_toplevel(main_window));
- GtkWidget *plug_main=gtk_plug_new(socket_main_id);
- GtkWidget *plug_left=NULL;
- GtkWidget *plug_right=NULL;
- GtkWidget *box=NULL;
- g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL);
- if (socket_left_id>-1&&left_window){
- plug_left=gtk_plug_new(socket_left_id);
- g_object_ref(left_window);
- gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window);
- gtk_container_add(GTK_CONTAINER(plug_left),left_window);
- gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar");
- gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button");
- gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited");
- gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color");
- gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder");
- gtk_widget_show(plug_left);
- }
- else if (left_window){
- if (box==NULL){
- box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
- gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5);
- gtk_box_reorder_child(GTK_BOX(main_window),box,0);
- gtk_widget_show(box);
- }
- gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited");
- gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window);
- gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5);
- }
- if (socket_right_id>-1&&right_window){
- plug_right=gtk_plug_new(socket_right_id);
- g_object_ref(right_window);
- gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window);
- gtk_container_add(GTK_CONTAINER(plug_right),right_window);
- gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar");
- gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button");
- gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited");
- gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color");
- gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder");
- gtk_widget_show(plug_right);
- }
- else if (right_window){
- if (box==NULL){
- box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
- gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5);
- gtk_box_reorder_child(GTK_BOX(main_window),box,0);
- gtk_widget_show(box);
- }
- gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited");
- gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window);
- gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5);
- }
- g_object_ref(main_window);
- gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window);
- gtk_container_add(GTK_CONTAINER(plug_main),main_window);
- gtk_widget_show(plug_main);
- }
-}
-
-#ifdef WEBKIT_FOUND
-
-/**yon_ubl_browser_window_open(char *link, char *browser_window_name)
- * [EN]
- * Launches integrated browser window, named [browser_window_name] at header with [link].
- * [RU]
- * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link]
-*/
-void yon_ubl_browser_window_open(char *link, char *browser_window_name){
- GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL);
- GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
- GtkWidget *header=gtk_header_bar_new();
- GtkWidget *header_label=gtk_label_new(browser_window_name);
- GtkWidget *WebView=webkit_web_view_new();
- gtk_container_add(GTK_CONTAINER(browser),web_place);
- gtk_window_set_titlebar(GTK_WINDOW(browser),header);
- gtk_window_set_title(GTK_WINDOW(browser),browser_window_name);
- gtk_widget_set_size_request(browser,800,600);
- gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label);
- gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1);
- webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link);
- gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0);
- gtk_widget_show_all(browser);
-}
-#else
-
-/**yon_ubl_browser_window_open(char *link, char *browser_window_name)
- * [EN]
- * Launches browser with [link].
- * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function.
- * [RU]
- * Открывает браузер со страницей по ссылке [link]
- * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции.
-*/
-void yon_ubl_browser_window_open(char *link, char *browser_window_name){
- char *user=getenv("SUDO_USER");
- if (!user)
- user=getlogin();
- char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL);
- yon_launch_app(command);
-}
-#endif
-
-#endif
\ No newline at end of file
diff --git a/source/ubl-utils.h b/source/ubl-utils.h
deleted file mode 100644
index 6ef2559..0000000
--- a/source/ubl-utils.h
+++ /dev/null
@@ -1,367 +0,0 @@
-#ifndef UBL_UTILS
-#define UBL_UTILS
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "../compile/ubl-cmake.h"
-#ifdef WEBKIT_FOUND
- #include
-#endif
-#define DesktopPath "/usr/share/applications/"
-
-#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next)
-
-#define new(type) malloc(sizeof(type))
-#define new_arr(type,size) malloc(sizeof(type)*size)
-
-#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL)
-
-typedef enum
-{
- #ifdef __GTK_H__
- DICTIONARY_GTK_WIDGETS_TYPE,
- #endif
- DICTIONARY_OTHER_TYPE=0,
- DICTIONARY_CHAR_TYPE,
- DICTIONARY_INT_TYPE,
- DICTIONARY_BOOL_TYPE,
-
-} DICT_TYPE;
-
-typedef struct dictionary
-{
- char *key;
- void *data;
- struct dictionary *next;
- struct dictionary *prev;
- struct dictionary *first;
- DICT_TYPE data_type;
- int flag1;
-} dictionary;
-
-typedef struct apps
-{
- char *Name;
- int Type;
- char *Categories;
- char *Exec;
- char *Icon;
- int Pluggable;
- int DualPluggable;
-} apps;
-
-typedef char** config_str;
-
-static dictionary *__yon__config__strings = NULL;
-#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE)
-
-#define config(key) yon_config_get_by_key(key)
-
-#define for_config dictionary temp = NULL; for_dictionary(temp,__yon__config__strings)
-
-#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size)
-// dictionary functions
-
-/**yon_dictionary_get_data(dictionary, type)
- * [EN]
- * Gets data from dictionary.
- * [dictionary] is dictionary, from which data should be extracted;
- * [type] is type of data, [dictionary] contains.
- * [RU]
- * Возвращает данные из словаря.
- * [dictionary] - словарь из которого достаются данные.
- * [type] - тип данных, хранящихся в словаре [dictionary].
-*/
-#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data)
-
-/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data)
- * [EN]
- *
- * [RU]
- * Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data].
- * Если словарь не существует, создаёт его
-*/
-#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \
- else dict=yon_dictionary_append_with_data(dict,key,data);}
-
-dictionary *yon_dictionary_new();
-
-dictionary *yon_dictionary_append(dictionary *targetdict);
-
-dictionary *yon_dictionary_get_last(dictionary *dict);
-
-dictionary *yon_dictionary_swap(dictionary *dict, int aim);
-
-void yon_dictionary_make_first(dictionary *dict);
-
-void yon_dictionary_make_nth(dictionary *dict, int nth);
-
-dictionary *yon_dictionary_new_with_data(char *key, void *data);
-
-dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data);
-
-dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect);
-
-dictionary *yon_dictionary_get(dictionary **dict, char *key);
-
-dictionary *yon_dictionary_rip(dictionary *dict);
-
-dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
-
-void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*));
-
-// char functions
-
-int yon_char_find_last(char *source, char find);
-
-char *yon_char_append(char *source, char *append);
-
-char *yon_char_new(char *chr);
-
-char *yon_char_unite(char *source, ...);
-
-char *yon_cut(char *source, int size, int startpos);
-
-char *yon_char_divide(char *source, int dividepos);
-
-char *yon_char_divide_search(char *source, char *dividepos, int delete_divider);
-
-char *yon_char_from_int(int int_to_convert);
-
-char *yon_char_replace(char *source, char *find, char*replace);
-
-char **yon_char_parse(char *parameters, int *size, char *divider);
-
-char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete);
-
-int yon_char_parsed_check_exist(char **parameters, int size, char *param);
-
-int yon_char_find_count(char *source, char *find);
-
-int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size);
-
-config_str yon_char_parsed_new (int *size, ...);
-
-void yon_char_parsed_copy(config_str *source, config_str *to_copy);
-
-config_str yon_char_parsed_append(config_str parsed, int *size, char *string);
-
-int yon_ubl_check_root();
-
-char *yon_ubl_root_user_get();
-
-char *yon_ubl_user_get_home_directory();
-
-// parsing functions
-
-config_str philos_list_user(int* size);
-
-apps *yon_apps_scan_and_parse_desktops(int *sizef);
-
-void yon_apps_sort(apps *applist, int size);
-
-apps *yon_apps_get_by_name(apps *applist, char *name, int size);
-
-config_str yon_config_load(char *command, int *str_len);
-
-int yon_config_save_registered(char *command);
-
-char *yon_config_get_parameter(config_str parameters, int size, char *param);
-
-int yon_config_load_register(char *command);
-
-int yon_config_remove_by_key(char *key);
-
-int yon_config_remove_by_data(void *data);
-
-int yon_config_remove_element(char *key, char *deleted);
-
-void *yon_config_get_by_key(char *key);
-
-char *yon_config_get_key_by_data(char *data);
-
-int yon_config_set(char *key, void *data);
-
-int yon_config_clean();
-
-void yon_config_register(char *key, void *data);
-
-config_str yon_config_get_all();
-
-// terminal-using functions
-
-int yon_launch_app_with_arguments(char *name, char *args);
-
-void yon_launch(char *command);
-
-// Gtk functions
-
-#ifdef __GTK_H__
-#ifdef VTE_TERMINAL
-void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument);
-
-void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument);
-
-#endif
-
-enum YON_TYPE{
- YON_TYPE_STRING,
- YON_TYPE_STRING_LIST,
- YON_TYPE_INT,
- YON_TYPE_BOOLEAN,
- YON_TYPE_OTHER
-};
-
-GtkWidget *yon_ubl_menu_item_about_new(char *buttonname);
-GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname);
-
-/**yon_gtk_builder_get_widget(builder, widget_name)
- * [EN]
- * Returns GtkWidget from GtkBuilder *[builder].
- * [builder] is GtkBuilder*;
- * [widget_name] is id of widget;
-*/
-#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name))
-
-typedef struct
-{
- GtkWidget *Icon;
- GtkWidget *Label;
- GtkWidget *IconView;
- GtkListStore *List;
-} expander_icon_view;
-
-void yon_window_config_setup(GtkWindow *window);
-
-int yon_window_config_load(char *path);
-
-config_str yon_window_config_get_section(char *section, gsize *size);
-
-void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type);
-
-void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type);
-
-void yon_window_config_erase_custom_parameter(char *param_name, char *section);
-
-int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type);
-
-int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size);
-
-int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find);
-
-int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment);
-
-int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
-
-int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
-
-
-
-typedef enum
-{
- BACKGROUND_IMAGE_SUCCESS_TYPE,
- BACKGROUND_IMAGE_FAIL_TYPE
-} BACKGROUND_IMAGE_TYPE;
-
-typedef struct {
- BACKGROUND_IMAGE_TYPE type;
- GtkWidget *icon;
- GtkWidget *box;
- GtkWidget *label;
- char* text_to_render;
-} render_data;
-
-
-/**yon_ubl_status_box_setup(render,icon,box,label)
- * [EN]
- * Sets up [render] structure of type render_data.
- * [icon] is GtkImage widget of status box for showing status icons;
- * [box] is GtkBox widget of status box for showing status color;
- * [label] is GtkLabel widget of status box for showing status text;
- * [RU]
- * Настраивает структуру [render] типа render_data.
- * [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки;
- * [box] - виджет типа GtkBox в котором будет отображаться цвет статуса;
- * [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения;
-*/
-int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label);
-
-/**yon_ubl_status_box_render(render,text,type)
- * [EN]
- * Renders message in status box;
- * [render] is render_data structure of status box;
- * [text] is text to be shown in status box;
- * [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE
- * [RU]
- * Отображает сообщение в статусном окне.
- * [render] - структура типа render_data для нужного статусного окна;
- * [text] - текст, отображаемый в статусном окне;
- * [type] - тип сообщения. Может быть:
- * BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак)
- * или
- * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка)
-*/
-void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type);
-
-#ifdef __cplusplus
-
-/**yon_ubl_header_setup(overlay, head, image, imag_path)
- * [EN]
- * Sets up header of app.
- * [overlay] is overlay for app header;
- * [head] is box of header, which connects to [overlay]
- * [image] is header background image;
- * [imag_path] is path of image, shown in [image]
- * [RU]
- * Настраивает заголовок приложения.
- * [overlay] - оверлей заголовка приложения;
- * [head] - шапка заголовка, присоединяемая к [overlay]
- * [image] - виджет картинки для заднего фона;
- * [imag_path] - путь до картинки, загружаемой в [image]
-*/
-#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()), GTK_WIDGET(head.gobj()), GTK_WIDGET(image.gobj()), (char *)imag_path)
-#else
-
-/**yon_ubl_header_setup(overlay, head, image, imag_path)
- * [EN]
- * Sets up header of app.
- * [overlay] is overlay for app header;
- * [head] is box of header, which connects to [overlay]
- * [image] is header background image;
- * [imag_path] is path of image, shown in [image]
- * [RU]
- * Настраивает заголовок приложения.
- * [overlay] - оверлей заголовка приложения;
- * [head] - шапка заголовка, присоединяемая к [overlay]
- * [image] - виджет картинки для заднего фона;
- * [imag_path] - путь до картинки, загружаемой в [image]
-*/
-#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
-#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
-#endif
-
-void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
-
-void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
-
-void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id);
-#ifdef WEBKIT_FOUND
-
-void yon_ubl_browser_window_open(char *link, char *browser_window_name);
-#else
-void yon_ubl_browser_window_open(char *link, char *browser_window_name);
-#endif
-#endif
-#endif
\ No newline at end of file
diff --git a/ubl-settings-repomanager-add.glade b/ubl-settings-repomanager-add.glade
new file mode 100644
index 0000000..b952edb
--- /dev/null
+++ b/ubl-settings-repomanager-add.glade
@@ -0,0 +1,664 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade
new file mode 100644
index 0000000..3aa1cf5
--- /dev/null
+++ b/ubl-settings-repomanager-configuration.glade
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.zoom-symbolic
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.increase-symbolic
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.trash-symbolic
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.increase-symbolic
+
+
+ 450
+ 300
+ False
+ True
+ com.ublinux.ubl-settings-repomanager
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ vertical
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Storage:
+ 0
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ True
+ True
+ Open existing
+ image1
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ True
+ True
+ Create new
+ image2
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ True
+ True
+ True
+ Disable
+ image3
+
+
+
+ False
+ True
+ 4
+
+
+
+
+ True
+ True
+ True
+ Delete
+ image4
+
+
+
+ False
+ True
+ 5
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0.019999999552965164
+ in
+
+
+ True
+ False
+ 5
+ 5
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ True
+
+
+ True
+ False
+ none
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ True
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ True
+ True
+ Add repository
+ image5
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+
+
+
+
+ True
+ False
+ Repository (-ies)
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ubl-settings-repomanager-filechooser.glade b/ubl-settings-repomanager-filechooser.glade
new file mode 100644
index 0000000..d5a5480
--- /dev/null
+++ b/ubl-settings-repomanager-filechooser.glade
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.accept-symbolic
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.cancel-uncolored-symbolic
+
+
+ False
+ True
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ vertical
+ 5
+
+
+ True
+ False
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 5
+ 5
+ 5
+
+
+ True
+ True
+
+
+ True
+ True
+ 0
+
+
+
+
+ Cancel
+ True
+ True
+ True
+ image2
+
+
+ False
+ True
+ 1
+
+
+
+
+ Choose
+ True
+ True
+ True
+ image1
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+
diff --git a/ubl-settings-repomanager-key.glade b/ubl-settings-repomanager-key.glade
new file mode 100644
index 0000000..07621c5
--- /dev/null
+++ b/ubl-settings-repomanager-key.glade
@@ -0,0 +1,484 @@
+
+
+
+
+
+
+ 1024
+ 4096
+ 2048
+ 512
+ 512
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.calendar-symbolic
+ 3
+
+
+ 500
+ False
+ True
+ com.ublinux.ubl-settings-repomanager
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ vertical
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Name:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Email:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 0.019999999552965164
+ in
+
+
+ True
+ False
+ 5
+ 5
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Commentary:
+
+
+ False
+ True
+ 0
+
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Encryption type:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ key strength (in bits):
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+ adjustment1
+ 2048
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Expires:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0
+
+ - Timeless
+ - Until
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ True
+
+
+ True
+ True
+ 2
+
+
+
+
+ True
+ True
+ True
+ image1
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Password:
+ 0
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+
+
+ True
+ True
+ 2
+
+
+
+
+ False
+ True
+ 4
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Password confirmation:
+ 0
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+
+
+ True
+ True
+ 2
+
+
+
+
+ False
+ True
+ 5
+
+
+
+
+
+
+
+
+ True
+ False
+ Key additional configuration
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ubl-settings-repomanager-progressbar-window.glade b/ubl-settings-repomanager-progressbar-window.glade
new file mode 100644
index 0000000..13218ba
--- /dev/null
+++ b/ubl-settings-repomanager-progressbar-window.glade
@@ -0,0 +1,139 @@
+
+
+
+
+
+ 450
+ 200
+ False
+ True
+ com.ublinux.ubl-settings-repomanager
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 5
+ 5
+ vertical
+ 10
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ 15
+
+
+ True
+ False
+ dialog-information-symbolic
+ 6
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ Please, wait. List of repository packages is currently updating. It can take a while
+ True
+ 0
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+ 15
+
+
+ True
+ False
+
+
+ False
+ True
+ 0
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 0%
+ 0
+
+
+ True
+ True
+ 2
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+
+
+
+
+
diff --git a/ubl-settings-repomanager-repo-block.glade b/ubl-settings-repomanager-repo-block.glade
new file mode 100644
index 0000000..a1682ac
--- /dev/null
+++ b/ubl-settings-repomanager-repo-block.glade
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.key-symbolic
+
+
+ True
+ False
+ com.ublinux.libublsettingsui-gtk3.trash-symbolic
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ Signature:
+ 0
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+
+
+ True
+ True
+ 2
+
+
+
+
+ True
+ True
+ True
+ Sign repo
+ image1
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ True
+ True
+ True
+ Remove repo
+ image2
+
+
+
+ False
+ True
+ 4
+
+
+
+
diff --git a/ubl-settings-repomanager-sign.glade b/ubl-settings-repomanager-sign.glade
index 491c267..584e3fa 100644
--- a/ubl-settings-repomanager-sign.glade
+++ b/ubl-settings-repomanager-sign.glade
@@ -1,19 +1,10 @@
-
+
-
- True
- False
- process-stop-symbolic
-
-
- True
- False
- emblem-ok-symbolic
-
-
- 450
+
+
+ 500
False
True
com.ublinux.ubl-settings-repomanager
@@ -21,34 +12,18 @@
True
False
- 5
- 5
- 5
- 5
- 5
- 5
vertical
- 10
-
+
True
False
vertical
- 5
-
- True
- False
-
-
- False
- True
- 0
-
+
- True
+ False
True
0
@@ -57,46 +32,49 @@
True
False
- end
- 5
- True
+ 5
+ 5
+ 25
+ 25
+ vertical
-
- Cancel
+
True
- True
- True
- image16
-
+ False
+ 5
+
+
+ True
+ False
+ Packages sign:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ True
+ 1
+
+
- True
+ False
True
0
-
-
- Save
- True
- True
- True
- image17
-
-
-
- True
- True
- 1
-
-
- False
+ True
True
1
@@ -107,12 +85,11 @@
diff --git a/ubl-settings-repomanager-windows.glade b/ubl-settings-repomanager-windows.glade
deleted file mode 100644
index 98d4bbd..0000000
--- a/ubl-settings-repomanager-windows.glade
+++ /dev/null
@@ -1,549 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- master
- True
-
-
-
-
- True
- False
- process-stop-symbolic
-
-
- True
- False
- emblem-ok-symbolic
-
-
- 450
- 150
- False
- True
- com.ublinux.ubl-settings-repomanager
-
-
- True
- False
- 5
- 5
- 5
- 5
- 5
- 5
- vertical
- 10
-
-
- True
- False
- vertical
- 5
-
-
- True
- False
- 5
-
-
- True
- False
- Name:
- 0
-
-
- False
- True
- 0
-
-
-
-
- True
- True
-
-
- True
- True
- 1
-
-
-
-
- False
- True
- 0
-
-
-
-
- True
- False
- vertical
- 4
-
-
- Choose repository folder
- True
- True
- True
- start
-
-
- False
- True
- 0
-
-
-
-
- True
- False
- True
- 0
-
-
- False
- True
- 1
-
-
-
-
- False
- True
- 1
-
-
-
-
- True
- False
- 5
-
-
- False
- Branches:
- 0
-
-
- False
- True
- 0
-
-
-
-
- False
- True
- 2
-
-
-
-
- True
- False
- 5
-
-
- True
- True
- never
- in
-
-
- True
- False
-
-
- True
- curRepoEditList
- False
- True
- 0
- False
-
-
-
-
-
- column
-
-
- True
- < Type branch name >
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
-
- True
- True
- 0
-
-
-
-
- True
- True
- 3
-
-
-
-
- True
- True
- 0
-
-
-
-
- True
- False
- end
- 5
- True
-
-
- Cancel
- True
- True
- True
- image14
-
-
-
- True
- True
- 0
-
-
-
-
- Save
- True
- True
- True
- image15
-
-
-
- True
- True
- 1
-
-
-
-
- False
- True
- 1
-
-
-
-
-
-
-
-
-
- True
- False
- process-stop-symbolic
-
-
- True
- False
- emblem-ok-symbolic
-
-
- 450
- 150
- False
- True
- com.ublinux.ubl-settings-repomanager
-
-
- True
- False
- 5
- 5
- 5
- 5
- 5
- 5
- vertical
- 10
-
-
- True
- False
- vertical
- 5
-
-
- True
- False
- 5
-
-
- True
- False
- Name:
- 0
-
-
- False
- True
- 0
-
-
-
-
- True
- True
-
-
- True
- True
- 1
-
-
-
-
- False
- True
- 0
-
-
-
-
- True
- False
- 5
-
-
- False
- Branches:
- 0
-
-
- False
- True
- 0
-
-
-
-
- False
- True
- 1
-
-
-
-
- True
- False
- 5
-
-
- True
- True
- never
- in
-
-
- True
- False
-
-
- True
- curRepoEditList
- False
- 0
- False
-
-
- none
-
-
-
-
- column
-
-
-
- 0
-
-
-
-
-
-
-
-
-
-
-
-
-
- True
- True
- 0
-
-
-
-
- True
- True
- 3
-
-
-
-
- True
- True
- 0
-
-
-
-
- True
- False
- end
- 5
- True
-
-
- Cancel
- True
- True
- True
- image16
-
-
-
- True
- True
- 0
-
-
-
-
- Save
- True
- True
- True
- image17
-
-
-
- True
- True
- 1
-
-
-
-
- False
- True
- 1
-
-
-
-
-
-
-
-
-
diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css
index 2a55ea0..af0b6cc 100644
--- a/ubl-settings-repomanager.css
+++ b/ubl-settings-repomanager.css
@@ -1,4 +1,3 @@
-
.thin {
margin:0px;
padding:0px;
@@ -38,7 +37,7 @@ background:transparent;
border-left-width:inherit;
border-right-width:inherit;
}
-
+
.menuitemtop{
margin-bottom:0px;
border-color:inherit;
@@ -46,25 +45,19 @@ background:transparent;
border-left-width:inherit;
border-right-width:inherit;
}
- .menuitemtop *{
- margin:2px 2px 0 2px;
- padding-top:2px;
- padding-bottom:2px;
- /* padding: 5px 0px 3px 5px; */
+ .menuitemtop >*{
+ margin:4px 2px 0 2px;
+ padding: 3px 10px 3px 5px;
border:transparent;
}
- .menuitemmiddle *{
+ .menuitemmiddle >*{
margin:0 2px 0 2px;
- padding-top:2px;
- padding-bottom:2px;
- /* padding: 3px 0px 3px 5px; */
+ padding: 3px 10px 3px 5px;
border:transparent;
}
- .menuitembottom *{
+ .menuitembottom >*{
margin:0 2px 2px 2px;
- padding-top:2px;
- padding-bottom:2px;
- /* padding: 3px 0px 5px 5px; */
+ padding: 3px 10px 3px 5px;
}
.menuitemtop:hover {
background:@theme_bg_color;
@@ -87,27 +80,21 @@ background:transparent;
border-right-width:inherit;
}
- .menuitemtop:hover* {
- margin:2px 2px 0 2px;
- padding-top:2px;
- padding-bottom:2px;
- /* padding: 5px 0 3px 5px; */
+ .menuitemtop:hover>* {
+ margin:4px 2px 0 2px;
+ padding: 3px 10px 3px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
}
- .menuitemmiddle:hover* {
- margin:0 2px 0px 2px;
- padding-top:2px;
- padding-bottom:2px;
- /* padding: 3px 0px 3px 5px; */
+ .menuitemmiddle:hover>* {
+ margin:0 2px 0 2px;
+ padding: 3px 10px 3px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
}
- .menuitembottom:hover* {
+ .menuitembottom:hover>* {
margin:0 2px 2px 2px;
- padding-top:2px;
- padding-bottom:2px;
- /* padding: 3px 0px 5px 5px; */
+ padding: 3px 10px 3px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
}
@@ -118,24 +105,39 @@ background:transparent;
.boxInfoMessOK{
background-color: #f3f0ac;
}
-.invisprogress {
- background-color:transparent;
- color:transparent;
-
+.errorBox {
+ border-width: 2px;
+ border-color: #ea9999;
+ border-style:solid;
}
-.invisprogress.osd {
- background:transparent;
- color:transparent;
+
+.chosenOutline{
+ transition: 0ms;
+ border-width: 1px;
+ border-color: #f3f0ac;
+ border-style:solid;
}
-.invisprogress.trough * {
- background:transparent;
- color:transparent;
+
+.separatorTop{
+ border-color: darker (@theme_bg_color);
+ border-top-width:1px;
+ border-style:solid;
}
-.invisprogress.trough.empty {
- background:transparent;
- color:transparent;
+
+.separatorBottom{
+ border-color: darker (@theme_bg_color);
+ border-bottom-width:1px;
+ border-style:solid;
}
.marginright image{
margin-right: 2px;
-}
\ No newline at end of file
+}
+
+.spinner_image{
+ -gtk-icon-transform: scale(2);
+}
+
+treeview row:nth-child(odd) { background-color: #000000; }
+
+treeview row:nth-child(even) { background-color: #ffffff; }
\ No newline at end of file
diff --git a/ubl-settings-repomanager.desktop b/ubl-settings-repomanager.desktop
index cac9fb5..58b8580 100644
--- a/ubl-settings-repomanager.desktop
+++ b/ubl-settings-repomanager.desktop
@@ -1,6 +1,6 @@
[Desktop Entry]
Encoding=UTF-8
-Name=ubl-settings-repomanager
+Name=Repository manager
Name[ru]=Менеджер репозиториев
GenericName=ubl-settings-repomanager
GenericName[ru]=Менеджер репозиториев
diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade
index 39b7c4e..3f0e0ba 100644
--- a/ubl-settings-repomanager.glade
+++ b/ubl-settings-repomanager.glade
@@ -1,319 +1,92 @@
-
+
-
-
-
-
- False
- False
- True
- center
- com.ublinux.ubl-settings-repomanager
- dialog
- True
- ubl-settings-repomanager
- 1.1
- Copyright © 2022 - 2023, UBSoft LLC
- Repository manager
- https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-repomanager
- Project Home Page
- Это приложение распространяется без каких-либо гарантий.
-Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>.
- UBGroup
- UBGroup
- com.ublinux.ubl-settings-repomanager
- True
- gpl-2-0
-
-
- True
- False
- vertical
- 2
-
-
- False
- end
-
-
- False
- False
- 1
-
-
-
-
-
-
-
-
-
diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot
index 4b035ef..4ce191e 100644
--- a/ubl-settings-repomanager.pot
+++ b/ubl-settings-repomanager.pot
@@ -17,320 +17,510 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: source/ubl-strings.h:1
-msgid "Version:"
-msgstr ""
-
-#: source/ubl-strings.h:2
-msgid "ubl-settings-repomanager version:"
-msgstr ""
-
#: source/ubl-strings.h:2
-msgid "Usage:"
+msgid "Repository manager"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "[OPTIONS]"
+#: source/ubl-strings.h:3
+msgid "Repository management and configuring"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Options:"
+#: source/ubl-strings.h:5
+msgid "Would you like to read documentation in the Web?"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Show this help"
+#: source/ubl-strings.h:6
+msgid ""
+"You will be redirected to documentation website where documentation is\n"
+"translated and supported by community."
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Show package version"
+#: source/ubl-strings.h:7
+msgid "Always redirect to online documentation"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Lock this help menu"
+#: source/ubl-strings.h:8
+msgid "Open documentation"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Lock configuration saving"
+#: source/ubl-strings.h:9
+msgid "Project Home Page"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Lock local configration saving"
+#: source/ubl-strings.h:10
+msgid "Nothing were chosen"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Lock global configration saving"
+#: source/ubl-strings.h:12
+msgid "Information"
msgstr ""
-#: source/ubl-strings.h:2
-msgid "Lock global configration loading"
+#: source/ubl-strings.h:14
+msgid "Choose package(-s)"
msgstr ""
-#: source/ubl-strings.h:4
-msgid ""
-"Warning! Application was launched without root - root-dependent actions are "
-"locked"
+#: source/ubl-strings.h:15
+msgid "Choose folder"
msgstr ""
-#: source/ubl-strings.h:6
-msgid "Repository manager"
+#: source/ubl-strings.h:16
+msgid "Add packages"
msgstr ""
-#: source/ubl-strings.h:7
-msgid "Repository management and configuring"
+#: source/ubl-strings.h:17
+msgid "Move packages"
msgstr ""
-#: source/ubl-strings.h:8
-msgid "Operation succeeded"
+#: source/ubl-strings.h:18
+msgid "Remove packages"
msgstr ""
-#: source/ubl-strings.h:10
-msgid "About"
+#: source/ubl-strings.h:20 source/ubl-strings.h:39
+msgid "Key creation"
msgstr ""
-#: source/ubl-strings.h:11
-msgid "Documentation"
+#: source/ubl-strings.h:21
+msgid "Email:"
msgstr ""
-#: source/ubl-strings.h:13
-msgid "Save to local configuration"
+#: source/ubl-strings.h:22
+msgid "Key additional configuration"
msgstr ""
-#: source/ubl-strings.h:14
-msgid "Save to global configuration"
+#: source/ubl-strings.h:23
+msgid "Commentary:"
msgstr ""
-#: source/ubl-strings.h:15
-msgid "Save configuration"
+#: source/ubl-strings.h:24
+msgid "Encryption type:"
msgstr ""
-#: source/ubl-strings.h:16
-msgid "Save"
+#: source/ubl-strings.h:25
+msgid "key strength (in bits):"
msgstr ""
-#: source/ubl-strings.h:18
-msgid "Load local configuration"
+#: source/ubl-strings.h:26
+msgid "Expires:"
msgstr ""
-#: source/ubl-strings.h:19
-msgid "Load global configuration"
+#: source/ubl-strings.h:27
+msgid "Password:"
msgstr ""
-#: source/ubl-strings.h:20
-msgid "Load"
+#: source/ubl-strings.h:28
+msgid "Password confirmation:"
msgstr ""
-#: source/ubl-strings.h:22
-msgid "Cancel"
+#: source/ubl-strings.h:29
+msgid "Timeless"
msgstr ""
-#: source/ubl-strings.h:24
-msgid "Would you like to read documentation in the Web?"
+#: source/ubl-strings.h:30
+msgid "Until"
msgstr ""
-#: source/ubl-strings.h:25
-msgid ""
-"You will be redirected to documentation website where documentation is\n"
-"translated and supported by community."
+#: source/ubl-strings.h:32
+msgid "Add"
msgstr ""
-#: source/ubl-strings.h:26
-msgid "Always redirect to online documentation"
+#: source/ubl-strings.h:34
+msgid "Update"
msgstr ""
-#: source/ubl-strings.h:27
-msgid "Open documentation"
+#: source/ubl-strings.h:35
+msgid "Configure storages"
msgstr ""
-#: source/ubl-strings.h:28
-msgid "Project Home Page"
+#: source/ubl-strings.h:36
+msgid "System update"
msgstr ""
-#: source/ubl-strings.h:29
-msgid "Nothing were chosen"
+#: source/ubl-strings.h:38
+msgid "Empty important field"
msgstr ""
-#: source/ubl-strings.h:31
+#: source/ubl-strings.h:41
msgid "Repository data has been loaded successfully"
msgstr ""
-#: source/ubl-strings.h:33
+#: source/ubl-strings.h:43
msgid "Saving has succeeded"
msgstr ""
-#: source/ubl-strings.h:35
+#: source/ubl-strings.h:45
msgid "General"
msgstr ""
-#: source/ubl-strings.h:36
+#: source/ubl-strings.h:46
msgid "Publication"
msgstr ""
-#: source/ubl-strings.h:37
+#: source/ubl-strings.h:47
msgid "Trusted repository"
msgstr ""
-#: source/ubl-strings.h:38
+#: source/ubl-strings.h:48
msgid "Server type:"
msgstr ""
-#: source/ubl-strings.h:39
+#: source/ubl-strings.h:49
msgid "IP adress:"
msgstr ""
-#: source/ubl-strings.h:40
+#: source/ubl-strings.h:50
msgid "Port:"
msgstr ""
-#: source/ubl-strings.h:41
+#: source/ubl-strings.h:51
msgid "Publish"
msgstr ""
-#: source/ubl-strings.h:42
+#: source/ubl-strings.h:52
msgid "Code name:"
msgstr ""
-#: source/ubl-strings.h:43
+#: source/ubl-strings.h:53
msgid "Branch:"
msgstr ""
-#: source/ubl-strings.h:44
+#: source/ubl-strings.h:54
msgid "Architecture:"
msgstr ""
-#: source/ubl-strings.h:45
+#: source/ubl-strings.h:55
msgid "Components:"
msgstr ""
-#: source/ubl-strings.h:46
+#: source/ubl-strings.h:56
msgid "Signature:"
msgstr ""
-#: source/ubl-strings.h:47
+#: source/ubl-strings.h:57
msgid "Sign"
msgstr ""
-#: source/ubl-strings.h:49
+#: source/ubl-strings.h:59
+msgid "Move"
+msgstr ""
+
+#: source/ubl-strings.h:60
+msgid "Remove"
+msgstr ""
+
+#: source/ubl-strings.h:62
+msgid "Sign repo"
+msgstr ""
+
+#: source/ubl-strings.h:63
+msgid "Remove repo"
+msgstr ""
+
+#: source/ubl-strings.h:64
+msgid "Manage storages"
+msgstr ""
+
+#: source/ubl-strings.h:65
+msgid "Storage:"
+msgstr ""
+
+#: source/ubl-strings.h:66
+msgid "Open existing"
+msgstr ""
+
+#: source/ubl-strings.h:67
+msgid "Create new"
+msgstr ""
+
+#: source/ubl-strings.h:68
+msgid "Disable"
+msgstr ""
+
+#: source/ubl-strings.h:69
+msgid "Delete"
+msgstr ""
+
+#: source/ubl-strings.h:70
+msgid "Add repository"
+msgstr ""
+
+#: source/ubl-strings.h:71
+msgid "Repository (-ies)"
+msgstr ""
+
+#: source/ubl-strings.h:72
+msgid "Accept"
+msgstr ""
+
+#: source/ubl-strings.h:74
+msgid "Repository:"
+msgstr ""
+
+#: source/ubl-strings.h:75
+msgid "Source"
+msgstr ""
+
+#: source/ubl-strings.h:76
+msgid "Target"
+msgstr ""
+
+#: source/ubl-strings.h:77
+msgid "Packages sign:"
+msgstr ""
+
+#: source/ubl-strings.h:78
+msgid "Repository sign:"
+msgstr ""
+
+#: source/ubl-strings.h:79
+msgid "Package (-s) to add"
+msgstr ""
+
+#: source/ubl-strings.h:80
+msgid "Package (-s) to remove"
+msgstr ""
+
+#: source/ubl-strings.h:81
+msgid "Package (-s) to move"
+msgstr ""
+
+#: source/ubl-strings.h:82
+msgid "Name"
+msgstr ""
+
+#: source/ubl-strings.h:83
+msgid "Path"
+msgstr ""
+
+#: source/ubl-strings.h:84
+msgid "Remove package"
+msgstr ""
+
+#: source/ubl-strings.h:85
+msgid "Add package"
+msgstr ""
+
+#: source/ubl-strings.h:87
+msgid "Repository sign failed - repository has no packages"
+msgstr ""
+
+#: source/ubl-strings.h:88
+msgid "Data has been loaded"
+msgstr ""
+
+#: source/ubl-strings.h:89
+msgid "Packages were added successfully"
+msgstr ""
+
+#: source/ubl-strings.h:90
+msgid "Packages were removed successfully"
+msgstr ""
+
+#: source/ubl-strings.h:91
+msgid "Packages were moved successfully"
+msgstr ""
+
+#: source/ubl-strings.h:92
+msgid "Changes saved"
+msgstr ""
+
+#: source/ubl-strings.h:93
+msgid "Key was successfully created"
+msgstr ""
+
+#: source/ubl-strings.h:94
+msgid "Key creation failed"
+msgstr ""
+
+#: source/ubl-strings.h:96
+msgid "Choose"
+msgstr ""
+
+#: source/ubl-strings.h:97
+msgid "Cancel"
+msgstr ""
+
+#: source/ubl-strings.h:99
msgid "Open or create repository"
msgstr ""
-#: source/ubl-strings.h:50
+#: source/ubl-strings.h:100
msgid "Open existing repository"
msgstr ""
-#: source/ubl-strings.h:51
+#: source/ubl-strings.h:101
msgid "Configure repository"
msgstr ""
-#: source/ubl-strings.h:52
+#: source/ubl-strings.h:102
msgid "Delete repository"
msgstr ""
-#: source/ubl-strings.h:53
+#: source/ubl-strings.h:103
msgid ""
"Add/Remove repository from\n"
"local package sources"
msgstr ""
-#: source/ubl-strings.h:54
+#: source/ubl-strings.h:104
msgid "Enable/disable repository publish"
msgstr ""
-#: source/ubl-strings.h:55
+#: source/ubl-strings.h:105
msgid "Check dependences"
msgstr ""
-#: source/ubl-strings.h:56
+#: source/ubl-strings.h:106
msgid "Sign ripository"
msgstr ""
-#: source/ubl-strings.h:57
-msgid "Add package"
-msgstr ""
-
-#: source/ubl-strings.h:58
-msgid "Remove package"
-msgstr ""
-
-#: source/ubl-strings.h:59
+#: source/ubl-strings.h:107
msgid "Open"
msgstr ""
-#: source/ubl-strings.h:61
+#: source/ubl-strings.h:109
msgid "Operation done"
msgstr ""
-#: source/ubl-strings.h:63
+#: source/ubl-strings.h:111
msgid "Choose branch or pack in branch to add file!"
msgstr ""
-#: source/ubl-strings.h:64
+#: source/ubl-strings.h:112
msgid "Choose repository or branch!"
msgstr ""
-#: source/ubl-strings.h:65
+#: source/ubl-strings.h:113
msgid "Choose pack to delete!"
msgstr ""
-#: source/ubl-strings.h:66
+#: source/ubl-strings.h:114
msgid "Choose repository to delete!"
msgstr ""
-#: source/ubl-strings.h:67
+#: source/ubl-strings.h:115
msgid "Choose repository or package to sign"
msgstr ""
-#: source/ubl-strings.h:69
+#: source/ubl-strings.h:117
msgid "Name:"
msgstr ""
-#: source/ubl-strings.h:70
+#: source/ubl-strings.h:118
msgid "Branches:"
msgstr ""
-#: source/ubl-strings.h:71
+#: source/ubl-strings.h:119
msgid "< Type branch name >"
msgstr ""
-#: source/ubl-strings.h:72
+#: source/ubl-strings.h:120
msgid "Name must be filled!"
msgstr ""
-#: source/ubl-strings.h:73
+#: source/ubl-strings.h:121
msgid "Choose path for new repository"
msgstr ""
-#: source/ubl-strings.h:75
+#: source/ubl-strings.h:123
msgid "Choose repository folder"
msgstr ""
-#: source/ubl-strings.h:76
+#: source/ubl-strings.h:124
msgid "Choose repository"
msgstr ""
-#: source/ubl-strings.h:78
+#: source/ubl-strings.h:126
msgid "Absent"
msgstr ""
-#: source/ubl-strings.h:79
+#: source/ubl-strings.h:127
msgid "Dependences:"
msgstr ""
-#: source/ubl-strings.h:80
+#: source/ubl-strings.h:128
msgid "Digital signature"
msgstr ""
-#: source/ubl-strings.h:82
+#: source/ubl-strings.h:130
msgid "package"
msgstr ""
-#: source/ubl-strings.h:83
+#: source/ubl-strings.h:131
msgid "repository"
msgstr ""
-#: source/ubl-strings.h:84
-msgid "This package already exists in that repository"
+#: source/ubl-strings.h:132
+msgid "Repeating packages were not added"
msgstr ""
-#: source/ubl-strings.h:84
+#: source/ubl-strings.h:133
msgid "This repository has already been added"
-msgstr ""
\ No newline at end of file
+msgstr ""
+
+#: source/ubl-strings.h:135
+msgid "Close"
+msgstr ""
+
+#: source/ubl-strings.h:137
+msgid "Are you sure want to disable?"
+msgstr ""
+
+#: source/ubl-strings.h:139
+msgid "Are you sure want to remove?"
+msgstr ""
+
+#: source/ubl-strings.h:141
+msgid "Do not sign"
+msgstr ""
+
+#: source/ubl-strings.h:143
+msgid "Package name error - package has incorrect name pattern"
+msgstr ""
+
+#: source/ubl-strings.h:145
+msgid "Passwords do not match"
+msgstr ""
+
+#: source/ubl-strings.h:147
+msgid "Package search"
+msgstr ""
+
+#: source/ubl-strings.h:149
+msgid "Storage path"
+msgstr ""
+
+#: source/ubl-strings.h:151
+msgid "Repository"
+msgstr ""
+
+#: source/ubl-strings.h:153
+msgid "Architecture"
+msgstr ""
+
+#: source/ubl-strings.h:155
+msgid "Repository name"
+msgstr ""
+
+#: source/ubl-strings.h:157
+msgid "Signature"
+msgstr ""
+
+#: source/ubl-strings.h:159
+msgid "Signature status"
+msgstr ""
+
+#: source/ubl-strings.h:161
+msgid "Sign packages"
+msgstr ""
+
+#: source/ubl-strings.h:163
+msgid "Packages successfully signed"
+msgstr ""
+
+#: source/ubl-strings.h:165
+msgid "Folder must contain repositories"
+msgstr ""
+
+#: source/ubl-strings.h:167
+msgid "Folder must not be empty"
+msgstr ""
diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po
index 5522979..f7624f4 100644
--- a/ubl-settings-repomanager_ru.po
+++ b/ubl-settings-repomanager_ru.po
@@ -17,220 +17,347 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: source/ubl-strings.h:1
-msgid "Version:"
-msgstr "Версия:"
-
-#: source/ubl-strings.h:2
-msgid "ubl-settings-repomanager version:"
-msgstr "Версия ubl-settings-repomanager: "
-
-#: source/ubl-strings.h:2
-msgid "Usage:"
-msgstr "Использование:"
-
-#: source/ubl-strings.h:2
-msgid "[OPTIONS]"
-msgstr "[АРГУМЕНТЫ]"
-
#: source/ubl-strings.h:2
-msgid "Options:"
-msgstr "Аргументы:"
-
-#: source/ubl-strings.h:2
-msgid "Show this help"
-msgstr "Показать параметры справки"
-
-#: source/ubl-strings.h:2
-msgid "Show package version"
-msgstr "Показать текущую версию"
-
-#: source/ubl-strings.h:2
-msgid "Lock this help menu"
-msgstr "Блокировка вызова справки"
-
-#: source/ubl-strings.h:2
-msgid "Lock configuration saving"
-msgstr "Блокировка сохранения локальной и глобальной конфигурации"
-
-#: source/ubl-strings.h:2
-msgid "Lock local configration saving"
-msgstr "Блокировка сохранения локальной конфигурации"
+msgid "Repository manager"
+msgstr "Менеджер репозиториев"
-#: source/ubl-strings.h:2
-msgid "Lock global configration saving"
-msgstr "Блокировка сохранения глобальной конфигурации"
+#: source/ubl-strings.h:3
+msgid "Repository management and configuring"
+msgstr "Настройка параметров и управление репозиториями системы"
-#: source/ubl-strings.h:2
-msgid "Lock global configration loading"
-msgstr "Блокировка загрузки глобальной конфигурации"
+#: source/ubl-strings.h:5
+msgid "Would you like to read documentation in the Web?"
+msgstr "Вы хотите прочитать справку в Сети?"
-#: source/ubl-strings.h:4
+#: source/ubl-strings.h:6
msgid ""
-"Warning! Application was launched without root - root-dependent actions are "
-"locked"
+"You will be redirected to documentation website where documentation is\n"
+"translated and supported by community."
msgstr ""
-"Внимание! Приложение было запущено без прав суперпользователя - действия, "
-"требующие их наличия заблокированы"
-
-#: source/ubl-strings.h:6
-msgid "Repository manager"
-msgstr "Менеджер репозиториев"
+"Вы будете перенаправлены на сайт с документацией где страницы помощи\n"
+"переводятся и поддерживаются сообществом."
#: source/ubl-strings.h:7
-msgid "Repository management and configuring"
-msgstr "Настройка параметров и управление репозиториями системы"
+msgid "Always redirect to online documentation"
+msgstr "Всегда перенаправлять"
#: source/ubl-strings.h:8
-msgid "Operation succeeded"
-msgstr "Операция завершена"
+msgid "Open documentation"
+msgstr "Прочитать справку"
-#: source/ubl-strings.h:10
-msgid "About"
-msgstr "О программе"
+#: source/ubl-strings.h:9
+msgid "Project Home Page"
+msgstr "Домашняя страница проекта"
-#: source/ubl-strings.h:11
-msgid "Documentation"
-msgstr "Справка"
+#: source/ubl-strings.h:10
+msgid "Nothing were chosen"
+msgstr "Ничего не выбрано"
-#: source/ubl-strings.h:13
-msgid "Save to local configuration"
-msgstr "Сохранить в локальную конфигурацию"
+#: source/ubl-strings.h:12
+msgid "Information"
+msgstr "Информация"
#: source/ubl-strings.h:14
-msgid "Save to global configuration"
-msgstr "Сохранить в глобальную конфигурацию"
+msgid "Choose package(-s)"
+msgstr "Выбрать пакеты"
#: source/ubl-strings.h:15
-msgid "Save configuration"
-msgstr "Сохранить конфигурацию"
+msgid "Choose folder"
+msgstr "Выбрать директорию для репозитория"
#: source/ubl-strings.h:16
-msgid "Save"
-msgstr "Сохранить"
+msgid "Add packages"
+msgstr "Добавить пакеты"
+
+#: source/ubl-strings.h:17
+msgid "Move packages"
+msgstr "Переместить пакеты"
#: source/ubl-strings.h:18
-msgid "Load local configuration"
-msgstr "Загрузить локальную конфигуруцию"
+msgid "Remove packages"
+msgstr "Удалить пакеты"
-#: source/ubl-strings.h:19
-msgid "Load global configuration"
-msgstr "Загрузить глобальную конфигурацию"
+#: source/ubl-strings.h:20 source/ubl-strings.h:39
+msgid "Key creation"
+msgstr "Создание ключа"
-#: source/ubl-strings.h:20
-msgid "Load"
-msgstr "Загрузить"
+#: source/ubl-strings.h:21
+msgid "Email:"
+msgstr "Адрес электронной почты:"
#: source/ubl-strings.h:22
-msgid "Cancel"
-msgstr "Отмена"
+msgid "Key additional configuration"
+msgstr "Дополнительные параметры ключа"
+
+#: source/ubl-strings.h:23
+msgid "Commentary:"
+msgstr "Комментарий:"
#: source/ubl-strings.h:24
-msgid "Would you like to read documentation in the Web?"
-msgstr "Вы хотите прочитать справку в Сети?"
+msgid "Encryption type:"
+msgstr "Тип шифрования:"
#: source/ubl-strings.h:25
-msgid ""
-"You will be redirected to documentation website where documentation is\n"
-"translated and supported by community."
-msgstr ""
-"Вы будете перенаправлены на сайт с документацией где страницы помощи\n"
-"переводятся и поддерживаются сообществом."
+msgid "key strength (in bits):"
+msgstr "Стойкость ключа (в битах):"
#: source/ubl-strings.h:26
-msgid "Always redirect to online documentation"
-msgstr "Всегда перенаправлять"
+msgid "Expires:"
+msgstr "Срок действия:"
#: source/ubl-strings.h:27
-msgid "Open documentation"
-msgstr "Прочитать справку"
+msgid "Password:"
+msgstr "Пароль:"
#: source/ubl-strings.h:28
-msgid "Project Home Page"
-msgstr "Домашняя страница проекта"
+msgid "Password confirmation:"
+msgstr "Подтверждение пароля:"
#: source/ubl-strings.h:29
-msgid "Nothing were chosen"
-msgstr "Ничего не было выбрано"
+msgid "Timeless"
+msgstr "Бессрочный"
-#: source/ubl-strings.h:31
+#: source/ubl-strings.h:30
+msgid "Until"
+msgstr "До"
+
+#: source/ubl-strings.h:32
+msgid "Add"
+msgstr "Добавить"
+
+#: source/ubl-strings.h:34
+msgid "Update"
+msgstr "Обновить"
+
+#: source/ubl-strings.h:35
+msgid "Configure storages"
+msgstr "Редактировать хранилища"
+
+#: source/ubl-strings.h:36
+msgid "System update"
+msgstr "Обновление системы"
+
+#: source/ubl-strings.h:38
+msgid "Empty important field"
+msgstr "Пустое важное поле"
+
+#: source/ubl-strings.h:41
msgid "Repository data has been loaded successfully"
msgstr "Информация о пакетах успешно загружена"
-#: source/ubl-strings.h:33
-#, fuzzy
+#: source/ubl-strings.h:43
msgid "Saving has succeeded"
msgstr "Успешно сохранено"
-#: source/ubl-strings.h:35
+#: source/ubl-strings.h:45
msgid "General"
msgstr "Общие"
-#: source/ubl-strings.h:36
+#: source/ubl-strings.h:46
msgid "Publication"
msgstr "Публикация"
-#: source/ubl-strings.h:37
+#: source/ubl-strings.h:47
msgid "Trusted repository"
msgstr "Доверенный репозиторий"
-#: source/ubl-strings.h:38
+#: source/ubl-strings.h:48
msgid "Server type:"
msgstr "Тип сервера:"
-#: source/ubl-strings.h:39
+#: source/ubl-strings.h:49
msgid "IP adress:"
msgstr "IP-адрес:"
-#: source/ubl-strings.h:40
+#: source/ubl-strings.h:50
msgid "Port:"
msgstr "Порт:"
-#: source/ubl-strings.h:41
+#: source/ubl-strings.h:51
msgid "Publish"
msgstr "Опубликовать"
-#: source/ubl-strings.h:42
+#: source/ubl-strings.h:52
msgid "Code name:"
msgstr "Кодовое имя:"
-#: source/ubl-strings.h:43
+#: source/ubl-strings.h:53
msgid "Branch:"
msgstr "Ветка:"
-#: source/ubl-strings.h:44
+#: source/ubl-strings.h:54
msgid "Architecture:"
msgstr "Архитектура:"
-#: source/ubl-strings.h:45
+#: source/ubl-strings.h:55
msgid "Components:"
msgstr "Компоненты"
-#: source/ubl-strings.h:46
+#: source/ubl-strings.h:56
msgid "Signature:"
msgstr "Подпись:"
-#: source/ubl-strings.h:47
+#: source/ubl-strings.h:57
msgid "Sign"
msgstr "Подписать"
-#: source/ubl-strings.h:49
+#: source/ubl-strings.h:59
+msgid "Move"
+msgstr "Переместить"
+
+#: source/ubl-strings.h:60
+msgid "Remove"
+msgstr "Удалить"
+
+#: source/ubl-strings.h:62
+msgid "Sign repo"
+msgstr "Подписать репозиторий"
+
+#: source/ubl-strings.h:63
+msgid "Remove repo"
+msgstr "Удалить репозиторий"
+
+#: source/ubl-strings.h:64
+msgid "Manage storages"
+msgstr "Управление хранилищами"
+
+#: source/ubl-strings.h:65
+msgid "Storage:"
+msgstr "Хранилище:"
+
+#: source/ubl-strings.h:66
+msgid "Open existing"
+msgstr "Открыть существующее хранилище"
+
+#: source/ubl-strings.h:67
+msgid "Create new"
+msgstr "Создать"
+
+#: source/ubl-strings.h:68
+msgid "Disable"
+msgstr "Отключить"
+
+#: source/ubl-strings.h:69
+msgid "Delete"
+msgstr "Удалить"
+
+#: source/ubl-strings.h:70
+msgid "Add repository"
+msgstr "Добавить репозиторий"
+
+#: source/ubl-strings.h:71
+msgid "Repository (-ies)"
+msgstr "Репозиторий (-ии)"
+
+#: source/ubl-strings.h:72
+msgid "Accept"
+msgstr "Принять"
+
+#: source/ubl-strings.h:74
+msgid "Repository:"
+msgstr "Репозиторий:"
+
+#: source/ubl-strings.h:75
+msgid "Source"
+msgstr "Источник"
+
+#: source/ubl-strings.h:76
+msgid "Target"
+msgstr "Назначение"
+
+#: source/ubl-strings.h:77
+msgid "Packages sign:"
+msgstr "Подпись пакетов:"
+
+#: source/ubl-strings.h:78
+msgid "Repository sign:"
+msgstr "Подпись репозитория:"
+
+#: source/ubl-strings.h:79
+msgid "Package (-s) to add"
+msgstr "Пакет(-ы) для добавления"
+
+#: source/ubl-strings.h:80
+msgid "Package (-s) to remove"
+msgstr "Пакет(-ы) для удаления"
+
+#: source/ubl-strings.h:81
+msgid "Package (-s) to move"
+msgstr "Пакет(-ы) для перемещения"
+
+#: source/ubl-strings.h:82
+msgid "Name"
+msgstr "Имя"
+
+#: source/ubl-strings.h:83
+msgid "Path"
+msgstr "Путь"
+
+#: source/ubl-strings.h:84
+msgid "Remove package"
+msgstr "Удалить пакет"
+
+#: source/ubl-strings.h:85
+msgid "Add package"
+msgstr "Добавить пакет"
+
+#: source/ubl-strings.h:87
+msgid "Repository sign failed - repository has no packages"
+msgstr "Ошибка подписи репозитория - репозиторий не содержит пакетов"
+
+#: source/ubl-strings.h:88
+msgid "Data has been loaded"
+msgstr "Данные загружены"
+
+#: source/ubl-strings.h:89
+msgid "Packages were added successfully"
+msgstr "Пакеты успешно добавлены"
+
+#: source/ubl-strings.h:90
+msgid "Packages were removed successfully"
+msgstr "Пакеты успешно удалены"
+
+#: source/ubl-strings.h:91
+msgid "Packages were moved successfully"
+msgstr "Пакеты успешно перемещены"
+
+#: source/ubl-strings.h:92
+msgid "Changes saved"
+msgstr "Изменения сохранены"
+
+#: source/ubl-strings.h:93
+msgid "Key was successfully created"
+msgstr "Ключ был успешно создан"
+
+#: source/ubl-strings.h:94
+msgid "Key creation failed"
+msgstr "Ошибка создания ключа"
+
+#: source/ubl-strings.h:96
+msgid "Choose"
+msgstr "Выбрать"
+
+#: source/ubl-strings.h:97
+msgid "Cancel"
+msgstr "Отмена"
+
+#: source/ubl-strings.h:99
msgid "Open or create repository"
msgstr "Открыть или создать репозиторий"
-#: source/ubl-strings.h:50
+#: source/ubl-strings.h:100
msgid "Open existing repository"
msgstr "Открыть и добавить репозиторий"
-#: source/ubl-strings.h:51
+#: source/ubl-strings.h:101
msgid "Configure repository"
msgstr "Редактировать репозиторий"
-#: source/ubl-strings.h:52
+#: source/ubl-strings.h:102
msgid "Delete repository"
msgstr "Удалить репозиторий"
-#: source/ubl-strings.h:53
+#: source/ubl-strings.h:103
msgid ""
"Add/Remove repository from\n"
"local package sources"
@@ -238,106 +365,174 @@ msgstr ""
"Добавить/удалить репу из\n"
" локальных источников пакетов"
-#: source/ubl-strings.h:54
+#: source/ubl-strings.h:104
msgid "Enable/disable repository publish"
msgstr "Включить/отключить публикацию"
-#: source/ubl-strings.h:55
+#: source/ubl-strings.h:105
msgid "Check dependences"
msgstr "Проверить на битые зависимости"
-#: source/ubl-strings.h:56
+#: source/ubl-strings.h:106
msgid "Sign ripository"
msgstr "Подпись пакетов"
-#: source/ubl-strings.h:57
-msgid "Add package"
-msgstr "Добавить пакет"
-
-#: source/ubl-strings.h:58
-msgid "Remove package"
-msgstr "Удалить пакет"
-
-#: source/ubl-strings.h:59
+#: source/ubl-strings.h:107
msgid "Open"
msgstr "Открыть"
-#: source/ubl-strings.h:61
+#: source/ubl-strings.h:109
msgid "Operation done"
msgstr "Операция завершена"
-#: source/ubl-strings.h:63
+#: source/ubl-strings.h:111
msgid "Choose branch or pack in branch to add file!"
msgstr "Выберите ветку чтобы добавить пакет!"
-#: source/ubl-strings.h:64
+#: source/ubl-strings.h:112
msgid "Choose repository or branch!"
msgstr "Выберите репозиторий!"
-#: source/ubl-strings.h:65
+#: source/ubl-strings.h:113
msgid "Choose pack to delete!"
msgstr "Выберите пакет для удаления!"
-#: source/ubl-strings.h:66
+#: source/ubl-strings.h:114
msgid "Choose repository to delete!"
msgstr "Выберите репозиторий для удаления!"
-#: source/ubl-strings.h:67
+#: source/ubl-strings.h:115
msgid "Choose repository or package to sign"
msgstr "Выберите репозиторий или пакет для подписи"
-#: source/ubl-strings.h:69
+#: source/ubl-strings.h:117
msgid "Name:"
msgstr "Название:"
-#: source/ubl-strings.h:70
+#: source/ubl-strings.h:118
msgid "Branches:"
msgstr "Ветки:"
-#: source/ubl-strings.h:71
+#: source/ubl-strings.h:119
msgid "< Type branch name >"
msgstr "< Введите название ветки >"
-#: source/ubl-strings.h:72
+#: source/ubl-strings.h:120
msgid "Name must be filled!"
msgstr "Введите название!"
-#: source/ubl-strings.h:73
+#: source/ubl-strings.h:121
msgid "Choose path for new repository"
msgstr "Выбрать расположение нового репозитория"
-#: source/ubl-strings.h:75
+#: source/ubl-strings.h:123
msgid "Choose repository folder"
msgstr "Выбрать директорию для репозитория"
-#: source/ubl-strings.h:76
+#: source/ubl-strings.h:124
msgid "Choose repository"
msgstr "Выбрать репозиторий"
-#: source/ubl-strings.h:78
+#: source/ubl-strings.h:126
msgid "Absent"
msgstr "Отсутствует"
-#: source/ubl-strings.h:79
+#: source/ubl-strings.h:127
msgid "Dependences:"
msgstr "Зависит от:"
-#: source/ubl-strings.h:80
+#: source/ubl-strings.h:128
msgid "Digital signature"
msgstr "Цифровая подпись"
-#: source/ubl-strings.h:82
+#: source/ubl-strings.h:130
msgid "package"
msgstr "пакет"
-#: source/ubl-strings.h:83
+#: source/ubl-strings.h:131
msgid "repository"
msgstr "репозиторий"
-#: source/ubl-strings.h:84
-msgid "This package already exists in that repository"
-msgstr "Этот пакет уже присутствует в выбранном репозитории"
+#: source/ubl-strings.h:132
+msgid "Repeating packages were not added"
+msgstr "Дублирующиеся пакеты не были добавлены"
-#: source/ubl-strings.h:84
+#: source/ubl-strings.h:133
msgid "This repository has already been added"
-msgstr "Этот репозиторий уже был добавлен"
\ No newline at end of file
+msgstr "Этот репозиторий уже был добавлен"
+
+#: source/ubl-strings.h:135
+msgid "Close"
+msgstr "Закрыть"
+
+#: source/ubl-strings.h:137
+msgid "Are you sure want to disable?"
+msgstr ""
+"Внимание! Вы хотите отключить хранилище от управления менеджером "
+"репозиториев. При этом будет прекращено управление самим хранилищем и "
+"вложенными репозиториями!\n"
+"\n"
+"Примечание: в дальнейшем Вы можете заново подключить хранилище и управлять "
+"им."
+
+#: source/ubl-strings.h:139
+msgid "Are you sure want to remove?"
+msgstr ""
+"Внимание! Вы ходите удалить хранилище При этом хранилище и вложенные "
+"репозитории будут безвозвратно удалены!"
+
+#: source/ubl-strings.h:141
+msgid "Do not sign"
+msgstr "Не подписывать"
+
+#: source/ubl-strings.h:143
+msgid "Package name error - package has incorrect name pattern"
+msgstr "Ошибка имени пакета - некорректное имя пакета"
+
+#: source/ubl-strings.h:145
+msgid "Passwords do not match"
+msgstr "Пароли не совпадают"
+
+#: source/ubl-strings.h:147
+msgid "Package search"
+msgstr "Поиск пакетов"
+
+#: source/ubl-strings.h:149
+msgid "Storage path"
+msgstr "Расположение хранилища"
+
+#: source/ubl-strings.h:151
+msgid "Repository"
+msgstr "Репозиторий"
+
+#: source/ubl-strings.h:153
+msgid "Architecture"
+msgstr "Архитектура"
+
+#: source/ubl-strings.h:155
+msgid "Repository name"
+msgstr "Имя репозитория"
+
+#: source/ubl-strings.h:157
+msgid "Signature"
+msgstr "Подпись"
+
+#: source/ubl-strings.h:159
+msgid "Signature status"
+msgstr "Статус подписи"
+
+#: source/ubl-strings.h:161
+msgid "Sign packages"
+msgstr "Подписать пакеты"
+
+#: source/ubl-strings.h:163
+msgid "Packages successfully signed"
+msgstr "Пакеты успешно подписаны"
+
+#: source/ubl-strings.h:165
+msgid "Folder must contain repositories"
+msgstr "Директория должна содержать репозитории"
+
+#: source/ubl-strings.h:167
+msgid "Folder must not be empty"
+msgstr "Директория должна быть пустой"