diff --git a/.gitignore b/.gitignore
index 1d74e21..5706090 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
.vscode/
+ubl-settings-usergroups.glade~
+ubl-settings-usergroups
\ No newline at end of file
diff --git a/Makefile b/Makefile
index dc489c7..89d234d 100644
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,7 @@ all: init build
init:
@echo "Initialize ..."; \
sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-usergroups.h; \
+ gcc source/ubl-settings-usergroups.c source/ubl-utils.c -o ubl-settings-usergroups `pkg-config --cflags --libs gtk+-3.0` -g; \
echo "-- Build path: ${CMAKE_BUILD_DIR}"
depend:
@@ -116,6 +117,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}-banner.png"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css"
@if [ -z ${DESTDIR} ]; then \
[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
diff --git a/com.ublinux.ubl-settings-usergroups.checked.svg b/com.ublinux.ubl-settings-usergroups.checked.svg
new file mode 100644
index 0000000..e3cab42
--- /dev/null
+++ b/com.ublinux.ubl-settings-usergroups.checked.svg
@@ -0,0 +1,327 @@
+
+
diff --git a/com.ublinux.ubl-settings-usergroups.warning.svg b/com.ublinux.ubl-settings-usergroups.warning.svg
new file mode 100644
index 0000000..9a90dba
--- /dev/null
+++ b/com.ublinux.ubl-settings-usergroups.warning.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 1bb765e..d891c96 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -17,7 +17,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin
set(SOURCE_FILES
ubl-settings-usergroups.c
- ubl-settings-usergroups.h)
+ ubl-settings-usergroups.h
+ ubl-utils.c
+ ubl-utils.h)
set(LIBRARIES
${GTK_LIBRARIES}
diff --git a/source/ubl-settings-usergroups.c b/source/ubl-settings-usergroups.c
index 79a7ddc..71a0ed8 100644
--- a/source/ubl-settings-usergroups.c
+++ b/source/ubl-settings-usergroups.c
@@ -1,11 +1,131 @@
#include
#include "ubl-settings-usergroups.h"
-int main(int argc, char *argv[]){
- gtk_init(&argc,&argv);
+void on_close_subwindow(GtkWidget *self){
+ gtk_widget_destroy(gtk_widget_get_toplevel(self));
+}
+
+void on_about_open(){
+
+}
+
+void on_open_users(){
+ GtkBuilder *builder=gtk_builder_new_from_file(glade_path);
+ users_window *widgets = malloc (sizeof(users_window));
+ widgets->window=yon_gtk_builder_get_widget(builder, "usersEditWindow");
+}
+
+void on_open_groups(){
+ GtkBuilder *builder=gtk_builder_new_from_file(glade_path);
+ groups_window *widgets = malloc (sizeof(groups_window));
+ widgets->window=yon_gtk_builder_get_widget(builder, "groupsEditWindow");
+
+ widgets->groupsTreeView=yon_gtk_builder_get_widget(builder, "groupsTreeView");
+ widgets->groupsGroupColumn=GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "groupsGroupColumn"));
+ widgets->groupsEnabledColumn=GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "groupsEnabledColumn"));
+ widgets->groupsCancelButton=yon_gtk_builder_get_widget(builder, "groupsCancelButton");
+ widgets->groupsOkButton=yon_gtk_builder_get_widget(builder, "groupsOkButton");
+ widgets->list=GTK_LIST_STORE(gtk_builder_get_object(builder, "liststore2"));
+ gtk_button_set_label(GTK_BUTTON(widgets->groupsCancelButton),_("Cancel"));
+ gtk_button_set_label(GTK_BUTTON(widgets->groupsOkButton),_("Ok"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->groupsGroupColumn),_("Group"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->groupsEnabledColumn),_("Enabled"));
+ g_signal_connect(G_OBJECT(widgets->groupsCancelButton), "clicked", G_CALLBACK(on_close_subwindow),NULL);
+ gtk_widget_show_all(widgets->window);
+}
+
+main_window *setup_main_window(){
+ main_window *widgets=NULL;
+ widgets=malloc(sizeof(main_window));
GtkBuilder *builder=gtk_builder_new_from_file(glade_path);
- GtkWidget *window=GTK_WIDGET(gtk_builder_get_object(builder,"MainWindow"));
- gtk_widget_show_all(window);
+ widgets->window=yon_gtk_builder_get_widget(builder,"MainWindow");
+ GtkListStore *list;
+ widgets->mainUserGroupsLabel=yon_gtk_builder_get_widget(builder,"mainUserGroupsLabel");
+ widgets->mainUserGroupsEntry=yon_gtk_builder_get_widget(builder,"mainUserGroupsEntry");
+ widgets->mainUserGroupsButton=yon_gtk_builder_get_widget(builder,"mainUserGroupsButton");
+ widgets->mainUserNameLabel=yon_gtk_builder_get_widget(builder,"mainUserNameLabel");
+ widgets->mainUserNameAdminCheck=yon_gtk_builder_get_widget(builder,"mainUserNameAdminCheck");
+ widgets->mainUserNameEntry=yon_gtk_builder_get_widget(builder,"mainUserNameEntry");
+ widgets->mainUserPasswordLabel=yon_gtk_builder_get_widget(builder,"mainUserPasswordLabel");
+ widgets->mainUserPasswordEntry=yon_gtk_builder_get_widget(builder,"mainUserPasswordEntry");
+ widgets->mainPasswordHashLabel=yon_gtk_builder_get_widget(builder,"mainPasswordHashLabel");
+ widgets->mainUserPasswordHashCombo=yon_gtk_builder_get_widget(builder,"mainUserPasswordHashCombo");
+ widgets->mainUserAutologinLabel=yon_gtk_builder_get_widget(builder,"mainUserAutologinLabel");
+ widgets->mainUserAutologinCombo=yon_gtk_builder_get_widget(builder,"mainUserAutologinCombo");
+ widgets->mainUpdateHomeDirLabel=yon_gtk_builder_get_widget(builder,"mainUpdateHomeDirLabel");
+ widgets->mainUpdateDirCheck=yon_gtk_builder_get_widget(builder,"mainUpdateDirCheck");
+ widgets->mainLoadUserProgramsLabel=yon_gtk_builder_get_widget(builder,"mainLoadUserProgramsLabel");
+ widgets->mainLoadUserProgramsEntry=yon_gtk_builder_get_widget(builder,"mainLoadUserProgramsEntry");
+ widgets->mainUserStringLabel=yon_gtk_builder_get_widget(builder,"mainUserStringLabel");
+ widgets->mainUserStringEntry=yon_gtk_builder_get_widget(builder,"mainUserStringEntry");
+ widgets->mainAddButton=yon_gtk_builder_get_widget(builder,"mainAddButton");
+ widgets->mainEditButton=yon_gtk_builder_get_widget(builder,"mainEditButton");
+ widgets->mainDeleteButton=yon_gtk_builder_get_widget(builder,"mainDeleteButton");
+ widgets->mainUIDColumn=GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"mainUIDColumn"));
+ widgets->mainLoginColumn=GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"mainLoginColumn"));
+ widgets->mainPasswordColumn=GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"mainPasswordColumn"));
+ widgets->mainUserNameColumn=GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"mainUserNameColumn"));
+ widgets->headerLoadGlobalConfigurationMenuItem=yon_gtk_builder_get_widget(builder,"headerLoadGlobalConfigurationMenuItem");
+ widgets->headerLoadLocalConfigurationMenuItem=yon_gtk_builder_get_widget(builder,"headerLoadLocalConfigurationMenuItem");
+ widgets->headerSaveGlobalLocalConfigurationMenuItem=yon_gtk_builder_get_widget(builder,"headerSaveGlobalLocalConfigurationMenuItem");
+ widgets->headerSaveGlobalConfigurationMenuItem=yon_gtk_builder_get_widget(builder,"headerSaveGlobalConfigurationMenuItem");
+ widgets->headerSaveLocalConfigurationMenuItem=yon_gtk_builder_get_widget(builder,"headerSaveLocalConfigurationMenuItem");
+ widgets->headerDocumentationMenuItem=yon_gtk_builder_get_widget(builder,"headerDocumentationMenuItem");
+ widgets->headerAboutMenuItem=yon_gtk_builder_get_widget(builder,"headerAboutMenuItem");
+ widgets->mainHeaderConfigLoadLabel=yon_gtk_builder_get_widget(builder,"mainHeaderConfigLoadLabel");
+ widgets->mainHeaderTitleLabel=yon_gtk_builder_get_widget(builder,"mainHeaderTitleLabel");
+ widgets->mainHeaderSaveConfigurationLabel=yon_gtk_builder_get_widget(builder,"mainHeaderSaveConfigurationLabel");
+ widgets->mainStatusBox=yon_gtk_builder_get_widget(builder,"mainStatusBox");
+ widgets->mainStatusIcon=yon_gtk_builder_get_widget(builder,"mainStatusIcon");
+ widgets->mainStatusLabel=yon_gtk_builder_get_widget(builder,"mainStatusLabel");
+
+ g_signal_connect(G_OBJECT(widgets->mainUserGroupsButton),"clicked", G_CALLBACK(on_open_groups),NULL);
+ g_signal_connect(G_OBJECT(widgets->window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
+
+ gtk_label_set_text(GTK_LABEL(widgets->mainUserGroupsLabel),_("User groups (default)"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainUserNameLabel),_("User name"));
+ gtk_button_set_label(GTK_BUTTON(widgets->mainUserNameAdminCheck),_("Administrator"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainUserPasswordLabel),_("User password"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainPasswordHashLabel),_("Password hash algorythm"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainUserAutologinLabel),_("Autologin"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainUpdateHomeDirLabel),_("Update HOME directory(ies)"));
+ gtk_button_set_label(GTK_BUTTON(widgets->mainUpdateDirCheck),_("Enabled"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainLoadUserProgramsLabel),_("Automatically load user programs"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainUserStringLabel),_("User string"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->mainUIDColumn),_("UID"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->mainLoginColumn),_("Login"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->mainPasswordColumn),_("Password"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->mainUserNameColumn),_("User Name"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerLoadGlobalConfigurationMenuItem),_("Load from global configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerLoadLocalConfigurationMenuItem),_("Load from local configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerSaveGlobalLocalConfigurationMenuItem),_("Save to global and local configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerSaveGlobalConfigurationMenuItem),_("Save to global configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerSaveLocalConfigurationMenuItem),_("Save to local configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerDocumentationMenuItem),_("Documentation"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->headerAboutMenuItem),_("About"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHeaderConfigLoadLabel),_("Load"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHeaderTitleLabel),_("Users and groups"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHeaderSaveConfigurationLabel),_("Save"));
+
+ GtkWidget *Header = yon_gtk_builder_get_widget(builder,"headBox");
+ GtkWidget *Image = yon_gtk_builder_get_widget(builder,"mainHeadBackgroundImage");
+ GtkWidget *Overlay = yon_gtk_builder_get_widget(builder,"mainHeadOverlay");
+ yon_ubl_header_setup(Overlay,Header,Image,image_path);
+ widgets->mainUserAutologinCombo;
+ gtk_widget_show_all(widgets->window);
+
+}
+
+int main(int argc, char *argv[]){
+
+ textdomain (LocaleName);
+ gtk_init(&argc,&argv);
+ main_window *widgets=setup_main_window();
+ GtkCssProvider *css=gtk_css_provider_new();
+ gtk_css_provider_load_from_path(css,CssPath,NULL);
+ gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
+ GTK_STYLE_PROVIDER(css),
+ -1);
gtk_main();
}
\ No newline at end of file
diff --git a/source/ubl-settings-usergroups.h b/source/ubl-settings-usergroups.h
index 347bd68..c002716 100644
--- a/source/ubl-settings-usergroups.h
+++ b/source/ubl-settings-usergroups.h
@@ -1,2 +1,96 @@
+#include "ubl-utils.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
-#define glade_path "/usr/share/ubl-settings-usergroups/ui/ubl-settings-usergroups.glade"
\ No newline at end of file
+
+#define glade_path "/usr/share/ubl-settings-usergroups/ui/ubl-settings-usergroups.glade"
+#define CssPath "/usr/share/ubl-settings-usergroups/css/ubl-settings-usergroups.css"
+#define image_path "/usr/share/ubl-settings-usergroups/ui/ubl-settings-usergroups-banner.png"
+
+#define LocalePath "/usr/share/locale"
+#define LocaleName "ubl-settings-usergroups"
+
+
+#define _(String) gettext(String)
+
+typedef struct {
+ GtkWidget *window;
+
+ GtkListStore *list;
+ GtkWidget *mainUserGroupsLabel;
+ GtkWidget *mainUserGroupsEntry;
+ GtkWidget *mainUserGroupsButton;
+ GtkWidget *mainUserNameLabel;
+ GtkWidget *mainUserNameAdminCheck;
+ GtkWidget *mainUserNameEntry;
+ GtkWidget *mainUserPasswordLabel;
+ GtkWidget *mainUserPasswordEntry;
+ GtkWidget *mainPasswordHashLabel;
+ GtkWidget *mainUserPasswordHashCombo;
+ GtkWidget *mainUserAutologinLabel;
+ GtkWidget *mainUserAutologinCombo;
+ GtkWidget *mainUpdateHomeDirLabel;
+ GtkWidget *mainUpdateDirCheck;
+ GtkWidget *mainLoadUserProgramsLabel;
+ GtkWidget *mainLoadUserProgramsEntry;
+ GtkWidget *mainUserStringLabel;
+ GtkWidget *mainUserStringEntry;
+ GtkWidget *mainAddButton;
+ GtkWidget *mainEditButton;
+ GtkWidget *mainDeleteButton;
+ GtkTreeViewColumn *mainUIDColumn;
+ GtkTreeViewColumn *mainLoginColumn;
+ GtkTreeViewColumn *mainPasswordColumn;
+ GtkTreeViewColumn *mainUserNameColumn;
+ GtkWidget *headerLoadGlobalConfigurationMenuItem;
+ GtkWidget *headerLoadLocalConfigurationMenuItem;
+ GtkWidget *headerSaveGlobalLocalConfigurationMenuItem;
+ GtkWidget *headerSaveGlobalConfigurationMenuItem;
+ GtkWidget *headerSaveLocalConfigurationMenuItem;
+ GtkWidget *headerDocumentationMenuItem;
+ GtkWidget *headerAboutMenuItem;
+ GtkWidget *mainHeaderConfigLoadLabel;
+ GtkWidget *mainHeaderTitleLabel;
+ GtkWidget *mainHeaderSaveConfigurationLabel;
+ GtkWidget *mainStatusBox;
+ GtkWidget *mainStatusIcon;
+ GtkWidget *mainStatusLabel;
+
+} main_window;
+
+typedef struct {
+ GtkWidget *window;
+
+ GtkWidget *userUIDLabel;
+ GtkWidget *userUIDEntry;
+ GtkWidget *userUsernameLabel;
+ GtkWidget *userUsernameEntry;
+ GtkWidget *userLoginLabel;
+ GtkWidget *userLoginEntry;
+ GtkWidget *userPasswordLabel;
+ GtkWidget *userPasswordEntry;
+ GtkWidget *userDefaultPasswordCheck;
+ GtkWidget *userPasswordHashLabel;
+ GtkWidget *userPasswordHashCombo;
+ GtkWidget *userSAMBALabel;
+
+ GtkWidget *userCancelButton;
+ GtkWidget *userAddButton;
+} users_window;
+
+typedef struct {
+ GtkWidget *window;
+
+ GtkWidget *groupsTreeView;
+ GtkTreeViewColumn *groupsEnabledColumn;
+ GtkTreeViewColumn *groupsGroupColumn;
+ GtkListStore *list;
+
+ GtkWidget *groupsCancelButton;
+ GtkWidget *groupsOkButton;
+} groups_window;
\ No newline at end of file
diff --git a/source/ubl-utils.c b/source/ubl-utils.c
new file mode 100644
index 0000000..ed01b97
--- /dev/null
+++ b/source/ubl-utils.c
@@ -0,0 +1,599 @@
+#include "ubl-utils.h"
+#ifndef UBL_UTILS
+
+typedef enum {
+ DICTIONARY_ACTION_WIDGETS_TYPE,
+ DICTIONARY_IVGRAPHICALS_TYPE,
+ DICTIONARY_OTHER_TYPE
+
+} DICT_TYPE;
+
+typedef struct dictionary {
+ char *key;
+ void *data;
+ struct dictionary *next;
+ struct dictionary *prev;
+ struct dictionary *first;
+ DICT_TYPE data_type;
+} dictionary;
+
+typedef struct apps{
+ char *Name;
+ int Type;
+ char *Categories;
+ char *Exec;
+ char *Icon;
+ int Pluggable;
+ int DualPluggable;
+ } apps;
+
+typedef struct {
+ char *command;
+ int *exitcode;
+} thread_output;
+
+#ifdef __GTK_H__
+typedef struct IVGrapgicals{
+ char *sectionName;
+ char *categories;
+ GtkListStore *LV;
+ GtkWidget *Box;
+ GtkWidget *IV;
+ GtkWidget *label;
+ GtkWidget *sep;
+ GtkCellRendererPixbuf *iconRender;
+} IVGraphicals;
+#endif
+#endif
+
+
+//dictionary functions
+
+/**
+ * yon_dictionary_create_empty:
+ * Creates and returns empty dictionary
+*/
+dictionary *yon_dictionary_create_empty(){
+ dictionary *dict=malloc(sizeof(dictionary));
+ dict->data=NULL;
+ dict->key=NULL;
+ dict->next=NULL;
+ dict->prev=NULL;
+ dict->first=dict;
+ dict->data_type=DICTIONARY_OTHER_TYPE;
+ return dict;
+}
+
+void yon_dictionary_switch_to_last(dictionary **dict){
+ if ((*dict)->next!=NULL)
+ for ((*dict)=(*dict)->first;(*dict)->next!=NULL;(*dict)=(*dict)->next){}
+}
+
+dictionary * yon_dictionary_create_conneced(dictionary *targetdict){
+ targetdict=yon_dictionary_get_last(targetdict);
+ targetdict->next=yon_dictionary_create_empty();
+ targetdict->next->prev=targetdict;
+ targetdict->next->first=targetdict->first;
+ targetdict->next->data_type=DICTIONARY_OTHER_TYPE;
+ return targetdict->next;
+}
+
+dictionary *yon_dictionary_get_last(dictionary *dict){
+ dictionary *dct=NULL;
+ for (dct=dict->first;dct->next!=NULL;dct=dct->next){}
+ return dct;
+}
+
+dictionary *yon_dictionary_switch_places(dictionary *dict,int aim){
+ if (aim<0){
+ if (dict->prev){
+ if (dict->prev->prev){
+ dictionary *next = dict->next,*prev=dict->prev,*preprev=prev->prev;
+ if (next){
+ preprev->next=dict;
+ dict->prev=preprev;
+ dict->next=prev;
+ prev->prev=dict;
+ prev->next=next;
+ next->prev=prev;
+ } else {
+ preprev->next=dict;
+ dict->prev=preprev;
+ dict->next=prev;
+ prev->prev=dict;
+ prev->next=NULL;
+ }
+ return prev;
+ } else {
+ dictionary *next = dict->next,*prev=dict->prev;
+ if (next){
+ yon_dictionary_make_first(dict);
+ dict->prev=NULL;
+ dict->next=prev;
+ prev->prev=dict;
+ prev->next=next;
+ next->prev=prev;
+ } else {
+ dict->prev=NULL;
+ dict->next=prev;
+ prev->prev=dict;
+ prev->next=NULL;
+ }
+ return prev;
+ }
+ }
+ } else if (aim>0){
+ if (dict->next){
+ if (dict->next->next){
+ dictionary *next = dict->next,*prev=dict->prev,*afnext=next->next;
+ if (prev){
+ prev->next=next;
+ next->prev=prev;
+ next->next=dict;
+ dict->prev=next;
+ dict->next=afnext;
+ afnext->prev=dict;
+ } else {
+ yon_dictionary_make_first(next);
+ next->prev=NULL;
+ next->next=dict;
+ dict->prev=next;
+ dict->next=afnext;
+ afnext->prev=dict;
+ }
+ return next;
+ } else {
+ dictionary *next = dict->next,*prev=dict->prev;
+ if (prev){
+ prev->next=next;
+ next->prev=prev;
+ next->next=dict;
+ dict->prev=next;
+ dict->next=NULL;
+ } else {
+ next->prev=NULL;
+ next->next=dict;
+ dict->prev=next;
+ dict->next=NULL;
+ }
+ }
+ }
+ }
+}
+
+void yon_dictionary_make_first(dictionary *dict){
+ for (dictionary *dct=dict->first;dct!=NULL;dct=dct->next){
+ dct->first=dict;
+ }
+}
+
+void yon_dictionary_make_nth(dictionary *dict, int nth){
+ dictionary *dct=dict->first;
+ for (int i=0;inext;}
+ yon_dictionary_rip(dict);
+ dictionary *prev=dct->prev;
+ prev->next=dict;
+ dict->prev=prev;
+ dict->next=dct;
+ dct->prev=dict;
+}
+
+dictionary *yon_dictionary_create_with_data(char *key, void *data){
+ dictionary *dct=yon_dictionary_create_empty();
+ dct->key=yon_char_new(key);
+ dct->data=data;
+ dct->data_type=DICTIONARY_OTHER_TYPE;
+ return dct;
+}
+
+dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data){
+ dictionary *dct=yon_dictionary_create_conneced(dict);
+ dct->key=yon_char_new(key);
+ dct->data=data;
+ dct->data_type=DICTIONARY_OTHER_TYPE;
+ return dct;
+}
+
+dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect){
+ dictionary *dict=yon_dictionary_get_last(old);
+ dict->next=toconnect;
+ toconnect->prev=dict;
+ toconnect->first=dict->first;
+ return toconnect;
+}
+
+dictionary *yon_dictionary_find(dictionary **dict, char *key){
+ dictionary *dct=*dict;
+ for (dictionary *pointer=dct->first;pointer!=NULL;pointer=pointer->next){
+ if (strcmp(pointer->key,key)==0){
+ *dict=pointer;
+ return pointer;
+ }
+ }
+ return NULL;
+}
+
+
+dictionary *yon_dictionary_rip(dictionary *dict){
+ if (!dict->next){
+ dictionary *prev=dict->prev;
+ if (prev){
+ prev->next=NULL;
+ return prev;
+ } else return dict;
+ }
+ else if (!dict->prev){
+ dictionary *next=dict->next;
+ if (next){
+ yon_dictionary_make_first(next);
+ next->prev=NULL;
+ return next;
+ }
+ else return dict;
+ }
+ else {
+ dictionary *next=dict->next, *prev=dict->prev;
+ next->prev=prev;
+ prev->next=next;
+ return next;
+ }
+}
+
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place){
+ dict=dict->first;
+ for (int i=0;inext;
+ if (dict) return dict;
+ else return NULL;
+}
+
+//char functions
+
+/**
+ * creates new char string by combining two char strings.
+*/
+char *yon_char_get_augumented(char *source, char *append){
+ if (source&&append){
+ int size=strlen(source)+strlen(append)+1;
+ char *final=malloc(size);
+ memset(final,0,size);
+ if (strstr(source,"%%"))
+ sprintf(final,source,append);
+ else
+ sprintf(final,"%s%s",source,append);
+ return final;
+ } else
+ return NULL;
+}
+
+/**
+ * creates new char string by copying another char.
+*/
+char *yon_char_new(char *chr){
+ char *newchar=malloc(strlen(chr)+1);
+ memset(newchar,0,strlen(chr)+1);
+ memcpy(newchar,chr,strlen(chr));
+ return newchar;
+}
+
+/**
+ * cuts source string by size length from startpos position.
+*/
+char *yon_cut(char *source, int size, int startpos){
+ char *cut=NULL;
+ cut=malloc(size+1);
+ memset(cut,0,size+1);
+ memcpy(cut,source+startpos,size);
+ return cut;
+}
+/**
+ * divides source string in dividepos position,
+ * returning left part of divided string and
+ * inserting right part to source string.
+*/
+char *yon_char_divide(char *source, int dividepos){
+ char *cut=malloc(dividepos+1);
+ memset(cut,0,dividepos+1);
+ memcpy(cut,source,dividepos);
+ char *left=malloc(strlen(source)-strlen(cut));
+ memset(left,0,strlen(source)-strlen(cut));
+ memcpy(left,source+dividepos+1,(strlen(source)-dividepos));
+ memset(source,0,strlen(source));
+ memcpy(source,left,strlen(left));
+ return cut;
+}
+
+/**
+ * searches string dividepos in source string and divides it,
+ * returning left part of divided string and
+ * inserting right part to source string.
+ * if delete_divider is 0, left part will contain delete_divider substring, else
+ * it will stay in right part.
+*/
+char *yon_char_divide_search(char *source, char* dividepos, int delete_divider){
+ char *cut=strstr(source,dividepos);
+ int leng=strlen(source)-strlen(cut);
+ cut=yon_char_divide(source,leng);
+ return cut;
+}
+/**
+ * converts int to char.
+*/
+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++){
+ convert_check=convert_check/10;
+ }
+ char *ch=malloc(i*sizeof(char)+1);
+ sprintf(ch,"%d",int_to_convert);
+ return ch;
+}
+
+
+//parsing functions
+
+apps *yon_apps_scan_and_parse_desktops(int *sizef){
+ int size=0;
+ struct apps *applist;
+ {
+ DIR *directory=opendir(DesktopPath);
+ struct dirent *de;
+ while ((de = readdir(directory)))
+ {
+ FILE *file;
+ char *path=yon_char_get_augumented(DesktopPath,de->d_name);
+ file=fopen(path,"r");
+ if (strlen(de->d_name)>9)
+ {
+ char *extension=strstr(path,".");
+ if (extension!=NULL)
+ {
+ if (strcmp(extension,".desktop")==0)
+ {
+ apps tempapp;
+ GKeyFile *gfile=g_key_file_new();
+ GError *err=NULL;
+ g_key_file_load_from_file(gfile,path,G_KEY_FILE_KEEP_TRANSLATIONS,NULL);
+ char *Type=g_key_file_get_string(gfile,"Desktop Entry", "Type",&err);
+ if (err){
+ printf("%s\n",err->message);
+ }
+ if (strcmp(Type,"Application")==0) tempapp.Type=1; else if (strcmp(Type,"pyApplication")==0) tempapp.Type=2; else continue;
+ tempapp.Name=g_key_file_get_locale_string(gfile,"Desktop Entry","Name",setlocale(LC_ALL,NULL),NULL);
+ if (tempapp.Name==NULL) continue;
+ tempapp.Categories=g_key_file_get_string(gfile,"Desktop Entry", "Categories",NULL);
+ if (tempapp.Categories==NULL) continue;
+ tempapp.Exec=g_key_file_get_string(gfile,"Desktop Entry", "Exec",NULL);
+ if (tempapp.Exec==NULL) continue;
+ tempapp.Icon=g_key_file_get_string(gfile,"Desktop Entry", "Icon",NULL);
+ if (tempapp.Icon==NULL) continue;
+ tempapp.Pluggable=g_key_file_get_boolean(gfile,"Desktop Entry", "Pluggable",NULL);
+ if (!tempapp.Pluggable) tempapp.Pluggable=g_key_file_get_boolean(gfile,"Desktop Entry", "X-XfcePluggable",NULL);
+ if (tempapp.Pluggable) tempapp.DualPluggable=g_key_file_get_boolean(gfile,"Desktop Entry", "X-UBLPluggable",NULL);
+ if (g_key_file_get_boolean(gfile,"Desktop Entry", "X-UBL-SettingsManager-Hidden",NULL)==0)
+ if (size==0){
+ applist=(apps*)malloc(size+1*sizeof(apps));
+ applist[0].Name=yon_char_new(tempapp.Name);
+ applist[0].Categories=yon_char_new(tempapp.Categories);
+ applist[0].Exec=yon_char_new(tempapp.Exec);
+ applist[0].Icon=yon_char_new(tempapp.Icon);
+ applist[0].Type=tempapp.Type;
+ applist[0].Pluggable=tempapp.Pluggable;
+ applist[0].DualPluggable=tempapp.DualPluggable;
+ size++;
+ } else {
+ applist=(apps*)realloc(applist,(size+1)*sizeof(apps));
+ applist[size].Name=yon_char_new(tempapp.Name);
+ applist[size].Categories=yon_char_new(tempapp.Categories);
+ applist[size].Exec=yon_char_new(tempapp.Exec);
+ applist[size].Icon=yon_char_new(tempapp.Icon);
+ applist[size].Pluggable=tempapp.Pluggable;
+ applist[size].DualPluggable=tempapp.DualPluggable;
+ applist[size].Type=tempapp.Type;
+ size++;
+ }
+ }
+ }
+ }
+ }
+ }
+ *sizef=size;
+ return applist;
+};
+
+
+void yon_apps_sort(apps *applist,int size){
+ apps tmp;
+ if (size>2)
+ {
+ for (int i=1;icommand=path;
+ thread->exitcode=malloc(sizeof(int));
+ pthread_t thread_id;
+ pthread_create(&thread_id, NULL, (void*)yon_launch, thread);
+ return *thread->exitcode;
+};
+
+
+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);
+ 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;
+};
+
+
+int yon_launch(thread_output *thread){
+ int a=0;
+ a=system(thread->command);
+ *thread->exitcode=a;
+ return *thread->exitcode;
+}
+
+
+//Gtk functions
+
+#ifdef __GTK_H__
+
+// dictionary *yon_gtk_app_chooser_create(GtkBuilder *builder){
+// GtkWidget *chooserWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+// GtkWidget *Box=gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
+// GtkWidget *Frame=gtk_frame_new("");
+// GtkWidget *Scroll=gtk_scrolled_window_new(NULL, gtk_adjustment_new(0,0,10000,1,10,100));
+// GtkWidget *PackBox=gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
+// GtkWidget *ButtonsBox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+// GtkWidget *ButtonsPlaceBox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+
+// GtkWidget *CancelButton=gtk_button_new_with_label("Cancel");
+// GtkWidget *AcceptButton=gtk_button_new_with_label("Accept");
+// gtk_container_add(GTK_CONTAINER(chooserWindow),Box);
+// gtk_box_pack_start(GTK_BOX(Box),Frame,1,1,0);
+// gtk_container_add(GTK_CONTAINER(Frame),PackBox);
+// gtk_box_pack_start(GTK_BOX(Box),ButtonsBox,0,0,0);
+// gtk_box_pack_end(GTK_BOX(ButtonsBox),ButtonsPlaceBox,0,0,0);
+// gtk_box_pack_end(GTK_BOX(ButtonsPlaceBox),AcceptButton,0,0,0);
+// gtk_box_pack_end(GTK_BOX(ButtonsPlaceBox),CancelButton,0,0,0);
+// gtk_box_pack_start(GTK_BOX(PackBox),(GtkWidget*)yon_gtk_app_chooser_apps_create(builder),0,0,0);
+// gtk_widget_show_all(chooserWindow);
+// }
+
+/**
+ * yon_iv_segment_create:
+ * connect_to - dictionary, in the end of which new one will be connected;
+ * name - name of this segment, renders on label;
+ * categories - desktop file categories that application NEEDS to have to render in that category;
+ * segment_icon_name - icon name for this section;
+ * builder - newly allocated builder with glade file connected where template widgets are stored:
+ * - templateAppsIconView - setted up icon view;
+ * - templateAppsPack - setted up container for every template widget;
+ * - templateAppsImage - image for rendering section image;
+ * - templateAppsLabel - label for rendering section name;
+*/
+// dictionary *yon_iv_segment_create(dictionary *connect_to, char *name, char *categories, char *segment_icon_name){
+// IVSegment *segment=malloc(sizeof(IVSegment));
+// segment->name=name;
+// segment->categories=categories;
+// GtkBuilder *builder=gtk_builder_new_from_string(return_app_string(),-1);
+// GtkWidget *iv=yon_gtk_builder_get_widget(builder,"templateAppsIconView");
+// GtkWidget *expander=yon_gtk_builder_get_widget(builder,"templateAppsPack");
+// GtkWidget *image=yon_gtk_builder_get_widget(builder,"templateAppsImage");
+// GtkWidget *label=yon_gtk_builder_get_widget(builder,"templateAppsLabel");
+// GtkIconTheme *theme=gtk_icon_theme_get_default();
+// gtk_image_set_from_pixbuf(GTK_IMAGE(image),gtk_icon_theme_load_icon_for_scale(theme,segment_icon_name,20,1,GTK_ICON_LOOKUP_FORCE_SVG,NULL));
+// gtk_label_set_text(GTK_LABEL(label),name);
+// GtkListStore *ls=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore5"));
+// // g_signal_connect(G_OBJECT(iv), "item-activated", G_CALLBACK(on_activate), videoconfig.applist);
+// segment->Expander=expander;
+// segment->IV=iv;
+// segment->LS=ls;
+// segment->Image=image;
+// dictionary *dict=NULL;
+// if (connect_to) {
+// // connect_to=yon_dictionary_get_last(connect_to);
+// dict=yon_dictionary_create_with_data_connected(connect_to,name,segment);
+// } else
+// dict=yon_dictionary_create_with_data(name,segment);
+// return dict;
+// }
+
+// GtkWidget *yon_gtk_app_chooser_apps_create(){
+// GtkWidget *Box=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
+// dictionary *IVS=yon_iv_segment_create(NULL, "Graphics", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Tools", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Internet", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Multimedia", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Settings", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Education", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Office", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Other", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Development", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "System", "", "dialog-yes-symbolic");
+// dictionary *nd;
+// for_dictionaries(nd,IVS){
+// gtk_box_pack_start(GTK_BOX(Box),((IVSegment*)nd->data)->Expander,0,0,0);
+// }
+// return Box;
+
+// }
+
+// GtkWidget *yon_gtk_socket_create_new_with_connect(GtkWidget *container, gpointer data){
+// GtkWidget *socket;
+// socket = gtk_socket_new();
+// g_signal_connect(G_OBJECT(socket),"plug-added",G_CALLBACK(yon_on_plug_added),data);
+// g_signal_connect(G_OBJECT(socket),"plug-removed",G_CALLBACK(yon_on_plug_removed),data);
+// g_signal_connect(G_OBJECT(socket),"destroy",G_CALLBACK(yon_on_plug_removed),data);
+// gtk_box_pack_start(GTK_BOX(container),socket,1,1,0);
+// return socket;
+// };
+
+int yon_dictionary_gtk_pack_start_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_start(GTK_BOX(destination),(GtkWidget*)dct->data,expand,fill,padding);
+ }
+ return 1;
+}
+
+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);
+ }
+ return 1;
+}
+
+void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path){
+ gtk_overlay_add_overlay(GTK_OVERLAY(Overlay),Head);
+ gtk_image_set_from_file(GTK_IMAGE(Image),image_path);
+}
+
+void _yon_ubl_status_box_render(GtkWidget *StatusBox, GtkWidget *StatusIcon, GtkWidget *StatusLabel, char *IconName, char* StatusText, BACKGROUND_IMAGE_TYPE BackgroundClass){
+ GtkIconTheme *ictheme=gtk_icon_theme_get_default();
+ GError *err=NULL;
+ gtk_image_set_from_pixbuf(GTK_IMAGE(StatusIcon),gtk_icon_theme_load_icon_for_scale(ictheme,IconName,25,1,GTK_ICON_LOOKUP_FORCE_SIZE,&err));
+ if (err){
+ printf("%s\n",err->message);
+ g_error_free(err);
+ }
+ gtk_label_set_text(GTK_LABEL(StatusLabel),StatusText);
+ if (BackgroundClass==BACKGROUND_IMAGE_SUCCESS_TYPE){
+ gtk_style_context_add_class(gtk_widget_get_style_context(StatusBox),"boxInfoMessOK");
+ } else if (BackgroundClass==BACKGROUND_IMAGE_FAIL_TYPE){
+ gtk_style_context_add_class(gtk_widget_get_style_context(StatusBox),"boxInfoMessError");
+ }
+}
+#endif
\ No newline at end of file
diff --git a/source/ubl-utils.h b/source/ubl-utils.h
new file mode 100644
index 0000000..444fd93
--- /dev/null
+++ b/source/ubl-utils.h
@@ -0,0 +1,164 @@
+#ifndef UBL_UTILS
+#define UBL_UTILS
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#define DesktopPath "/usr/share/applications/"
+
+#define for_dictionaries(obj,obj1) for(obj=obj1->first;obj!=NULL;obj=obj->next)
+
+typedef enum {
+ DICTIONARY_ACTION_WIDGETS_TYPE,
+ DICTIONARY_IVGRAPHICALS_TYPE,
+ DICTIONARY_OTHER_TYPE
+
+} DICT_TYPE;
+
+
+typedef struct {
+ char *command;
+ int *exitcode;
+} thread_output;
+
+typedef struct dictionary {
+ char *key;
+ void *data;
+ struct dictionary *next;
+ struct dictionary *prev;
+ struct dictionary *first;
+ DICT_TYPE data_type;
+} dictionary;
+
+typedef struct apps{
+ char *Name;
+ int Type;
+ char *Categories;
+ char *Exec;
+ char *Icon;
+ int Pluggable;
+ int DualPluggable;
+ } apps;
+
+
+//dictionary functions
+
+dictionary *yon_dictionary_create_empty();
+
+dictionary * yon_dictionary_create_conneced(dictionary *targetdict);
+
+dictionary *yon_dictionary_get_last(dictionary *dict);
+
+dictionary *yon_dictionary_switch_places(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_create_with_data_connected(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_rip(dictionary *dict);
+
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
+
+//char functions
+
+char *yon_char_get_augumented(char *source, char *append);
+
+char *yon_char_new(char *chr);
+
+char *yon_cut(char *source, int size, int startpos);
+
+char *yon_char_divide(char *source, int dividepos);
+
+char *yon_char_divide_search(char *source, char* dividepos, int delete_divider);
+
+char *yon_char_from_int(int int_to_convert);
+
+
+
+//parsing functions
+
+apps *yon_apps_scan_and_parse_desktops(int *sizef);
+
+
+void yon_apps_sort(apps *applist,int size);
+
+
+apps *yon_apps_get_by_name(apps *applist,char *name, int size);
+
+
+//terminal-using functions
+
+
+
+int yon_launch_app(char *name);
+
+
+int yon_launch_app_with_arguments(char *name, char *args);
+
+
+int yon_launch(thread_output *thread);
+
+//Gtk functions
+
+#ifdef __GTK_H__
+
+#define yon_gtk_builder_get_widget(obj,obj2) GTK_WIDGET(gtk_builder_get_object(obj,obj2))
+
+
+typedef struct {
+ GtkWidget *Icon;
+ GtkWidget *Label;
+ GtkWidget *IconView;
+ GtkListStore *List;
+} expander_icon_view;
+
+
+// GtkWidget *yon_gtk_app_chooser_apps_create();
+
+// dictionary *yon_gtk_app_chooser_create();
+
+// expander_icon_view yon_gtk_icon_view_expander_create(GtkWidget *pack, ...);
+
+GtkWidget *yon_gtk_socket_create_new_with_connect(GtkWidget *container, gpointer data);
+
+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);
+
+//uninitialised
+
+void yon_on_plug_added(GtkSocket* self, gpointer user_data);
+void yon_on_plug_removed(GtkSocket* self, gpointer user_data);
+
+
+#endif
+typedef enum {
+ BACKGROUND_IMAGE_SUCCESS_TYPE,
+ BACKGROUND_IMAGE_FAIL_TYPE
+} BACKGROUND_IMAGE_TYPE;
+#ifdef __cplusplus
+#define yon_ubl_header_setup(overlay,head,image,imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()),GTK_WIDGET(head.gobj()),GTK_WIDGET(image.gobj()),(char*)imag_path)
+#define yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass) _yon_ubl_status_box_render(GTK_WIDGET(statusbox.gobj()), GTK_WIDGET(statusicon.gobj()), GTK_WIDGET(statuslabel.gobj()), (char*)iconname, (char*)statustext, backgroundclass)
+#else
+#define yon_ubl_header_setup(overlay,head,image,imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay),GTK_WIDGET(head),GTK_WIDGET(image), (char*)imag_path)
+#define yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass) _yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass)
+#endif
+
+void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
+void _yon_ubl_status_box_render(GtkWidget *StatusBox, GtkWidget *StatusIcon, GtkWidget *StatusLabel, char *IconName, char* StatusText, BACKGROUND_IMAGE_TYPE BackgroundClass);
+#endif
\ No newline at end of file
diff --git a/ubl-settings-usergroups-banner.png b/ubl-settings-usergroups-banner.png
new file mode 100644
index 0000000..8eb67cb
Binary files /dev/null and b/ubl-settings-usergroups-banner.png differ
diff --git a/ubl-settings-usergroups.glade b/ubl-settings-usergroups.glade
index 68e963c..3c5e40d 100644
--- a/ubl-settings-usergroups.glade
+++ b/ubl-settings-usergroups.glade
@@ -20,7 +20,7 @@
1.0
Copyright © 2023 - UBSoft Software LLC
Settings for users and groups
- https://ublinux.ru/
+ https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-usergroups
Project Home Page
Это приложение распространяется без каких-либо гарантий.
Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>.
@@ -120,17 +120,6 @@
0
-
-
-
- False
- True
- 1
-
-
True
@@ -172,7 +161,9 @@
False
process-stop-symbolic
-
-
+
True
True
1000
@@ -229,7 +220,7 @@
False
5
-
+
True
False
Username
@@ -242,7 +233,7 @@
-
+
True
True
@@ -265,7 +256,7 @@
False
5
-
+
True
False
Login
@@ -278,7 +269,7 @@
-
+
True
True
@@ -301,7 +292,7 @@
False
5
-
+
True
False
Password
@@ -314,7 +305,7 @@
-
+
True
True
@@ -332,11 +323,12 @@
-
+
Default password
True
True
False
+ 0
True
@@ -351,7 +343,7 @@
False
5
-
+
True
False
Password hash algorythm
@@ -364,7 +356,7 @@
-
+
True
False
@@ -382,11 +374,12 @@
-
+
Sync with SAMBA user
True
True
False
+ 0
True
@@ -411,7 +404,7 @@
5
True
-
+
Cancel
True
True
@@ -425,7 +418,7 @@
-
+
Add
True
True
@@ -459,10 +452,10 @@
-
-
-
-
+
+
+
+
@@ -485,7 +478,9 @@
-
+
+ 300
+ 400
False
True
com.ublinux.ubl-settings-usergroups
@@ -495,7 +490,7 @@
False
vertical
-
+
True
True
liststore2
@@ -503,7 +498,7 @@
-
+
Enabled
@@ -514,7 +509,7 @@
-
+
Group
@@ -526,7 +521,7 @@
- False
+ True
True
0
@@ -542,8 +537,8 @@
5
True
-
- button
+
+ Cancel
True
True
True
@@ -555,8 +550,8 @@
-
- button
+
+ Ok
True
True
True
@@ -582,7 +577,7 @@
True
False
-
-