From ef455294230187c7a0eaf653e585f1900ba79cf4 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 25 May 2023 14:43:12 +0600 Subject: [PATCH 01/35] Design edits --- ubl-settings-repomanager.glade | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index d531ee6..4f02288 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -190,6 +190,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + + + + + + 65536 1 @@ -539,14 +547,6 @@ translated and supported by community. - - - - - - - - 800 600 @@ -928,9 +928,9 @@ translated and supported by community. True True - treestore1 + RepoStore False - treeviewcolumn1 + treeviewcolumn2 5 @@ -941,13 +941,19 @@ translated and supported by community. - + column + + 0 + + + 1 + @@ -1678,7 +1684,7 @@ translated and supported by community. - + From acbd545bfd2f7907d00c04e43c1c9a519565aa50 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 May 2023 15:45:36 +0600 Subject: [PATCH 02/35] Added functionality to some buttons --- Makefile | 2 + com.ublinux.ubl-settings-repomanager.svg | 1232 +++++++++++++++++++++- source/ubl-cmake.h | 1 + source/ubl-settings-repomanager.c | 321 +++++- source/ubl-settings-repomanager.h | 26 +- source/ubl-strings.h | 15 +- source/ubl-utils.h | 3 + ubl-settings-repomanager | Bin 0 -> 116392 bytes ubl-settings-repomanager-windows.glade | 512 +++++++++ ubl-settings-repomanager.glade | 39 +- ubl-settings-repomanager.pot | 36 + ubl-settings-repomanager_ru.po | 40 +- 12 files changed, 2116 insertions(+), 111 deletions(-) create mode 120000 source/ubl-cmake.h create mode 100755 ubl-settings-repomanager create mode 100644 ubl-settings-repomanager-windows.glade diff --git a/Makefile b/Makefile index d715cd8..1537dd6 100644 --- a/Makefile +++ b/Makefile @@ -99,6 +99,7 @@ uninstall: @echo "Uninstall: OK" install: check uninstall + @gcc source/ubl-settings-repomanager.c source/ubl-utils.c source/ubl-strings.h -o ubl-settings-repomanager `pkg-config --cflags --libs gtk+-3.0 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g @echo "Install ..." @for FILE_PO in $(wildcard *.po); do \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ @@ -122,6 +123,7 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" @install -dm755 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images} @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}-windows.glade" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css" @install -dm755 -d "${DESTDIR}${PREFIX}/share/${PKGNAME}/images" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "${PKGNAME}-banner.png" diff --git a/com.ublinux.ubl-settings-repomanager.svg b/com.ublinux.ubl-settings-repomanager.svg index f636c26..add01b7 100644 --- a/com.ublinux.ubl-settings-repomanager.svg +++ b/com.ublinux.ubl-settings-repomanager.svg @@ -4,8 +4,8 @@ height="180" version="1.0" id="svg8" - sodipodi:docname="ublinux-ubconfig.svg" - inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)" + sodipodi:docname="ubl-settings-repomanager.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" inkscape:export-filename="/media/Data/ShareMX/temp/archtoub_icons/ublinux-logo.png" inkscape:export-xdpi="136.53334" inkscape:export-ydpi="136.53334" @@ -2225,11 +2225,11 @@ + gradientTransform="matrix(3.779602,0,0,3.779602,-193.72728,-7.0470659)"> + + + + + + + + + + + + + + + + + + + + id="filter104568" + x="-0.16132975" + y="-0.15932729" + width="1.2893327" + height="1.2869388"> + id="feFlood104558" /> + id="feComposite104560" /> + id="feGaussianBlur104562" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="feOffset32783-4" /> + id="feComposite32785-3" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:current-layer="layer3"> + + + inkscape:label="ubinstall_gui" + style="display:none"> - + id="g2035" + transform="matrix(1.7064512,0,0,1.7064512,182.08962,45.305852)" + style="filter:url(#filter104568)"> + + + + + + + + + + + + + cx="4.7361059" + cy="12.475146" + r="3.9282389" + fill="url(#linearGradient3529)" + stroke-width="0.927939" + id="circle34" + style="fill:url(#linearGradient3529)" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cx="4.7361059" + cy="12.475146" + r="3.9282389" + fill="url(#linearGradient3529)" + stroke-width="0.927939" + id="circle34-6" + style="fill:url(#linearGradient3529-4)" /> + diff --git a/source/ubl-cmake.h b/source/ubl-cmake.h new file mode 120000 index 0000000..967149f --- /dev/null +++ b/source/ubl-cmake.h @@ -0,0 +1 @@ +/home/superadmin/Документы/ubl-settings-repomanager/compile/ubl-cmake.h \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 647733f..ff794a9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -98,7 +98,281 @@ void on_about(){ gtk_widget_show(window); } +void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); + GtkTreeIter *iter=NULL; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,iter)){ + char *codeName,*branch,*version,*architecture,*components,*signature,*ipAdress,*port; + int serverType=0,trusted=0,published=0; + gtk_tree_model_get(model,iter,3,&codeName,4,&branch,5,&version,6,&architecture,7,&components,8,&signature,9,&trusted,10,&serverType,11,&ipAdress,12,&port,13,published,-1); + // gtk_label_set_text(GTK_LABEL(widgets->srgbe),) + } +} + +int yon_add_branches(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, void *dct){ + printf("%d\n",1); + dictionary *dict=(dictionary*)dct; + 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*); + char *name=NULL; + gtk_tree_model_get(model,iter,0,&name,-1); + if(name){ + printf("%s\n",name); + GtkTreeIter ITER,iters; + if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&ITER)){ + gtk_tree_store_append(main_config.tree_store,&iters,&ITER); + gtk_tree_store_set(main_config.tree_store,&iters,1,name,-1); + } + } + return 0; +} + +void on_repo_add_new(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*); + char *name = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry))); + if (!name||strcmp(name,"")!=0){ + on_close_subwindow(self); + GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); + gtk_tree_store_set(main_config.tree_store,iter,2,window->BranchesListStore,-1); + gtk_tree_model_foreach(GTK_TREE_MODEL(window->BranchesListStore),yon_add_branches,dict); + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } else { + yon_ubl_status_box_render(EMPTY_NAME_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } +} + +void on_branch_add(GtkCellRendererText *self, char*path,char *new_text, repo_create_window *window){ + if (new_text&&strcmp(new_text,"")!=0){ + GtkTreeIter iter; + gboolean used, use=1; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->BranchesListStore),&iter,path); + gtk_tree_model_get(GTK_TREE_MODEL(window->BranchesListStore),&iter,1,&used,-1); + used; + gtk_list_store_set(window->BranchesListStore,&iter,0,new_text,1,&use,-1); + if (used==0) + gtk_list_store_append(window->BranchesListStore,&iter); + + } +} + +void on_repo_new (GtkWidget *self, main_window *widgets){ + GtkBuilder *builder = gtk_builder_new_from_file(glade_repo_path); + repo_create_window *window = new(repo_create_window); + window->Window=yon_gtk_builder_get_widget(builder,"repoCreateWindow"); + window->NameEntry=yon_gtk_builder_get_widget(builder,"repoNameEntry"); + window->CancelButton=yon_gtk_builder_get_widget(builder,"repoCancelButton"); + window->SaveButton=yon_gtk_builder_get_widget(builder,"repoSaveButton"); + window->BranchesTree=yon_gtk_builder_get_widget(builder,"curRepoEditTree"); + window->BranchCell=GTK_CELL_RENDERER(gtk_builder_get_object(builder,"branchTextCell")); + window->BranchesListStore=GTK_LIST_STORE(gtk_builder_get_object(builder,"curRepoEditList")); + gtk_widget_show(window->Window); + GtkTreeIter iter; + gtk_list_store_append(window->BranchesListStore,&iter); + dictionary *dict = yon_dictionary_create_with_data("",widgets); + dict = yon_dictionary_create_with_data_connected(dict,"",window); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(window->BranchCell),"placeholder-text",val); + g_value_set_string(val,TYPE_BRANCH_NAME_LABEL); + g_object_set_property(G_OBJECT(window->BranchCell),"placeholder-text",val); + g_signal_connect(G_OBJECT(window->BranchCell),"edited",G_CALLBACK(on_branch_add),window); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_repo_add_new),dict); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); +} + +void on_repo_add_file(GtkWidget *self, main_window *widgets){ + yon_add_file(widgets); +} + +void on_repo_remove_package(GtkWidget *self, main_window *widgets){ + yon_repo_remove_package(widgets); +} + +void on_repo_remove(GtkWidget *self, main_window *widgets){ + yon_repo_remove(widgets); +} + +void on_repo_configure(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)){ + GtkBuilder *builder = gtk_builder_new_from_file(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_create_with_data("",widgets); + dict = yon_dictionary_create_with_data_connected(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); + // GtkListStore *branches; + // gtk_tree_model_get(model,&iter,2,branches,-1); + // gtk_tree_view_set_model(GTK_TREE_VIEW(window->BranchesTree),GTK_TREE_MODEL(branches)); + } 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; + 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 *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); + gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1); + } + on_close_subwindow(self); +} + +void on_repo_load_local(GtkWidget *self, 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); + int res = gtk_dialog_run(GTK_DIALOG(chooser)); + if (res==GTK_RESPONSE_ACCEPT){ + + char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + while (1){ + char *ret = yon_char_divide_search(filename,"/",-1); + if (strcmp(ret,filename)==0) break; + } + 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; + GdkPixbuf *icon = NULL; + GtkIconTheme *theme = gtk_icon_theme_get_default(); + 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){ + icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + gtk_tree_store_append(main_config.tree_store,&iter,NULL); + gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&iter); + } + else if (type==YON_REPO_LINE_BRANCH_TYPE){ + icon = NULL; + if (gtk_tree_model_iter_parent(model,&iter,&parentIter)){ + GtkTreeIter branch; + if (!gtk_tree_model_iter_parent(model,&branch,&iter)){ + gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); + gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&iter); + } else { + gtk_tree_store_append(main_config.tree_store,&iter,&branch); + gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&iter); + } + } else { + gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); + gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&iter); + } + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } + + else if (type==YON_REPO_LINE_FILE_TYPE){ + icon = gtk_icon_theme_load_icon_for_scale(theme,"network-server-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + if (gtk_tree_model_iter_parent(model,&iter,&parentIter)){ + GtkTreeIter branch; + if (gtk_tree_model_iter_parent(model,&branch,&iter)){ + GtkTreeIter repo; + if (!gtk_tree_model_iter_parent(model,&repo,&branch)){ + gtk_tree_store_append(main_config.tree_store,&branch,&iter); + gtk_tree_store_set(main_config.tree_store,&branch,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&branch); + } + } else { + gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); + gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&iter); + } + yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } else yon_ubl_status_box_render(CHOOSE_BRANCH_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); + } + else if (type==YON_REPO_LINE_REPO_TYPE){ + icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + gtk_tree_store_append(main_config.tree_store,&iter,NULL); + gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + retIter = gtk_tree_iter_copy(&iter); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); + } else { + yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } + return retIter; +} + +void yon_repo_remove_package(main_window *widgets){ + 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)){ + GtkTreeIter parentparent; + if (gtk_tree_model_iter_parent(model,&parentparent,&iterparent)){ + 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; + 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){ + 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_REPO_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); +} + +void yon_repo_configure(main_window *widgets){ + GtkBuilder *builder = gtk_builder_new_from_file(glade_repo_path); + 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)){ + GtkTreeIter parentparent; + if (gtk_tree_model_iter_parent(model,&parentparent,&iterparent)){ + 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_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); + int res = gtk_dialog_run(GTK_DIALOG(chooser)); + if (res==GTK_RESPONSE_ACCEPT){ + + char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + while (1){ + char *ret = yon_char_divide_search(filename,"/",-1); + if (strcmp(ret,filename)==0) break; + } + yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); + } + on_close_subwindow(chooser); + + +} + + + /* 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; @@ -182,6 +456,7 @@ main_window *setup_window(){ 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,"SignatureInfoLabel"); + main_config.tree_store = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); if (main_config.lock_load_global == 1){ gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0); @@ -203,49 +478,17 @@ main_window *setup_window(){ 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); /* Localisation | Локализация */ - gtk_label_set_text(GTK_LABEL(widgets->HatLabel),TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->SaveLabel),SAVE_LABEL); - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->SaveMenuItem),SAVE_CONFIGURATION_LABEL); - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->SaveGlobalMenuItem),SAVE_GLOBAL_LABEL); - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->SaveLocalMenuItem),SAVE_LOCAL_LABEL); - - gtk_label_set_text(GTK_LABEL(widgets->LoadLabel),LOAD_LABEL); - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->LoadGlobalMenuItem),LOAD_GLOBAL_LABEL); - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->LoadLocalMenuItem),LOAD_LOCAL_LABEL); - - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->DocumentationMenuItem),DOCUMENTATION_LABEL); - gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->AboutMenuItem),ABOUT_LABEL); - - - gtk_label_set_text(GTK_LABEL(widgets->GeneralTabLabel),GENERAL_TAB_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->PublicationTabLabel),PUBLICATION_TAB_LABEL); + gtk_widget_show_all(widgets->Window); - gtk_label_set_text(GTK_LABEL(widgets->CodeNameLabel),CODE_NAME_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->BranchLabel),BRANCH_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->VersionLabel),VERSION_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->ArchitectureLabel),ARCHITECRURE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->ComponentsLabel),COMPONENTS_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->SignatureLabel),SIGNATURE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->ServerTypeLabel),SERVER_TYPE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->IpAdressLabel),IP_ADRESS_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->PortLabel),PORT_LABEL); - - gtk_button_set_label(GTK_BUTTON(widgets->TrustedRepoCheck),TRUSTED_LABEL); - - gtk_widget_set_tooltip_markup(widgets->CreateButton,CREATE_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->LoadFromNetButton,OPEN_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->ConfigureButton,CONFIGURE_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->DeleteButton,DELETE_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->LoadFromLocalButton,ADD_REMOVE_LOCAL_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->SwitchPublishButton,ENABLE_DISABLE_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->CheckDependencesButton,CHECK_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->SignButton,SIGN_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->AddPackageButton,ADD_PACKAGE_REPO_LABEL); - gtk_widget_set_tooltip_markup(widgets->RemovePackageButton,REMOVE_PACKAGE_REPO_LABEL); - gtk_widget_show_all(widgets->Window); return widgets; } diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index ddf5c4a..3e6fa30 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -19,6 +19,7 @@ #define _(String) gettext(String) #define glade_path "/usr/share/ubl-settings-repomanager/ui/ubl-settings-repomanager.glade" +#define glade_repo_path "/usr/share/ubl-settings-repomanager/ui/ubl-settings-repomanager-windows.glade" #define banner_path "/usr/share/ubl-settings-repomanager/images/ubl-settings-repomanager-banner.png" #define CssPath "/usr/share/ubl-settings-repomanager/css/ubl-settings-repomanager.css" @@ -30,6 +31,7 @@ string version_application; char *local; typedef struct { + GtkTreeStore *tree_store; int always_open_documentation; int win_pos_x; int win_pos_y; @@ -113,6 +115,16 @@ typedef struct { GtkWidget *Finder; } main_window; +typedef struct { + GtkWidget *Window; + GtkWidget *NameEntry; + GtkWidget *BranchesTree; + GtkWidget *CancelButton; + GtkWidget *SaveButton; + GtkCellRenderer *BranchCell; + + GtkListStore *BranchesListStore; +} repo_create_window; typedef struct { GtkWidget *Window; @@ -126,5 +138,15 @@ typedef struct { GtkWidget *AcceptButton; } documentation_confirmation_window; - -main_window *setup_window(); \ No newline at end of file +typedef enum { + YON_REPO_LINE_REPO_TYPE, + YON_REPO_LINE_FILE_TYPE, + YON_REPO_LINE_BRANCH_TYPE +} YON_REPO_LINE_TYPE; + +main_window *setup_window(); +void yon_add_file(main_window *widgets); +GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYPE type); +void yon_repo_remove_package(main_window *widgets); +void yon_repo_remove(main_window *widgets); +void on_repo_configure_done(GtkWidget *self, dictionary *dict); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index cdea169..f32e589 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -53,4 +53,17 @@ #define CHECK_REPO_LABEL _("Check dependences") #define SIGN_REPO_LABEL _("Sign ripository") #define ADD_PACKAGE_REPO_LABEL _("Add package") -#define REMOVE_PACKAGE_REPO_LABEL _("Remove package") \ No newline at end of file +#define REMOVE_PACKAGE_REPO_LABEL _("Remove package") +#define OPEN_LABEL _("Open") + +#define OPERATION_DONE_LABEL _("Operation done") + +#define CHOOSE_BRANCH_PACK_LABEL _("Choose branch or pack in branch to add file!") +#define CHOOSE_REPO_BRANCH_LABEL _("Choose repository or branch!") +#define CHOOSE_PACK_LABEL _("Choose pack to delete!") +#define CHOOSE_REPO_LABEL _("Choose repository to delete!") + +#define NAME_LABEL _("Name:") +#define BRANCHES_LABEL _("Branches:") +#define TYPE_BRANCH_NAME_LABEL _("< Type branch name >") +#define EMPTY_NAME_LABEL _("Name must be filled!") \ No newline at end of file diff --git a/source/ubl-utils.h b/source/ubl-utils.h index 8de7531..5b7eb82 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -29,6 +29,9 @@ #define yon_ubl_save_global_config(command) yon_config_save(command) #define yon_ubl_save_local_config(command) yon_config_save(command) +#define for_liststore_each(liststore) GtkTreeIter iter;\ +for (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore),&iter);gtk_list_store_iter_is_valid(liststore,&iter);gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore),&iter)) + typedef enum { #ifdef __GTK_H__ diff --git a/ubl-settings-repomanager b/ubl-settings-repomanager new file mode 100755 index 0000000000000000000000000000000000000000..94d87e07a5aeb58464b551724f0568da8b26b4d8 GIT binary patch literal 116392 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 SUhmZZ=L0HvQ=w4YR{sNf#cX;2 literal 0 HcmV?d00001 diff --git a/ubl-settings-repomanager-windows.glade b/ubl-settings-repomanager-windows.glade new file mode 100644 index 0000000..b94c777 --- /dev/null +++ b/ubl-settings-repomanager-windows.glade @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + 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 + 5 + + + True + False + Branches: + 0 + + + False + True + 0 + + + + + False + True + 1 + + + + + True + False + 5 + + + True + True + never + in + + + True + False + + + True + 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 + True + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + + + 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 + + + True + False + Branches: + 0 + + + False + True + 0 + + + + + False + True + 1 + + + + + True + False + 5 + + + True + True + never + in + + + True + False + + + True + True + curRepoEditList + False + 0 + False + + + + + + 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 + + + + + + + True + False + True + + + True + False + Repository manager + + + + + + + + True + False + 32 + com.ublinux.ubl-settings-repomanager + + + + + + diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 4f02288..f680b6c 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -192,10 +192,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + - + + + @@ -682,9 +684,11 @@ translated and supported by community. True True + 40 edit-find-symbolic False False + name False @@ -726,6 +730,7 @@ translated and supported by community. True True True + Create repository image1 @@ -384,7 +407,9 @@ 0 False - + + none + diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index f680b6c..6554636 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -210,11 +210,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False document-new-symbolic - - True - False - document-edit-symbolic - True False @@ -225,11 +220,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False value-decrease-symbolic - - True - False - edit-copy-symbolic - True False @@ -245,21 +235,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False user-trash-symbolic - - True - False - system-shutdown-symbolic - - - True - False - document-send-symbolic - - - True - False - emblem-synchronizing-symbolic - True False @@ -804,86 +779,6 @@ translated and supported by community. 5 - - - True - True - True - Add/Remove repository from -local package sources - image6 - - - - False - True - 6 - - - - - True - True - True - Enable/disable repository publish - image5 - - - - False - True - 7 - - - - - True - False - - - False - True - 8 - - - - - True - True - True - Check dependences - image7 - - - - False - True - 9 - - - - - True - True - True - Sign ripository - image10 - - - - False - True - 10 - - True @@ -999,499 +894,6 @@ local package sources 0 - - - True - True - - - True - False - 5 - 5 - 5 - 5 - vertical - 5 - - - True - False - 20 - - - True - False - Code name: - 0 - - - - - - False - True - 0 - - - - - True - False - extend - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - 20 - - - True - False - Branch: - 0 - - - - - - False - True - 0 - - - - - True - False - stable - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 20 - - - True - False - Version: - 0 - - - - - - False - True - 0 - - - - - True - False - 2204 - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - 20 - - - True - False - Architecture: - 0 - - - - - - False - True - 0 - - - - - True - False - amd64 - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - 20 - - - True - False - Components: - 0 - - - - - - False - True - 0 - - - - - True - False - main contrib non-free - - - False - True - 1 - - - - - False - True - 4 - - - - - True - False - 20 - - - True - False - Signature: - 0 - - - - - - False - True - 0 - - - - - True - False - signed - - - False - True - 1 - - - - - False - True - 5 - - - - - - - True - False - General - - - False - - - - - True - False - 5 - 5 - 5 - 5 - vertical - 5 - - - Trusted repository - True - True - False - start - True - - - False - True - 0 - - - - - True - False - 5 - - - True - False - Server type: - 0 - - - False - True - 0 - - - - - True - False - 0 - - HTML - local - - - - False - True - 1 - - - - - False - True - 1 - - - - - True - False - 5 - - - True - False - IP adress: - 0 - - - False - True - 0 - - - - - True - False - 0 - True - - 192.168.1.110 - - - - False - 192.168.1.110 - - - - - False - True - 1 - - - - - False - True - 2 - - - - - True - False - 5 - - - True - False - Port: - 0 - - - False - True - 0 - - - - - True - True - adjustment1 - - - False - True - 1 - - - - - False - True - 3 - - - - - True - False - 5 - - - True - False - True - - - True - True - 0 - - - - - True - True - True - image13 - - - - False - True - 1 - - - - - False - True - 4 - - - - - Publish - True - True - True - start - - - False - True - 5 - - - - - 1 - - - - - True - False - Publication - - - 1 - False - - - - - True - True - 1 - - True @@ -1685,28 +1087,4 @@ local package sources - - - - - - - - - - - - - - - - - - - - - - - - From fde061970a292d98947b2f5ef23e8f5e4b5d0a77 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:38:51 +0600 Subject: [PATCH 05/35] Added new icon for package --- ...settings-repomanager.document-symbolic.svg | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 com.ublinux.ubl-settings-repomanager.document-symbolic.svg diff --git a/com.ublinux.ubl-settings-repomanager.document-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-symbolic.svg new file mode 100644 index 0000000..a0b2a8d --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-symbolic.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + From b2e6c5075c4547f0001f1ed86ea35d85f32c2979 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:42:50 +0600 Subject: [PATCH 06/35] Design changes --- ubl-settings-repomanager | Bin 234056 -> 0 bytes ubl-settings-repomanager-windows.glade | 4 - ubl-settings-repomanager.glade | 590 +++++++++++++++++++++++-- 3 files changed, 562 insertions(+), 32 deletions(-) delete mode 100755 ubl-settings-repomanager diff --git a/ubl-settings-repomanager b/ubl-settings-repomanager deleted file mode 100755 index 5e0244fd566d95b85437031b356d43d969f100d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234056 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⋙$>BLf$4Vx*y>BrU91oAb^l;5e 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 diff --git a/ubl-settings-repomanager-windows.glade b/ubl-settings-repomanager-windows.glade index 4c03776..152f804 100644 --- a/ubl-settings-repomanager-windows.glade +++ b/ubl-settings-repomanager-windows.glade @@ -118,7 +118,6 @@ 5 - True False Branches: 0 @@ -153,7 +152,6 @@ False - True True curRepoEditList False @@ -365,7 +363,6 @@ 5 - True False Branches: 0 @@ -400,7 +397,6 @@ False - True True curRepoEditList False diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 6554636..ce0e3d4 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -193,11 +193,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - + + + + + @@ -220,6 +224,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False value-decrease-symbolic + + True + False + edit-copy-symbolic + True False @@ -228,7 +237,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False - preferences-other-symbolic + system-run-symbolic True @@ -835,34 +844,48 @@ translated and supported by community. 5 5 - + True True - RepoStore - False - treeviewcolumn2 - - - + in - - column - - - - - column - - - - 0 - - + + True + False - - - 1 - + + True + True + RepoStore + False + treeviewcolumn2 + 0 + + + + + + column + + + + + column + + + + 0 + + + + + + 1 + + + + + @@ -880,6 +903,505 @@ translated and supported by community. 1 + + + True + True + False + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + 5 + + + True + False + 20 + + + True + False + Code name: + 0 + + + + + + False + True + 0 + + + + + True + False + extend + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 20 + + + True + False + Branch: + 0 + + + + + + False + True + 0 + + + + + True + False + stable + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + 20 + + + True + False + Version: + 0 + + + + + + False + True + 0 + + + + + True + False + 2204 + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + 20 + + + True + False + Architecture: + 0 + + + + + + False + True + 0 + + + + + True + False + amd64 + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + 20 + + + True + False + Components: + 0 + + + + + + False + True + 0 + + + + + True + False + main contrib non-free + + + False + True + 1 + + + + + False + True + 4 + + + + + True + False + 20 + + + True + False + Signature: + 0 + + + + + + False + True + 0 + + + + + True + False + signed + + + False + True + 1 + + + + + False + True + 5 + + + + + + + True + False + General + + + False + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + 5 + + + Trusted repository + True + True + False + start + True + + + False + True + 0 + + + + + True + False + 5 + + + True + False + Server type: + 0 + + + False + True + 0 + + + + + True + False + 0 + + HTML + local + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + 5 + + + True + False + IP adress: + 0 + + + False + True + 0 + + + + + True + False + 0 + True + + 192.168.1.110 + + + + True + 192.168.1.110 + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + 5 + + + True + False + Port: + 0 + + + False + True + 0 + + + + + True + True + 0 + adjustment1 + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + 5 + + + True + False + True + + + True + True + 0 + + + + + True + True + True + image13 + + + + False + True + 1 + + + + + False + True + 4 + + + + + Publish + True + True + True + start + + + False + True + 5 + + + + + 1 + + + + + True + False + Publication + + + 1 + False + + + + + True + True + 2 + + True @@ -957,7 +1479,6 @@ translated and supported by community. False - True True False True @@ -1019,9 +1540,23 @@ translated and supported by community. False True + end 1 + + + Save + True + True + True + + + False + True + 2 + + end @@ -1030,7 +1565,6 @@ translated and supported by community. - True False From 30b1ced97d655f888bb2d7dde6e58131ffa72822 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:43:15 +0600 Subject: [PATCH 07/35] Repomanager back --- ubl-settings-repo-back/Makefile | 146 ++++++++++++++++++ .../com.ublinux.ubl-settings-repo-back.policy | 24 +++ ubl-settings-repo-back/source/CMakeLists.txt | 31 ++++ .../source/ubl-settings-repo-back.c | 141 +++++++++++++++++ .../source/ubl-settings-repo-back.h | 32 ++++ ubl-settings-repo-back/source/ubl-strings.h | 1 + ubl-settings-repo-back/ubl-settings-repo-back | Bin 0 -> 21832 bytes 7 files changed, 375 insertions(+) create mode 100644 ubl-settings-repo-back/Makefile create mode 100644 ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy create mode 100644 ubl-settings-repo-back/source/CMakeLists.txt create mode 100644 ubl-settings-repo-back/source/ubl-settings-repo-back.c create mode 100644 ubl-settings-repo-back/source/ubl-settings-repo-back.h create mode 100644 ubl-settings-repo-back/source/ubl-strings.h create mode 100755 ubl-settings-repo-back/ubl-settings-repo-back diff --git a/ubl-settings-repo-back/Makefile b/ubl-settings-repo-back/Makefile new file mode 100644 index 0000000..f84e9df --- /dev/null +++ b/ubl-settings-repo-back/Makefile @@ -0,0 +1,146 @@ +#!/usr/bin/make -f + +#SHELL := /bin/bash +MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST))) +MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH)))) +MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) + +CMAKE_COMMAND = cmake +CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source +CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile +#CMAKE_SOURCE_DIR = ./source +#CMAKE_BUILD_DIR = ./compile +DEPENDS = /bin/cmake +PREFIX ?= /usr +PKGNAME = $(MAKEFILE_DIR) +#PKGNAME = ubl-settings-manager +LATEST_TAG= +default_target: all + +.PHONY: all init depend debug prepare check build uninstall install clean help + +all: init build + +init: + @echo "Initialize ..."; \ + if [ -d ".git" ]; then \ + LATEST_TAG=$$(git describe --tags | sed 's/^v//'|grep -oE "^[0-9]{1,}.[0-9]{1,}"); \ + else \ + LATEST_TAG="0.0"; \ + fi; \ + sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.h; \ + echo "-- Build path: ${CMAKE_BUILD_DIR}" + +depend: + @echo "Check depends ..." + @for FILE_DEPEND in $(DEPENDS); do \ + if [ ! -f $${FILE_DEPEND} ]; then \ + echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \ + exit 1; \ + fi; \ + done; \ + echo "Check depends: OK" +# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 + +debug: init build + @echo "Debug ..."; \ + if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ + fi; \ + echo "${CMAKE_BUILD_DIR}/${PKGNAME}"; \ + cp ${CMAKE_BUILD_DIR}/${PKGNAME} ./; \ + echo "Debug: OK" + +prepare: + @echo "Prepare ..."; \ + if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ + fi; \ + echo "Prepare: OK" + +check: + @echo "Check ..."; \ + if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \ + echo "Check: OK"; \ + else \ + echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \ + exit 1; \ + fi + +build: depend prepare + @echo "Build ..."; \ + make --directory=${CMAKE_BUILD_DIR}; \ + echo "Build: OK" + +uninstall: + @echo "Uninstall ..." + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + $(RM) "$${PATH_FILE_MO}"; \ + done + @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" + @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ + fi + @echo "Uninstall: OK" + +install: check uninstall + @echo "Install ..." +#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ + @gcc source/ubl-settings-repo-back.c source/ubl-settings-repo-back.h source/ubl-strings.h -o ubl-settings-repo-back `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g +#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + echo "$${FILE_PO}"; \ + msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ + done + @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" + @install -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" + @install -dm755 "${DESTDIR}/etc/xdg" + @install -dm755 "${DESTDIR}${PREFIX}/share/applications" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ + fi + @echo "Install: OK" + @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ + +clean: + @echo "Clean ..." + @$(RM) -rd ${CMAKE_BUILD_DIR} + @if [ -d ${CMAKE_BUILD_DIR} ]; then \ + echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ + else \ + echo "Clean: OK"; \ + fi + +up_ver: + @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ + MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ + MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ + VER="$${MAJOR}.$$(($${MINOR}+1))"; \ + sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ + echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" + +help: + @echo "The following are some of the valid targets for this Makefile:"; \ + echo "... all (the default if no target is provided)"; \ + echo "... init"; \ + echo "... debug"; \ + echo "... prepare"; \ + echo "... compile"; \ + echo "... install"; \ + echo "... uninstall"; \ + echo "... clean"; \ + echo "... up_ver" diff --git a/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy b/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy new file mode 100644 index 0000000..2dd9623 --- /dev/null +++ b/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy @@ -0,0 +1,24 @@ + + + + + UBLinux + https://ublinux.ru + + + Run ubl-settings-repo-back as root + Запуск утилиты ubl-settings-repo-back с правами root + Authentication is required to run ubl-settings-repo-back + Требуется авторизация для запуска утилиты ubl-settings-repo-back с правами root + + auth_admin + auth_admin + auth_admin + + /usr/bin/ubl-settings-repo-back + true + + + diff --git a/ubl-settings-repo-back/source/CMakeLists.txt b/ubl-settings-repo-back/source/CMakeLists.txt new file mode 100644 index 0000000..9ed448b --- /dev/null +++ b/ubl-settings-repo-back/source/CMakeLists.txt @@ -0,0 +1,31 @@ +cmake_minimum_required(VERSION 3.7) +project(ubl-settings-repo-back) + +find_package(PkgConfig REQUIRED) + +pkg_check_modules(GTK REQUIRED glib-2.0) +include_directories(${GTK_INCLUDE_DIRS}) +link_directories(${GTK_LIBRARY_DIRS}) +add_definitions(${GTK_CFLAGS_OTHER}) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ + -O2 -pipe -fno-plt -fexceptions \ + -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ + -fstack-clash-protection -fcf-protection") + + +set(SOURCE_FILES + ubl-settings-repo-back.c + ubl-settings-repo-back.h + # ubl-strings.h + ) + +set(LIBRARIES + ${GTK_LIBRARIES} + pthread) + + +add_executable(${PROJECT_NAME} ${SOURCE_FILES}) +target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES}) +target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR}) +install(TARGETS ${PROJECT_NAME} DESTINATION bin) \ No newline at end of file diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.c b/ubl-settings-repo-back/source/ubl-settings-repo-back.c new file mode 100644 index 0000000..f8a7dee --- /dev/null +++ b/ubl-settings-repo-back/source/ubl-settings-repo-back.c @@ -0,0 +1,141 @@ +#include "ubl-settings-repo-back.h" + + +dict_simple *yon_dict_new(){ + dict_simple *dict = (dict_simple*)malloc(sizeof(dict_simple)); + dict->first=dict; + dict->next=NULL; + dict->data=NULL; + return dict; +} + +dict_simple *yon_dict_append(dict_simple *dictionary_to_append){ + dict_simple *dict = (dict_simple*)malloc(sizeof(dict_simple)); + dictionary_to_append->next=dict; + dict->first=dictionary_to_append->first; + dict->next=NULL; + dict->data=NULL; + return dict; +} + +repo_operation *yon_operation_new(){ + repo_operation *operation = (repo_operation*)malloc(sizeof(repo_operation)); + operation->package_add=NULL; + operation->package_remove=NULL; + operation->rename=NULL; + operation->target=NULL; + operation->create=0; + return operation; +} + +char *yon_string_append(char *source, char *append){ + int size = (strlen(source)+strlen(append)+2); + char *n_source = (char*)malloc(sizeof(char)*size); + memset(n_source,0,size); + memcpy(n_source,source,strlen(source)); + memcpy(n_source+strlen(source)," ",1); + memcpy(n_source+strlen(source)+1,append,strlen(append)); + return n_source; +} + +char *yon_string_copy(char *string){ + if (string){ + char *str = malloc(sizeof(char)*strlen(string)+1); + memset(str,0,strlen(string)+1); + memcpy(str,string,strlen(string)); + return str; + } else return NULL; +} + +char *yon_string_find_last(char *source, char *find){ + + for (char *found = strstr(source,find);found;found=strstr(found,find)){ + if (found); + } +} + +int yon_repo_proceed(int argc, char *argv[]){ + int option_index=0; + int show_help=0; + { + struct option long_options[] = { + {"repo-new", 1, 0, 1}, + {"package-add", 1, 0, 2}, + {"package-remove", 1, 0, 3}, + {"repo-rename", 1, 0, 4}, + {"origin", 1, 0, 'o'}, + { NULL, 0, NULL, 0 } + }; + dict_simple *dict = yon_dict_new(); + repo_operation *operation = yon_operation_new(); + dict->data=(void*)operation; + #define curpack(dict) ((repo_operation*)dict->data) + for (int i=0;ipackage_add = yon_string_append(curpack(dict)->package_add,yon_string_copy(optarg)); + break; + case 3: curpack(dict)->package_remove = yon_string_append(curpack(dict)->package_add,yon_string_copy(optarg)); + break; + case 4: curpack(dict)->rename=yon_string_copy(optarg); + case 1: + if (!((repo_operation*)dict->data)->target) ((repo_operation*)dict->data)->target=yon_string_copy(optarg); + else { + dict = yon_dict_append(dict); + operation = yon_operation_new(); + dict->data=(void*)operation; + ((repo_operation*)dict->data)->target=yon_string_copy(optarg); + } + ((repo_operation*)dict->data)->create=1; + break; + case 'o': + if (!((repo_operation*)dict->data)->target) ((repo_operation*)dict->data)->target=yon_string_copy(optarg); + else { + dict = yon_dict_append(dict); + operation = yon_operation_new(); + dict->data=(void*)operation; + ((repo_operation*)dict->data)->target=yon_string_copy(optarg); + } + break; + case '?': printf("%s: %c\n",UNKNOWN_ARGUMENT_LABEL,argument); + break; + } + } + for (dict_simple *dct=dict->first;dct;dct=dct->next){ + if (curpack(dct)->target){ + if (curpack(dct)->create){ + GKeyFile *file = g_key_file_new(); + g_key_file_load_from_file(file,"/etc/pacman.conf",G_KEY_FILE_KEEP_COMMENTS,NULL); + g_key_file_set_string(file,curpack(dct)->target,"Server",curpack(dct)->target); + char *command = yon_string_append("repo-add ",curpack(dct)->target); + if (curpack(dct)->package_add){ + command = yon_string_append(command," "); + command = yon_string_append(command,curpack(dct)->package_add); + } + system(command); + + } else if (curpack(dct)->package_remove){ + char *command = yon_string_append("repo-remove ",curpack(dct)->target); + command = yon_string_append(command," "); + command = yon_string_append(command,curpack(dct)->package_remove); + system(command); + } + if (curpack(dct)->package_add){ + char *command = yon_string_append("repo-add ",curpack(dct)->target); + command = yon_string_append(command," "); + command = yon_string_append(command,curpack(dct)->package_add); + } + system(command); + + + } + } + } +} + +int main(int argc, char *argv[]){ + char *local=setlocale(LC_ALL, ""); + textdomain (LocaleName); + yon_repo_proceed(argc, argv); + +} diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.h b/ubl-settings-repo-back/source/ubl-settings-repo-back.h new file mode 100644 index 0000000..fcc8d86 --- /dev/null +++ b/ubl-settings-repo-back/source/ubl-settings-repo-back.h @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "ubl-strings.h" + +#define LocaleName "ubl-settings-repo-back" + + +#define _(String) gettext(String) + +typedef struct { + char *target; + char *package_add; + char *package_remove; + char *rename; + int create; + +} repo_operation; + +typedef struct { + struct dict_simple *first; + struct dict_simple *next; + void *data; +} dict_simple; + +char *yon_string_append(char *source, char *append); +char *yon_string_copy(char *string); \ No newline at end of file diff --git a/ubl-settings-repo-back/source/ubl-strings.h b/ubl-settings-repo-back/source/ubl-strings.h new file mode 100644 index 0000000..290f02c --- /dev/null +++ b/ubl-settings-repo-back/source/ubl-strings.h @@ -0,0 +1 @@ +#define UNKNOWN_ARGUMENT_LABEL _("Unknown argument has been given") \ No newline at end of file diff --git a/ubl-settings-repo-back/ubl-settings-repo-back b/ubl-settings-repo-back/ubl-settings-repo-back new file mode 100755 index 0000000000000000000000000000000000000000..28783d805f095677b4fd97de885378ea367ccade GIT binary patch literal 21832 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 literal 0 HcmV?d00001 From ac897539dbec07e8b584850da3ed47c3a6ac92ee Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:44:21 +0600 Subject: [PATCH 08/35] Fucntions edits for new design --- source/ubl-settings-repomanager.c | 79 ++++++++++--------------------- source/ubl-settings-repomanager.h | 3 +- 2 files changed, 28 insertions(+), 54 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 6255b16..0043e02 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -134,8 +134,8 @@ void on_repo_add_new(GtkWidget *self, dictionary *dict){ if (!name||strcmp(name,"")!=0){ on_close_subwindow(self); GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); - gtk_tree_store_set(main_config.tree_store,iter,2,window->BranchesListStore,-1); - gtk_tree_model_foreach(GTK_TREE_MODEL(window->BranchesListStore),yon_add_branches,dict); + gtk_tree_store_set(main_config.tree_store,iter,2,window->BranchesListStore,3,window->path,-1); + // gtk_tree_model_foreach(GTK_TREE_MODEL(window->BranchesListStore),yon_add_branches,dict); yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } else { yon_ubl_status_box_render(EMPTY_NAME_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -156,17 +156,13 @@ void on_branch_add(GtkCellRendererText *self, char*path,char *new_text, repo_cre } } -void on_choose_repo_folder(main_window *widgets){ +void on_choose_repo_folder(repo_create_window *window){ GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - while (1){ - char *ret = yon_char_divide_search(filename,"/",-1); - if (strcmp(ret,filename)==0) break; - } - yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); + window->path=filename; } on_close_subwindow(chooser); } @@ -193,7 +189,7 @@ void on_repo_new (GtkWidget *self, main_window *widgets){ g_object_set_property(G_OBJECT(window->BranchCell),"placeholder-text",val); g_signal_connect(G_OBJECT(window->BranchCell),"edited",G_CALLBACK(on_branch_add),window); g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_repo_add_new),dict); - g_signal_connect(G_OBJECT(window->repoChooseFolderButton),"clicked",G_CALLBACK(on_choose_repo_folder),widgets); + g_signal_connect(G_OBJECT(window->repoChooseFolderButton),"clicked",G_CALLBACK(on_choose_repo_folder),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); } @@ -236,9 +232,11 @@ void on_repo_configure(GtkWidget *self, main_window *widgets){ 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; + 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 *name = (char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry)); gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1); } @@ -265,60 +263,41 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP GtkTreeIter iter,parentIter; GdkPixbuf *icon = NULL; GtkIconTheme *theme = gtk_icon_theme_get_default(); + char *name_short = yon_char_new(name); + 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){ icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,-1); retIter = gtk_tree_iter_copy(&iter); } - else if (type==YON_REPO_LINE_BRANCH_TYPE){ - icon = NULL; - if (gtk_tree_model_iter_parent(model,&iter,&parentIter)){ - GtkTreeIter branch; - if (!gtk_tree_model_iter_parent(model,&branch,&iter)){ - gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&iter); - } else { - gtk_tree_store_append(main_config.tree_store,&iter,&branch); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&iter); - } - } else { - gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); - retIter = gtk_tree_iter_copy(&iter); - } - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } - else if (type==YON_REPO_LINE_FILE_TYPE){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"network-server-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); - if (gtk_tree_model_iter_parent(model,&iter,&parentIter)){ - GtkTreeIter branch; - if (gtk_tree_model_iter_parent(model,&branch,&iter)){ + GtkTreeIter branch; + icon = gtk_icon_theme_load_icon_for_scale(theme,"follder-documents-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){ GtkTreeIter repo; - if (!gtk_tree_model_iter_parent(model,&repo,&branch)){ - gtk_tree_store_append(main_config.tree_store,&branch,&iter); - gtk_tree_store_set(main_config.tree_store,&branch,0, icon, 1, name,-1); + gtk_tree_store_append(main_config.tree_store,&iter,&branch); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,-1); retIter = gtk_tree_iter_copy(&branch); - } + } else { gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,-1); retIter = gtk_tree_iter_copy(&iter); } yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } else yon_ubl_status_box_render(CHOOSE_BRANCH_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else if (type==YON_REPO_LINE_REPO_TYPE){ icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, icon, 1, name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,-1); retIter = gtk_tree_iter_copy(&iter); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else { @@ -333,12 +312,9 @@ void yon_repo_remove_package(main_window *widgets){ 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)){ - GtkTreeIter parentparent; - if (gtk_tree_model_iter_parent(model,&parentparent,&iterparent)){ 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); - } + }else yon_ubl_status_box_render(CHOOSE_PACK_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } } @@ -375,10 +351,6 @@ void yon_add_file(main_window *widgets){ if (res==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - while (1){ - char *ret = yon_char_divide_search(filename,"/",-1); - if (strcmp(ret,filename)==0) break; - } yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); } on_close_subwindow(chooser); @@ -472,7 +444,8 @@ main_window *setup_window(){ widgets->ComponentsInfoLabel = yon_gtk_builder_get_widget(builder,"ComponentsInfoLabel"); 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,"SignatureInfoLabel"); + widgets->Finder = yon_gtk_builder_get_widget(builder,"RepoFinder"); + widgets->SaveButton = yon_gtk_builder_get_widget(builder,"mainSaveButton"); main_config.tree_store = GTK_TREE_STORE(gtk_builder_get_object(builder,"RepoStore")); if (main_config.lock_load_global == 1){ @@ -503,7 +476,7 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->ConfigureButton),"clicked",G_CALLBACK(on_repo_configure),widgets); /* Localisation | Локализация */ - gtk_widget_show_all(widgets->Window); + gtk_widget_show(widgets->Window); return widgets; diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 51d0176..c12885f 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include "ubl-cmake.h" @@ -113,6 +112,7 @@ typedef struct { GtkWidget *SignatureLabel; GtkWidget *SignatureInfoLabel; GtkWidget *Finder; + GtkWidget *SaveButton; } main_window; typedef struct { @@ -125,6 +125,7 @@ typedef struct { GtkWidget *repoChooseFolderButton; GtkListStore *BranchesListStore; + char *path; } repo_create_window; typedef struct { From 568938e06ebb6f48328e745bfaacdb69cda8640d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:51:52 +0600 Subject: [PATCH 09/35] Makefile edits to allow building backend --- Makefile | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 8fd7e6e..a2bb33c 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,10 @@ check: build: depend prepare @echo "Build ..."; \ make --directory=${CMAKE_BUILD_DIR}; \ - echo "Build: OK" + echo "Build: OK"; \ + cd ubl-settings-repo-back; \ + make ; \ + cd ../ uninstall: @echo "Uninstall ..." @@ -94,6 +97,7 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-symbolic.svg" @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ @@ -104,9 +108,6 @@ uninstall: install: check uninstall @echo "Install ..." -#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ - @gcc source/ubl-cmake.h compile/resources.c compile/ubl-cmake.h source/ubl-settings-repomanager.c source/ubl-settings-repomanager.h source/ubl-strings.h source/ubl-utils.c source/ubl-utils.h -o ubl-settings-repomanager `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g -#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ @for FILE_PO in $(wildcard *.po); do \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ @@ -129,17 +130,24 @@ install: check uninstall @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" @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" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi + fi; \ + cd ./ubl-settings-repo-back; \ + make install; \ + cd ../ @echo "Install: OK" @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." - @$(RM) -rd ${CMAKE_BUILD_DIR} + @$(RM) -rd ${CMAKE_BUILD_DIR}; \ + cd ./ubl-settings-repo-back; \ + make clean; \ + cd ../ @if [ -d ${CMAKE_BUILD_DIR} ]; then \ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ else \ From 7c2de56839962cf3d7bc370445ad031be490f1e1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:52:13 +0600 Subject: [PATCH 10/35] Fixed minor issues --- .../source/ubl-settings-repo-back.c | 2 +- ubl-settings-repo-back/ubl-settings-repo-back | Bin 21832 -> 21976 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.c b/ubl-settings-repo-back/source/ubl-settings-repo-back.c index f8a7dee..c223ca1 100644 --- a/ubl-settings-repo-back/source/ubl-settings-repo-back.c +++ b/ubl-settings-repo-back/source/ubl-settings-repo-back.c @@ -124,8 +124,8 @@ int yon_repo_proceed(int argc, char *argv[]){ char *command = yon_string_append("repo-add ",curpack(dct)->target); command = yon_string_append(command," "); command = yon_string_append(command,curpack(dct)->package_add); - } system(command); + } } diff --git a/ubl-settings-repo-back/ubl-settings-repo-back b/ubl-settings-repo-back/ubl-settings-repo-back index 28783d805f095677b4fd97de885378ea367ccade..072509e2b93a44dbef450faa475ca6195012dcd4 100755 GIT binary patch delta 3352 zcmai03viTI6~6cW`|mT^-E6X(eT3|8NFW^`F9IPUkfZ_TPejZ#p#nush6KrI12Q2p z!m?t&-Hi7H2A@;*5Z_ETt`vYMV-BJ?Gv{*f2W& zGr8xUbH4AKbI*Nj#t+l;N9ev%dOrTZ-^_1Yi1^;Na0e|j?POBjnP{QqH0O9gs#B6j zSt_sLb%)h_!LOXy-d%A058r<5=|gXICq|Tdh3)Y1zvwrb#`Tgm!0C$oM5p0`iPf7E zOLBH8^A=G;qNmQ>O{KKxOQRsVwV1A?6!2Pfd9reJEOH)<& zXUK|>6o^;^?ON<{p+(#5W0Ak6iPwG!i_nILF_1R=ctF5Ku2|#@uXK6BSHLrP3dha1 zp%;I@{1GC`ZC{w!L$wJWBsprB$)*bxm2RZRp4pp4lRw zl|n`>rvC8(T=ZDd_HSI)Z>E;iXxCzmMp#;s-*Q#hPGumV*u7cuDt?- zNS*EWtj|pSi#wP`x%T}u0Jj6OTkg-k^8aKnn#}$kcPYKXkGTC|+-e#VJH9xAhspMX zMcBp3QvrRA+ywKrM_?DgigRcxG?r+QQQJ_}baSjRfYu2pG7 zTD9Q?r3MgTSjKL|Wk!bJ8F?x|6EUKH(uSQnWC3Z%{UorS)`r#VaADB@$fqLtgeW&7 z8XSknXuk$Ag)2PltP_lLNSggWNNsS2Bt9x|sfo`0A%>kf_e#1eH#hCiC<$97tg@tY({R!;mh7A?DU78-J@SxggQqYO zu|<9aXKD9=FUFPw;~ebPtqFV#6GPs5-TuIqvhtq(4dq+9HayzZSGHku z-$v5jvvr_nE7{t!W%InQ?(Tq`ZS8q<^FU94#{=FkQ=hVUJ)|?k-=-T-FUp&#)OL_v zx8zfM0OWblZ-c~3q1{fU+;9P^K1!wPLB0rbJ;*yCcY=HsZtww+gm8VZ$diPyvrt=R zu%jr3ziRk9%bS9;=|SEb^wUuu4f@&boBVLFke2e-f-~ud`~z@&o@W>NXMGbgieHf? ztNpvIIa{v{D#}THmcd9!0fbrx*?gZS9xB>sPK?i8L)jT$qNwa=j2$!a7nv)2FI+g4 zP(Txs%WqUT7alX=Tz+|8khWrL9SCI^3|Tl+ss1qtn}r6aPVMdMCw5*}S>f@amFHmU;BQoQPzNubU#8EoLu7@oncoz! z^ushOU&+FPUWYk-3MRyxkC9@Q8~o7x;+c60*sp?xw%~99hi70QzD^j8b(X7if3=$y za8GrUUTFY_!aJ+EagT~o;fMTAwP(g2D=I9$-Y^QJJ>GYP*2b{dD6d>l5T5+0rz3B| zSvEWYj#@90l=#ab!K$5wEG2#{#NGgJok@DfL+k^vFV2?g*^v209_a9W18)O-Y#4?m z`50G;@7u*3z+UdUBGmIC)&>h-5%ydY`puBl>=G>U7TEEt0f()Zv^ZpfGa<7ljre&Q z!6snRnj`&hhTu+Ia!YPFjj(lZ=qH46c^4 z0BSW2K=LXB=Il*(u{E8Ij;!R*EUci6|9RnDI>K2^5w-D>nz`j4L!S*J0Q38i$l{uz z8MS#*Yh+JCN7Vltuca1BI-9GG)p&yol(2?12+r)mjoCsj?O~mwfAZJ;z+%;+Z zLsR%3z#BS2&6Fqe{W)NNy7 zXIu>)RrBiAS%a$cq`J!Zj=JusT2ZgoA61?8YO`@rEjg-sjL)NRx2iMOs!ISf6THTk z)dJ&Ewe+a!YgJdQMSvf0wcz%n`{cVKbgSBYzc0slQmrCP#}sSt6?G2Gs4<{Yr7&@} zenOWx-Si-(+qtQ^9G+!f*Zf28@c?ezy{{aOtAkkKnMqu3zDwD-K5==u-prme^Y^|` zWD$r#7^!L}NcJ18OU#HF_HG0J&wdkx*j54Ja$*Wvkv&#UnF p+846^CA_F(DLufuIvQBxgZvOEW1u delta 2766 zcmai0eQ;FO6~FhseYWj~Ys4(x6W2ogg!i6q&CY*I+(B~oXpiG&v0*rpUZR3Z~; z4YQsNk z^2e_sD&?mAHK*vP2ncUsMeCktrxg4>Q=uDi%G$z&CWOU?1}=TB&{H=wdvx zr>)wt-Hy!|>Z>lcelYH=u;773O%$1i!R9Qrz!7^B`5KHd052jWMxwrucW z0)DsGzjdkecFie#aK}P=06g<45^4?98~c%N`0tH{N?(Qj(dwD?x(n1Tj+vG)tb?3; z83v8o>ho_~O8vrBq!G?NSO~!F0CxF5**ElI-HT9pjMpHN1{TTS|o{Qe4-nv(Q` z_U|y*mDKcrq6}qp->CbT5fN|Ux+eYyC;?lkhwE|Q{!E<40ciS(s^)jW0K7h(7sYX? zl)Qv}Rz`36iAFY)7l$w|v$!fH14~$!=)>WD^PaEw@4or2zP>Qu9rp8yu>VVh z28G5R$cL|`feWg75amTx9RT^QORD+;$VrfY067oxGRUsKt7-}KsQF`6tp_;;vInH; zvZ{Uu}^KIl<4=xr2W;0w4Cn<(i7E2u@b!`xZ#z9|T2-_#3;qBU3vB+!~^b?Mp;65a>V)Bxd$dUsTFii=J{Mbc3W zFguYW63&ELBG_UP+9)^39mUMYAFF?22yD_48(gPiD%fN>CPP?6qJVQ01Fi{r=q#q- zh?vo1Mvu!$SJ;YWAruTbsmtW>!j;rW5DXk~Kf+4Ni7YqE0$g0T73m7zdYO?lT-ARdBJnPMTdm^)(~>~}1;Ep{*K zh!2aANzpAmgQBEU3~dz~q_bjZQgli`7t79y&Yy{$V7OyatY{MJ!Q3QP6J}t-Ug>^u z4a}$%7OCLKeR=(yA=mS{7D{*U@eOO?ZN-1H;i167zdooyd)C59auFNc$K0Nc^OPMB zb9>s27PiyO2NRW+g8@AZ(8m((^l5%2vDUnhW0FTV*O{e=9wO!L+57;b9sJ7eb#x7n zcEv3YJWcSt#rR;?I`&=@Ki1VuUHnp4oITgdtGk=wU3^b>-13)BJ#ahavCl967nqKM AasU7T From 550d79cf9ef834dcd2948d43af124e5353ffc323 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 11:52:41 +0600 Subject: [PATCH 11/35] Deleted version file --- VERSION.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 VERSION.md diff --git a/VERSION.md b/VERSION.md deleted file mode 100644 index 12ebd01..0000000 --- a/VERSION.md +++ /dev/null @@ -1 +0,0 @@ -VERSION 1.0 From 33e3d537636165207b9268a378c0692e6f188c60 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 12:04:31 +0600 Subject: [PATCH 12/35] Removed file --- source/ubl-cmake.h | 1 - source/ubl-settings-repomanager.c | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 120000 source/ubl-cmake.h diff --git a/source/ubl-cmake.h b/source/ubl-cmake.h deleted file mode 120000 index 967149f..0000000 --- a/source/ubl-cmake.h +++ /dev/null @@ -1 +0,0 @@ -/home/superadmin/Документы/ubl-settings-repomanager/compile/ubl-cmake.h \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 0043e02..9bb046a 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -98,6 +98,7 @@ void on_about(){ gtk_widget_show(window); } + void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); GtkTreeIter *iter=NULL; From 42da5e31d778b042c292fbecd049bbc3323f06cd Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 12:15:03 +0600 Subject: [PATCH 13/35] removed bin --- ubl-settings-repo-back/ubl-settings-repo-back | Bin 21976 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 ubl-settings-repo-back/ubl-settings-repo-back diff --git a/ubl-settings-repo-back/ubl-settings-repo-back b/ubl-settings-repo-back/ubl-settings-repo-back deleted file mode 100755 index 072509e2b93a44dbef450faa475ca6195012dcd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21976 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 MBPAMb3O1DeFR_gj-T(jq From 6ea890e5973e579967bca2f23d1945bb66d1c4f7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 18:04:59 +0600 Subject: [PATCH 14/35] Added new localisation --- source/ubl-strings.h | 3 +- ubl-settings-repomanager-windows.glade | 16 ++ ubl-settings-repomanager.glade | 376 +++++++++++++------------ 3 files changed, 218 insertions(+), 177 deletions(-) diff --git a/source/ubl-strings.h b/source/ubl-strings.h index f32e589..3046d76 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -66,4 +66,5 @@ #define NAME_LABEL _("Name:") #define BRANCHES_LABEL _("Branches:") #define TYPE_BRANCH_NAME_LABEL _("< Type branch name >") -#define EMPTY_NAME_LABEL _("Name must be filled!") \ No newline at end of file +#define EMPTY_NAME_LABEL _("Name must be filled!") +#define CHOOSE_PATH_LABEL _("Choose path for new repository") \ No newline at end of file diff --git a/ubl-settings-repomanager-windows.glade b/ubl-settings-repomanager-windows.glade index 152f804..98d4bbd 100644 --- a/ubl-settings-repomanager-windows.glade +++ b/ubl-settings-repomanager-windows.glade @@ -91,12 +91,15 @@ True False + vertical + 4 Choose repository folder True True True + start False @@ -104,6 +107,19 @@ 0 + + + True + False + True + 0 + + + False + True + 1 + + False diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index ce0e3d4..2a4383c 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -202,6 +202,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + @@ -688,20 +690,148 @@ translated and supported by community. - + True - False - 5 + True + 395 + True True False - vertical + 5 + 5 5 - + True False + vertical + 5 + + + True + False + + + False + True + 0 + + + + + True + True + True + Create repository + image1 + + + + False + True + 1 + + + + + True + True + True + Open existing repository + image2 + + + + False + True + 2 + + + + + True + True + True + Configure repository + image3 + + + + False + True + 3 + + + + + True + True + True + Delete repository + image4 + + + + False + True + 4 + + + + + True + False + + + False + True + 5 + + + + + True + True + True + Add package + image11 + + + + False + True + 11 + + + + + True + True + True + Remove package + image12 + + + + False + True + 12 + + False @@ -710,178 +840,68 @@ translated and supported by community. - - True - True - True - Create repository - image1 - - - - False - True - 1 - - - - - True - True - True - Open existing repository - image2 - - - - False - True - 2 - - - - - True - True - True - Configure repository - image3 - - - - False - True - 3 - - - - - True - True - True - Delete repository - image4 - - - - False - True - 4 - - - - + True False - - - False - True - 5 - - - - - True - True - True - Add package - image11 - - - - False - True - 11 - - - - - True - True - True - Remove package - image12 - - - - False - True - 12 - - - - - False - True - 0 - - - - - True - False - 0 - in - - - True - False - 5 - 5 - 5 - 5 + 0 + in - + True - True - in + False + 5 + 5 + 5 + 5 - + True - False + True + in - + True - True - RepoStore - False - treeviewcolumn2 - 0 - - - + False - - column - - - - - column + + True + True + RepoStore + False + treeviewcolumn2 + 0 + + + - - - 0 - + + column + - - - 1 - + + column + + + + 0 + + + + + [D] + + + 5 + + + + + + 1 + + + @@ -891,22 +911,28 @@ translated and supported by community. + + + - - - + + True + True + 1 + - True - True - 1 + False + True True True + 5 + 5 False @@ -1269,8 +1295,7 @@ translated and supported by community. - True - 192.168.1.110 + False @@ -1397,9 +1422,8 @@ translated and supported by community. - True - True - 2 + True + True From beec6b1009ea1851a6542ee05d3fcb868863a912 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 6 Jul 2023 18:07:16 +0600 Subject: [PATCH 15/35] Implemented save button --- source/ubl-settings-repomanager.c | 53 +++++++++++++++++++++++++++---- source/ubl-settings-repomanager.h | 1 + 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 9bb046a..7d41d31 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -98,6 +98,34 @@ void on_about(){ gtk_widget_show(window); } +void on_save(){ + char *command = "ubl-settings-repo-back"; + char *remove_flagged = " "; + char *add_flagged = " "; + char *origin_flagged = NULL; + GtkTreeIter iter, childIter; + 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 *path=NULL; + char *name = NULL; + char *remove_flagged = " "; + char *add_flagged = " "; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&path,1,&name,-1); + origin_flagged = yon_char_unite(path,"/",name,".db.tar.gz",NULL); + if (strstr(origin_flagged," ")) origin_flagged = yon_char_unite("\"",origin_flagged,"\"",NULL); + int 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)){ + path=NULL; + int status = 0,deleted = 0; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,3,&path,4,&status,5,&deleted,-1); + if (status==-1) { remove_flagged = yon_char_unite(remove_flagged," --package-remove ",path,NULL); gtk_tree_store_remove(main_config.tree_store,&childIter);} + else if (status == 1&&deleted==0) add_flagged = yon_char_unite(add_flagged," --package-add ",path,NULL); + + } + command = yon_char_unite(command," -o ",origin_flagged,"/",name,".db.tar.gz",remove_flagged,add_flagged,NULL); + } + printf("%s\n",command); +} void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); @@ -131,6 +159,7 @@ int yon_add_branches(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, void on_repo_add_new(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 = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry))); if (!name||strcmp(name,"")!=0){ on_close_subwindow(self); @@ -157,13 +186,14 @@ void on_branch_add(GtkCellRendererText *self, char*path,char *new_text, repo_cre } } -void on_choose_repo_folder(repo_create_window *window){ +void on_choose_repo_folder(GtkWidget *self,repo_create_window *window){ GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); 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=filename; + window->path=yon_char_new(filename); + gtk_label_set_text(GTK_LABEL(window->PathLabel),window->path); } on_close_subwindow(chooser); } @@ -179,6 +209,8 @@ void on_repo_new (GtkWidget *self, main_window *widgets){ window->repoChooseFolderButton=yon_gtk_builder_get_widget(builder,"repoChooseFolderButton"); window->BranchCell=GTK_CELL_RENDERER(gtk_builder_get_object(builder,"branchTextCell")); window->BranchesListStore=GTK_LIST_STORE(gtk_builder_get_object(builder,"curRepoEditList")); + window->PathLabel=yon_gtk_builder_get_widget(builder,"repoPathLabel"); + window->path=NULL; gtk_widget_show(window->Window); GtkTreeIter iter; gtk_list_store_append(window->BranchesListStore,&iter); @@ -265,6 +297,7 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP GdkPixbuf *icon = NULL; 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; @@ -274,7 +307,7 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP if (type==YON_REPO_LINE_REPO_TYPE){ icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); } else if (type==YON_REPO_LINE_FILE_TYPE){ @@ -283,12 +316,12 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){ GtkTreeIter repo; gtk_tree_store_append(main_config.tree_store,&iter,&branch); - gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&branch); } else { gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); - gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); } yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); @@ -298,7 +331,7 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP else if (type==YON_REPO_LINE_REPO_TYPE){ icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else { @@ -313,7 +346,12 @@ void yon_repo_remove_package(main_window *widgets){ 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)){ - gtk_tree_store_remove(main_config.tree_store,&iter); + // gtk_tree_store_remove(main_config.tree_store,&iter); + int status = 0; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,4,&status,-1); + if (status != 1) + gtk_tree_store_set(main_config.tree_store,&iter,4,-1,-1); + gtk_tree_store_set(main_config.tree_store,&iter,5,1,-1); 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); } @@ -475,6 +513,7 @@ main_window *setup_window(){ 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->SaveButton),"clicked",G_CALLBACK(on_save),widgets); /* Localisation | Локализация */ gtk_widget_show(widgets->Window); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index c12885f..31f2619 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -125,6 +125,7 @@ typedef struct { GtkWidget *repoChooseFolderButton; GtkListStore *BranchesListStore; + GtkWidget *PathLabel; char *path; } repo_create_window; From 66130bd6d34aa6dd56aad3879479cc8eed619dc7 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Jul 2023 16:00:24 +0600 Subject: [PATCH 16/35] Moved on existing backend --- .gitignore | 4 +- source/ubl-settings-repomanager.c | 35 +++-- ubl-settings-repo-back/Makefile | 146 ------------------ .../com.ublinux.ubl-settings-repo-back.policy | 24 --- ubl-settings-repo-back/source/CMakeLists.txt | 31 ---- .../source/ubl-settings-repo-back.c | 141 ----------------- .../source/ubl-settings-repo-back.h | 32 ---- ubl-settings-repo-back/source/ubl-strings.h | 1 - 8 files changed, 23 insertions(+), 391 deletions(-) delete mode 100644 ubl-settings-repo-back/Makefile delete mode 100644 ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy delete mode 100644 ubl-settings-repo-back/source/CMakeLists.txt delete mode 100644 ubl-settings-repo-back/source/ubl-settings-repo-back.c delete mode 100644 ubl-settings-repo-back/source/ubl-settings-repo-back.h delete mode 100644 ubl-settings-repo-back/source/ubl-strings.h diff --git a/.gitignore b/.gitignore index c50c704..1f9cf81 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ .vscode/ *# ubl-settings-repomanager +ubl-settings-repo-back/ubl-settings-repo-back *~ build/ compile/ -terminal-commands/ \ No newline at end of file +terminal-commands/ +source/ubl-cmake.h \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 7d41d31..39ea86d 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -99,32 +99,37 @@ void on_about(){ } void on_save(){ - char *command = "ubl-settings-repo-back"; - char *remove_flagged = " "; - char *add_flagged = " "; + char *command = "repo-manager"; + char *remove_command=NULL; + char *add_command=NULL; + char *remove_flagged = NULL; + char *add_flagged = NULL; char *origin_flagged = NULL; + char *name_flagged = NULL; GtkTreeIter iter, childIter; 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 *path=NULL; - char *name = NULL; - char *remove_flagged = " "; - char *add_flagged = " "; - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&path,1,&name,-1); - origin_flagged = yon_char_unite(path,"/",name,".db.tar.gz",NULL); - if (strstr(origin_flagged," ")) origin_flagged = yon_char_unite("\"",origin_flagged,"\"",NULL); + remove_flagged = NULL; + add_flagged = ""; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&origin_flagged,1,&name_flagged,-1); + remove_command = yon_char_unite(command," remove -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); + add_command = yon_char_unite(command," add -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); int 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)){ - path=NULL; int status = 0,deleted = 0; + char *path=NULL; gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,3,&path,4,&status,5,&deleted,-1); - if (status==-1) { remove_flagged = yon_char_unite(remove_flagged," --package-remove ",path,NULL); gtk_tree_store_remove(main_config.tree_store,&childIter);} - else if (status == 1&&deleted==0) add_flagged = yon_char_unite(add_flagged," --package-add ",path,NULL); + if (status==-1) { remove_flagged = yon_char_unite(remove_flagged ? remove_flagged : "",path,NULL); gtk_tree_store_remove(main_config.tree_store,&childIter);} + else if (status == 1&&deleted==0) add_flagged = yon_char_unite(add_flagged ? add_flagged : "",path,NULL); } - command = yon_char_unite(command," -o ",origin_flagged,"/",name,".db.tar.gz",remove_flagged,add_flagged,NULL); + if (origin_flagged) + remove_command = remove_flagged ? yon_char_unite(remove_command,remove_flagged,NULL) : NULL; + add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : NULL; + printf("%s\n%s\n",remove_command,add_command); + if (remove_command) system(remove_command); + if (add_command) system(add_command); } - printf("%s\n",command); } void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ diff --git a/ubl-settings-repo-back/Makefile b/ubl-settings-repo-back/Makefile deleted file mode 100644 index f84e9df..0000000 --- a/ubl-settings-repo-back/Makefile +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/make -f - -#SHELL := /bin/bash -MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST))) -MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH)))) -MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) - -CMAKE_COMMAND = cmake -CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source -CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile -#CMAKE_SOURCE_DIR = ./source -#CMAKE_BUILD_DIR = ./compile -DEPENDS = /bin/cmake -PREFIX ?= /usr -PKGNAME = $(MAKEFILE_DIR) -#PKGNAME = ubl-settings-manager -LATEST_TAG= -default_target: all - -.PHONY: all init depend debug prepare check build uninstall install clean help - -all: init build - -init: - @echo "Initialize ..."; \ - if [ -d ".git" ]; then \ - LATEST_TAG=$$(git describe --tags | sed 's/^v//'|grep -oE "^[0-9]{1,}.[0-9]{1,}"); \ - else \ - LATEST_TAG="0.0"; \ - fi; \ - sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.h; \ - echo "-- Build path: ${CMAKE_BUILD_DIR}" - -depend: - @echo "Check depends ..." - @for FILE_DEPEND in $(DEPENDS); do \ - if [ ! -f $${FILE_DEPEND} ]; then \ - echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \ - exit 1; \ - fi; \ - done; \ - echo "Check depends: OK" -# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 - -debug: init build - @echo "Debug ..."; \ - if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ - $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ - fi; \ - echo "${CMAKE_BUILD_DIR}/${PKGNAME}"; \ - cp ${CMAKE_BUILD_DIR}/${PKGNAME} ./; \ - echo "Debug: OK" - -prepare: - @echo "Prepare ..."; \ - if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ - $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ - fi; \ - echo "Prepare: OK" - -check: - @echo "Check ..."; \ - if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \ - echo "Check: OK"; \ - else \ - echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \ - exit 1; \ - fi - -build: depend prepare - @echo "Build ..."; \ - make --directory=${CMAKE_BUILD_DIR}; \ - echo "Build: OK" - -uninstall: - @echo "Uninstall ..." - @for FILE_PO in $(wildcard *.po); do \ - LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ - FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ - PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ - $(RM) "$${PATH_FILE_MO}"; \ - done - @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" - @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" - @if [ -z ${DESTDIR} ]; then \ - [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi - @echo "Uninstall: OK" - -install: check uninstall - @echo "Install ..." -#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ - @gcc source/ubl-settings-repo-back.c source/ubl-settings-repo-back.h source/ubl-strings.h -o ubl-settings-repo-back `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g -#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ - @for FILE_PO in $(wildcard *.po); do \ - LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ - install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ - FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ - PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ - echo "$${FILE_PO}"; \ - msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ - done - @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" - @install -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" - @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" - @install -dm755 "${DESTDIR}/etc/xdg" - @install -dm755 "${DESTDIR}${PREFIX}/share/applications" - @if [ -z ${DESTDIR} ]; then \ - [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi - @echo "Install: OK" - @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ - -clean: - @echo "Clean ..." - @$(RM) -rd ${CMAKE_BUILD_DIR} - @if [ -d ${CMAKE_BUILD_DIR} ]; then \ - echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ - else \ - echo "Clean: OK"; \ - fi - -up_ver: - @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ - MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ - MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ - VER="$${MAJOR}.$$(($${MINOR}+1))"; \ - sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ - echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" - -help: - @echo "The following are some of the valid targets for this Makefile:"; \ - echo "... all (the default if no target is provided)"; \ - echo "... init"; \ - echo "... debug"; \ - echo "... prepare"; \ - echo "... compile"; \ - echo "... install"; \ - echo "... uninstall"; \ - echo "... clean"; \ - echo "... up_ver" diff --git a/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy b/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy deleted file mode 100644 index 2dd9623..0000000 --- a/ubl-settings-repo-back/com.ublinux.ubl-settings-repo-back.policy +++ /dev/null @@ -1,24 +0,0 @@ - - - - - UBLinux - https://ublinux.ru - - - Run ubl-settings-repo-back as root - Запуск утилиты ubl-settings-repo-back с правами root - Authentication is required to run ubl-settings-repo-back - Требуется авторизация для запуска утилиты ubl-settings-repo-back с правами root - - auth_admin - auth_admin - auth_admin - - /usr/bin/ubl-settings-repo-back - true - - - diff --git a/ubl-settings-repo-back/source/CMakeLists.txt b/ubl-settings-repo-back/source/CMakeLists.txt deleted file mode 100644 index 9ed448b..0000000 --- a/ubl-settings-repo-back/source/CMakeLists.txt +++ /dev/null @@ -1,31 +0,0 @@ -cmake_minimum_required(VERSION 3.7) -project(ubl-settings-repo-back) - -find_package(PkgConfig REQUIRED) - -pkg_check_modules(GTK REQUIRED glib-2.0) -include_directories(${GTK_INCLUDE_DIRS}) -link_directories(${GTK_LIBRARY_DIRS}) -add_definitions(${GTK_CFLAGS_OTHER}) - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ - -O2 -pipe -fno-plt -fexceptions \ - -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ - -fstack-clash-protection -fcf-protection") - - -set(SOURCE_FILES - ubl-settings-repo-back.c - ubl-settings-repo-back.h - # ubl-strings.h - ) - -set(LIBRARIES - ${GTK_LIBRARIES} - pthread) - - -add_executable(${PROJECT_NAME} ${SOURCE_FILES}) -target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES}) -target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR}) -install(TARGETS ${PROJECT_NAME} DESTINATION bin) \ No newline at end of file diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.c b/ubl-settings-repo-back/source/ubl-settings-repo-back.c deleted file mode 100644 index c223ca1..0000000 --- a/ubl-settings-repo-back/source/ubl-settings-repo-back.c +++ /dev/null @@ -1,141 +0,0 @@ -#include "ubl-settings-repo-back.h" - - -dict_simple *yon_dict_new(){ - dict_simple *dict = (dict_simple*)malloc(sizeof(dict_simple)); - dict->first=dict; - dict->next=NULL; - dict->data=NULL; - return dict; -} - -dict_simple *yon_dict_append(dict_simple *dictionary_to_append){ - dict_simple *dict = (dict_simple*)malloc(sizeof(dict_simple)); - dictionary_to_append->next=dict; - dict->first=dictionary_to_append->first; - dict->next=NULL; - dict->data=NULL; - return dict; -} - -repo_operation *yon_operation_new(){ - repo_operation *operation = (repo_operation*)malloc(sizeof(repo_operation)); - operation->package_add=NULL; - operation->package_remove=NULL; - operation->rename=NULL; - operation->target=NULL; - operation->create=0; - return operation; -} - -char *yon_string_append(char *source, char *append){ - int size = (strlen(source)+strlen(append)+2); - char *n_source = (char*)malloc(sizeof(char)*size); - memset(n_source,0,size); - memcpy(n_source,source,strlen(source)); - memcpy(n_source+strlen(source)," ",1); - memcpy(n_source+strlen(source)+1,append,strlen(append)); - return n_source; -} - -char *yon_string_copy(char *string){ - if (string){ - char *str = malloc(sizeof(char)*strlen(string)+1); - memset(str,0,strlen(string)+1); - memcpy(str,string,strlen(string)); - return str; - } else return NULL; -} - -char *yon_string_find_last(char *source, char *find){ - - for (char *found = strstr(source,find);found;found=strstr(found,find)){ - if (found); - } -} - -int yon_repo_proceed(int argc, char *argv[]){ - int option_index=0; - int show_help=0; - { - struct option long_options[] = { - {"repo-new", 1, 0, 1}, - {"package-add", 1, 0, 2}, - {"package-remove", 1, 0, 3}, - {"repo-rename", 1, 0, 4}, - {"origin", 1, 0, 'o'}, - { NULL, 0, NULL, 0 } - }; - dict_simple *dict = yon_dict_new(); - repo_operation *operation = yon_operation_new(); - dict->data=(void*)operation; - #define curpack(dict) ((repo_operation*)dict->data) - for (int i=0;ipackage_add = yon_string_append(curpack(dict)->package_add,yon_string_copy(optarg)); - break; - case 3: curpack(dict)->package_remove = yon_string_append(curpack(dict)->package_add,yon_string_copy(optarg)); - break; - case 4: curpack(dict)->rename=yon_string_copy(optarg); - case 1: - if (!((repo_operation*)dict->data)->target) ((repo_operation*)dict->data)->target=yon_string_copy(optarg); - else { - dict = yon_dict_append(dict); - operation = yon_operation_new(); - dict->data=(void*)operation; - ((repo_operation*)dict->data)->target=yon_string_copy(optarg); - } - ((repo_operation*)dict->data)->create=1; - break; - case 'o': - if (!((repo_operation*)dict->data)->target) ((repo_operation*)dict->data)->target=yon_string_copy(optarg); - else { - dict = yon_dict_append(dict); - operation = yon_operation_new(); - dict->data=(void*)operation; - ((repo_operation*)dict->data)->target=yon_string_copy(optarg); - } - break; - case '?': printf("%s: %c\n",UNKNOWN_ARGUMENT_LABEL,argument); - break; - } - } - for (dict_simple *dct=dict->first;dct;dct=dct->next){ - if (curpack(dct)->target){ - if (curpack(dct)->create){ - GKeyFile *file = g_key_file_new(); - g_key_file_load_from_file(file,"/etc/pacman.conf",G_KEY_FILE_KEEP_COMMENTS,NULL); - g_key_file_set_string(file,curpack(dct)->target,"Server",curpack(dct)->target); - char *command = yon_string_append("repo-add ",curpack(dct)->target); - if (curpack(dct)->package_add){ - command = yon_string_append(command," "); - command = yon_string_append(command,curpack(dct)->package_add); - } - system(command); - - } else if (curpack(dct)->package_remove){ - char *command = yon_string_append("repo-remove ",curpack(dct)->target); - command = yon_string_append(command," "); - command = yon_string_append(command,curpack(dct)->package_remove); - system(command); - } - if (curpack(dct)->package_add){ - char *command = yon_string_append("repo-add ",curpack(dct)->target); - command = yon_string_append(command," "); - command = yon_string_append(command,curpack(dct)->package_add); - system(command); - } - - - } - } - } -} - -int main(int argc, char *argv[]){ - char *local=setlocale(LC_ALL, ""); - textdomain (LocaleName); - yon_repo_proceed(argc, argv); - -} diff --git a/ubl-settings-repo-back/source/ubl-settings-repo-back.h b/ubl-settings-repo-back/source/ubl-settings-repo-back.h deleted file mode 100644 index fcc8d86..0000000 --- a/ubl-settings-repo-back/source/ubl-settings-repo-back.h +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "ubl-strings.h" - -#define LocaleName "ubl-settings-repo-back" - - -#define _(String) gettext(String) - -typedef struct { - char *target; - char *package_add; - char *package_remove; - char *rename; - int create; - -} repo_operation; - -typedef struct { - struct dict_simple *first; - struct dict_simple *next; - void *data; -} dict_simple; - -char *yon_string_append(char *source, char *append); -char *yon_string_copy(char *string); \ No newline at end of file diff --git a/ubl-settings-repo-back/source/ubl-strings.h b/ubl-settings-repo-back/source/ubl-strings.h deleted file mode 100644 index 290f02c..0000000 --- a/ubl-settings-repo-back/source/ubl-strings.h +++ /dev/null @@ -1 +0,0 @@ -#define UNKNOWN_ARGUMENT_LABEL _("Unknown argument has been given") \ No newline at end of file From 9a6da5255a61ccc573968d25737d19abfa8673de Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Jul 2023 16:07:38 +0600 Subject: [PATCH 17/35] Fixed install loop --- Makefile | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index a2bb33c..f22cb51 100644 --- a/Makefile +++ b/Makefile @@ -70,10 +70,7 @@ check: build: depend prepare @echo "Build ..."; \ make --directory=${CMAKE_BUILD_DIR}; \ - echo "Build: OK"; \ - cd ubl-settings-repo-back; \ - make ; \ - cd ../ + echo "Build: OK" uninstall: @echo "Uninstall ..." @@ -135,10 +132,7 @@ install: check uninstall [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi; \ - cd ./ubl-settings-repo-back; \ - make install; \ - cd ../ + fi; @echo "Install: OK" @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ From 91d4743ec5bf607076dee68043aeec98c1995e0a Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Jul 2023 16:11:56 +0600 Subject: [PATCH 18/35] Fixed install loop --- Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index f22cb51..1afbbfa 100644 --- a/Makefile +++ b/Makefile @@ -138,10 +138,7 @@ install: check uninstall clean: @echo "Clean ..." - @$(RM) -rd ${CMAKE_BUILD_DIR}; \ - cd ./ubl-settings-repo-back; \ - make clean; \ - cd ../ + @$(RM) -rd ${CMAKE_BUILD_DIR} @if [ -d ${CMAKE_BUILD_DIR} ]; then \ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ else \ From d1084a70fbccf179ffb002a9462e8d823bc45b2d Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Jul 2023 17:50:47 +0600 Subject: [PATCH 19/35] Added open file filters --- source/ubl-settings-repomanager.c | 58 ++++++++++++++----------------- 1 file changed, 27 insertions(+), 31 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 39ea86d..6a11882 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -112,6 +112,7 @@ void on_save(){ remove_flagged = NULL; add_flagged = ""; gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&origin_flagged,1,&name_flagged,-1); + if (!strstr(name_flagged,".db.tar.gz")) name_flagged = yon_char_get_augumented(name_flagged,".db.tar.gz"); remove_command = yon_char_unite(command," remove -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); add_command = yon_char_unite(command," add -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); int valid_child=gtk_tree_model_iter_children(GTK_TREE_MODEL(main_config.tree_store),&childIter,&iter); @@ -139,7 +140,6 @@ void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ char *codeName,*branch,*version,*architecture,*components,*signature,*ipAdress,*port; int serverType=0,trusted=0,published=0; gtk_tree_model_get(model,iter,3,&codeName,4,&branch,5,&version,6,&architecture,7,&components,8,&signature,9,&trusted,10,&serverType,11,&ipAdress,12,&port,13,published,-1); - // gtk_label_set_text(GTK_LABEL(widgets->srgbe),) } } @@ -161,16 +161,25 @@ int yon_add_branches(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, return 0; } +int yon_char_find_last(char *source, char find){ + int size = strlen(source); + int i=size; + for (;source[i]!=find&&i>0;i--) + printf("%d\n",i); + return i; +} + void on_repo_add_new(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 = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->NameEntry))); + char *name=NULL; + + name = window->path; + window->path = yon_char_divide(name,yon_char_find_last(window->path, '/')); if (!name||strcmp(name,"")!=0){ - on_close_subwindow(self); GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); gtk_tree_store_set(main_config.tree_store,iter,2,window->BranchesListStore,3,window->path,-1); - // gtk_tree_model_foreach(GTK_TREE_MODEL(window->BranchesListStore),yon_add_branches,dict); yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } else { yon_ubl_status_box_render(EMPTY_NAME_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -191,44 +200,27 @@ void on_branch_add(GtkCellRendererText *self, char*path,char *new_text, repo_cre } } -void on_choose_repo_folder(GtkWidget *self,repo_create_window *window){ - GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); +char *on_choose_repo_folder(GtkWidget *self,repo_create_window *window){ + GtkFileFilter *file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*db.tar.gz"); + GtkWidget *chooser = gtk_file_chooser_dialog_new(ADD_PACKAGE_REPO_LABEL,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); 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); - gtk_label_set_text(GTK_LABEL(window->PathLabel),window->path); } on_close_subwindow(chooser); } void on_repo_new (GtkWidget *self, main_window *widgets){ - 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,"repoCreateWindow"); - window->NameEntry=yon_gtk_builder_get_widget(builder,"repoNameEntry"); - window->CancelButton=yon_gtk_builder_get_widget(builder,"repoCancelButton"); - window->SaveButton=yon_gtk_builder_get_widget(builder,"repoSaveButton"); - window->BranchesTree=yon_gtk_builder_get_widget(builder,"curRepoEditTree"); - window->repoChooseFolderButton=yon_gtk_builder_get_widget(builder,"repoChooseFolderButton"); - window->BranchCell=GTK_CELL_RENDERER(gtk_builder_get_object(builder,"branchTextCell")); - window->BranchesListStore=GTK_LIST_STORE(gtk_builder_get_object(builder,"curRepoEditList")); - window->PathLabel=yon_gtk_builder_get_widget(builder,"repoPathLabel"); window->path=NULL; - gtk_widget_show(window->Window); - GtkTreeIter iter; - gtk_list_store_append(window->BranchesListStore,&iter); + on_choose_repo_folder(self,window); dictionary *dict = yon_dictionary_create_with_data("",widgets); dict = yon_dictionary_create_with_data_connected(dict,"",window); - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(window->BranchCell),"placeholder-text",val); - g_value_set_string(val,TYPE_BRANCH_NAME_LABEL); - g_object_set_property(G_OBJECT(window->BranchCell),"placeholder-text",val); - g_signal_connect(G_OBJECT(window->BranchCell),"edited",G_CALLBACK(on_branch_add),window); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_repo_add_new),dict); - g_signal_connect(G_OBJECT(window->repoChooseFolderButton),"clicked",G_CALLBACK(on_choose_repo_folder),window); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + on_repo_add_new(self,dict); } void on_repo_add_file(GtkWidget *self, main_window *widgets){ @@ -261,9 +253,6 @@ void on_repo_configure(GtkWidget *self, main_window *widgets){ 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); - // GtkListStore *branches; - // gtk_tree_model_get(model,&iter,2,branches,-1); - // gtk_tree_view_set_model(GTK_TREE_VIEW(window->BranchesTree),GTK_TREE_MODEL(branches)); } else yon_ubl_status_box_render(NOTHING_CHOSEN_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); } @@ -282,7 +271,10 @@ void on_repo_configure_done(GtkWidget *self, dictionary *dict){ } void on_repo_load_local(GtkWidget *self, main_window *widgets){ + GtkFileFilter *file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*db.tar.gz"); 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); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ @@ -390,7 +382,11 @@ void yon_repo_configure(main_window *widgets){ } void yon_add_file(main_window *widgets){ + + GtkFileFilter *file_filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(file_filter,"*package.tar.gz"); 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); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); if (res==GTK_RESPONSE_ACCEPT){ From 256ef84eb17d5fcdbffbab045df3da7ec8f4a1d3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Jul 2023 17:55:10 +0600 Subject: [PATCH 20/35] Fixed packages filter --- source/ubl-settings-repomanager.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 6a11882..7c093b9 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -384,7 +384,8 @@ void yon_repo_configure(main_window *widgets){ void yon_add_file(main_window *widgets){ GtkFileFilter *file_filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(file_filter,"*package.tar.gz"); + gtk_file_filter_add_pattern(file_filter,"*.package.tar.zst"); + gtk_file_filter_set_name(file_filter,"*.package.tar.zst"); 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); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); From 0319ea5ca0cabcf81268a2cc7289e68f99ed8be3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 7 Jul 2023 17:57:26 +0600 Subject: [PATCH 21/35] Fixed packages filter --- source/ubl-settings-repomanager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 7c093b9..e1f5c71 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -384,8 +384,8 @@ void yon_repo_configure(main_window *widgets){ void yon_add_file(main_window *widgets){ GtkFileFilter *file_filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(file_filter,"*.package.tar.zst"); - gtk_file_filter_set_name(file_filter,"*.package.tar.zst"); + gtk_file_filter_add_pattern(file_filter,"*.pkg.tar.zst"); + gtk_file_filter_set_name(file_filter,"*.pkg.tar.zst"); 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); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); From c7abfb8f187b5705aefcb5eb188e48dcc01acb1b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Jul 2023 14:49:48 +0600 Subject: [PATCH 22/35] Removed backend --- Makefile | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 1afbbfa..a2bb33c 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,10 @@ check: build: depend prepare @echo "Build ..."; \ make --directory=${CMAKE_BUILD_DIR}; \ - echo "Build: OK" + echo "Build: OK"; \ + cd ubl-settings-repo-back; \ + make ; \ + cd ../ uninstall: @echo "Uninstall ..." @@ -132,13 +135,19 @@ install: check uninstall [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi; + fi; \ + cd ./ubl-settings-repo-back; \ + make install; \ + cd ../ @echo "Install: OK" @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." - @$(RM) -rd ${CMAKE_BUILD_DIR} + @$(RM) -rd ${CMAKE_BUILD_DIR}; \ + cd ./ubl-settings-repo-back; \ + make clean; \ + cd ../ @if [ -d ${CMAKE_BUILD_DIR} ]; then \ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ else \ From 00e37cebff417908f3f8406d3f55e7d6806e3de9 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Jul 2023 14:51:00 +0600 Subject: [PATCH 23/35] Added new icons --- Makefile | 26 +++---- ...gs-repomanager.document-green-symbolic.svg | 67 +++++++++++++++++++ ...ings-repomanager.document-red-symbolic.svg | 67 +++++++++++++++++++ ...ings-repomanager.folder-green-symbolic.svg | 1 + ...ttings-repomanager.folder-red-symbolic.svg | 1 + ...l-settings-repomanager.folder-symbolic.svg | 1 + 6 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg create mode 100644 com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg create mode 100644 com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg create mode 100644 com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg create mode 100644 com.ublinux.ubl-settings-repomanager.folder-symbolic.svg diff --git a/Makefile b/Makefile index a2bb33c..15d79aa 100644 --- a/Makefile +++ b/Makefile @@ -70,10 +70,7 @@ check: build: depend prepare @echo "Build ..."; \ make --directory=${CMAKE_BUILD_DIR}; \ - echo "Build: OK"; \ - cd ubl-settings-repo-back; \ - make ; \ - cd ../ + echo "Build: OK" uninstall: @echo "Uninstall ..." @@ -97,7 +94,12 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-green-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-red-symbolic.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-green-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-red-symbolic.svg" @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ @@ -131,23 +133,23 @@ install: check uninstall @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}.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" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi; \ - cd ./ubl-settings-repo-back; \ - make install; \ - cd ../ + fi; @echo "Install: OK" @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." - @$(RM) -rd ${CMAKE_BUILD_DIR}; \ - cd ./ubl-settings-repo-back; \ - make clean; \ - cd ../ + @$(RM) -rd ${CMAKE_BUILD_DIR}; @if [ -d ${CMAKE_BUILD_DIR} ]; then \ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ else \ diff --git a/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg new file mode 100644 index 0000000..76ab9d2 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-green-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg b/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg new file mode 100644 index 0000000..1233c4d --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.document-red-symbolic.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg new file mode 100644 index 0000000..9373086 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.folder-green-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg new file mode 100644 index 0000000..9373086 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.folder-red-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg b/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg new file mode 100644 index 0000000..9373086 --- /dev/null +++ b/com.ublinux.ubl-settings-repomanager.folder-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file From 9e1eeeb0f8044e9e47e762cf68409b0a6b627e77 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 11 Jul 2023 14:52:15 +0600 Subject: [PATCH 24/35] Added status icons for packages and repos; redesigned and improved saving --- source/ubl-settings-repomanager.c | 72 ++++++++++--------------------- ubl-settings-repomanager.glade | 10 +++++ 2 files changed, 33 insertions(+), 49 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e1f5c71..02562ed 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -111,7 +111,11 @@ void on_save(){ for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.tree_store),&iter)){ remove_flagged = NULL; add_flagged = ""; - gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,3,&origin_flagged,1,&name_flagged,-1); + int repostatus=0; + gboolean renamed=0; + char *old_name=NULL; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,1,&name_flagged,3,&origin_flagged,4,&repostatus,6,&old_name,7,&renamed,-1); + if (!strstr(name_flagged,".db.tar.gz")) name_flagged = yon_char_get_augumented(name_flagged,".db.tar.gz"); remove_command = yon_char_unite(command," remove -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); add_command = yon_char_unite(command," add -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); @@ -127,7 +131,6 @@ void on_save(){ if (origin_flagged) remove_command = remove_flagged ? yon_char_unite(remove_command,remove_flagged,NULL) : NULL; add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : NULL; - printf("%s\n%s\n",remove_command,add_command); if (remove_command) system(remove_command); if (add_command) system(add_command); } @@ -143,29 +146,10 @@ void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ } } -int yon_add_branches(GtkTreeModel* model, GtkTreePath* path, GtkTreeIter* iter, void *dct){ - printf("%d\n",1); - dictionary *dict=(dictionary*)dct; - 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*); - char *name=NULL; - gtk_tree_model_get(model,iter,0,&name,-1); - if(name){ - printf("%s\n",name); - GtkTreeIter ITER,iters; - if(gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,&ITER)){ - gtk_tree_store_append(main_config.tree_store,&iters,&ITER); - gtk_tree_store_set(main_config.tree_store,&iters,1,name,-1); - } - } - return 0; -} - int yon_char_find_last(char *source, char find){ int size = strlen(source); int i=size; - for (;source[i]!=find&&i>0;i--) - printf("%d\n",i); + for (;source[i]!=find&&i>0;i--); return i; } @@ -179,7 +163,7 @@ void on_repo_add_new(GtkWidget *self, dictionary *dict){ window->path = yon_char_divide(name,yon_char_find_last(window->path, '/')); if (!name||strcmp(name,"")!=0){ GtkTreeIter *iter = yon_repo_append(widgets, name, YON_REPO_LINE_REPO_TYPE); - gtk_tree_store_set(main_config.tree_store,iter,2,window->BranchesListStore,3,window->path,-1); + gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.folder-green-symbolic",2,window->BranchesListStore,3,window->path,-1); yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } else { yon_ubl_status_box_render(EMPTY_NAME_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); @@ -264,8 +248,14 @@ void on_repo_configure_done(GtkWidget *self, dictionary *dict){ 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_store_set(main_config.tree_store,&iter,1,name,-1); + gtk_tree_model_get(model,&iter,1,&oldname,4,&status,-1); + if (status==0) + gtk_tree_store_set(main_config.tree_store,&iter,1,name,6,oldname,7,1,-1); + else if (status==1) + gtk_tree_store_set(main_config.tree_store,&iter,1,name,-1); } on_close_subwindow(self); } @@ -302,14 +292,14 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP 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){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); } else if (type==YON_REPO_LINE_FILE_TYPE){ GtkTreeIter branch; - icon = gtk_icon_theme_load_icon_for_scale(theme,"follder-documents-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.follder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); if (gtk_tree_model_iter_parent(model,&branch,&parentIter)){ GtkTreeIter repo; gtk_tree_store_append(main_config.tree_store,&iter,&branch); @@ -326,9 +316,9 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else if (type==YON_REPO_LINE_REPO_TYPE){ - icon = gtk_icon_theme_load_icon_for_scale(theme,"folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); + icon = gtk_icon_theme_load_icon_for_scale(theme,"com.ublinux.ubl-settings-repomanager.folder-symbolic",16,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL); gtk_tree_store_append(main_config.tree_store,&iter,NULL); - gtk_tree_store_set(main_config.tree_store,&iter,0, "folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.folder-symbolic", 1, name_short,3,name,4,1,5,fls,-1); retIter = gtk_tree_iter_copy(&iter); gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&iter); } else { @@ -348,7 +338,7 @@ void yon_repo_remove_package(main_window *widgets){ gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,4,&status,-1); if (status != 1) gtk_tree_store_set(main_config.tree_store,&iter,4,-1,-1); - gtk_tree_store_set(main_config.tree_store,&iter,5,1,-1); + gtk_tree_store_set(main_config.tree_store,&iter,0,"com.ublinux.ubl-settings-repomanager.document-red-symbolic",-1); 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); } @@ -359,28 +349,11 @@ void yon_repo_remove(main_window *widgets){ 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){ - gtk_tree_store_remove(main_config.tree_store,&iter); - yon_ubl_status_box_render(OPERATION_DONE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + gtk_tree_store_set(main_config.tree_store,&iter,4,-1,5,1,-1); }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); } -void yon_repo_configure(main_window *widgets){ - GtkBuilder *builder = gtk_builder_new_from_resource(glade_repo_path); - 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)){ - GtkTreeIter parentparent; - if (gtk_tree_model_iter_parent(model,&parentparent,&iterparent)){ - 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_add_file(main_window *widgets){ GtkFileFilter *file_filter = gtk_file_filter_new(); @@ -392,7 +365,8 @@ void yon_add_file(main_window *widgets){ if (res==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); + GtkTreeIter *iter = yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); + gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.document-green-symbolic",-1); } on_close_subwindow(chooser); diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index 2a4383c..dcbdb02 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -204,6 +204,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + + + + + + + + From b6edfe8dad9f45fb547e0aa73b7dc1723e8a26d9 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 13 Jul 2023 15:48:39 +0600 Subject: [PATCH 25/35] Code redesign for template --- .gitignore | 4 +- source/ubl-settings-repomanager.c | 94 ++- source/ubl-settings-repomanager.h | 6 +- source/ubl-strings.h | 11 + source/ubl-utils.c | 980 +++++++++++++++++++++++++----- source/ubl-utils.h | 122 ++-- ubl-settings-repomanager.css | 26 +- ubl-settings-repomanager.glade | 42 +- 8 files changed, 1021 insertions(+), 264 deletions(-) diff --git a/.gitignore b/.gitignore index 1f9cf81..767f93e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ ubl-settings-repo-back/ubl-settings-repo-back build/ compile/ terminal-commands/ -source/ubl-cmake.h \ No newline at end of file +source/ubl-cmake.h +.BUILD.md +.updatebuild.sh \ No newline at end of file diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 02562ed..49f1aff 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -110,27 +110,29 @@ void on_save(){ 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)){ remove_flagged = NULL; - add_flagged = ""; + add_flagged = NULL; int repostatus=0; gboolean renamed=0; char *old_name=NULL; gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,1,&name_flagged,3,&origin_flagged,4,&repostatus,6,&old_name,7,&renamed,-1); - if (!strstr(name_flagged,".db.tar.gz")) name_flagged = yon_char_get_augumented(name_flagged,".db.tar.gz"); - remove_command = yon_char_unite(command," remove -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); - add_command = yon_char_unite(command," add -d ", origin_flagged, " -r ", name_flagged, " -p ",NULL); + // if (!strstr(name_flagged,".db.tar.gz")) name_flagged = yon_char_append(name_flagged,".db.tar.gz"); + remove_command = yon_char_unite(command," remove -d ", origin_flagged, " -r ", name_flagged, NULL); + add_command = yon_char_unite(command," add -d ", origin_flagged, " -r ", name_flagged, NULL); int 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)){ int status = 0,deleted = 0; char *path=NULL; gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&childIter,3,&path,4,&status,5,&deleted,-1); - if (status==-1) { remove_flagged = yon_char_unite(remove_flagged ? remove_flagged : "",path,NULL); gtk_tree_store_remove(main_config.tree_store,&childIter);} - else if (status == 1&&deleted==0) add_flagged = yon_char_unite(add_flagged ? add_flagged : "",path,NULL); + gtk_tree_store_set(main_config.tree_store,&childIter,4,0,5,0,-1); + if (status==-1) { remove_flagged = yon_char_unite(remove_flagged ? yon_char_append(remove_flagged,",") : " -p ",path,NULL); /*gtk_tree_store_remove(main_config.tree_store,&childIter);*/} + else if (status == 1&&deleted==0) { add_flagged = yon_char_unite(add_flagged ? yon_char_append(add_flagged,",") : " -p ",path,NULL);gtk_tree_store_set(main_config.tree_store,&childIter,0,"com.ublinux.ubl-settings-repomanager.document-symbolic",-1); } } if (origin_flagged) remove_command = remove_flagged ? yon_char_unite(remove_command,remove_flagged,NULL) : NULL; add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : NULL; + printf("%s\n%s\n",remove_command,add_command); if (remove_command) system(remove_command); if (add_command) system(add_command); } @@ -138,11 +140,14 @@ void on_save(){ void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); - GtkTreeIter *iter=NULL; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoTree)),&model,iter)){ - char *codeName,*branch,*version,*architecture,*components,*signature,*ipAdress,*port; + 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; int serverType=0,trusted=0,published=0; - gtk_tree_model_get(model,iter,3,&codeName,4,&branch,5,&version,6,&architecture,7,&components,8,&signature,9,&trusted,10,&serverType,11,&ipAdress,12,&port,13,published,-1); + gtk_tree_model_get(model,&iter,11,&codeName,12,&version,13,&architecture,-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 : ""); } } @@ -202,8 +207,8 @@ 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_create_with_data("",widgets); - dict = yon_dictionary_create_with_data_connected(dict,"",window); + dictionary *dict = yon_dictionary_new_with_data("",widgets); + dict = yon_dictionary_append_with_data(dict,"",window); on_repo_add_new(self,dict); } @@ -232,8 +237,8 @@ void on_repo_configure(GtkWidget *self, main_window *widgets){ 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_create_with_data("",widgets); - dict = yon_dictionary_create_with_data_connected(dict,"",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); @@ -304,7 +309,7 @@ GtkTreeIter *yon_repo_append(main_window *widgets, char *name, YON_REPO_LINE_TYP GtkTreeIter repo; gtk_tree_store_append(main_config.tree_store,&iter,&branch); gtk_tree_store_set(main_config.tree_store,&iter,0, "com.ublinux.ubl-settings-repomanager.document-symbolic", 1, name_short,3,name,4,1,5,fls,-1); - retIter = gtk_tree_iter_copy(&branch); + retIter = gtk_tree_iter_copy(&iter); } else { gtk_tree_store_append(main_config.tree_store,&iter,&parentIter); @@ -336,9 +341,10 @@ void yon_repo_remove_package(main_window *widgets){ // gtk_tree_store_remove(main_config.tree_store,&iter); int status = 0; gtk_tree_model_get(GTK_TREE_MODEL(main_config.tree_store),&iter,4,&status,-1); - if (status != 1) + if (status != 1){ gtk_tree_store_set(main_config.tree_store,&iter,4,-1,-1); gtk_tree_store_set(main_config.tree_store,&iter,0,"com.ublinux.ubl-settings-repomanager.document-red-symbolic",-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); } @@ -349,7 +355,7 @@ void yon_repo_remove(main_window *widgets){ 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){ - gtk_tree_store_set(main_config.tree_store,&iter,4,-1,5,1,-1); + gtk_tree_store_set(main_config.tree_store,&iter,4,-1,0,"com.ublinux.ubl-settings-repomanager.folder-red-symbolic",-1); }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); } @@ -365,8 +371,19 @@ void yon_add_file(main_window *widgets){ if (res==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + FILE *file = popen(yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |grep -E \"Name|Version|Architecture\" |sed -e 's/ *//g'",NULL),"r"); + char *cur_string=g_malloc0(sizeof(char)*4096); + char *packname=NULL, *packver=NULL, *packarch=NULL; + while (fgets(cur_string,4096,file)){ + cur_string = yon_char_divide_search(cur_string,"\n",-1); + char *p = yon_char_divide_search(cur_string,":",-1); + if (strstr(p,"Name")) packname = yon_char_new(cur_string); + else if (strstr(p,"Version")) packver = yon_char_new(cur_string); + else if (strstr(p,"Architecture")) packarch = yon_char_new(cur_string); + } GtkTreeIter *iter = yon_repo_append(widgets,filename,YON_REPO_LINE_FILE_TYPE); - gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.document-green-symbolic",-1); + gtk_tree_store_set(main_config.tree_store,iter,0,"com.ublinux.ubl-settings-repomanager.document-green-symbolic",11,packname,12,packver,13,packarch,-1); + } on_close_subwindow(chooser); @@ -421,8 +438,8 @@ main_window *setup_window(){ widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); - widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); - widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + // widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); + // widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem"); widgets->GeneralTabLabel = yon_gtk_builder_get_widget(builder,"GeneralTabLabel"); widgets->PublicationTabLabel = yon_gtk_builder_get_widget(builder,"PublicationTabLabel"); @@ -462,6 +479,14 @@ main_window *setup_window(){ widgets->Finder = yon_gtk_builder_get_widget(builder,"RepoFinder"); 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); // yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); + widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); // yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + + + 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); @@ -490,6 +515,7 @@ main_window *setup_window(){ 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->SaveButton),"clicked",G_CALLBACK(on_save),widgets); + g_signal_connect(G_OBJECT(widgets->RepoTree),"cursor-changed",G_CALLBACK(on_tree_selection_changed),widgets); /* Localisation | Локализация */ gtk_widget_show(widgets->Window); @@ -503,7 +529,8 @@ int main(int argc, char *argv[]){ textdomain (LocaleName); config_init(); int option_index=0; - int show_help=0; + int show_help=0; + int debug_mode=0; { struct option long_options[] = { {"help", 0, 0, 'h'}, @@ -516,10 +543,11 @@ int main(int argc, char *argv[]){ {"socket-id", 1, 0, 's'}, {"socket-ext-id", 1,0, 'e'}, {"socket-trd-id", 1,0, 't'}, + {"debug", 0,0, 'd'}, { NULL, 0, NULL, 0 } }; for (int i=0;iHeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); - if (yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel)) - yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); + if (getuid()!=0) + yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + else + yon_ubl_status_box_render(TITLE_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); 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); + GTK_STYLE_PROVIDER(css), + -1); gtk_main(); } \ No newline at end of file diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 31f2619..2b44ec4 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -5,9 +5,12 @@ #include #include #include +#include #include #include -#include "ubl-cmake.h" +#include +#include +#include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include #endif @@ -21,6 +24,7 @@ #define glade_repo_path "/com/ublinux/ui/ubl-settings-repomanager-windows.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("/home/",yon_ubl_root_user_get(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-repomanager" diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 3046d76..17d9b66 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -3,13 +3,17 @@ #define TITLE_LABEL _("Repository manager") #define TITLE_INFO_LABEL _("Repository management and configuring") +#define SUCCESS_LABEL _("Operation succeeded") +#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") #define ABOUT_LABEL _("About") #define DOCUMENTATION_LABEL _("Documentation") + #define SAVE_LOCAL_LABEL _("Save to local configuration") #define SAVE_GLOBAL_LABEL _("Save to global configuration") #define SAVE_CONFIGURATION_LABEL _("Save configuration") #define SAVE_LABEL _("Save") + #define LOAD_LOCAL_LABEL _("Load local configuration") #define LOAD_GLOBAL_LABEL _("Load global configuration") #define LOAD_LABEL _("Load") @@ -23,7 +27,14 @@ #define PROJECT_HOME_LABEL _("Project Home Page") #define NOTHING_CHOSEN_LABEL _("Nothing were chosen") +#define GLOBAL_LOAD_SUCCESS_LABEL _("Global configuration loading succseeded.") +#define LOCAL_LOAD_SUCCESS_LABEL _("Local configuration loading succseeded.") +#define LOAD_FAILED_LABEL _("Config loading failed") +#define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.") +#define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.") +#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.") +#define SAVE_FAILED_LABEL #define GLOBAL_LOAD_SUCCESS _("Global configuration loading succseeded.") #define LOCAL_LOAD_SUCCESS _("Local configuration loading succseeded.") diff --git a/source/ubl-utils.c b/source/ubl-utils.c index 7b5724c..44d839c 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -2,11 +2,13 @@ // dictionary functions -/**[EN] - * yon_dictionary_create_empty(): +/**yon_dictionary_create_empty(): + * [EN] * Creates and returns empty dictionary + * [RU] + * Создаёт и возвращает пустой словарь. */ -dictionary *yon_dictionary_create_empty() +dictionary *yon_dictionary_new() { dictionary *dict = malloc(sizeof(dictionary)); dict->data = NULL; @@ -18,34 +20,129 @@ dictionary *yon_dictionary_create_empty() 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; +} + +/**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; +} + +/** 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; +} + +/**int yon_dictionary_empty(dictionary *dict) + * [EN] + * + * [RU] + * Очищает элемент словаря [dict] от данных +*/ +int yon_dictionary_empty(dictionary *dict){ + dict->data=NULL; + dict->data_type=DICTIONARY_OTHER_TYPE; +} + +/**yon_dictionary_switch_to_last(dictionary **dict) + * [EN] + * + * [RU] + * Переключает словарь [dict] на последний элемент. +*/ void yon_dictionary_switch_to_last(dictionary **dict) { - if ((*dict)->next != NULL) - for ((*dict) = (*dict)->first; (*dict)->next != NULL; (*dict) = (*dict)->next) - { - } + dictionary *dct=NULL, *dact=*dict; + for_dictionaries(dct,dact); } -dictionary *yon_dictionary_create_conneced(dictionary *targetdict) +/**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_create_empty(); + 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) { - dictionary *dct = NULL; - for (dct = dict->first; dct->next != NULL; dct = dct->next) - { - } - return dct; + if (dict->next){ + dictionary *dct = NULL; + for_dictionaries(dct,dict); + return dct; + } else return dict; } -dictionary *yon_dictionary_switch_places(dictionary *dict, int aim) +/**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) { @@ -146,6 +243,13 @@ dictionary *yon_dictionary_switch_places(dictionary *dict, int aim) } } +/**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) @@ -154,6 +258,12 @@ void yon_dictionary_make_first(dictionary *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; @@ -172,9 +282,15 @@ void yon_dictionary_make_nth(dictionary *dict, int nth) dct->prev = dict; } -dictionary *yon_dictionary_create_with_data(char *key, void *data) +/**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_create_empty(); + dictionary *dct = yon_dictionary_new(); dct->key = yon_char_new(key); dct->data = data; dct->data_type = DICTIONARY_OTHER_TYPE; @@ -199,15 +315,28 @@ void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipul return NULL; } -dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data) +/**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_create_conneced(dict); + 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); @@ -217,7 +346,14 @@ dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect) return toconnect; } -dictionary *yon_dictionary_find(dictionary **dict, char *key) +/**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) @@ -231,6 +367,12 @@ dictionary *yon_dictionary_find(dictionary **dict, char *key) return NULL; } +/**yon_dictionary_rip(dictionary *dict) + * [EN] + * + * [RU] + * Вырезает элемент из словаря и возвращает вырезанный элемент. +*/ dictionary *yon_dictionary_rip(dictionary *dict) { if (!dict->next&&!dict->prev) return NULL; @@ -266,6 +408,12 @@ dictionary *yon_dictionary_rip(dictionary *dict) } } +/**yon_dictionary_get_nth(dictionary *dict, int place) + * [EN] + * + * [RU] + * Возвращает [place]-й элемент словаря [dict] +*/ dictionary *yon_dictionary_get_nth(dictionary *dict, int place) { if (dict){ @@ -289,7 +437,7 @@ dictionary *yon_dictionary_get_nth(dictionary *dict, int place) * * creates new char string by combining two char strings. */ -char *yon_char_get_augumented(char *source, char *append) +char *yon_char_append(char *source, char *append) { if (source && append) { @@ -321,8 +469,12 @@ char *yon_char_new(char *chr) return NULL; } -// char *yon_char_unite(char *source, ...) - +/**yon_char_unite(char *source, ...) + * [En] + * + * [RU] + * Объединяет строку [source] со всеми строками, написанными в [...] +*/ char *yon_char_unite(char *source, ...){ va_list arglist; char *new_char=NULL; @@ -331,15 +483,15 @@ char *yon_char_unite(char *source, ...){ va_start(arglist,source); unite_char = va_arg(arglist,char*); while(unite_char){ - new_char = yon_char_get_augumented(new_char,unite_char); + new_char = yon_char_append(new_char,unite_char); unite_char = va_arg(arglist,char*); } va_end(arglist); return new_char; } -/**[EN] - * +/**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) @@ -350,8 +502,9 @@ char *yon_cut(char *source, int size, int startpos) memcpy(cut, source + startpos, size); return cut; } -/**[EN] - * + +/**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. @@ -369,6 +522,12 @@ char *yon_char_divide(char *source, int dividepos) 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; @@ -383,7 +542,8 @@ int yon_char_find_count(char *source, char *find){ return i; } -/**[EN] +/**yon_char_divide_search(char *source, char *dividepos, int delete_divider) + * [EN] * char *yon_char_divide_search(char *source, char *dividepos, int delete_divider) * searches string [dividepos] in [source] string and divides it, * returning left part of divided string and @@ -415,7 +575,8 @@ char *yon_char_divide_search(char *source, char *dividepos, int delete_divider) } } -/**[EN] +/**yon_char_from_int(int int_to_convert) + * [EN] * char *yon_char_from_int(int int_to_convert) * converts int to char*. * @@ -427,15 +588,21 @@ char *yon_char_from_int(int int_to_convert) { int i = 1; float convert_check = (float)int_to_convert; - for (i = 1; convert_check > 10; i++) + for (i = 1; convert_check >= 10; i++) { convert_check = convert_check / 10; } - char *ch = malloc(i * sizeof(char) + 1); + 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){ char *final=NULL; char *temp=NULL; @@ -444,15 +611,15 @@ char *yon_char_replace(char *source, char *find, char*replace){ 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_get_augumented(temp,replace); - source=yon_char_get_augumented(temp,final+1); + temp=yon_char_append(temp,replace); + source=yon_char_append(temp,final+1); } return source; } } -/**[EN] - * char **yon_char_parse(char *parameters, int *size, char *divider) +/**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 @@ -478,37 +645,59 @@ char **yon_char_parse(char *parameters, int *size, char *divider){ } -char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete){ +/**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)-2); - int sz=0; - for (int i=0;i<*size-2;i++){ - if (i!=item_to_delete){ + 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]); - sz++; } - + else if (flag == 1 && i!=item_to_delete) { + new_char_parsed[i-1]=yon_char_new(char_string[i]); + } } - *size=sz; + (*size)=(*size)-1; return new_char_parsed; } -/**[EN] - * +/**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); + char *path = yon_char_append(DesktopPath, de->d_name); file = fopen(path, "r"); if (strlen(de->d_name) > 9) { @@ -664,15 +919,197 @@ apps *yon_apps_get_by_name(apps *applist, char *name, int size) return NULL; }; -config_str yon_config_load(char *command, int *str_len) -{ +//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[1000]; - memset(str, 0, 1000); - while (fgets(str, 1000, output)) + char str[4096]; + memset(str, 0, 4096); + while (fgets(str, 4096, output)) { if (strcmp(str, "") != 0) { @@ -680,7 +1117,7 @@ config_str yon_config_load(char *command, int *str_len) // printf("%s\n", str); output_strings[i] = NULL; output_strings[i] = yon_char_new(str); - memset(str, 0, 1000); + memset(str, 0, 4096); i++; } } @@ -693,22 +1130,54 @@ config_str yon_config_load(char *command, int *str_len) } } -/**[EN] - * int yon_config_save(char *command) +/**int yon_config_save(char *command) + * [EN] * Saves config with [command] * [RU] + * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: + * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" */ -int yon_config_save(char *command) -{ - FILE *output = popen(command, "r"); - return 1; +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; } -/**[EN] - * char *yon_config_get_parameter(config parameters, int size, char *param) - * Gets parameter from parameter list; +/**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) { @@ -735,66 +1204,34 @@ char *yon_config_get_parameter(config_str parameters, int size, char *param) return NULL; } -/**[EN] - * Parses, modifies and connects string to use it as one of arguments, - * sended to ubconfig. - * - * [RU] - */ -char *yon_config_make_save_parameter_with_multiple_arguments(char *parameter_string, char *config_parameter, char *divider){ - char *final=""; - int done=0; - char *cur=yon_char_new(parameter_string); - yon_char_divide_search(cur,"=",1); - char *cur_param=NULL; - while (cur_param=yon_char_divide_search(cur,",",1)){ - if (done==0){ - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"="), yon_char_get_augumented(cur_param,", "))); - done=1; - } else { - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"+="), yon_char_get_augumented(cur_param,", "))); - } - } - if (cur&&strcmp(cur,"")!=0) - if (done==0) - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"="), yon_char_get_augumented(cur,", "))); - else - final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"+="), yon_char_get_augumented(cur,", "))); - return final; -} -// terminal-using functions -int yon_launch_app(char *name) -{ - char *path = name; - thread_output *thread = malloc(sizeof(thread_output)); - thread->command = path; - thread->exitcode = malloc(sizeof(int)); - pthread_t thread_id; - pthread_create(&thread_id, NULL, (void *)yon_launch, thread); - return *thread->exitcode; -}; +// 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_get_augumented("/usr/bin/", name); - path = yon_char_get_augumented(path, " "); - path = yon_char_get_augumented(path, args); + char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); pthread_t thread_id; - thread_output *thread = malloc(sizeof(thread_output)); - thread->command = path; - thread->exitcode = malloc(sizeof(int)); - pthread_create(&thread_id, NULL, (void *)yon_launch, thread); - return *thread->exitcode; + char *command = NULL; + command = path; + pthread_create(&thread_id, NULL, (void *)yon_launch, command); }; -int yon_launch(thread_output *thread) +/**yon_launch(char *command) + * [EN] + * Execute command [command] + * [RU] + * Выполнить команду [command] +*/ +void yon_launch(char *command) { - int a = 0; - a = system(thread->command); - *thread->exitcode = a; - return *thread->exitcode; + system(command); } // Gtk functions @@ -807,6 +1244,13 @@ 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] @@ -819,27 +1263,37 @@ static render_data render; * после завершения работы терминала вызывается функция [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); - g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(on_terminal_done), widgets); + 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, - install_command, + commands, NULL, 0, NULL, NULL, NULL, -1, NULL, - NULL, - NULL); + child_ready, + install_command); vte_pty_spawn_async(pty, NULL, - install_command, + commands, NULL, 0, NULL, NULL, @@ -848,15 +1302,217 @@ void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, voi NULL, NULL, NULL); - vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100); + 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(widgets->TerminalRevealer); + 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 -int yon_gtk_combo_box_fill(GtkWidget *combo, config_str parameters,int size){ + // Window config functions + + #define check_window_config_setup if(__yon_window_config_target_window) + + struct { + int x; + int y; + int width; + int height; + int fullscreen; + } __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); + 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; + config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); + char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); + 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); + 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); + } + +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;ifirst; dct != NULL; dct = dct->next) - { - gtk_box_pack_start(GTK_BOX(destination), (GtkWidget *)dct->data, expand, fill, padding); +/**yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...) + * [EN] + * + * [RU] + * Добвляет [destination] все виджеты, прописанные после [padding]. Добавление происходит с начала контейнера. + * [expand] - расширяемость выделенного для виджетов места + * [fill] - заполнять ли виджетом всё ему выделенное место + * [padding] - отступ од других элементов +*/ +int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...){ + va_list args; + va_start(args,padding); + GtkWidget *widget = va_arg(args,GtkWidget*); + while (widget){ + gtk_box_pack_start(GTK_BOX(destination), widget, expand, fill, padding); } + va_end(args); return 1; - }else return 0; } -int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding) -{ - for (dictionary *dct = dict->first; dct != NULL; dct = dct->next) - { - gtk_box_pack_end(GTK_BOX(destination), (GtkWidget *)dct->data, expand, fill, padding); - } +/**yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...) + * [EN] + * + * [RU] + * Добвляет в [destination] все виджеты, прописанные после [padding]. Добавление происходит с конца контейнера. + * [expand] - расширяемость выделенного для виджетов места + * [fill] - заполнять ли виджетом всё ему выделенное место + * [padding] - отступ од других элементов +*/ +int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...){ + va_list args; + va_start(args,padding); + GtkWidget *widget = va_arg(args,GtkWidget*); + while (widget){ + gtk_box_pack_end(GTK_BOX(destination), widget, expand, fill, padding); + } + va_end(args); return 1; } + void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) { gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); @@ -921,9 +1605,6 @@ int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label) } else return 0; } -/** - * -*/ void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) { render_data data = render; @@ -950,7 +1631,6 @@ void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) 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); } diff --git a/source/ubl-utils.h b/source/ubl-utils.h index 43410b0..e3eaa0f 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -7,11 +7,13 @@ #include #include #include +#include +#include #include #include #include -#include "ubl-cmake.h" +#include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include #endif @@ -22,32 +24,19 @@ #define new(type) malloc(sizeof(type)) #define new_arr(type,size) malloc(sizeof(type)*size) -#define yon_ubl_set_config_save_data_pointer(command) config_commands.config_save_data = command - -#define yon_ubl_load_global_config(command, size_pointer) yon_config_load(command, size_pointer) -#define yon_ubl_load_local_config(command, size_pointer) yon_config_load(command, size_pointer) -#define yon_ubl_save_global_config(command) yon_config_save(command) -#define yon_ubl_save_local_config(command) yon_config_save(command) - -#define for_liststore_each(liststore) GtkTreeIter iter;\ -for (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(liststore),&iter);gtk_list_store_iter_is_valid(liststore,&iter);gtk_tree_model_iter_next(GTK_TREE_MODEL(liststore),&iter)) typedef enum { #ifdef __GTK_H__ DICTIONARY_GTK_WIDGETS_TYPE, #endif - DICTIONARY_OTHER_TYPE + DICTIONARY_OTHER_TYPE=0, + DICTIONARY_CHAR_TYPE, + DICTIONARY_INT_TYPE, + DICTIONARY_BOOL_TYPE, } DICT_TYPE; -typedef struct -{ - char *command; - int *exitcode; -} thread_output; - - typedef struct dictionary { char *key; @@ -56,6 +45,7 @@ typedef struct dictionary struct dictionary *prev; struct dictionary *first; DICT_TYPE data_type; + int flag1; } dictionary; typedef struct apps @@ -70,6 +60,15 @@ typedef struct apps } 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) @@ -83,28 +82,36 @@ typedef char** config_str; * [type] - тип данных, хранящихся в словаре [dictionary]. */ #define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data) -#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_create_with_data(key,data); \ - else dict=yon_dictionary_create_with_data_connected(dict,key,data);} -dictionary *yon_dictionary_create_empty(); +/**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_create_conneced(dictionary *targetdict); +dictionary *yon_dictionary_append(dictionary *targetdict); dictionary *yon_dictionary_get_last(dictionary *dict); -dictionary *yon_dictionary_switch_places(dictionary *dict, int aim); +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_create_with_data(char *key, void *data); +dictionary *yon_dictionary_new_with_data(char *key, void *data); -dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, 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_find(dictionary **dict, char *key); +dictionary *yon_dictionary_get(dictionary **dict, char *key); dictionary *yon_dictionary_rip(dictionary *dict); @@ -114,7 +121,7 @@ void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(vo // char functions -char *yon_char_get_augumented(char *source, char *append); +char *yon_char_append(char *source, char *append); char *yon_char_new(char *chr); @@ -132,7 +139,7 @@ char *yon_char_replace(char *source, char *find, char*replace); char **yon_char_parse(char *parameters, int *size, char *divider); -char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete); +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); @@ -140,10 +147,20 @@ 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 (config_str old, int *old_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(); // 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); @@ -152,31 +169,49 @@ 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(char *command); +int yon_config_save_registered(char *command); char *yon_config_get_parameter(config_str parameters, int size, char *param); -char *yon_config_make_save_parameter_with_multiple_arguments(char *parameter_string, char *config_parameter, char *divider); +int yon_config_load_register(char *command); -// terminal-using functions +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); -int yon_launch_app(char *name); +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); -int yon_launch(thread_output *thread); +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 +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]. @@ -193,11 +228,9 @@ typedef struct GtkListStore *List; } expander_icon_view; -// GtkWidget *yon_gtk_app_chooser_apps_create(); +void yon_window_config_setup(GtkWindow *window); -// dictionary *yon_gtk_app_chooser_create(); - -// expander_icon_view yon_gtk_icon_view_expander_create(GtkWidget *pack, ...); +int yon_window_config_load(char *path); int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); @@ -205,8 +238,9 @@ 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(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding); -int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding); +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, ...); diff --git a/ubl-settings-repomanager.css b/ubl-settings-repomanager.css index 8687d4a..547dcda 100644 --- a/ubl-settings-repomanager.css +++ b/ubl-settings-repomanager.css @@ -48,17 +48,23 @@ background:transparent; } .menuitemtop *{ margin:2px 2px 0 2px; - padding: 5px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 5px 0px 3px 5px; */ border:transparent; } .menuitemmiddle *{ margin:0 2px 0 2px; - padding: 3px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 3px 5px; */ border:transparent; } .menuitembottom *{ margin:0 2px 2px 2px; - padding: 3px 10px 5px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 5px 5px; */ } .menuitemtop:hover { background:@theme_bg_color; @@ -83,19 +89,25 @@ background:transparent; } .menuitemtop:hover* { margin:2px 2px 0 2px; - padding: 5px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 5px 0 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } .menuitemmiddle:hover* { - margin:0 2px 0 2px; - padding: 3px 10px 3px 5px; + margin:0 2px 0px 2px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } .menuitembottom:hover* { margin:0 2px 2px 2px; - padding: 3px 10px 5px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 5px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } diff --git a/ubl-settings-repomanager.glade b/ubl-settings-repomanager.glade index dcbdb02..8043960 100644 --- a/ubl-settings-repomanager.glade +++ b/ubl-settings-repomanager.glade @@ -214,6 +214,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + + + + + @@ -487,28 +493,6 @@ translated and supported by community. False False False - - - True - False - Documentation - True - - - - - - True - False - About - - - True @@ -867,11 +851,11 @@ translated and supported by community. True True - in True False + none True @@ -924,6 +908,9 @@ translated and supported by community. + True @@ -981,7 +968,6 @@ translated and supported by community. True False - extend False @@ -998,7 +984,6 @@ translated and supported by community. - True False 20 @@ -1021,7 +1006,6 @@ translated and supported by community. True False - stable False @@ -1061,7 +1045,6 @@ translated and supported by community. True False - 2204 False @@ -1101,7 +1084,6 @@ translated and supported by community. True False - amd64 False @@ -1118,7 +1100,6 @@ translated and supported by community. - True False 20 @@ -1141,7 +1122,6 @@ translated and supported by community. True False - main contrib non-free False @@ -1158,7 +1138,6 @@ translated and supported by community. - True False 20 @@ -1181,7 +1160,6 @@ translated and supported by community. True False - signed False From 0878b850549c91b665b845f9dee3151c24efef98 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 14 Jul 2023 11:23:33 +0600 Subject: [PATCH 26/35] package and repo search implemented --- source/ubl-settings-repomanager.c | 35 +++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index 49f1aff..e191871 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -131,13 +131,37 @@ void on_save(){ } if (origin_flagged) remove_command = remove_flagged ? yon_char_unite(remove_command,remove_flagged,NULL) : NULL; - add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : NULL; + add_command = add_flagged ? yon_char_unite(add_command, add_flagged,NULL) : add_command; printf("%s\n%s\n",remove_command,add_command); if (remove_command) system(remove_command); if (add_command) system(add_command); } } +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; + } + 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); + return; + } + + } + gtk_tree_view_expand_row(GTK_TREE_VIEW(widgets->RepoTree),gtk_tree_model_get_path(GTK_TREE_MODEL(main_config.tree_store),&iter),0); + } +} + void on_tree_selection_changed(GtkWidget *self,main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(main_config.tree_store); GtkTreeIter iter; @@ -483,7 +507,8 @@ main_window *setup_window(){ widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); // yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); // yon_gtk_builder_get_widget(builder,"AboutMenuItem"); - + gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); + 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); @@ -516,6 +541,7 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->ConfigureButton),"clicked",G_CALLBACK(on_repo_configure),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); @@ -605,10 +631,7 @@ int main(int argc, char *argv[]){ yon_ubl_header_setup_resource(widgets->HeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); - if (getuid()!=0) - yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - else - yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_status_box_render(TITLE_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); From 0d8c54766aa7a31b57dc8a962c495eed0d45568e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 14 Jul 2023 11:24:09 +0600 Subject: [PATCH 27/35] Localisation updates --- ubl-settings-repomanager.pot | 120 ++++++++++++++++++-------------- ubl-settings-repomanager_ru.po | 122 +++++++++++++++++++-------------- 2 files changed, 138 insertions(+), 104 deletions(-) diff --git a/ubl-settings-repomanager.pot b/ubl-settings-repomanager.pot index d9e7cb6..96993f6 100644 --- a/ubl-settings-repomanager.pot +++ b/ubl-settings-repomanager.pot @@ -73,214 +73,230 @@ msgstr "" msgid "Repository management and configuring" msgstr "" -#: source/ubl-strings.h:7 +#: source/ubl-strings.h:6 +msgid "Operation succeeded" +msgstr "" + +#: source/ubl-strings.h:9 msgid "About" msgstr "" -#: source/ubl-strings.h:8 +#: source/ubl-strings.h:10 msgid "Documentation" msgstr "" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:12 msgid "Save to local configuration" msgstr "" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:13 msgid "Save to global configuration" msgstr "" -#: source/ubl-strings.h:11 +#: source/ubl-strings.h:14 msgid "Save configuration" msgstr "" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:15 msgid "Save" msgstr "" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:17 msgid "Load local configuration" msgstr "" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:18 msgid "Load global configuration" msgstr "" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:19 msgid "Load" msgstr "" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:21 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:23 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:24 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." msgstr "" -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:25 msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:26 msgid "Open documentation" msgstr "" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:27 msgid "Project Home Page" msgstr "" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:28 msgid "Nothing were chosen" msgstr "" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:30 source/ubl-strings.h:38 msgid "Global configuration loading succseeded." msgstr "" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:31 source/ubl-strings.h:39 msgid "Local configuration loading succseeded." msgstr "" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 +msgid "Config loading failed" +msgstr "" + +#: source/ubl-strings.h:34 source/ubl-strings.h:41 msgid "Local and global configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:35 source/ubl-strings.h:42 msgid "Global configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:36 source/ubl-strings.h:43 msgid "Local configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:45 msgid "General" msgstr "" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:46 msgid "Publication" msgstr "" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:47 msgid "Trusted repository" msgstr "" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:48 msgid "Server type:" msgstr "" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:49 msgid "IP adress:" msgstr "" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:50 msgid "Port:" msgstr "" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:51 msgid "Publish" msgstr "" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:52 msgid "Code name:" msgstr "" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:53 msgid "Branch:" msgstr "" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:54 msgid "Architecture:" msgstr "" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:55 msgid "Components:" msgstr "" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:56 msgid "Signature:" msgstr "" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:58 msgid "Create repository" msgstr "" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:59 msgid "Open existing repository" msgstr "" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:60 msgid "Configure repository" msgstr "" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:61 msgid "Delete repository" msgstr "" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:62 msgid "" "Add/Remove repository from\n" "local package sources" msgstr "" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:63 msgid "Enable/disable repository publish" msgstr "" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:64 msgid "Check dependences" msgstr "" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:65 msgid "Sign ripository" msgstr "" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:66 msgid "Add package" msgstr "" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:67 msgid "Remove package" msgstr "" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:68 msgid "Open" msgstr "" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:70 msgid "Operation done" msgstr "" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:72 msgid "Choose branch or pack in branch to add file!" msgstr "" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:73 msgid "Choose repository or branch!" msgstr "" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:74 msgid "Choose pack to delete!" msgstr "" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:75 msgid "Choose repository to delete!" msgstr "" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:77 msgid "Name:" msgstr "" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:78 msgid "Branches:" msgstr "" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:79 msgid "< Type branch name >" msgstr "" + +#: source/ubl-strings.h:80 +msgid "Name must be filled!" +msgstr "" + +#: source/ubl-strings.h:81 +msgid "Choose path for new repository" +msgstr "" diff --git a/ubl-settings-repomanager_ru.po b/ubl-settings-repomanager_ru.po index 579cc0f..9143c52 100644 --- a/ubl-settings-repomanager_ru.po +++ b/ubl-settings-repomanager_ru.po @@ -74,51 +74,56 @@ msgstr "Менеджер репозиториев" msgid "Repository management and configuring" msgstr "Настройка параметров и управление репозиториями системы" -#: source/ubl-strings.h:7 +#: source/ubl-strings.h:6 +#, fuzzy +msgid "Operation succeeded" +msgstr "Операция завершена" + +#: source/ubl-strings.h:9 msgid "About" msgstr "О программе" -#: source/ubl-strings.h:8 +#: source/ubl-strings.h:10 msgid "Documentation" msgstr "Справка" -#: source/ubl-strings.h:9 +#: source/ubl-strings.h:12 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:13 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/ubl-strings.h:11 +#: source/ubl-strings.h:14 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:15 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:17 msgid "Load local configuration" msgstr "Загрузить локальную конфигуруцию" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:18 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:19 msgid "Load" msgstr "Загрузить" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:21 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:23 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:24 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -126,107 +131,111 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/ubl-strings.h:21 +#: source/ubl-strings.h:25 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:26 msgid "Open documentation" msgstr "Прочитать справку" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:27 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:28 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:30 source/ubl-strings.h:38 msgid "Global configuration loading succseeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:31 source/ubl-strings.h:39 msgid "Local configuration loading succseeded." msgstr "Успешно загружена локальная конфигурация" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 +msgid "Config loading failed" +msgstr "" + +#: source/ubl-strings.h:34 source/ubl-strings.h:41 msgid "Local and global configuration saving succseeded." msgstr "Успешно записаны локальная и глобальная конфигурация" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:35 source/ubl-strings.h:42 msgid "Global configuration saving succseeded." msgstr "Успешно записана глобальная конфигурация" -#: source/ubl-strings.h:32 +#: source/ubl-strings.h:36 source/ubl-strings.h:43 msgid "Local configuration saving succseeded." msgstr "Успешно записана локальная конфигурация" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:45 msgid "General" msgstr "Общие" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:46 msgid "Publication" msgstr "Публикация" -#: source/ubl-strings.h:36 +#: source/ubl-strings.h:47 msgid "Trusted repository" msgstr "Доверенный репозиторий" -#: source/ubl-strings.h:37 +#: source/ubl-strings.h:48 msgid "Server type:" msgstr "Тип сервера:" -#: source/ubl-strings.h:38 +#: source/ubl-strings.h:49 msgid "IP adress:" msgstr "IP-адрес:" -#: source/ubl-strings.h:39 +#: source/ubl-strings.h:50 msgid "Port:" msgstr "Порт:" -#: source/ubl-strings.h:40 +#: source/ubl-strings.h:51 msgid "Publish" msgstr "Опубликовать" -#: source/ubl-strings.h:41 +#: source/ubl-strings.h:52 msgid "Code name:" msgstr "Кодовое имя:" -#: source/ubl-strings.h:42 +#: source/ubl-strings.h:53 msgid "Branch:" msgstr "Ветка:" -#: source/ubl-strings.h:43 +#: source/ubl-strings.h:54 msgid "Architecture:" msgstr "Архитектура:" -#: source/ubl-strings.h:44 +#: source/ubl-strings.h:55 msgid "Components:" msgstr "Компоненты" -#: source/ubl-strings.h:45 +#: source/ubl-strings.h:56 msgid "Signature:" msgstr "Подпись" -#: source/ubl-strings.h:47 +#: source/ubl-strings.h:58 msgid "Create repository" msgstr "Создать репозиторий" -#: source/ubl-strings.h:48 +#: source/ubl-strings.h:59 msgid "Open existing repository" msgstr "Открыть и добавить репозиторий" -#: source/ubl-strings.h:49 +#: source/ubl-strings.h:60 msgid "Configure repository" msgstr "Редактировать репозиторий" -#: source/ubl-strings.h:50 +#: source/ubl-strings.h:61 msgid "Delete repository" msgstr "Удалить репозиторий" -#: source/ubl-strings.h:51 +#: source/ubl-strings.h:62 msgid "" "Add/Remove repository from\n" "local package sources" @@ -234,59 +243,68 @@ msgstr "" "Добавить/удалить репу из\n" " локальных источников пакетов" -#: source/ubl-strings.h:52 +#: source/ubl-strings.h:63 msgid "Enable/disable repository publish" msgstr "Включить/отключить публикацию" -#: source/ubl-strings.h:53 +#: source/ubl-strings.h:64 msgid "Check dependences" msgstr "Проверить на битые зависимости" -#: source/ubl-strings.h:54 +#: source/ubl-strings.h:65 msgid "Sign ripository" msgstr "Подпись пакетов" -#: source/ubl-strings.h:55 +#: source/ubl-strings.h:66 msgid "Add package" msgstr "Добавить пакет" -#: source/ubl-strings.h:56 +#: source/ubl-strings.h:67 msgid "Remove package" msgstr "Удалить пакет" -#: source/ubl-strings.h:57 +#: source/ubl-strings.h:68 msgid "Open" msgstr "Открыть" -#: source/ubl-strings.h:59 +#: source/ubl-strings.h:70 msgid "Operation done" msgstr "Операция завершена" -#: source/ubl-strings.h:61 +#: source/ubl-strings.h:72 msgid "Choose branch or pack in branch to add file!" msgstr "Выберите ветку чтобы добавить пакет!" -#: source/ubl-strings.h:62 +#: source/ubl-strings.h:73 msgid "Choose repository or branch!" msgstr "Выберите репозиторий!" -#: source/ubl-strings.h:63 +#: source/ubl-strings.h:74 msgid "Choose pack to delete!" msgstr "Выберите пакет для удаления!" -#: source/ubl-strings.h:64 +#: source/ubl-strings.h:75 msgid "Choose repository to delete!" msgstr "Выберите репозиторий для удаления!" -#: source/ubl-strings.h:66 +#: source/ubl-strings.h:77 msgid "Name:" msgstr "Название:" -#: source/ubl-strings.h:67 +#: source/ubl-strings.h:78 #, fuzzy msgid "Branches:" msgstr "Ветки:" -#: source/ubl-strings.h:68 +#: source/ubl-strings.h:79 msgid "< Type branch name >" msgstr "< Введите название ветки >" + +#: source/ubl-strings.h:80 +msgid "Name must be filled!" +msgstr "Введите название!" + +#: source/ubl-strings.h:81 +#, fuzzy +msgid "Choose path for new repository" +msgstr "Выбрать расположение нового репозитория" From 9388b52905d039379b55e4256beae716f1c35e15 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 14 Jul 2023 11:49:06 +0600 Subject: [PATCH 28/35] Removed unused string --- source/ubl-strings.h | 1 - 1 file changed, 1 deletion(-) diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 17d9b66..f516e5f 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -4,7 +4,6 @@ #define TITLE_LABEL _("Repository manager") #define TITLE_INFO_LABEL _("Repository management and configuring") #define SUCCESS_LABEL _("Operation succeeded") -#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") #define ABOUT_LABEL _("About") #define DOCUMENTATION_LABEL _("Documentation") From 73a0b7177697a1495136b2807331a67dd42c93b8 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 17 Jul 2023 09:51:07 +0600 Subject: [PATCH 29/35] Addeed screenshot --- screenshot/screensgot.png | Bin 0 -> 64258 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshot/screensgot.png diff --git a/screenshot/screensgot.png b/screenshot/screensgot.png new file mode 100644 index 0000000000000000000000000000000000000000..723457cf2c11f4bb0ea696e8f8894d6e5364f689 GIT binary patch literal 64258 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 Q4$^Z?T7~p_=3uY7ik4Q)u zBJOW6&3LtZQ%}v-XIg5*pZqjBoj=tUhb)ue`Hc8q+5`0RVxWq!tNhs3Ro4v~tUbHf zOtJnr+i`m2-slP9(vUg(^X0mO30K-bq@+M{!3y?Vh?%a}ZoZS;0Em;9`?J6-K9CgH#lK)`SP5)c+$pVS3J2Se zRNG8f1U27*t^SOA1`>|_P{{!{OQM!Tsg!VcXC~ybTfYgjzSCpUW#WdZ@IxOiw*%eH zaOCs%^zRDu=W$;t@e<0wb&?M5trmX09Eigf(}{>c!4Ql6Y(a3oHMBBW>j2Cw<(-t6 zpFRW}l*tYZ4zi@lB{Q0D4QD``rkArD^P_rDwyn=8U;6vrX{F2at59qFa-AP(i1b~4 z9(y@=&xu?4J7wzwwwRATGa%Bc9?i(<`BFSG)lV(M#>7NM%6fS<)xL}}S-rmJOk#0; z^76i)t@0+hv`Ed_Cp?Kw;k0B0TfOz!RstUsde%Y}R6MKaRc44oEB=dX2SC)IHZ6%_GM}#B7eKj>RXEE~O#VLIiG1=L| z%dU0Z%MVl$)gIY;Y1PNiJKIVSY@AIKjuaLdEZFue&3=dgPhUJW5b-40M<+;^B$-;g76#l@tu^uO187}{0b3dOpm_`Z->vo`5-Raoz!`U*a)j|sX zGN*_ppSX+Xs{oCUu%v14Ts0LN|?# zjdmxVit6EGrj)}wrb`Q2W!}Dma&qMislo{UzeigQ?%Uj!8>*;ueK+$Fa{_45?MaJG zz9()O-u;FCTPiInXW-(q8;f59|5SOm#H#}t7oKEc2OOK}^1|$@U@_DY38$*HCG+aJ zWNvTj$}->h-d@Yn9Q{Q6iGq`n-g1~^3j0FF@#?`e@}-2I z!!|#BTD|@BQv1yrU)%j*C7MjZe{ubiOQ%|9(x*vicNNt(oJbOr5M$bRGlFI>iLn{q zA1DlRGjd}+m;Uy8alGMVy#%eN!$IRo0| z>V7v}B;(W5Az=Tj+wH9F-9kac%G3XG0kWprDuH0A@~Djv0Bygk2nocHPF>ecg5GFG zqeuR<*;;R5n6}X7ct2TFt&edz6A3Z|BKWH2pH_dxwK5hA83oHFK@4%Bc(N80BZFsW0s$Htv+^O;FfDki--^d zaP7Qva$3YUMExeIqVc=Gz`aA}&HD1m{YwUYmNfsTQmuHkD0(G^IQOp%6U)n$k(I+( z_zEZ;h8XS4sXKt_IJzCxqEShA>4hMmEhrwZRQ+P^kV{VM!n3s~9*5r|sZ3u=ULL3U znrH>AYEKVI{%5TY{%?7={^-}XMy1uO08X-Az5llf*Gr^rO$@jKg|zOm^+Fz>4ca&c zOyuBXP8VdHQmy@X;tD_9)$e@%*$sRNx4Q++h5Q{4s3WJ}aTvH8c@mvdLsY*4z z$HxyxXWajzq5@TJmd`W)H6~gxygy1TB#sgj`5QSTs7k_E_QGX)dOCuE-jopjtxLdI zPw>WeOy}`+_4Du8Am7;BCC=yQnukPZOAZGvg-<*ZHxu$oG`P1UgO-d{T)Z7+NWi z$gv`U+##H5XVx!Cg>w$oymzB{bc2AD4-MNRIJ}!-%}wEP66lN0*a*26#x}@C!>LY@ zVQ&0h_5>g+UFR#b0NMTJ1+%|3AY<`u6c* z722)@zDeCc21tFRG`apYGFEfHU0>DcuWX^1leQ(LRKQ`1aFA;r;E7{TsMmbA2yRqu z9RD-V43{Cl75ihw`trHKY5kk++A#NW9&mEsBbJJrsj+%P$Zap{p#aEofL9UrhDLmG zVtoAU=-ww9$O^jF@eThL>4KC$sEVqGNXX~oy^yfMEU47kZJQ2TeTW|2;~DxpiGW5Y zoh^*9aWb|JgZ&m)Q8PJ)6p@3wUfHDyO)3${K@VbnFo#h_EAD%pZcb~}nUVqUXEmTe zEAH8Ln7Dtt`BE4VcOWj;egtW$rylU2LuCjE^r4uu3|bsX;Ygsroc|EZ6&mhLgV&ws z8{Wi3yUwk-EI>#7Lq+dhF*6o>-jegmiV_TXr+o@^;nIFf{Y88@%;{Z#Mh((D8O=Um zU4X~y3`e6d^~-cjfUzTh@;yDDgDMlCU}+_udLiHmxBcLCF=w+Fk)>A1g!}ovqU#Hv zg^)o&Zr@w?)|}3k4qh88l`Yx06EEL`ma04_DsLK2^@P0{sG2V$5^xUu8WIgM&FTV$9#Gm$!6y0-Fg!|SK4G<1HB zuua3wod)VytW`Pb-@ci{$YRdI-}5HrN8maF2_x*Ev3!hrLt0S{cV-AfJPsLkRX-so zoBh$&NXBrBXLSmY4;4@9I6HtIi_rBf;caI|J)3vI+MX?&SRYF3%>W^T4&*yPrOD*d zHne!MGgCD{eI(?I{D%66#F2c9e9dx|zoQ)XR*baf_Jx&7vXC9}+c&)uQ4@-a)9NZ4 zo}?0)2=`Yc@IUkNB*`k{y5q#o8$Vyt9W_0g10-Kr;R|+~F4J0oeR@3OOJvlN>QIqBZI;J*wQiu^o$h9kMcmHDp^cB0hdZNHkT9@lqW*&1;FTx-PRj~;?B zIY$+WIKp5Wk+JwlQFO!y4NmkzW+2-L#d4fu9H&hCg^%#8X<=?oU5c;BhE6>{R$5lJ z5s1Ph>E!^Jl7Cz6umAYn93zNF4}mT?$YIU~mj%8sNX;FUk(nH*&5C8ly5KJ*7pcLPsI z*?3RdAE5DvpwWk0_S`7Ll&KTGBzD(r{xn=ARNgvfX$Ya$6QYRv#tf3mM&qxteP z%QTP7$zXlkVk)v2D6!&3oJgrhth^_Q570uyrKx|=6LKBfE)?j|6Kdo%VD~X-NAwK! z;4*C|)H+zXSa9K6TH2aJa~g-z;(4sTtr4fryy6m+!FiC|W%JZpx6mgY!y7t$c$w6e+wWbpOs|ZVvrFy50h+$}L(0-E?FyS#Q@TOA1nGEdpX0gjjW_NcgEIymcKrYP*P8R2@y&1R z;Z7TxK9Im}Fy<%F{iFj>yx29HqOnq0+%IF6pEWgniu^uTOsfB_hKUH|7Q1PqUdZ|^ zF;-PSGY@abjZcgKhyNAb3zg~E=pHiO&lI5PybGl6cmxESn?P2X%Y4nPK=Caf=cKvU zxjx6+M(^h~QNc?~Ak4s6!#2?{kqwAQW!Z6Ue55ZDdDG@a0zlxi;X9o`aYEQ!g5z_c zR4wllxuNScR1l6mS#=blpeM!rU0S{@^!0i;Kk`+D<{%6+Ww;;GS>N%eyI5F`R9I}{ zC$NSpi8!(wAO9|~UBN*F(xA9GjNIP4?*wT_hW`b8f=h{ck1oC@D@(4T`W%n^nXI8# z+VaxF{ilRZZln(9eU6#2H)yQ#fYwhTo?)%H{>7YPg3{-md9)p-v^f8Ab;xA5il_qN z#+Lm=#Psns`O#~QX)%y&t6%c+R(0tnFMmJ;?eepYp45fKmi9B&;nezajD$a{oUoA8 z`m~zds0uAUQ|S=(=;@o`F6H2&)sF>q*L$_zG18ML4_JA=!4Kylh! zC|iX;7cId~Qq5Ffpm?v8IY%eg# z_M^c?4;RrG5l+8C&Qu>~E z)`;RXLpuid3tCY7SxLy;80NKkSn7Hb7MA!Y5r3=UujczR`R^>DoVJm~BgB}9&dBkv z?jqU>GBdTF71+(DsDbImpiOw%XN?;aIf{oyQo<5W!Ayjjy2%th5U=>rtbo$S3r8}5 zP2j|&rAcf?Aa5CzN7tD1D+u2ogEi*E4vt7~#xZj&q)4a14Q-(NmQ!D^;dnC1(1eTl zF;&z%f;-Z*dN@#}$apsP>fJm3*&1g+C;OCU_3F(iDm2GA=RT57*7SU^2v)dCkn#FC zF6n45Xk}HjK%`bEP8b*4^~xITQVZ^96SIvs5XGT~D3E4}%V~Ll+$SIWak=nV{g5k< zA}$s>p87?cGsnn?l}l8dwK7}WZ|s%Pa|?w@(#nrwkT>Fz#wd94pPcwtt{0aM4y~8d z)35F-g&eD!t36%qkT!0H2Nn)LZ@CvNoOo?9y+ukL3aZ?S>Y0=!5i3&lGbD9lJM;qz z398eRT^2t&J_ACQ9PVV$gzY`r};^G4-mwg!S(~susH5QhyevMnolIWv54Gmw~yTf zuSch*BgLzHVo*{FhOV;dVFGtBdg-=(P^%Vc3RBoVN zxitS^*SZZD9uh$J6DbfYxD&x>b9U>Z^C)cio9lewCGy7PVx|wPe`_Kmm;uh-`cx z9+qMx{8oiR4GvvLu5XA7t;uYGEVEk%h^0SD6uoL~rJ^8d<*-iHdR?N{@bFPIcX$cc z)jP*{i|{og;ip%c4QcF*gmRk3M-ittUMt3%h>-GWgv{yS!9fK^HRj6}y<=gNT5XI7 zb$>A$)Wiw6Y5@f8Qe?S!beno|5nCtL+@SFTEQ6SH?41u7K=HjjZcIASUrft*@RYK@Tk4f`8+zbn$E(XlB5FaIzNFt?XBlDMkp%M3(WpJA-zu_E`Pda*F0naW zhxL4W%^Z*Z1L27Tsz7Tv)$`JWK0Dc>c)0~mlc#O&8}$u7{hx?OoF<=0SSD&CNJ{a2 zcBgxtRNe8V7L~Eae!Uo|NF?$VnNJiL?$1=p8aL1@r6uvrz~^wNBpk+NW@ftF3_nrj zy_|W#Evfim2%$2%O0_H{U}nW*hd&;(1*4<04PJkRRD#>c#^uilQ|rjB&OoA@M}>zI z1$qWvBKlAa9NHoZw0R({Y)1i}9a5<}LS$IS-pLdE)hyMb4o*zr$}(#SjKrEf?FIX% zpJ^$u{kH@zy?yMUZ$0#q%N!tJhxa;?9p9{)+4aDWpb8(FefXlnP=J^D{wcn=yZa;1 zv>Pt-^hw*PoM0OhDQ4H+$p;gyFRB)1JY>g}V-Ka?nQs{h!_!G<2r+XCn#eXc$7D&t z)k<{I@Uz1Q`oWDjq9VOqL!?k4D@7(NW!KKe2?mWXYyD|nHZNl>N1a}f28jc$6EJVt z<)HybcqG^MNN;Te-ztfSp*p&NAyIm*5$v$ay>9RYU6gw&sK>|dxfkJl#0oq-sHMjz z=49bgq>83rCYeFHzkyuWfD~+4c=UX3cFu(LQ}O;WtQCNOa zWWl3|cjE=gpQZW3QOWP_La8ut5=>SdcwZ2P)pah(a

JjfJEW5Ivz6d>dc&=+EVZAJgULjJW3cFX_uBHd8J_PIR#%2!Zzo z8sxYr++H_H&utZ{<$AXSHBbVkx@6OQP}d+jirKvq<$Fsja(n#J>uNI*+%8Pad*er3 zT$QmFafy0q*YjmBgp#SyOrL8e_VU=+*gS6~A+Iw^P--G*z65}H=IzGz+ihSGrZ-ve zNLD)>#tIk4Y1jnSL^`CNtYHSP3I5<~)09-oe%)oo2R2M@+Y)x51YGqjs|{@)$LG#< zm#{_tM?vC@goMkMPgT<>vJ24LIGshif!TZxFN~9~5@MGWxTuHIyhw#%;)Ttc5pA-|hcSS{$3Z3uMCMZJ!`k7z%su*ZocFX8H zS?@Ef)dq76dJoklX0;NK$jNCFNZ-kflnW`kQqTy-rHQTuPwxeSH-I_gLD-a`pr;8C zEI~oPav(Lj3^xyQLgbT8F>V=m`HV4{Sx@tuJs#q%A&|%ejLNf}2^63MVC34B{SxKV z4*hT$!(age@&=~=H_iMP_EO(Ih(f5R2{F;;SqRaA)RL;kku;F&`D((4nmLV8s*Vw4 z2*hC4h8@>l0%I9p6Taon!}HYD79H6iwf9gu8wmZ4tt>c>NIE<7x*W^}vgl zrH#SZ;d_OCxoDoG5O%ZT5ArPgAw)Eh>shMIfVbB3=(a|i%}JXLa65qXN7j^uA$MvI zdx(SkbLld*uyuZ*Wdi((ChORtzr+=Am4-kV)}8_oJkC74`?);E)M+Fa?j49!%mX#E zUw3SsX1BFbsh1G>qu>NF|D+o+s?4gZQ^#xxsFL;9Ya~v0`uH)A5Q2+gv1iDgJen(w z!$rzTih1nO3T9<+rVfn)O38~+tFZSHEJjW0g=UtSB!FcAMl66$3JwKokml!j4T&Pv zwKS1d$gAc?wD#_honv8+gmNb9t14Mh6n}Bha=+~)c(ykUDy?V$ORU=QK%Dp~fUkI6 zGG%Xkk$2&~cDE3FlV+mD!^1;EiuvUEbB+B1h8FT;FsB||17OvRn(;9Cr>gc%j~}cJ zP`;=~!J&Eu+9<)se-eX9YP{%XqP)%Y2{~Zwun3@Bk5+8ZTnGfI%)k+m%KfNR9%Y-p zM^kFeL?3`FpNXl#Pu}r;m|i^;0~GJv6L?MOc?9t$-Aj?9sGEk^aN= zG;HGieiIx5@=6FpW~?p)5lNm?^snC=frkMKU13q~B4tyOr7Cck1bcoY_1QCBPunmU zDv4-*8s$w%>fq<_!1?wwDOg>RURiL9^S8Bx)>-Re7%)#p60!%(Z8NGARo)+b03PskDS^yLV;kA7@#?UolF>7z{NEF zlYPfsaT-3|tu$Z+JXD|!v^}1WQ6orsez1rU)rZi$h@CnVy08FEQYhHw{~B<+b||DL z;!UMknd0UJJ-aioi9%tHXBH%mHgC%8ls@wIrGdo#K#Y(=0N0hTf=B+IIgjOmlQuH1 z@TKMJQAyOtdH^wkz&kMM=i5iPX)!Mm?Y6 zl`&O&ugoqagAB8#Ufrx=#4GxbL4XH1aCyh~GGFCoXOAmExDem5{a!#O zz_Z}q!9g^7&TS}a-m6ALUZ1a01PZyRnIpj<7~B4HZ6>Lw0;jkym3-(WM1c*8k4{HR zlwh`!u&KGmGhlp6)x%m^gh5UX@a18mg5U$c4-FA9EXi1jf2OtSwuiF1jlRrQeZse{l#31IQJwfB3Eorf&DFB-kVTN1 zp;iBe8$+)LB}so}@MPHW@$`3Syt(YxuHu`qyPTc*DZu6j;wafOem$oxGY4;JoYDsX z^qsPh1b_yBvooYtbjgYRMDB~mvue8q@WcVN4fH{8FSU9?8)s(D4#!W;t7i@PQh~*L zqpckZZV1>Fu1hm>%LE>3^VuBZ0;th*k;gzj4`90p0Mq%?u_;7-C+X5Ac%;J7LMKhw?3V$P3KK-&};xR5N=ojlf6f#Mzb>Y3ZnR|rO ziTXGo?S)_|pqt?2gHT~8>i8fgluuT<({Wqt{L!SdR=Dsr_~n25}d#BwtEOUfS5OhfC$U-FEqeC_e;dg7HA$ssaN8zyJ6VQnw-l z&$ikS_!~rhT(*W*G4lsfCMI-Ff|T6Pp7qYs<`cOzT2i7St~fM;3Kc@`7$dUw_}-J- z&wB57-2ZsAf*6D|S)uYUQ_h}zr&2yji!2&Y-2vMe2=#?6ZsYgW%c6@| zK*o}Zo0}W7^}N%$REcZcZc6m*+q&Gm=`-4!l$!6b*+mU_J3y zyc?Tlf~2A%)@QkVx1kBOUz>j4!A1mq*5IlEeNh5nwvT2_H;O5d(ExknHCIaYDKPgK z@XUqg5tbLK6hQ{6Ktsu~TkH1EQXS|hTkH8+o)DS|iFN}pR6r>cbnP2*OX-y2Y8)0g zK2dsL7d{I?`YM3aqWq8q8n+B68C4xw9p9 zanXvleP-O*(7Byq++CJSbd0Qg!1i0Xo963e=YCl@1}PXD`z?Z;Au=WgDED;V9JNRF z_sfB@IYX;I8W5T)uCQO1LiF!!D3iQcbQMKMM~@wN>>ldfWJF5Oz7kt9i54Ixp9B?e zTO0Yb7Z8G)cXTAn%aT-)UQx=KAyum0ZN}rb?lw6+?QfWrXGv>a1P`g7#{zaS?gybL zniSL^n!*lE92Kl^R`zQ~10FIU$Os;350{byk#3M7!1+dSIb^LKfBbrl@N}Fvw4djR zC*oqF_LWWV#enA?WY}|JB0)0vs>|(Z;RIT|Tp&1bT;Fjc*-k_a8_y_E0Zf^+;020s zfQJX35-BFemFxvU8}Rr5{sD6V+YW4bVC$`FJ{NDSbRVbrXrfiwt88XZ@LRdXbS;46 zQ{4s_LX80NINOFx9YU_vW{af8Z|W*2Zo!xqcSEZky&I!U{VF-5#P8cx363hbjKYZ! z;0^)fwFk**{9yBUypMX3Dj1UVx=0n~KNtytHbFcF=jJ%rXW;ppg%1fc<~>H#9%qjm zyAhb{2eT>xo`U(d@@bX~N42gzVh1=4rxq&!-BG~pfN2b>a%u}lVbI3>b` z!6}vsgt*I@^Q1J`tFjK{0B{NOC4+;6Ixhlf#tvM<%IR_ah?&gg6KVqGJroHL1hU~N zu!DhWUG~IIjJ7-aQ9Atb}2r?@~6n5@OZAn89I~1mK+HWpMY+o zZdQp(oBA&MJj`e}DrkyLLD8@PY-i|6MWwoUAVd8^gQRY+L^BN!G(43Av5>{Yudqp5 zYi0MYFOH%DF-X=x@vNiDWZ-yAn!2~t_x7ZZ%V9&tYQ7E&7MjM;O2>`^okUD3twxov zU(&D_Q8sIyuHcJsa>p~7lZC|p0jWRs^QEHgBmy<42Cppq7&RMaL%=~m0(YQ92vq{km@-w!~~!O z03rc`1G0ZFDO{hX38q+f~s9*{M zkdL(QLNiQDa7xo$yTTP2C{?}%Sv?*yEZ_rRiLt|q>})uXR;uLWh^ zgQGmoj+lWGV9ehNKQ-;)+tHI@D9G`P43DWHL>!=g6l zi#(oYg5nMSd-}!t0Q5{Jg*XX3%9(QYlHAVpJ_KOkfdPEsd2Vofd192Pl3)VbPLzt` zpK&qb`mtyG4RMay%L%z2zN)ub1o#>ybA(}-KS>iW-bV>DDKIl6{%zw?7kBwI28cE% zc5p*pt(mS8=s7H^m$rYQW|*k#JAR4z_-aV0Z%-Q9#r7m zbw@|(OK;7FJi<`>IbY~vCxHOwhgZYV8XzCm-M`*kGqCEPa_ug*{c`)ZB0t-NiHezWoRx4zMj()t1~>8YIpUN&e~!H~0WD0yPn>5ALq@3L=_U;H30 zD_CJliNf^)NkQNhhVzIqk=FY{f2e+aiv$hnW5(jl8wfyeADsiJlX=*RL7|@gfO+Pp zu6&>|i62Jd08;rhxrRUjRj}&XWogd`d7Jj0^+aSMVBXjhF6Bw5lhld+S0+EPJbQVMBR!o{h-%3c7!?5AmOb1Do{kuyU|kQ5+xfO*W2 zFi+xd6I3rZnHP7M`zZQ4w@yReYPjzG!~zKd5RRUE)jFFfk>V79e(xWQIUKQ5VVwlg z3stdS8o3n2ZX08SV7nEBw^n0uF0_h7gK1xTPMK=5v{;ENSi=lB86zj;F2+q8f0n3T z{aAcCewf^8@Ou9z2_|y3N>Qw~-gtg;WX-LF*yBZwZ3|{rjgqOgt3;Pg5UPZj#5HS- z*Y=?4dIctEWJ9|!;sO(@evRY%%279Qp7`R7Bgs~^*R$QGf`Bo=DeoEm3ce<$;DYFp z1S{!t)PbdI(s>^RDh=MlG#fX&&Ua~VKd08%oNaUQAGN%hX)?iB^6|tvKZx_y(8vMF zRipdO_MXY2wG7>P8_>-EERj9O{Hf=K7vKe4YfC@(E=r8*K_kS36^<@ryY_;71_)3Ri0F;$(B)oG}nR4z;MR&5-GhP zZ62_GKi-96)CoSZU0otrTBUoDIG(6BP}_rQj;exm=dg#*tGHLD&@@~GuYBbobNFBy zsh?uA;8v_DuLYfBuouYL`npqnOs9rR-+D3kunRkhrH%O$cq2DPd=9e=U{wx_{#nXUcy%46_r$6my+iWzq@Q0NR0 z@xC_b`5pt<4M(541xsa@b)S~z$?KHk>y+k=t5IxfcWlUHp2_=X{$l>3@b*BlZd3en zcAQ;btj2_c5IscsMkobp8Fc*CBNBL^o%fB-<7e6q&^6W=O44K04egD&CTB&tlsYIU z-E#zEdH7LPHj9wG@d#zYx_Hav&vEQ-vWY%x7Y*#672axe^c>8ersV0k)V-jg4ZwA{ z7BEI&?+k#W8$#CHAtWM#2^(X{JDtn!_apG=H_Cn89>|a36HU%^n6D{_Wtbjf)}3ZH zENDt_A+WS8f`8TMI1klm`qj@dUHe*-K0H}2-o;Zs4Xe7b%#UqW$%eY|l&KZjLA;EI zV@Ghu$6;rHQrU=ecELOGa4C93R76HW16zEY=M)oRCxA3$Qy~6^cJajJ=MfDIXW+m0 z>X4MlQB}SqU@>vX)Ol+zk7*>B+m)#4p2%*?Lb<4RtUyEJl#lU2nU6D(9JIY`{pw$g zbuKD%UprDOuC&Gu~{AGwG_j z_u3AM`CD{T`;O`M*mEW1xeJxwDJ_jK;-DJsznVIKY>q)Oq8GfEWA|ppZE`Ck*3aYa zr(<2icwH4$>MeN7t9_Qixr~mJgd@3{m7UIi-4wpH$x_Q^ej=#L?8Wdl(&?j?<4r#E z%lDa4!-MU-y1PDy0c9T;=8K*AGKIjV7S$)Ti+QFEMN&-r^x9`Z-YBsv0a2&uSU8hM zt2;TbR{WhK8-DuKE)Ak*`dFy~`>4eccOE&*&)ER>K-u<}E$_S~aOuA$x=23-=GDiB zapg&RFFn~OTQJZtFXgfD*19;gKqK3OG??f zsmd4h=x|_I8G9wm?hnL|<7lr{bmvtGoWDm{$}MP=Efh)|W|#rKx=?3dk<&}q7YPy| zLEne`bf&b_(oPpJ?Ahr^iy51h{Ge1WZK|$bxT)_()}oRvR(>>jE3_^Ggb0Pe{*lm@ z8oPz1M8S&TN+=;CLI3_ft^_Xo-`}HMB;ZJ3e+I9qiF=#ELrWUkv5wJ6Vt^NNY(PuF zA4z`!b0px;X~~4>$jtfha&!p(N=R|y2&KO^7{Y{#J`5aS`Qg0fj`N zx_EY$xd+<6AN-y^avcw~8a0^K&eQKp@hLo{%Gx6db634^y7&Xjpu?B4Q$LhZx@AAi zxVouF`2Sw+_Z_)x1B20GxKc9WIBdwuZ^YMHdqLeqVm^_07HR|1rnUSlzmYUmr`@Ad zO(bj*ivG|s{Jo`T(Y<;8y?HMq79*;Pr3g2YvZiZUKU=&p`-M^QrT9;lWp;!g+uv`| zV&a$&Uz1>AwtR7nGDCbYVbwwBM7yv4E|)#v@5fcAfX}LbLSDQpj9Lw?o_|hmr#9^# z6K9@f5cYR%ant!Z874mM&IFL{qU|fBY?q zGLVXHQ5$Oa@Asn$5Nw#Fj*XIj=p#`Q@-&}@jUwTnz)tyqC`ueR-a9OV; zBkN#aNEQ06=ahxl)t~33954Ppw6tI7jzbkfcjoo7vt2}(k{ysW)lWtHSLUL1zSS6@ zC&KW4L4cDC3j!&e2n5`%4>%&X98JWo;`WJMKdIsV`;-D!dP?SEkT#K2X`>J@!AR^Q zu^4M8Jy_oNlgjOEX(S2hB!*~~62rPWK$&g%?s#36F!S&2E7?Ax#}aO{>;J=qz^?xx zun`GPL(Q2D5Je2R$>M&Rn9PAOp&?bjLy3tK|Gs6I!ZZ&1-e8w$?JY7i1{J4NyG@Ig z9S#X0K`~uCAVMrx>BXn;|6Z#~R*P?yva*|Y1=*W`0Ql)Cgty&9RwYl5k@WFj(Ep#6Fz&yV|Esx z)Ce(+Lz{*=3)GNdb+Lv`FKb8T=JzQJ=>FY+J5~`(xC%j&t?*!VyHaCyGdh?^avJ0x zm$f-i@mTPJ!EZmymc9DT|DH>k_YUsxkO@MeAF@L7h6##M{o1angata&>9Ils73QpH=ssvmS3V8?buay@Q_h?NCau?&>qfWUCI>Vbl7rw@ShP zz4~p$A{LT=%_7=I;+9|*(Y{Yj$Q)!ZI{8>A{@bWU&6N>-eEN^{?`l|XnRBc=ka{96ZU&dY{&;+&p^|b%0FLV z>*9wgP>SAwNbgSuemY+xQt6XUIorH?B0PhN61lESFZLZ-;-~_bC|2@DqU6mJjLF*QzpIE}+j9E&?|Mb6XMgx_S?19GcMmXLEc*=PFy~7s z>_N00m!LK^BlOf3eD81c-&Ozo^DR5fw)&K9+#ks2tHC8gX(nSlT#m+zt_UQ)&+dM& z{H=a8k>VQ;9(nXLNlR*Gl|+fZ*KN)~XovUj?=nLF$F*qlnu9z7Fk*I|T?Vw!dE!?^ zVnMS0tR>i(-8JTOf0u9kkv5Utln?@Hu)x{AMWFUnv2H4nsg~+w!a8nBiVHUAyS zXEnw0hPe!%a-fc>C_0cV^`h6GEv0f9CV!d3fGzkynfGRD9lcU+U#6_7t3?x^+A)$zPdU?tWr>X)3P zC^3L@#6E1W6sW4Q()75%x1XK+bF|WJow-^-?i*Z{kS)@Kb>!%gFnwK5@_psCoggjv^y{$euLwu833%~p?um5(px7=IKziFG*kg+!0lBDZWfcwlFs$Kr@716XB&2{PASM%z!`pcKE-`@J(Fi1yq;GW=L7CguwQm^l7h}Z_EaHq4_znX z`SfO&bwGa%legUXl-+PYSCXEo zj#64)dBs*)gf$~Gs?Iy;8X3hc0|oL`(}ko)kd4ZFO#pL$8Ak)^W3Ho%4OZtMs~esj z0-iaHfBY?W`2nskGST_n&%%A2i=|MJR?m#HdnFB8D&JisX!CI*so*;rkgSr6N*B|! z8I~<<+>NMZ+*u-89~M2zn~1(XJ3Y{>U)4Q3m>^iSYfv128W8=8s+FLACY0I|wu}6e&o>=VdC%LWigQmUJQx4aTBb=3>y|PGo%lnqF7(;HuDRN7l)`yC0 z1TO3TS6*i)g+M)l1h~2gDmvYXL-LSU$7j_XPr9TyeGe)2XRavqJdG(qJM~y@o@KxB z((g`&FGaQ8?|8nkJ@{NufdW6w+(#x*^?mf0&QdRdgP`D0_v%>k8GK*)m?U6~e|{ty z0G<;91X?CFIW@Izwo@6`j0z5mph7S*6e8#q8{&O~WBBl~n{Dnq&8Ky&+?He3+1uly zr)!zj#`(TP&j%S&@z7zo@#~#&Pvc9-tC4Qt3$@cTRCDJ+cb%P_xeOB_X2Mb<>FjJW zxEGDoe0kKz4yHp%;Q$4_^!7(E*^J-Th9c4ky3~Db!JjCAe$a;s6F@4gdgb=7?|mES zN&P@Ac7l}e9ZeOtwVUxD4|@;>U=$bct(>^M*7kr$_NVHVL>fBu1fjaB#`IdOz%$O> zmeuX0QVezBTg3B2p=j=v;_7MRz2Hom=M3Z`nW8q7Bd0Sp?kqNKJK8N5_k3TTmg^Q3 z6(K;tQ$*N`q6z_OGRV-yCYR2t{Q6GQ>hy&lz)FrA3JS06nr)r!VL^tFb$9$q>kMj5 zS6*o$!8V8N#fI-^-7=|`+g*##Af?o4*3pHO7@~{SszO2m$I8 z^RD|{Kms>JqdZ<{wt_RlX|CgX^MDI#c?-4F=zq6;-ZXH0z7 zOX$_J0XIjDYOLLtmAMcI>pV~l)jO>R`4kw!5<4jIYc23QFT1d09i$R5Se3@p*UtYLR2;aV31tT?tZ!Ub{AfM&v zn2Rk^7N?h1AP_6B_ZWO_)shSJo825#ZkB(L!}(o7BOJWw{t`jG2RNmdYbBJI`(X!Q zqz3A@NC6yu>t!?u>1aC#;A;N-x){J~`J9eUS5=iUlL6StiT)9h75EgKra2*CD}B5@ z40rQRG*6BRwr6w6+0*PqzJ&{tfCLfb_{@>RxU1m}u+LchP7Q=nB3Hs0npe`Km>vMQ zX@CvSl5x9-?$)Y@=qJ9h`D?{Z3+ej&@FP9+S5B5Hs@Ap=ZJYeYC zE{BNw56d>&7O-8rp2mim8vGpmF+{cOD!Tu%@1Qdj$#2&GJfAik z4_r6kA?6C_p2nc9_nlQ<NQLR5kY=;bGvZ}0N=%Oz`{y1|P7%SNY}ayp zP@V}jZh;wvgZc%~N&*)~hfvg&2j;h^s!gwD2$A?3l7eEV;qZRZrNvFXQAfUdk=?pd*I21s?_T?!fwm655+r@EKUh54SS?i4k(rEr8zJl2 zs>~+ubgFO8 zcNPiU-38np{G;HIzYh$FYe^y%D5QY~kR&IosVUxu^Ar|P4T=4UW;&AM7uwIPknRQ7 zcJ1+gq3I9#Qm|ZpPgTCF!N}5`k^D3WtAx)I8OC5}v~@3muMvjD=lZn9y6E@|^=%pB zXR?Vs{kRUDXCgfyfX}}y=LIv?6y8)#tB2Z&UzPa6C z`a;wQ{MThRYCO1&mn3Ws3M7KBLt(EDn*fqUFC=>DaFgp9< zI6>uGU#5FJ8tNIB;M;nqvwwfW00d5uz@pAnyS6tBTk$;>Vj);;BCg+m3NX_S&wI5F zBnU9-Vo!fwwCDP>F@g5QH?+a4rM%?eZY2sQjAqB@v&X)y*Ri}%hxu3j$T+MfqiRG1 z$kznS$)B^JRi>vb6zGS2|1oSaZ4A!&PdBU0-+3m_3Y5FTcj9`EkdWMANQ-F#xKoIa z>w5Wm0-Nr+UD)}w1+UxcY4&wM(Owbf~a;-uYaKyXgr&Ld10Q%G*7lH2RN*JW~A zsH2J%u$ui~F?VA(a&`p`j&3OW@m#89XBFPDaMbRuHbl%mQDWO!u;uhH7}P9*b$0PY zfOME~t{lgxoGh|}*Bex8AD=h5c2wa_KIgBvYK`LD>8hmk0LJ4VSox*8EU=^&tOdVr z1OqRfSHTdok146ai1H0kN%Sf9o~6QMzqdwy++RF(X*XZ^x=1bQg)w@8QU<_7^lLj?dR+&uY<;{MBYhQ*5h~w} z{c+ozn$q;T@&3-4YB%<^h?M(_uTBPt<#tr%kMy22->wqL3pK!yugqzZcz56FeEVgV zBssP4ua1tTM%jV#RxZI>x27MQd2yzB)myLGuAP*9%4O6dC|@+Y#?0n=-(61l+@5Yu zg9u!wHghWW6@6X`)c=?s1$0|^#v`qAV#HVJGAR8A<*_G7mg5>upfiX21eiKtO!*owTJQ9-{ zm&L#S;=f*i2+OjRC|Qz7$=vw}wes@bvGMhET~^p<41v#J(ERiJ**`JD?N#|m7Jy5> zdRIKavJq>tJ)+bUlt4B2ee}pQ{KbPXA6xB8@4XOjcDv~sm zr925EKj+U2f1$M&{Mg}D+WgCdAw`@x5PRdIB76zVVp4u&ube3@_Ct>BZGPy0)5vUUlXJ zPE7dxdC9@D(Ev*3%0>Mhwsr)vvgifAp06WiS)+xIG)3gs;kHCUAzufJvYS8gppx(D zGZzdC7O6SPx>{Wq{rpj)vYMKR69*2 z(u&ADKLkU1!~lFy`mAOE5EM}V?KRTtG?2N4zAx|li6bg*qr~SWA_~bWD8Pn{)+^(r ziF!Qs>x?F~bKaXn8c0|I;&(qEZv}!<$B2B%69&Gnm!&rChWZw@#Y4@^8D%z?Lu%;> zuK&a`qvltcY#>iAe*_KR-&X+KV|kZUF#1LznMd!|r}J_Qpe3cxRH8A2cC9z}(wcTx z9MP$9SdhyhUJZj;|0tuSg)oCr*Ws6;fA9ad#~;>CciLb$h*XpyNxWJuze@{dgbmI< z7B-~gn`@oHx{ywfciyyi;Z#Vb=VvEraHCLm5{tc@k8fo!%6>mO?a(QCZUDlrYy-ke z!wV`%$A^1wke97AJ)r-p)y!mGpOe$|R!|SvkN4$#Q5jSo8?qE44hkaA;?Xtkf2%08 z7(jL2dwvrD-&^?@-kubh@lXX7@EX9gRaKvQYF)h%DQW;9#mOCxXwKL{XVROkwUm-y zVaCfqzEscKnC<*P2(?x!0)TFVpJ%cldz`v_^Z$))jOw`)OYk__o5=F>`+$g7ga-fKp#c&!DjOT`I*%^G5H?fgh4A|9FQ@*v>~XPTPL_Gp&aPfsG8{e0L0i8A=c;^`*;GBR>6T+Ek;H z+meI+FndWw<+Wl1CZXjF>qQMJ=mc-t7iYNr%DlV}rp`7Xh1RZcSI&R#7+VP#%L>*m zjnv67ug=NtO#ZAVA9dAy^bpKO?c--6ZyO9to(SJ9$ivb>Aa>MiF?D#>_hV6Bc%-nE z8km@+`6?`VVqKh)Ui`$R@FD^(CqR%1TG9b{7pi!F^E`xN1{uQs zCIC=8%qIW{TxC)ON@k0CQ5fH%;2>v*YJjJp085a<-Q9GV@fZy6n~z%Xf}e)7wPZKn zJ-*5*tI6-HM%r-c0EY$*oPow>E?9T zad!)g12>Z?3r0fp87pEKrTN!j1~LS&M>MOpk-t8SG+%TK*f;#r2>5Ik&C6>C5B< zq2$KqCM>{R69m~H;DDR}=P{!Y`1tQ5lT0YkarOWQ@dS#;+bYaN@2xMoeB0}gV`kiV zK~PshGT8eqMbyBvo7p}UcdJ`S4W}ck#vspHyuSvFZ0%Y#tLI(aX?L=?>*|8{y4}%W zx~QLi4lv|DF>oRi;2f$sTs(t-uw2SGSNisT>fH9EH&LjA_WJ3JX)Pd^CFD1zcpA;I zsez|%S>6c0$JY|p-hRnUug6L3$dQZ`A(dWZt+NG&x>Z{B>h~Ua{9*1~TfQrp+Ogyz z!z6RVCZkYlX*5NE9WiKPvU%Xh7SQX!*U5o&>^MB0Ftz5hZZrl{nDxa^dRNjby7%O+6=E;IC@|*wT?yAf0k#cy;Fr1bd8*+Waq1^>aB~ z>P(a3`o~jh2)HmoV>d{7nlOZbgN_P-3}SJK<;jBRJyzVy(6=;D<& z^e>7I#VpD190n)M_^xpJEL7tFGP&}?Z`G|AT)x0mfc%}}p8kp>`u(3MhTew{3Ci?# ze0D)BohQF1dZvRT>-p2!C6Ow$*xWo9g$!m<0e+vkU6LNNG31i+hYODS9LjOd%KH5! zhpxc2y_77&9lR##S+WS@j2-Ab(3kx+WDf*N@BS5OE ztHEi)jR}w0`y{L#y3T)lQ_Bl8q#&`qy8hr30(=^1jcxW_2z#*d!r8(mr>LidfI+@^ zCCf{nKvoPS3}J6ca_iLGu9?fTP8BkR0P+@W@Fi^TA8%?bzbe;y1NSu{{PQ#`S7whV z)8gIe0-*E0blZu4Zny4?v95hGo_^7D`%e)|>G{F)J|XjXD@E5YL>>VGzT-{sy1vOT zHn?D!fwDf9^0IGh^G7d(W_2|?8kwj2sG^l)+ zr7?mJ5?_TK_7p&!Ihd=G3)dex!@m<@q;v7&4h@uzUn1k+E(`Q>V%q3>A?W#RDlRzO z+yV4QGrYhclgI}Fvrq9x+K$n|Kpg*5>8K9pX}u5u43IGNYWKte=vEv&XaMAJQ~7K`MC-o~a@0w7BBqL&0U*I{ zqcPq}`j$RIng+L{zb^x+&ykeZfxj%tS5_s3ZZRzNg((cZ6W<*^cl({}n^VC_4J+RN z$k|&j(`pxK&HCibr7*~FqDKbu9{o4jjgIy!D~4da#j5Q{J8Ky=K$)gWsY$8vvUj`kAifeFXUn z8}0d8JG75)7ijHg7+ z^O1H3W7%|%|C6yvYZY`#_^%8skop?T=J=Z_+4$T{sLl4su8B<9;#R$2$fJ06z3Tly z%JL_Wh6*cfZfvLy69X^4wMuiqmF2eF>IJ{9EhP9VLZvd??EbenwXPmV@cC^m zC+gQ<&J3^9_DT47_;rwb{NF50?NLNmf6}>L$I&c*wSe@?4H~WvdlcmLjcAwWDEx%gc zjFLgAn;*dvTX6Zv?K81S?{A*C*1Ga&KRmqVYGDW{MF`v-sAh3(rYiQ*#m7mYIKZU# zQLn!7TArf1*`>rb4d-3?J&@SG``88X?#;XefN@1I+D4S(AOWvvX`R%V0pYVO` z-Bat^FkjqW*cvyq@31cX;(_8q;4o*YQUsipaPRn?-qxu_0<6cj`>>jAP z`pGv-0~I*lv~_c4K7~8Y$f8|yC0_@TM5b;_U8G_B;@3vYH4PA`DHhtOCWX>w z?p-^vCw(YQ$zroS%HjO)-pcDR+#ZkA`?5ATg7&uCL@^N*b$D{~=<8F3mv@<@c{7{5 z?+K9^LMDr@o>^AoI#jj93~C9~v(@Q3Uu|Fy?fbbR>;Ou`YR}`Pw_A4Iny{h3KjnY@ zwIwC#2eOAh$qmVuGQ^_yE|pAkEZi)zt0xvIs@f|W%fWDoW(zd4M6CaV9U9qzMCM7* z-d5CF7xRojBdBBMdNMXBb=)Fl_vAOOK^bpc6FnxIoa8ebH5G2DLUp;4uXD}KW^P$| zc}IQ{wY^ygf7&b@*Tpc=!O32E&BEacVOd3mHSf!z5iH-zxwh(HolUbLODfwck|61w zUp`u&#K&06WYa4@QLG_Xtn==cUM_w`^1YUswJlAR?sGl1hnHJ07IOuc$SV4NlK9%r zmf|(_k|vo;`$)q2h~v!Pqt&jkj`PQ{R}VM)UCZ1y#Qsdu5lGecaUKoQY+(l1peSA- z=8#o516`!m@!=aYPR~pdmxsblzMl{fC;qxx1=&%Lh)HBK(r zj0XM$b_6DC30d-sQ{5TqbsD&z*G90HiMRnr6Rtp>Dqg@>8rKIk&j*hLHI|1m(DtbH z7m7aJ&n|%mfBjK(6R+vVlG$X?q#h7c#ZBnFGJR%Ub#Z=rINy4vna;2ie(}toCS(ySU zPnk2=HVUmLBU%&6y2d}!;XX__=}6yHdFQH<9+t_CD730jeSE*G5w#XPRZv~3t$iV= zJ9bwv%~CJdK2@Ng)lrTa&(IPH=~Axh7{6YyV0hR6M|lxHB4Ras%%`Y!AY|cOn40>~-TQILT9jrL(*^g)@C)$Fcl-&Tn4Alwgu`i59b!hKZ2`e&nQW zo!2ZPm_AMtRD1clCa>t7I2k@Sin$6|?5!SA9AYosL%m(QXEZxZF|RQLJB|*J9NQG(AZVc>5mz=NbL-jn>6v6ST>=N-?i7t zBZWX%n5!LH@Sj7lgiVt)>~de6UPn)`=`l?SMVr%EDt}r^AQObcCZSV>Z(e+_u#FrY z^ieV5(CFMfUTdtQ<%b6^d88Yqs{3?#okS{H#kk4>$cBqQe)4&yL~zG8lG?s;%ylG3 zP*^iXP$`u=pwG!;OhQne;bT!hrd7;#q+)cbw;N(iu89ZqMQgBFjy)wKUE9SB8gPx$ zgh$zjtBk=*8=_DHj6f0NfOVgMjgATXl17@C8f?NPU3ac}X@->hFr(Vs5cXD%J%mXdXy2xhBUg3*zu8a1ZR6UGTZ*OaV0mYOI~RNZX;&6e6EU z)0(W)Ouv**Y}X`^^oq6ee+hb`QtiV@P;9mU?sv(U= z3vQ(Lg^0jyyY@fxuV~btLmANQr}qyI znsXzC&kXeKgK{&Qg-l$z6i{0{XLv-&5MEnomcIiH&$MGT!!K^?qgC>YGqJBCKP)!+ zWszBtTi(W%p1j`6&UGzxtG=WtTv_ot&HMFOAn%8|^VcVDqnWw-*oC|CW8tN>L^!&O z*?M(o{=TtAO?0{IOzuqa*w^yUu27Fpy7%o=Eb0$i+U!rh7p|VYkjsV>Tpj~X2r}vt zyE~N4d$8k9EE7|%oiBC#V~(gdB!5{ZK$h>dK&l(vNSILVyP6f6=#0w+CAMIw_mAh^ z%)gCZSQc3&=S5!&un>%ic-h|A!Y60^1qGA8aQf1zU6b3*HYCk=(kswXXXC()?s%1f zropw5P~{b0achL%H)}(hiw#ZUbDuz++s7h$J}sKAt3ye zr6appZ1~FC*~u|%g`JY#O)a4rcKMC(TlLkroD!27aH7E_9pl|!IoiKcy230OHm@-X zO%ITqe`qLmq-VoUV!R0rMS(4vkO>o8DQ|veZmv_K(QbV49V8%p)8aup`y4AQgsDHmsD*Ik+e0vEkH=6(8tT+BNWH28u-`H$f zGt%GkI`hn~%xrJ~(V)&_|4ceWmcglcN&%fpa(Wst>N*q>&Nm1j zFzHbi4ZQKmNXc{1?~7fe8L<%wOd>i&Pd?UbfyYB25d}K?-0&I8a1;6axD+j5o)ep7 zw}(<2u3Ta@g$mcg96U-0Q!3N1 zMlaq;36;P#QnX0ZUs!Cqv5i$#)B_$8PSM&OKC@ zN3~feBm|6l$`NBbTT4sJriTn>iI~qLL!l-W@dtFgxjcDW2zSTr{N~E{M=L_kcmU3 zN9*>G0pGm8{51!g9%GjbXPr2-X|J{XKR6a#?r2Ps#~K*zC~Yl3IMPHCC&A*uq@cz6 zc_QPmrim1BGGO?V^7Sha$d5-H8Vf)*+aM2rll8>JM8g|8&doPlSB=Nr%Dc#A0X6}L zI`aE8=_JHPl#BB5Bj$gBK%T!UXgH*01KtHaRf@=(_6ORns|U=vi1IH-Op%?&leuWnfn@rP;F zMJy#}3qen2cQL4*ifRUNjD1_W7IPMKR=e#)xbf~| zsQ9gzDQ&VCsz4mdlT0i2jhmZ;ATKZh2RadWkI2zj&ah|VEQ81(X30K&vQ8rwG&f84 zVsQ|N2WexETdiR#@I!?Jf=v+`yb`BUm-MD)KrmT7xYsKA%F&KN*T4+WYd)TV3d?;4 z!z4)U7{rm05mM_KkOv99e{4A?I3^^&?N)1>MUJsejJu4RHda+rt}CVlRWu3e>k11C zeab!M>qQiHYgSN)Gcq?;T#`rF#9%%S zsF;SGqsi81nz@a$Nq8E-ou{TG{X7n(oDH+G@gOS!8;5 zrE}pjo*8LlR1MYtS+OEyd>%8NS}I%TO2)L|Pi0akxh#5e4BiPuEV=K3$q@m!j-8(; z3GirUlnyquW+j;#BvGHG9w6e;%!ox^N?DBITM$i8x%179+;iN4C|QRSL_`E(EU;f3NMD~*WhC(&H2GJEliQa9MzE68GbWYA+a zx($q#=#s6vDi%$?IYWw&+sf8?CB8pT-ma-3B1hu~!@|+Q>k2rPbGDQnYM1lA+o@0z z#Y`{BPdw#S9(aJEv)ni$Pb(Hmk1=5G#eCx*Vv|gvV;qE01R017NL`E+>F>}m|G|u@6zm>$o`& z6pI-uc_W%1x8tPUhtI%#9E8hm7UDjYD}9ffGZXPNL4peOsE%U|k}27$LOLrDsP?^n zLUpcs6_^k>${>_WF~9nmIY)o z!EW*oklTJ$H(L)c&v}nJg&*%iD7)9tJcHd9@9o?+^!$!OwcvsoySIzbO^KfPYl3PE zP=?;ohI(N}VOrXK-yjWgt3Dq$G$xR0N)0xxMx@Xz$u=4Ihpr~k_TGVkS{k=`kdr|# zwH1q3+@eNOMcpHsw8!7y3uQ@_INK4<@~-E3^LG?AI~c<8JUVV_(m#L|%z{<3$XL)# zJ5sbJJl_8J-M!_h{9W$64d794M0%H9Tsrw_bm`{?>|nD^bXQ56(X6_5lek_oPrwQo znr_dWt9^>9t97bksX{(VEOWF`DXmsoEN!<25F|JmW8m) zTLDAzSwW zolN^K_Q2ENXtAZ}Q=3J~Zf2-kcuuAL;f3YV?8rgx$*}gvbEYBOTIP{88@f5`o)RqC zB$UggP(nTUvK-9l_m&#r7xmU>jzfc)pherR$u`cSvBonke|Nml9W(M8VFw)Di=(>_ z+b)p2I}Nj<)YT0B9=h4W;+5IWeDOq-5H~faglzr9;{IyFEql|P93x71LL`UW6P9j7 zTrim|E747nt;%KB*O>l7^ftA{<-dhiwQGVG)m**lzHmqciPyyn5o_GK%JQiPfUfE} z`fM5z{nWLfGURRbKF{Ikcvg&?MpVS8sZcuIMrn7>J7uWQX2fny)AagW(pJs6ofFEQ zw%hlpT-on**ZWu6K;m;ZJse9DcZ`omIb$G@Yqb_zovi(_rlt+hpsd#Z0Y?$cEhi_# z5aa9OGG;vH@JIOSqdwz^ZVLrg3hn`gdv-r{yI_418v0R_K$VDe!I)3%?M#kp$IQ#A5r425#ogFzsQ{o) zo<;fP;gNxqh6WTb0BpZ;lscXT0M)i&b~S7vot$P_Xp8U{uT_lb-jYAL@iGTYm)Nz+4L!+&!-U#?{v4M`xZ>Fb{bsbSUL)I<2BsBh4Z*@C!EHmG|*H?zek0(Cys(KIL`sT z45AHU#FM{6f00itzk)!T+^)dt$?K%*T!B0*1=wz?BK?#OAIDN0TIaLq(%C`{08tnJ zba8b;)esfOmB@A89qb!~>8$a&GNepMq`>%sT>R&cqWQf}a6Ub_3^{-7@}XxqMcaT;P*+xkw*m}0c4|RsfoTx zR5hDAs}AsfK+IP|zo=5A^-V&Y=A3{VgJK$QkDn5`R@Lav&(EuwFMK-VA^%G}fbd4a zcl~#p&bQ=slErgR%w*x1v}1u?ytR>on}!O&Tdj_lgC9jp_mww^PTl7k-~Q`foho?> z)Skg$h>B7!bP36;oE@sCPFO9Aj^htnsz+TrJa3`@pAblwu6^)thj%(6r}4~)@NEiN!H)Tg~}C_ikflWtx1~cN=FbyU$Y-0DCW?@i zX~z*ybSgINFPL#&85kLqg%Iv2Z1YO8+ASbpG_t@_#%74N%(Jd&x6&q;mQePA5XYos z?|I@plaG2L@8 zbn%W@J9TGXT~VW1j=Ot?zTgq)xb7V{^v^vgH=?nCKP3zqcreUs^(V(xIAM(V~!16l*&gh&S^ zX3K=p#w?WorWb-)Y2@ka*e2}c!N9B|Tn1*j0Bz9*@J)K4;~I~0HPANEd~U+e9aTMe zD&Xc674eurAb@>YWwjKr76X2PYvM!Q=rxXPXF?=lKZWeib=X%LAEOGb0bj z{*-re6E}eb_7oI}KXvB84jR~0^YnN$r=a$aAgpS-;-Fj4lo5?N^TAmA+6%&8>joTM z3$G7NMJX|qchXfHh_;~e=svOwRg2&ZR_-S-1^|UuX__aQuiBp zQ}I$H0suYsic-v;MUqMZQ5qo3pyQhY$IaNwz&DB1x% zF9+QKg!2Kg+ba1$Yf{(eVDl4Js1Mf_IchA~C5x3eboO6`>gfy&gJaUBe?5K3=Zjti zH3Ny$1AFE=fIeIRAv#}nPznA6YlE5e8;JndB-L7Py9QSBuMM z(yyPHg}%HljWZ7Tc6T^apS4b>2hCmw@rMxPse1eFdiSaizfc`6L_OW*S!y3 z?*H4%dO+@FYq<`H`3~l|GX@U)Z&;9^aJl$ONmS6L3j_Fipm#JkF>xV&tWY0ai`$sq zh7Jq&85}S0^$oNO?R#62s|NhA{dAx1ed|$2pSkuI4oT%&#iixc;U{ORUj;f0&_QL3 z$|FE%OdF#vJ2^>*qt5>=B?!FE@RehkTOg2&4=2F%e)#zoc)#beLHz}D(Mop2^30** z;17$*-VZjX`p0)$|L@FKCC3L`SOOP1GX_+5bfk8H%bT<^K5vflssyNAE-A{-rz;-l z?&5i`e{(tg7Ay-{x9LVtLf!tEM1TXMndgBWu}(O2;6P4sdCzU&vZr3yp`iiid-+uSIo7t$j`HP*M-M$(^doM8&Rl3J$*EtYL z&62?BM)&^-`K-<4tM&JcWH^VW7Z%hqjy?o;?DN8|ZjYX?YsPOPPE3A9AR2jE?xH3W z9US1s;Do|YMH91gvsUiztDd|gXmqUu#o@b6cD}g@ru26a`#s(N#-ZQe>Xp?37wz2W zjb9F6{w*hb2w+;dKL5gke;w&>Li&HXjWktjzyW*L{4HBRvhPgZtk3XcS%zV-@001- z>FMrnk~K8oChqUj)xXA>_%1=A7sx6|clV79xHInbuXI&@zpB!6;&}-dNY3yTFm&qq zLsVOZzHx)f{s?eiMryz5)!zm0_tW|pjro65;lHQb8fy+<41%|mPM$&(w5r^n|T*o*jJEYwujL>LjWKPHU0phSCQda z(u|#uQc}Sm{|WW{9UojbqL07VGI>g Date: Tue, 18 Jul 2023 12:28:19 +0600 Subject: [PATCH 30/35] Makefile update --- Makefile | 48 +++++++++++++++++------------------------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/Makefile b/Makefile index 15d79aa..3a308b0 100644 --- a/Makefile +++ b/Makefile @@ -8,13 +8,11 @@ MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) CMAKE_COMMAND = cmake CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile -#CMAKE_SOURCE_DIR = ./source -#CMAKE_BUILD_DIR = ./compile DEPENDS = /bin/cmake -PREFIX ?= /usr +PREFIX ?= /usr/local PKGNAME = $(MAKEFILE_DIR) -#PKGNAME = ubl-settings-manager -LATEST_TAG= +FILE_VER = source/${PKGNAME}.h + default_target: all .PHONY: all init depend debug prepare check build uninstall install clean help @@ -24,11 +22,11 @@ all: init build init: @echo "Initialize ..."; \ if [ -d ".git" ]; then \ - LATEST_TAG=$$(git describe --tags | sed 's/^v//'|grep -oE "^[0-9]{1,}.[0-9]{1,}"); \ + LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \ else \ - LATEST_TAG="0.0"; \ + LATEST_TAG="Development"; \ fi; \ - sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.h; \ + sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: @@ -39,16 +37,14 @@ depend: exit 1; \ fi; \ done; \ + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B${CMAKE_BUILD_DIR} --check-build-system CMakeFiles/Makefile.cmake 1 || exit 1; \ echo "Check depends: OK" -# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -debug: init build - @echo "Debug ..."; \ +debug: + @echo "Debug ..." if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ fi; \ - echo "${CMAKE_BUILD_DIR}/${PKGNAME}"; \ - cp ${CMAKE_BUILD_DIR}/${PKGNAME} ./; \ echo "Debug: OK" prepare: @@ -69,7 +65,7 @@ check: build: depend prepare @echo "Build ..."; \ - make --directory=${CMAKE_BUILD_DIR}; \ + $(MAKE_COMMAND) --directory=${CMAKE_BUILD_DIR}; \ echo "Build: OK" uninstall: @@ -100,7 +96,7 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-symbolic.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-green-symbolic.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-red-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ @@ -122,13 +118,12 @@ install: check uninstall 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"; \ done - @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" @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 -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" - @install -dm755 "${DESTDIR}/etc/xdg" - @install -dm755 "${DESTDIR}${PREFIX}/share/applications" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" @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" @@ -143,27 +138,19 @@ install: check uninstall [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ - fi; + fi @echo "Install: OK" @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." - @$(RM) -rd ${CMAKE_BUILD_DIR}; + @$(RM) -rd ${CMAKE_BUILD_DIR} @if [ -d ${CMAKE_BUILD_DIR} ]; then \ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ else \ echo "Clean: OK"; \ fi -up_ver: - @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ - MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ - MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ - VER="$${MAJOR}.$$(($${MINOR}+1))"; \ - sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ - echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" - help: @echo "The following are some of the valid targets for this Makefile:"; \ echo "... all (the default if no target is provided)"; \ @@ -173,5 +160,4 @@ help: echo "... compile"; \ echo "... install"; \ echo "... uninstall"; \ - echo "... clean"; \ - echo "... up_ver" + echo "... clean" \ No newline at end of file From d37cd0fb3e90ce01d7b219435baa0f86984fd1ef Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Jul 2023 12:33:45 +0600 Subject: [PATCH 31/35] commit --- Makefile | 61 +++++++++++++++++++++++++++--------------------------- VERSION.md | 1 + 2 files changed, 32 insertions(+), 30 deletions(-) create mode 100644 VERSION.md diff --git a/Makefile b/Makefile index 3a308b0..d715cd8 100644 --- a/Makefile +++ b/Makefile @@ -8,25 +8,23 @@ MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) CMAKE_COMMAND = cmake CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile +#CMAKE_SOURCE_DIR = ./source +#CMAKE_BUILD_DIR = ./compile +FILE_VERSION = VERSION.md DEPENDS = /bin/cmake -PREFIX ?= /usr/local +PREFIX ?= /usr PKGNAME = $(MAKEFILE_DIR) -FILE_VER = source/${PKGNAME}.h +#PKGNAME = ubl-settings-manager default_target: all -.PHONY: all init depend debug prepare check build uninstall install clean help +.PHONY: all init depend debug prepare check build uninstall install clean up_ver help all: init build init: @echo "Initialize ..."; \ - if [ -d ".git" ]; then \ - LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \ - else \ - LATEST_TAG="Development"; \ - fi; \ - sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ + sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-repomanager.h; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: @@ -37,8 +35,8 @@ depend: exit 1; \ fi; \ done; \ - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B${CMAKE_BUILD_DIR} --check-build-system CMakeFiles/Makefile.cmake 1 || exit 1; \ echo "Check depends: OK" +# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 debug: @echo "Debug ..." @@ -65,7 +63,7 @@ check: build: depend prepare @echo "Build ..."; \ - $(MAKE_COMMAND) --directory=${CMAKE_BUILD_DIR}; \ + make --directory=${CMAKE_BUILD_DIR}; \ echo "Build: OK" uninstall: @@ -90,13 +88,9 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-green-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-red-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-green-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-red-symbolic.svg" - @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/${PKGNAME}-banner.png" + @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}" + @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ @@ -118,29 +112,27 @@ install: check uninstall 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"; \ done + @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" @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 -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" - @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" + @install -dm755 "${DESTDIR}/etc/xdg" + @install -dm755 "${DESTDIR}${PREFIX}/share/applications" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" + @install -dm755 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images} + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css" + @install -dm755 -d "${DESTDIR}${PREFIX}/share/${PKGNAME}/images" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "${PKGNAME}-banner.png" @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}.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" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ fi @echo "Install: OK" - @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." @@ -151,6 +143,14 @@ clean: echo "Clean: OK"; \ fi +up_ver: + @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ + MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ + MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ + VER="$${MAJOR}.$$(($${MINOR}+1))"; \ + sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ + echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" + help: @echo "The following are some of the valid targets for this Makefile:"; \ echo "... all (the default if no target is provided)"; \ @@ -160,4 +160,5 @@ help: echo "... compile"; \ echo "... install"; \ echo "... uninstall"; \ - echo "... clean" \ No newline at end of file + echo "... clean"; \ + echo "... up_ver" diff --git a/VERSION.md b/VERSION.md new file mode 100644 index 0000000..12ebd01 --- /dev/null +++ b/VERSION.md @@ -0,0 +1 @@ +VERSION 1.0 From c0ca21e7f1ff745e1a022915eb12bcab0b4b75a3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Jul 2023 12:38:25 +0600 Subject: [PATCH 32/35] Makefile updated --- Makefile | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index e705317..3a308b0 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ init: else \ LATEST_TAG="Development"; \ fi; \ - sed -r "s/^(string version_application).*/\1 = \"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ + sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: @@ -66,7 +66,6 @@ check: build: depend prepare @echo "Build ..."; \ $(MAKE_COMMAND) --directory=${CMAKE_BUILD_DIR}; \ - sed -r "s/^(string version_application).*/\1;/" -i ${FILE_VER}; \ echo "Build: OK" uninstall: @@ -91,9 +90,13 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" - @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/${PKGNAME}-banner.png" - @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}" - @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-green-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-red-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-green-symbolic.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-red-symbolic.svg" + @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ @@ -116,20 +119,28 @@ install: check uninstall 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"; \ done @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @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 -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" + @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "${PKGNAME}-banner.png" @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}.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" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ fi @echo "Install: OK" + @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." @@ -149,4 +160,4 @@ help: echo "... compile"; \ echo "... install"; \ echo "... uninstall"; \ - echo "... clean" + echo "... clean" \ No newline at end of file From 5ec52c4b928bdc4fc2c052ba7fe6bd4695d45df9 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Jul 2023 15:12:28 +0600 Subject: [PATCH 33/35] Makefile and code fixes --- Makefile | 12 ++---------- source/CMakeLists.txt | 6 ------ source/ubl-settings-repomanager.c | 2 +- source/ubl-settings-repomanager.h | 4 +++- source/ubl-utils.c | 4 ++++ source/ubl-utils.h | 2 ++ 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 3a308b0..3dc9e1b 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ init: else \ LATEST_TAG="Development"; \ fi; \ - sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ + sed -r "s/^(string version_application).*/\1 = \"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ echo "-- Build path: ${CMAKE_BUILD_DIR}" depend: @@ -66,6 +66,7 @@ check: build: depend prepare @echo "Build ..."; \ $(MAKE_COMMAND) --directory=${CMAKE_BUILD_DIR}; \ + sed -r "s/^(string version_application).*/\1;/" -i ${FILE_VER}; \ echo "Build: OK" uninstall: @@ -88,14 +89,6 @@ uninstall: @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-green-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-red-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.document-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-green-symbolic.svg" - @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.folder-red-symbolic.svg" @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @if [ -z ${DESTDIR} ]; then \ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ @@ -140,7 +133,6 @@ install: check uninstall [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ fi @echo "Install: OK" - @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ clean: @echo "Clean ..." diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 2ef3c2a..d62565a 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,11 +8,6 @@ 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) @@ -82,7 +77,6 @@ set(SOURCE_FILES set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} -# ${VTE291_LIBRARIES} pthread) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e191871..e721947 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -395,7 +395,7 @@ void yon_add_file(main_window *widgets){ if (res==GTK_RESPONSE_ACCEPT){ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); - FILE *file = popen(yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |grep -E \"Name|Version|Architecture\" |sed -e 's/ *//g'",NULL),"r"); + FILE *file = popen(get_package_info_command(filename),"r"); char *cur_string=g_malloc0(sizeof(char)*4096); char *packname=NULL, *packver=NULL, *packarch=NULL; while (fgets(cur_string,4096,file)){ diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 2b44ec4..77b1942 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -24,11 +24,13 @@ #define glade_repo_path "/com/ublinux/ui/ubl-settings-repomanager-windows.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("/home/",yon_ubl_root_user_get(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) +#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-repomanager" typedef char* string; + +#define get_package_info_command(filename) yon_char_unite("LC_ALL=EN pacman -Q --info --file ",filename," |grep -E \"Name|Version|Architecture\" |sed -e 's/ *//g'",NULL) string version_application; char *local; diff --git a/source/ubl-utils.c b/source/ubl-utils.c index 44d839c..482d1e8 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -801,6 +801,10 @@ char *yon_ubl_root_user_get(){ return getlogin(); } +char *yon_ubl_user_get_home_directory(){ + return getenv("HOME"); +} + // parsing functions diff --git a/source/ubl-utils.h b/source/ubl-utils.h index e3eaa0f..a7394ea 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -157,6 +157,8 @@ 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); From 7f6f5e8bdf6fb41cb2735314e5e916dfe082c0e2 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Jul 2023 15:23:21 +0600 Subject: [PATCH 34/35] Edited file filter option --- source/ubl-settings-repomanager.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index e721947..64665e2 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -387,8 +387,8 @@ void yon_repo_remove(main_window *widgets){ void yon_add_file(main_window *widgets){ GtkFileFilter *file_filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(file_filter,"*.pkg.tar.zst"); - gtk_file_filter_set_name(file_filter,"*.pkg.tar.zst"); + gtk_file_filter_add_pattern(file_filter,"*.pkg.tar.*"); + gtk_file_filter_set_name(file_filter,"*.pkg.tar.*"); 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); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser),file_filter); int res = gtk_dialog_run(GTK_DIALOG(chooser)); From 338d8dca55fa789918b8015ad3fed6932f6471b1 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 18 Jul 2023 15:24:59 +0600 Subject: [PATCH 35/35] Removed folder installation --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 3dc9e1b..9c63112 100644 --- a/Makefile +++ b/Makefile @@ -114,7 +114,6 @@ install: check uninstall @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 -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"