diff --git a/.gitignore b/.gitignore index 07e1ac1..a4f5d99 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,8 @@ test.cpp ublexec nohup.out ublexec_ru.po~ -compile/ \ No newline at end of file +compile/ +.BUILD.md +.install.sh +terminal-commands/ +.updatebuild.sh \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index e35dd6d..bb6b66b 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -3,20 +3,15 @@ project(ublexec) find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK3 REQUIRED gtk+-3.0) -include_directories(${GTK3_INCLUDE_DIRS}) -link_directories(${GTK3_LIBRARY_DIRS}) -add_definitions(${GTK3_CFLAGS_OTHER}) +pkg_check_modules(GTK REQUIRED gtk+-3.0) +include_directories(${GTK_INCLUDE_DIRS}) +link_directories(${GTK_LIBRARY_DIRS}) +add_definitions(${GTK_CFLAGS_OTHER}) -pkg_check_modules(GTKMM30 REQUIRED gtkmm-3.0) -include_directories(${GTKMM30_INCLUDE_DIRS}) -link_directories(${GTKMM30_LIBRARY_DIRS}) -add_definitions(${GTKMM30_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}) +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) @@ -71,23 +66,22 @@ add_custom_target( 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 -g") + -fstack-clash-protection -fcf-protection") - set(SOURCE_FILES - main.cc - ublexec.cc + ublexec.c ublexec.h - ubl-util-standard.h - ubl-util-standard.c - ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h) + ubl-strings.h + ubl-utils.h + ubl-utils.c + ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h + ) set(LIBRARIES - ${GTK3_LIBRARIES} - ${GTKMM30_LIBRARIES} + ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} -# ${VTE291_LIBRARIES} + ${VTE291_LIBRARIES} pthread) @@ -99,4 +93,4 @@ set_source_files_properties( PROPERTIES GENERATED TRUE ) install(TARGETS ${PROJECT_NAME} DESTINATION bin) -add_dependencies(${PROJECT_NAME} dummy-resource) +add_dependencies(${PROJECT_NAME} dummy-resource) \ No newline at end of file diff --git a/source/main.cc b/source/main.cc deleted file mode 100644 index a00cdcb..0000000 --- a/source/main.cc +++ /dev/null @@ -1,51 +0,0 @@ -#include "ublexec.h" - -void pars_flag(int index_start, int argc, char* argv[]); - -int main(int argc, char** argv) { - string str_argv= ""; - string str_cmd_argv = ""; - - setlocale(LC_ALL, ""); - bindtextdomain(app_name, "/usr/share/locale/"); - bind_textdomain_codeset(app_name, "UTF-8"); - textdomain(app_name); - if (argc > 1){ - str_argv = argv[1]; - } - if (argc == 3) { - name_app_cmd = argv[2]; - string str_flag = argv[1]; - if (str_flag == "-x") { - flag_prog_file = 1; - } - else if (str_flag == "-e") { - flag_prog_file = 2; - } - } - pars_flag(1,argc, argv); - int local_argc = 1; - auto app = Gtk::Application::create(local_argc, argv, "org.gtkmm.example.plug"); - auto builder = Gtk::Builder::create_from_resource(path_glade); - MainWindow* wnd = nullptr; - builder->get_widget_derived("window", wnd); - auto r = app->run(*wnd); - delete wnd; - return r; -} - -void pars_flag(int index_start, int argc, char* argv[]) { - string str_argv = ""; - for (int i = index_start; i0&&LeftWidget){ - GtkWidget *plug=gtk_plug_new(left_plug_id); - GtkWidget *toplug=LeftWidget; - if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ - g_object_ref(G_OBJECT(toplug)); - GtkWidget *parent=gtk_widget_get_parent(toplug); - gtk_container_remove(GTK_CONTAINER(parent),toplug); - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - } else - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - gtk_widget_show(GTK_WIDGET(plug)); - ret->plugLeft=plug; - } - if (right_plug_id>0&&RightWidget){ - GtkWidget *plug=gtk_plug_new(right_plug_id); - GtkWidget *toplug=RightWidget; - if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ - g_object_ref(G_OBJECT(toplug)); - GtkWidget *parent=gtk_widget_get_parent(toplug); - gtk_container_remove(GTK_CONTAINER(parent),toplug); - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - } else - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - gtk_widget_show(GTK_WIDGET(plug)); - ret->plugRight=plug; - } - return ret; -} - -#endif - -#else - - -inline void ubl_make_plugs(Gtk::Widget *LeftWidget, Gtk::Widget *RightWidget, int left_plug_id, int right_plug_id){ - if (left_plug_id>0&&LeftWidget){ - GtkWidget *plug=gtk_plug_new(left_plug_id); - GtkWidget *toplug=GTK_WIDGET(LeftWidget->gobj()); - {GdkScreen *screen = gtk_widget_get_screen(plug); - gtk_widget_set_app_paintable(plug,TRUE); - GdkVisual *colormap = gdk_screen_get_rgba_visual(screen); - gtk_widget_set_visual(plug, colormap);} - {GdkScreen *screen = gtk_widget_get_screen(toplug); - gtk_widget_set_app_paintable(toplug,TRUE); - GdkVisual *colormap = gdk_screen_get_rgba_visual(screen); - gtk_widget_set_visual(toplug, colormap);} - if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ - g_object_ref(G_OBJECT(toplug)); - GtkWidget *parent=gtk_widget_get_parent(toplug); - gtk_container_remove(GTK_CONTAINER(parent),toplug); - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - } else - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - gtk_widget_show(GTK_WIDGET(plug)); - gtk_style_context_add_class(gtk_widget_get_style_context(plug),"bkim"); - gtk_style_context_add_class(gtk_widget_get_style_context(toplug),"bkim"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug),"primary-toolbar"); - } - if (right_plug_id>0&&RightWidget){ - GtkWidget *plug=gtk_plug_new(right_plug_id); - GtkWidget *toplug=GTK_WIDGET(RightWidget->gobj()); - {GdkScreen *screen = gtk_widget_get_screen(plug); - gtk_widget_set_app_paintable(plug,TRUE); - GdkVisual *colormap = gdk_screen_get_rgba_visual(screen); - gtk_widget_set_visual(plug, colormap);} - {GdkScreen *screen = gtk_widget_get_screen(toplug); - gtk_widget_set_app_paintable(toplug,TRUE); - GdkVisual *colormap = gdk_screen_get_rgba_visual(screen); - gtk_widget_set_visual(toplug, colormap);} - if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ - g_object_ref(G_OBJECT(toplug)); - GtkWidget *parent=gtk_widget_get_parent(toplug); - gtk_container_remove(GTK_CONTAINER(parent),toplug); - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - } else - gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); - gtk_widget_show(GTK_WIDGET(plug)); - gtk_style_context_add_class(gtk_widget_get_style_context(plug),"bkim"); - gtk_style_context_add_class(gtk_widget_get_style_context(toplug),"bkim"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug),"primary-toolbar"); - } -} -#endif \ No newline at end of file diff --git a/source/ubl-util-standard.h b/source/ubl-util-standard.h deleted file mode 100644 index 3209625..0000000 --- a/source/ubl-util-standard.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __cplusplus -#include -#include - -typedef struct { - GtkWidget *plugLeft; - GtkWidget *plugRight; - - -} returnstruct; -static returnstruct *ubl_make_plugs(GtkWidget *LeftWidget, GtkWidget *RightWidget, int left_plug_id, int right_plug_id); -#else -#include -#include -#include -#include - - -static void ubl_make_plugs(Gtk::Widget *LeftWidget, Gtk::Widget *RightWidget, int left_plug_id, int right_plug_id); -#endif \ No newline at end of file diff --git a/source/ubl-utils.c b/source/ubl-utils.c new file mode 100644 index 0000000..28ce67d --- /dev/null +++ b/source/ubl-utils.c @@ -0,0 +1,2072 @@ +#include "ubl-utils.h" + +// dictionary functions + +/**yon_dictionary_new(): + * [EN] + * Creates and returns empty dictionary + * [RU] + * Создаёт и возвращает пустой словарь. + */ +dictionary *yon_dictionary_new() +{ + 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; +} + +/**yon_dictionary_copy(dictionary *dict) + * [EN] + * + * [RU] + * Создаёт и возвращает копию элемента словаря [dict] +*/ +dictionary *yon_dictinoary_copy(dictionary *dict){ + dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); + dct->data_type= dict->data_type; + return dct; +} + +/**yon_dictionary_copy_deep(dictionary *dict) + * [EN] + * + * [RU] + * Создаёт полную копию словаря [dict] и возвращает первый элемент +*/ +dictionary *yon_dictionary_copy_deep(dictionary *dict){ + dictionary *dct = NULL; + dictionary *newone=NULL; + for_dictionaries(dct,dict){ + yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data); + newone->data_type=dct->data_type; + } + return newone->first; +} + +/**int yon_dictionary_set_data(dictionary *dict, void *data) + * [EN] + * + * [RU] + * Установить элементу словаря [dict] значение [data] +*/ +int yon_dictionary_set_data(dictionary *dict, void *data){ + dict->data=data; +} + +/**int yon_dictionary_set_key(dictionary *dict, char *key) + * [EN] + * + * [RU] + * Изменяет ключ элемента словаря [dict] на [key] +*/ +int yon_dictionary_set_key(dictionary *dict, char *key){ + dict->key=key; + return 1; +} + +/** int yon_dictionary_set(dictionary *dict, char *key, void *data) + * [EN] + * + * [RU] +* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] +*/ +int yon_dictionary_set(dictionary *dict, char *key, void *data){ + dict->key=key; + dict->data=data; + return 1; +} + +/**int yon_dictionary_empty(dictionary *dict) + * [EN] + * + * [RU] + * Очищает элемент словаря [dict] от данных +*/ +int yon_dictionary_empty(dictionary *dict){ + dict->data=NULL; + dict->data_type=DICTIONARY_OTHER_TYPE; + return 1; +} + +/**yon_dictionary_switch_to_last(dictionary **dict) + * [EN] + * + * [RU] + * Переключает словарь [dict] на последний элемент. +*/ +void yon_dictionary_switch_to_last(dictionary **dict) +{ + dictionary *dct=NULL, *dact=*dict; + for_dictionaries(dct,dact); +} + +/**yon_dictionary_create_conneced(dictionary *targetdict) + * [EN] + * + * [RU] + * Создаёт новый элемент словаря [targetdict] +*/ +dictionary *yon_dictionary_append(dictionary *targetdict) +{ + targetdict = yon_dictionary_get_last(targetdict); + targetdict->next = yon_dictionary_new(); + targetdict->next->prev = targetdict; + targetdict->next->first = targetdict->first; + targetdict->next->data_type = DICTIONARY_OTHER_TYPE; + return targetdict->next; +} + +/**yon_dictionary_get_last(dictionary *dict) + * [EN] + * + * [RU] + * Возвращает последний элемент словаря [dict]. + * В отличае от yon_dictionary_switch_to_last() + * словарь [dict] остаётся на прежнем элементе. +*/ +dictionary *yon_dictionary_get_last(dictionary *dict) +{ + if (dict->next){ + dictionary *dct = NULL; + for_dictionaries(dct,dict); + return dct; + } else return dict; +} + +/**yon_dictionary_switch_places(dictionary *dict, int aim) + * [EN] + * + * [RU] + * Меняет элемент словаря [dict] местами с другим элементом. + * если [aim]<0 элемент меняется местами с левым элементом; + * если [aim]>0 элемент меняется местами с правым элементом; +*/ +dictionary *yon_dictionary_swap(dictionary *dict, int aim) +{ + if (aim < 0) + { + if (dict->prev) + { + if (dict->prev->prev) + { + dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev; + if (next) + { + preprev->next = dict; + dict->prev = preprev; + dict->next = prev; + prev->prev = dict; + prev->next = next; + next->prev = prev; + } + else + { + preprev->next = dict; + dict->prev = preprev; + dict->next = prev; + prev->prev = dict; + prev->next = NULL; + } + return prev; + } + else + { + dictionary *next = dict->next, *prev = dict->prev; + if (next) + { + yon_dictionary_make_first(dict); + dict->prev = NULL; + dict->next = prev; + prev->prev = dict; + prev->next = next; + next->prev = prev; + } + else + { + dict->prev = NULL; + dict->next = prev; + prev->prev = dict; + prev->next = NULL; + } + return prev; + } + } + } + else if (aim > 0) + { + if (dict->next) + { + if (dict->next->next) + { + dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next; + if (prev) + { + prev->next = next; + next->prev = prev; + next->next = dict; + dict->prev = next; + dict->next = afnext; + afnext->prev = dict; + } + else + { + yon_dictionary_make_first(next); + next->prev = NULL; + next->next = dict; + dict->prev = next; + dict->next = afnext; + afnext->prev = dict; + } + return next; + } + else + { + dictionary *next = dict->next, *prev = dict->prev; + if (prev) + { + prev->next = next; + next->prev = prev; + next->next = dict; + dict->prev = next; + dict->next = NULL; + } + else + { + next->prev = NULL; + next->next = dict; + dict->prev = next; + dict->next = NULL; + } + } + } + } +} + +/**yon_dictionary_make_first(dictionary *dict) + * [EN] + * + * [RU] + * Устанавливает указатель первого элемента словаря [dict] + * на текущий элемент. Не использовать. +*/ +void yon_dictionary_make_first(dictionary *dict) +{ + for (dictionary *dct = dict->first; dct != NULL; dct = dct->next) + { + dct->first = dict; + } +} + +/**yon_dictionary_make_nth(dictionary *dict, int nth) + * [EN] + * + * [RU] + * Перемещает элемент словаря [dict] на позицию [nth]. +*/ +void yon_dictionary_make_nth(dictionary *dict, int nth) +{ + dictionary *dct = dict->first; + for (int i = 0; i < nth; i++) + { + if (dct == NULL) + return; + else + dct = dct->next; + } + yon_dictionary_rip(dict); + dictionary *prev = dct->prev; + prev->next = dict; + dict->prev = prev; + dict->next = dct; + dct->prev = dict; +} + +/**yon_dictionary_create_with_data(char *key, void *data) + * [EN] + * + * [RU] + * Создаёт новый словарь с ключом [key] и указателем на данные [data] +*/ +dictionary *yon_dictionary_new_with_data(char *key, void *data) +{ + dictionary *dct = yon_dictionary_new(); + dct->key = yon_char_new(key); + dct->data = data; + dct->data_type = DICTIONARY_OTHER_TYPE; + return dct; +} + +/** void *yon_dictionary_free_all(dictionary *dictionary,void *data_manipulation) + * [EN] + * Frees whole [dictionary] and activates [data_manipulation] function if not NULL with [dictionary]->data argument for each dictionary. + * [RU] + * Освобождает память для всех элементов словаря [dictionary] и активирует функцию [data_manipulation], если она была передана, с аргументом [dictionary]->data на каждый элемент словаря. +*/ +void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){ + dictionary *dict=NULL; + for_dictionaries(dict,dictionary_to_free){ + if(data_manipulation) + data_manipulation(dict->data); + if(dict->prev) + free(dict->prev); + } + free(dict); + return NULL; +} + +/**yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data) + * [EN] + * + * [RU] + * Создаёт новый элемент словаря, присоединяемый в конец словаря [dict] + * с ключом [key] и указателем на данные [data] +*/ +dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data) +{ + dictionary *dct = yon_dictionary_append(dict); + dct->key = yon_char_new(key); + dct->data = data; + dct->data_type = DICTIONARY_OTHER_TYPE; + return dct; +} + +/**yon_dictionary_connect(dictionary *old, dictionary *toconnect) + * [EN] + * + * [RU] + * Присоединяет словарь [toconnect] в конец словаря [old]. +*/ +dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect) +{ + dictionary *dict = yon_dictionary_get_last(old); + dict->next = toconnect; + toconnect->prev = dict; + toconnect->first = dict->first; + return toconnect; +} + +/**yon_dictionary_get(dictionary **dict, char *key) + * [EN] + * + * [RU] + * Возвращает элемент словаря [dict] с ключом [key]. + * Если такого элемента не было обнаружено, возвращается NULL +*/ +dictionary *yon_dictionary_get(dictionary **dict, char *key) +{ + dictionary *dct = *dict; + for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next) + { + if (strcmp(pointer->key, key) == 0) + { + *dict = pointer; + return pointer; + } + } + return NULL; +} + +/**yon_dictionary_rip(dictionary *dict) + * [EN] + * + * [RU] + * Вырезает элемент из словаря и возвращает вырезанный элемент. +*/ +dictionary *yon_dictionary_rip(dictionary *dict) +{ + if (!dict->next&&!dict->prev) return NULL; + else if (!dict->next) + { + dictionary *prev = dict->prev; + if (prev) + { + prev->next = NULL; + return prev; + } + else + return dict; + } + else if (!dict->prev) + { + dictionary *next = dict->next; + if (next) + { + yon_dictionary_make_first(next); + next->prev = NULL; + return next; + } + else + return dict; + } + else + { + dictionary *next = dict->next, *prev = dict->prev; + next->prev = prev; + prev->next = next; + return next; + } +} + +/**yon_dictionary_get_nth(dictionary *dict, int place) + * [EN] + * + * [RU] + * Возвращает [place]-й элемент словаря [dict] +*/ +dictionary *yon_dictionary_get_nth(dictionary *dict, int place) +{ + if (dict){ + dict = dict->first; + int i = 0; + for (i = 0; i < place; i++) + if (dict->next) + dict = dict->next; + else + break; + if (i == place) + return dict; + else + return NULL; + } else return NULL; +} + +// char functions + +int yon_char_find_last(char *source, char find){ + int size = strlen(source); + int i=size; + for (;source[i]!=find&&i>0;i--); + return i; +} + +/**[EN] + * + * creates new char string by combining two char strings. + */ +char *yon_char_append(char *source, char *append) +{ + if (source && append) + { + int size = strlen(source) + strlen(append) + 1; + char *final = malloc(size); + memset(final, 0, size); + if (strstr(source, "%%")) + sprintf(final, source, append); + else + sprintf(final, "%s%s", source, append); + return final; + } + else + return NULL; +} + +/**[EN] + * + * creates new char string by copying another char. + */ +char *yon_char_new(char *chr) +{ + if (chr){ + char *newchar = malloc(strlen(chr) + 1); + memset(newchar, 0, strlen(chr) + 1); + memcpy(newchar, chr, strlen(chr)); + return newchar; + } else + return NULL; +} + +/**yon_char_unite(char *source, ...) + * [En] + * + * [RU] + * Объединяет строку [source] со всеми строками, написанными в [...] +*/ +char *yon_char_unite(char *source, ...){ + va_list arglist; + char *new_char=NULL; + char *unite_char=NULL; + new_char=yon_char_new(source); + va_start(arglist,source); + unite_char = va_arg(arglist,char*); + while(unite_char){ + new_char = yon_char_append(new_char,unite_char); + unite_char = va_arg(arglist,char*); + } + va_end(arglist); + return new_char; +} + +/**yon_cut(char *source, int size, int startpos) + * [EN] + * cuts source string by size length from startpos position. + */ +char *yon_cut(char *source, int size, int startpos) +{ + char *cut = NULL; + cut = malloc(size + 1); + memset(cut, 0, size + 1); + memcpy(cut, source + startpos, size); + return cut; +} + +/**yon_char_divide(char *source, int dividepos) + * [EN] + * divides source string in dividepos position, + * returning left part of divided string and + * inserting right part to source string. + */ +char *yon_char_divide(char *source, int dividepos) +{ + char *cut = malloc(dividepos + 1); + memset(cut, 0, dividepos + 1); + memcpy(cut, source, dividepos); + char *left = malloc(strlen(source) - strlen(cut)); + memset(left, 0, strlen(source) - strlen(cut)); + memcpy(left, source + dividepos + 1, (strlen(source) - dividepos)); + memset(source, 0, strlen(source)); + memcpy(source, left, strlen(left)); + return cut; +} + +/**yon_char_find_count(char *source, char *find) + * [EN] + * + * [RU] + * Считает количество символов [find] в строке [source] +*/ +int yon_char_find_count(char *source, char *find){ + char *working_string=yon_char_new(source); + int i=0; + int size=0; + int pos=0; + config_str rtn = yon_char_parse(working_string,&size,"\n"); + for (int j=0;j= 10; i++) + { + convert_check = convert_check / 10; + } + char *ch = g_malloc0(i * sizeof(char) + 1); + sprintf(ch, "%d", int_to_convert); + return ch; +} + +/**yon_char_from_long(int int_to_convert) + * [EN] + * converts int to char*. + * + * [RU] + * Конвертирует int в char* + */ +char *yon_char_from_long(long int_to_convert) +{ + int i = 1; + double convert_check = (double)int_to_convert; + for (i = 1; convert_check >= 10; i++) + { + convert_check = convert_check / 10; + } + char *ch = g_malloc0(i * sizeof(char) + 1); + sprintf(ch, "%ld", int_to_convert); + return ch; +} + +/**yon_char_replace(char *source, char *find, char*replace) + * [EN] + * + * [RU] + * Заменяет в строке [source] все вхождения строки [find] на [replace] +*/ +char *yon_char_replace(char *source, char *find, char*replace){ + if (!strstr(replace,find)){ + + + char *final=NULL; + char *temp=NULL; + if(!strstr(replace,find)){ + while ((final=strstr(source,find))){ + temp=malloc(strlen(source)-strlen(final)); + memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); + memcpy(temp,source,strlen(source)-strlen(final)); + temp=yon_char_append(temp,replace); + source=yon_char_append(temp,final+1); + } + + } + } + return source; +} + +/**yon_char_parse(char *parameters, int *size, char *divider) + * [EN] + * Parses string [parameters], divided by [divider], + * then returns parsed string array and sets [size] to + * size of returned array +*/ +char **yon_char_parse(char *parameters, int *size, char *divider){ + char **string=NULL; + int i=1; + string=malloc(sizeof(char*)); + char *paramline=yon_char_new(parameters); + char *param; + if (!strstr(parameters,divider)) return NULL; + while ((param=yon_char_divide_search(paramline,divider,1))){ + if (strcmp(param,paramline)==0||param[0]=='\0') break; + string=realloc(string,sizeof(char*)*i); + string[i-1]=yon_char_new(param); + i++; + } + string=realloc(string,sizeof(char*)*i); + string[i-1]=yon_char_new(paramline); + i++; + *size=i-1; + return string; +} + +/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete) + * [EN] + * + * [RU] + * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size] + * Возвращает получившийся массив, в [size] загружается размер нового массива. +*/ +char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete){ + char **new_char_parsed=NULL; + new_char_parsed=malloc(sizeof(char*)*((*size)-1)); + int flag = 0; + for (int i=0;i < (*size);i++){ + if (i==item_to_delete) { + flag = 1; + } + if (flag == 0) { + new_char_parsed[i]=yon_char_new(char_string[i]); + } + else if (flag == 1 && i!=item_to_delete) { + new_char_parsed[i-1]=yon_char_new(char_string[i]); + } + } + (*size)=(*size)-1; + return new_char_parsed; +} + +/**yon_char_parsed_check_exist(char **parameters, int size, char *param) + * [EN] + * Checks if [parameters] string array of length [size] + * has [param] element; + * [RU] + * Проверяет есть ли в массиве строк [parameters], размера [size] + * элемент [param] +*/ +int yon_char_parsed_check_exist(char **parameters, int size, char *param){ + + for (int i=0;ipw_name,NULL); + else { + user_list = yon_char_parsed_append(user_list,user_size,user->pw_name); + } + } + endpwent(); + return user_list; +} + +config_str yon_ubl_get_all_processes(int *processes_size){ + config_str processes = yon_config_load(get_processes_command,processes_size); + yon_char_parsed_remove_newline_symbols(processes,processes_size); + return processes; +} + +config_str yon_ubl_get_all_slices(int *slices_size){ + config_str slices = yon_config_load(get_slices_command,slices_size); + yon_char_parsed_remove_newline_symbols(slices,slices_size); + return slices; +} + +// 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_append(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; i < size; i++) + { + for (int j = 1; j < size; j++) + { + if (strcmp(applist[j].Name, applist[j - 1].Name) < 0) + { + tmp = applist[j]; + applist[j] = applist[j - 1]; + applist[j - 1] = tmp; + }; + } + }; + } +}; + +apps *yon_apps_get_by_name(apps *applist, char *name, int size) +{ + for (int i = 0; i < size; i++) + { + if (strcmp(applist[i].Name, name) == 0) + return &applist[i]; + } + return NULL; +}; + +char *yon_app_chooser_open_with_sections(char *section_name,...){ + GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_VERTICAL,5); + GtkWidget *main_tree = gtk_tree_view_new(); + GtkTreeStore *store = gtk_tree_store_new(1,G_TYPE_STRING,-1); + gtk_tree_view_set_model(GTK_TREE_VIEW(main_tree),GTK_TREE_MODEL(store)); + GtkWidget *cancel_button = gtk_button_new(); + GtkWidget *accept_button = gtk_button_new(); + GtkWidget *button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + gtk_container_add(GTK_CONTAINER(window),box); + gtk_box_pack_start(GTK_BOX(box),main_tree,1,1,5); + gtk_box_pack_end(GTK_BOX(box),button_box,0,0,5); + gtk_box_pack_end(GTK_BOX(button_box),accept_button,0,0,5); + gtk_box_pack_end(GTK_BOX(button_box),cancel_button,0,0,5); + va_list args; + va_start(args,section_name); + GtkWidget *widget = va_arg(args,GtkWidget*); + while (widget){ + + } + va_end(args); +} +//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); + char *final_str=yon_char_divide_search(str,"\n",-1); + yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,yon_char_new(final_str)); + __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; + } + } + check_config + return 1; + else return 0; +} + +/**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; + dict->flag1=1; + return 1; + } else return 0; +} + + +/**yon_config_append(char *key, void *data) + * [EN] + * + * [RU] + * Производит поиск по конфигу и дополняет значение параметра с ключом [key] значением [data]; +*/ +int yon_config_append(char *key, char *data){ + check_config{ + dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); + if (strcmp(((char*)dict->data),"")!=0) + dict->data=(void*)(yon_char_unite((char*)dict->data," ",data,NULL)); + else dict->data=(void*)data; + dict->flag1=1; + 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){ + if (!__yon__config__strings||!yon_dictionary_get(&__yon__config__strings,key)){ + yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,data); + } + else if (yon_dictionary_get(&__yon__config__strings,key)) __yon__config__strings->data=data; + __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__strings->flag1=1; +} + +/**yon_config_load(char *command, int *str_len) + * [EN] + * + * [RU] + * Выполняет команду [command] и возвращает распаршеный результат выполнения команды. + * В [str_len] возвращается длина возвращаемого массива +*/ +config_str yon_config_load(char *command, int *str_len){ + FILE *output = popen(command, "r"); + char **output_strings = NULL; + output_strings = malloc(sizeof(char)); + int i = 0; + char str[4096]; + memset(str, 0, 4096); + while (fgets(str, 4096, output)) + { + if (strcmp(str, "") != 0) + { + output_strings = realloc(output_strings, sizeof(char *) * (i + 1)); + // printf("%s\n", str); + output_strings[i] = NULL; + output_strings[i] = yon_char_new(str); + memset(str, 0, 4096); + i++; + } + } + if (i>0){ + *str_len = i; + return output_strings; + } else{ + *str_len=-1; + return NULL; + } +} + +/**int yon_config_save_registered(char *path, char *section) + * [EN] + * Saves config with [command] + * [RU] + * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: + * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" +*/ +int yon_config_save_registered(char *path, char *section){ + check_config{ + char *command = yon_char_unite("/usr/bin/ubconfig",path ? yon_char_append(" --target ",path):"", " set ", section,NULL); + char *remove_command = yon_char_unite("/usr/bin/ubconfig", path ? yon_char_append(" --target ",path):"", " remove ", section,NULL); + dictionary *dict = NULL; + int any_add = 0; + int any_remove = 0; + for_dictionaries(dict,__yon__config__strings){ + char *data = yon_dictionary_get_data(dict,char*); + if (dict->flag1==1&&strcmp(data,"")!=0){ + command = yon_char_unite(command, " ", dict->key,"=\"", yon_dictionary_get_data(dict,char*),"\"", NULL); + any_add=1; + } + if (strcmp(data,"")==0){ + remove_command = yon_char_unite(remove_command, " ", dict->key, NULL); + any_remove=1; + } + } + if (any_add) yon_launch(command); + if (any_remove) yon_launch(remove_command); + return 1; + } else return 1; +} + +/**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)); + conf[*size-1] = NULL; + return conf; + } else return NULL; +} + +/**char *yon_config_get_parameter(config parameters, int size, char *param) + * [EN] + * Gets parameter [param] from parameter list [parameters] of size [size]; + * or NULL if nothing were found + * [RU] + * Возвращает параметр [param] из массива строк [parameters] размером [size] + * или NULL если такой не был найден +*/ +char *yon_config_get_parameter(config_str parameters, int size, char *param) +{ + if (param[0]==' ') + yon_char_divide_search(param," ",-1); + param=yon_char_divide_search(yon_char_new(param)," ",-1); + + char *str = NULL; + for (int j = 0; j < size; j++) + { + char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1); + if (name) + { + if (strcmp(name, param) == 0) + { + str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1); + if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0) + return str; + else + return NULL; + } + } + } + return NULL; +} + + + +// terminal-using functions + +/**yon_launch_app_with_arguments(char *name, char *args) + * [EN] + * Execute [command] in separate thread; + * [RU] + * Выполнить команду [command] в отдельном потоке; +*/ +int yon_launch_app_with_arguments(char *name, char *args) +{ + char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); + pthread_t thread_id; + char *command = NULL; + command = path; + pthread_create(&thread_id, NULL, (void *)yon_launch, command); +}; + +/**yon_launch(char *command) + * [EN] + * Execute command [command] + * [RU] + * Выполнить команду [command] +*/ +void yon_launch(char *command) +{ + system(command); +} + +// Gtk functions + + +#ifdef __GTK_H__ + + +static render_data render; + +#ifdef VTE_TERMINAL + +static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) +{ + if (!terminal) return; + if (pid == -1) printf("Error\n\n\n"); + else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); +} + +/** + * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument) + * [EN] + * launches terminal with specific [command], + * terminal is shown in [place_to_show] container, + * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. + * [RU] + * Запускает терминал с командой [command], + * терминал добавляется в контейнер [place_to_show] виджета, + * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. +*/ +void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument){ + char **commands=new_arr(char*,2); + gchar **envp = g_get_environ(); + commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); + commands[1]=NULL; + char **env=new_arr(char*,2); + env[0]=""; + env[1]=NULL; + GtkWidget *terminal = vte_terminal_new(); + vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); + VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); + vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); + gtk_container_add(GTK_CONTAINER(place_to_show),terminal); + char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL); + if(endwork_function) + g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument); + vte_terminal_spawn_async(VTE_TERMINAL(terminal), + VTE_PTY_DEFAULT, + NULL, + commands, + NULL, + 0, + NULL, NULL, + NULL, + -1, + NULL, + child_ready, + install_command); + vte_pty_spawn_async(pty, + NULL, + commands, + NULL, + 0, + NULL, NULL, + NULL, + -1, + NULL, + NULL, + NULL); + vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1); + vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); + vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); + gtk_widget_show_all(terminal); + } + +/**yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument) + * [EN] + * launches terminal with specific [command], + * terminal is shown in [place_to_show] container, + * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. + * [RU] + * Запускает терминал с командой [command], + * терминал добавляется в контейнер [place_to_show] виджета, + * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. +*/ +void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){ + char **commands=new_arr(char*,2); + gchar **envp = g_get_environ(); + commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); + commands[1]=NULL; + char **env=new_arr(char*,2); + env[0]=""; + env[1]=NULL; + vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); + VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); + vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); + char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL); + if(endwork_function) + g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument); + vte_terminal_spawn_async(VTE_TERMINAL(terminal), + VTE_PTY_DEFAULT, + NULL, + commands, + NULL, + 0, + NULL, NULL, + NULL, + -1, + NULL, + child_ready, + install_command); + vte_pty_spawn_async(pty, + NULL, + commands, + NULL, + 0, + NULL, NULL, + NULL, + -1, + NULL, + NULL, + NULL); + vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1); + vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); + vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); + gtk_widget_show_all(terminal); + } +#endif + + // Window config functions + + #define check_window_config_setup if(__yon_window_config_target_window) + + typedef struct { + char *parameter_name; + enum YON_TYPE containing_type; + GtkWidget *track_widget; + char *property_name; + } __yon_listener_parameter; + + typedef struct { + char *parameter_name; + char *section; + enum YON_TYPE containing_type; + void *property; + } __yon_custom_parameter; + + struct { + int x; + int y; + int width; + int height; + int fullscreen; + dictionary *custom_listeners; + dictionary *custom_parameters; + dictionary *deleted_parameters; + } __yon_main_window_config; + + static GtkWindow *__yon_window_config_target_window = NULL; + static GKeyFile *__yon_window_config_file = NULL; + static char *__yon_window_config_path = NULL; + + void yon_window_config_save(){ + g_key_file_set_integer(__yon_window_config_file,"window","WindowPosX",__yon_main_window_config.x); + g_key_file_set_integer(__yon_window_config_file,"window","WindowPosY",__yon_main_window_config.y); + g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width); + g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height); + g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen); + dictionary *dict=NULL; + if (__yon_main_window_config.custom_listeners) + for_dictionaries(dict,__yon_main_window_config.custom_listeners){ + __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); + switch(param->containing_type){ + case YON_TYPE_STRING: + g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val)); + break; + case YON_TYPE_INT: + g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val)); + break; + case YON_TYPE_DOUBLE: + g_key_file_set_double(__yon_window_config_file,"window",param->parameter_name, g_value_get_double(val)); + break; + case YON_TYPE_BOOLEAN: + g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val)); + break; + case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; + } + } + if (__yon_main_window_config.custom_parameters) + for_dictionaries(dict,__yon_main_window_config.custom_parameters){ + __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); + switch (param->containing_type){ + case YON_TYPE_STRING: + g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property); + break; + case YON_TYPE_INT: + g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property); + break; + case YON_TYPE_DOUBLE: + g_key_file_set_double(__yon_window_config_file,param->section,param->parameter_name, *(double*)param->property); + break; + case YON_TYPE_BOOLEAN: + g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property); + break; + default: + break; + } + } + if (__yon_main_window_config.deleted_parameters) + for_dictionaries(dict,__yon_main_window_config.deleted_parameters){ + __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); + g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL); + } + g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL); + } + + void yon_get_is_fullscreen(){ + gtk_window_is_maximized(__yon_window_config_target_window); + __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window); + if (!__yon_main_window_config.fullscreen) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); + } + + /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event) + * [EN] + * + * [RU] + * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается. + */ + void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){ + check_window_config_setup{ + yon_get_is_fullscreen(); + yon_window_config_save(); + } + gtk_main_quit(); + } + + void __yon_window_config_on_resize(){ + int max=0; + max=gtk_window_is_maximized(__yon_window_config_target_window); + if(max==0){ + gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height); + gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); + } + } + + /**yon_window_config_setup(GtkWindow *window) + * [EN] + * + * [RU] + * Устанавливает указатель на окно для отслеживания его положения и размера + */ + void yon_window_config_setup(GtkWindow *window){ + __yon_window_config_target_window = window; + g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); + g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); + } + + void _yon_maximize(void *data){ + g_usleep(G_USEC_PER_SEC/10); + if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window); + } + + /**yon_window_config_load(char *path) + * [EN] + * + * [RU] + * Загружает конфиг окна и инициализирует отслеживание его параметров + */ + int yon_window_config_load(char *path){ + __yon_window_config_file = g_key_file_new(); + __yon_window_config_path=yon_char_new(path); + if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ + struct stat st; + int size; + char *path = yon_char_divide(yon_char_new(__yon_window_config_path),yon_char_find_last(__yon_window_config_path,'/')); + if (stat(path, &st) == -1) { + mkdir(path, 0777); + } + FILE *fp; + fp=fopen(__yon_window_config_path,"w"); + fclose(fp); + g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL); + } + __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL); + __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL); + __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL); + __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL); + __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL); + dictionary *dict=NULL; + if (__yon_main_window_config.custom_listeners) + for_dictionaries(dict,__yon_main_window_config.custom_listeners){ + __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); + switch(param->containing_type){ + case YON_TYPE_STRING: + g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_INT: + g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_DOUBLE: + g_value_set_double(val,g_key_file_get_double(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_BOOLEAN: + gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL); + g_value_set_boolean(val,res); + break; + default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; + } + g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val); + } + if (__yon_main_window_config.width!=0&&__yon_main_window_config.height!=0) gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); + if (__yon_main_window_config.x!=0&&__yon_main_window_config.y!=0) gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); + + + pthread_t tid; + pthread_create(&tid,NULL,(void *)_yon_maximize,NULL); + return 1; + } + + void yon_window_config_apply(){ + dictionary *dict=NULL; + gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); + gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); + } + + config_str yon_window_config_get_section(char *section, gsize *size){ + config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL); + return key; + } + + /**yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type) + * [EN] + * + * [RU] + * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name]. + */ + void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){ + __yon_listener_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_listener_parameter)); + param->parameter_name = yon_char_new(param_name); + param->track_widget = widget; + param->property_name = yon_char_new(widget_property); + param->containing_type = val_type; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param); + } + + void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){ + __yon_custom_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_custom_parameter)); + param->parameter_name = yon_char_new(param_name); + param->section=section; + param->property = tracked_value; + param->containing_type = val_type; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param); + } + + void yon_window_config_erase_custom_parameter(char *param_name, char *section){ + __yon_custom_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_custom_parameter)); + param->parameter_name=param_name; + param->section=section; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param); + } + + int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){ + GError *err=NULL; + switch (type){ + case YON_TYPE_BOOLEAN: + *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_INT: + *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_DOUBLE: + *((int*)return_value) = g_key_file_get_double(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_STRING: + *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err); + if (err) return 0; else return 1; + break; + case YON_TYPE_STRING_LIST: + gsize size=0; + *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err); + *((char***)return_value)=yon_remalloc(return_value,size+1); + *((char***)return_value)[size]=NULL; + if (err) return 0; else return 1; + break; + } + } + +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + + +// other Gtk functions + +/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size) + * [EN] + * + * [RU] + * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size] +*/ +int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){ + if (combo&¶meters){ + for (int i=0;i=0 ? 1 : 0); +} + +void yon_gtk_widget_set_sensitive_from_toggle_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target){ + gtk_widget_set_sensitive(target,!gtk_combo_box_get_active(toggle)>=0 ? 0 : 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_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) +{ + gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); + gtk_image_set_from_resource(GTK_IMAGE(Image), image_path); +} + +int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label) +{ + if(icon&&box&&label){ + render.icon=icon; + render.box=box; + render.label=label; + return 1; + } else return 0; +} + +void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) +{ + render_data data = render; + GtkIconTheme *ictheme = gtk_icon_theme_get_default(); + GError *err = NULL; + if (err) + { + printf("%s\n", err->message); + g_error_free(err); + } + if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type) + { + gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); + gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); + gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); + } + else if (type == BACKGROUND_IMAGE_FAIL_TYPE) + { + gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); + gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); + gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); + } + if (text) + gtk_label_set_text(GTK_LABEL(data.label), text); +} + +void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){ + _yon_ubl_status_box_render(text,type); +} + +/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id) + * [EN] + * Set up plugs for using with GtkSockets insine ubl-settings-manager. + * [main_window] is container widget, which holds main application functionality. + * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header. + * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header. + * [socket_main_id] is id of socket for [main_window]. + * [socket_left_id] is id of socket for [left_window]. + * [socket_right_id] is id of socket for [right_window]. + * [RU] + * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager. + * [main_window] - контейнер основного интерфейса приложения. + * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager. + * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager. + * [socket_main_id] - id сокета для [main_window]. + * [socket_left_id] - id сокета для [left_window]. + * [socket_right_id] - id сокета для [right_window]. +*/ +void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){ + if (main_window&&socket_main_id>-1){ + gtk_widget_hide(gtk_widget_get_toplevel(main_window)); + GtkWidget *plug_main=gtk_plug_new(socket_main_id); + GtkWidget *plug_left=NULL; + GtkWidget *plug_right=NULL; + GtkWidget *box=NULL; + g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL); + if (socket_left_id>-1&&left_window){ + plug_left=gtk_plug_new(socket_left_id); + g_object_ref(left_window); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); + gtk_container_add(GTK_CONTAINER(plug_left),left_window); + gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar"); + gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button"); + gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited"); + gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color"); + gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder"); + gtk_widget_show(plug_left); + } + else if (left_window){ + if (box==NULL){ + box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); + gtk_box_reorder_child(GTK_BOX(main_window),box,0); + gtk_widget_show(box); + } + gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited"); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); + gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5); + } + if (socket_right_id>-1&&right_window){ + plug_right=gtk_plug_new(socket_right_id); + g_object_ref(right_window); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); + gtk_container_add(GTK_CONTAINER(plug_right),right_window); + gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar"); + gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button"); + gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited"); + gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color"); + gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder"); + gtk_widget_show(plug_right); + } + else if (right_window){ + if (box==NULL){ + box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); + gtk_box_reorder_child(GTK_BOX(main_window),box,0); + gtk_widget_show(box); + } + gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited"); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); + gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5); + } + g_object_ref(main_window); + gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window); + gtk_container_add(GTK_CONTAINER(plug_main),main_window); + gtk_widget_show(plug_main); + } +} + +#ifdef WEBKIT_FOUND + +/**yon_ubl_browser_window_open(char *link, char *browser_window_name) + * [EN] + * Launches integrated browser window, named [browser_window_name] at header with [link]. + * [RU] + * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link] +*/ +void yon_ubl_browser_window_open(char *link, char *browser_window_name){ + GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL); + GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + GtkWidget *header=gtk_header_bar_new(); + GtkWidget *header_label=gtk_label_new(browser_window_name); + GtkWidget *WebView=webkit_web_view_new(); + gtk_container_add(GTK_CONTAINER(browser),web_place); + gtk_window_set_titlebar(GTK_WINDOW(browser),header); + gtk_window_set_title(GTK_WINDOW(browser),browser_window_name); + gtk_widget_set_size_request(browser,800,600); + gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label); + gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link); + gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0); + gtk_widget_show_all(browser); +} +#else + +/**yon_ubl_browser_window_open(char *link, char *browser_window_name) + * [EN] + * Launches browser with [link]. + * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function. + * [RU] + * Открывает браузер со страницей по ссылке [link] + * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции. +*/ +void yon_ubl_browser_window_open(char *link, char *browser_window_name){ + char *user=getenv("SUDO_USER"); + if (!user) + user=getlogin(); + char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL); + yon_launch_app(command); +} +#endif + +#endif \ No newline at end of file diff --git a/source/ubl-utils.h b/source/ubl-utils.h new file mode 100644 index 0000000..dcdd903 --- /dev/null +++ b/source/ubl-utils.h @@ -0,0 +1,368 @@ +#ifndef UBL_UTILS +#define UBL_UTILS +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ubl-cmake.h" +#ifdef WEBKIT_FOUND + #include +#endif +#define DesktopPath "/usr/share/applications/" +#define try bool __HadError=false; +#define catch(x) ExitJmp:if(__HadError) +#define throw(x) {__HadError=true;goto ExitJmp;} +static char** array_size_pow; +#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) + +#define new(type) malloc(sizeof(type)) +#define new_arr(type,size) malloc(sizeof(type)*size) + +#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL) + +#define get_processes_command "systemd-cgls --no-pager |grep -oE \"[-0-9A-Za-z.:]{1,}.service\"" +#define get_slices_command "systemd-cgls --no-pager |grep -oE \"[-0-9A-Za-z.:]{1,}.slice\"" + +typedef enum +{ + #ifdef __GTK_H__ + DICTIONARY_GTK_WIDGETS_TYPE, + #endif + DICTIONARY_OTHER_TYPE=0, + DICTIONARY_CHAR_TYPE, + DICTIONARY_INT_TYPE, + DICTIONARY_BOOL_TYPE, + +} DICT_TYPE; + +typedef struct dictionary +{ + char *key; + void *data; + struct dictionary *next; + struct dictionary *prev; + struct dictionary *first; + DICT_TYPE data_type; + int flag1; +} dictionary; + +typedef struct apps +{ + char *Name; + int Type; + char *Categories; + char *Exec; + char *Icon; + int Pluggable; + int DualPluggable; +} apps; + +typedef char** config_str; + +static dictionary *__yon__config__strings = NULL; +#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) + +#define config(key) yon_config_get_by_key(key) + +#define for_config dictionary temp = NULL; for_dictionary(temp,__yon__config__strings) + +#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size) +// dictionary functions + +/**yon_dictionary_get_data(dictionary, type) + * [EN] + * Gets data from dictionary. + * [dictionary] is dictionary, from which data should be extracted; + * [type] is type of data, [dictionary] contains. + * [RU] + * Возвращает данные из словаря. + * [dictionary] - словарь из которого достаются данные. + * [type] - тип данных, хранящихся в словаре [dictionary]. +*/ +#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data) + +/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) + * [EN] + * + * [RU] + * Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data]. + * Если словарь не существует, создаёт его +*/ +#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \ + else dict=yon_dictionary_append_with_data(dict,key,data);} + +dictionary *yon_dictionary_new(); + +dictionary *yon_dictionary_append(dictionary *targetdict); + +dictionary *yon_dictionary_get_last(dictionary *dict); + +dictionary *yon_dictionary_swap(dictionary *dict, int aim); + +void yon_dictionary_make_first(dictionary *dict); + +void yon_dictionary_make_nth(dictionary *dict, int nth); + +dictionary *yon_dictionary_new_with_data(char *key, void *data); + +dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data); + +dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect); + +dictionary *yon_dictionary_get(dictionary **dict, char *key); + +dictionary *yon_dictionary_rip(dictionary *dict); + +dictionary *yon_dictionary_get_nth(dictionary *dict, int place); + +void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*)); + +// char functions + +int yon_char_find_last(char *source, char find); + +char *yon_char_append(char *source, char *append); + +char *yon_char_new(char *chr); + +char *yon_char_unite(char *source, ...); + +char *yon_cut(char *source, int size, int startpos); + +char *yon_char_divide(char *source, int dividepos); + +char *yon_char_divide_search(char *source, char *dividepos, int delete_divider); + +char *yon_char_from_int(int int_to_convert); +char *yon_char_from_long(long int_to_convert); + +char *yon_char_replace(char *source, char *find, char*replace); + +char **yon_char_parse(char *parameters, int *size, char *divider); + +char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete); + +int yon_char_parsed_check_exist(char **parameters, int size, char *param); + +int yon_char_find_count(char *source, char *find); + +int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size); + +config_str yon_char_parsed_new (int *size, ...); + +void yon_char_parsed_copy(config_str *source, config_str *to_copy); + +config_str yon_char_parsed_append(config_str parsed, int *size, char *string); + +int yon_char_parsed_remove_newline_symbols(config_str parsed, int *size); + +int yon_ubl_check_root(); + +char *yon_ubl_root_user_get(); + +char *yon_ubl_user_get_home_directory(); + +config_str yon_ubl_get_all_users(int *user_size); +config_str yon_ubl_get_all_processes(int *processes_size); +config_str yon_ubl_get_all_slices(int *slices_size); + +// parsing functions + +config_str philos_list_user(int* size); + +apps *yon_apps_scan_and_parse_desktops(int *sizef); + +void yon_apps_sort(apps *applist, int size); + +apps *yon_apps_get_by_name(apps *applist, char *name, int size); + +config_str yon_config_load(char *command, int *str_len); + +int yon_config_save_registered(char *path, char *section); + +char *yon_config_get_parameter(config_str parameters, int size, char *param); + +int yon_config_load_register(char *command); + +int yon_config_remove_by_key(char *key); + +int yon_config_remove_by_data(void *data); + +int yon_config_remove_element(char *key, char *deleted); + +void *yon_config_get_by_key(char *key); + +char *yon_config_get_key_by_data(char *data); + +int yon_config_set(char *key, void *data); + +int yon_config_clean(); + +void yon_config_register(char *key, void *data); + +config_str yon_config_get_all(); + +// terminal-using functions + +int yon_launch_app_with_arguments(char *name, char *args); + +void yon_launch(char *command); + +// Gtk functions + +#ifdef __GTK_H__ +#ifdef VTE_TERMINAL +void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument); + +void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument); + +#endif + +enum YON_TYPE{ + YON_TYPE_STRING, + YON_TYPE_STRING_LIST, + YON_TYPE_INT, + YON_TYPE_DOUBLE, + YON_TYPE_BOOLEAN, + YON_TYPE_OTHER +}; + +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); + +/**yon_gtk_builder_get_widget(builder, widget_name) + * [EN] + * Returns GtkWidget from GtkBuilder *[builder]. + * [builder] is GtkBuilder*; + * [widget_name] is id of widget; +*/ +#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name)) + +typedef struct +{ + GtkWidget *Icon; + GtkWidget *Label; + GtkWidget *IconView; + GtkListStore *List; +} expander_icon_view; + +void yon_window_config_setup(GtkWindow *window); + +int yon_window_config_load(char *path); + +config_str yon_window_config_get_section(char *section, gsize *size); + +void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type); + +void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type); + +void yon_window_config_erase_custom_parameter(char *param_name, char *section); + +int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type); + +int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); + +int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find); + +void yon_gtk_column_minimal_fixed_size_set(GtkTreeViewColumn *column); + +int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment); + +int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...); + +int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...); + +void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target); + +typedef enum +{ + BACKGROUND_IMAGE_SUCCESS_TYPE, + BACKGROUND_IMAGE_FAIL_TYPE +} BACKGROUND_IMAGE_TYPE; + +typedef struct { + BACKGROUND_IMAGE_TYPE type; + GtkWidget *icon; + GtkWidget *box; + GtkWidget *label; + char* text_to_render; +} render_data; + + +/**yon_ubl_status_box_setup(render,icon,box,label) + * [EN] + * Sets up [render] structure of type render_data. + * [icon] is GtkImage widget of status box for showing status icons; + * [box] is GtkBox widget of status box for showing status color; + * [label] is GtkLabel widget of status box for showing status text; + * [RU] + * Настраивает структуру [render] типа render_data. + * [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки; + * [box] - виджет типа GtkBox в котором будет отображаться цвет статуса; + * [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения; +*/ +int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label); + +/**yon_ubl_status_box_render(render,text,type) + * [EN] + * Renders message in status box; + * [render] is render_data structure of status box; + * [text] is text to be shown in status box; + * [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE + * [RU] + * Отображает сообщение в статусном окне. + * [render] - структура типа render_data для нужного статусного окна; + * [text] - текст, отображаемый в статусном окне; + * [type] - тип сообщения. Может быть: + * BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак) + * или + * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка) +*/ +void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type); + +/**yon_ubl_header_setup(overlay, head, image, imag_path) + * [EN] + * Sets up header of app. + * [overlay] is overlay for app header; + * [head] is box of header, which connects to [overlay] + * [image] is header background image; + * [imag_path] is path of image, shown in [image] + * [RU] + * Настраивает заголовок приложения. + * [overlay] - оверлей заголовка приложения; + * [head] - шапка заголовка, присоединяемая к [overlay] + * [image] - виджет картинки для заднего фона; + * [imag_path] - путь до картинки, загружаемой в [image] +*/ +#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path) +#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path) +#endif + +void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path); + +void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path); + +void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id); +#ifdef WEBKIT_FOUND + +void yon_ubl_browser_window_open(char *link, char *browser_window_name); +#else +void yon_ubl_browser_window_open(char *link, char *browser_window_name); +#endif +#endif \ No newline at end of file diff --git a/source/ublexec.c b/source/ublexec.c new file mode 100644 index 0000000..5e50471 --- /dev/null +++ b/source/ublexec.c @@ -0,0 +1,288 @@ +#include "ublexec.h" + +config main_config; + +//signal emmit handlers - no header initialization + +/**on_close_subwindow(GtkWidget *self) + * [EN] + * Closes window in which [self] is contained. + * [RU] + * Закрывает окно, в котором расположен виджет [self]. +*/ +void on_close_subwindow(GtkWidget *self){ + gtk_widget_destroy(gtk_widget_get_toplevel(self)); +} + +/**yon_open_browser(GtkWidget *self, char *link) + * [EN] + * Opens browser with [link] link. + * [RU] + * Открывает браузер с [link] ссылкой. +*/ +void yon_open_browser(GtkWidget *self, char *link){ + yon_ubl_browser_window_open(link,TITLE_LABEL); +} + +/**on_open_documentation_confirmation(GtkWidget *self, char *link) + * [EN] + * Opens confirmation window for [link] link. + * [RU] + * Открывает окно подтверждение перехода по ссылке [link]. +*/ +void on_open_documentation_confirmation(GtkWidget *self, char *link){ + if (main_config.always_open_documentation==0){ + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); + documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window)); + widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow"); + widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton"); + widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton"); + widgets->HatText = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel"); + widgets->HeaderText = yon_gtk_builder_get_widget(builder,"helpHeader"); + widgets->InfoText = yon_gtk_builder_get_widget(builder,"helpText"); + widgets->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox"); + gtk_label_set_text(GTK_LABEL(widgets->HatText),TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(widgets->HeaderText),HELP_TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(widgets->InfoText),HELP_INFO_LABEL); + gtk_button_set_label(GTK_BUTTON(widgets->AcceptButton),OPEN_HELP_LABEL); + gtk_button_set_label(GTK_BUTTON(widgets->AlwaysOpenCheck),HELP_ALWAYS_OPEN_LABEL); + gtk_button_set_label(GTK_BUTTON(widgets->CloseButton),CANCEL_LABEL); + gtk_widget_show_all(widgets->Window); + g_signal_connect(G_OBJECT(widgets->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link)); + g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + + + } else { + yon_open_browser(self,link); + } +} + +/**on_link(GtkWidget *self, char* uri, gpointer user_data) + * [EN] + * Signal for hadnling AboutDialog links. + * Connect to "activate-link" signal. + * [self] is AboutDialog window; + * [uri] is activated link; + * [user_data] is pointer for user data, hasn't used in standard handler; + * [RU] + * Функция для обработки сигнала нажатия на ссылку окна AboutDialog. + * Присоединять к сигналу "activate-link". + * [self] - окно AboutDialog; + * [uri] - ссылка, по которой совершается переход; + * [user_data] - указатель на любые другие данные, не используется в стандартном обработчике; +*/ +void on_link(GtkWidget *self, char* uri, gpointer user_data){ + gtk_widget_destroy(self); + on_open_documentation_confirmation(self,uri); +} + +/**on_about() + * [EN] + * Function for setting up and showing AboutDialog. + * Connect it to "activate" signal of Documentation MenuItem. + * [RU] + * Функиця для настройки и показа окна AboutDialog. + * Присоединять к сигналу "activate" кнопки справки типа MenuItem. +*/ +void on_about(){ + GtkBuilder *builder=gtk_builder_new_from_resource(glade_path); + GtkWidget *window=yon_gtk_builder_get_widget(builder,"AboutWindow"); + GtkWidget *title=yon_gtk_builder_get_widget(builder,"headerAboutTopic"); + GtkWidget *hideButtonBox=yon_gtk_builder_get_widget(builder,"buttonBoxHide"); + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window),version_application); + gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window),PROJECT_HOME_LABEL); + gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),TITLE_LABEL); + gtk_label_set_text(GTK_LABEL(title),TITLE_LABEL); + g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL); + gtk_widget_set_visible(hideButtonBox,0); + gtk_widget_destroy(hideButtonBox); + gtk_widget_show(window); +} + +//functions + +void yon_load_proceed(char *command){ + if (yon_config_load_register(command)) + yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + else + yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + +} + +// standard functions + +void config_init(){ + main_config.always_open_documentation=0; + main_config.win_height=0; + main_config.win_width=0; + main_config.win_pos_x=0; + main_config.win_pos_y=0; + main_config.socket_id=-1; + main_config.save_socket_id=-1; + main_config.load_socket_id=-1; + main_config.lock_help=0; + main_config.lock_help=0; + main_config.lock_load_global=0; + main_config.lock_save_global=0; + main_config.lock_save_local=0; +} + +main_window *setup_window(){ + /* Widgets getting | Получение виджетов */ + main_window *widgets = malloc(sizeof(main_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); + widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); + widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic"); + widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox"); + + widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay"); + widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage"); + widgets->HeadBox = yon_gtk_builder_get_widget(builder,"HeaderBox"); + widgets->HeadTitleLabel = yon_gtk_builder_get_widget(builder,"HeaderTitleLabel"); + widgets->HeadInfoLabel = yon_gtk_builder_get_widget(builder,"HeaderInfoLabel"); + + widgets->StatusBox = yon_gtk_builder_get_widget(builder,"mainStatusBox"); + widgets->StatusIcon = yon_gtk_builder_get_widget(builder,"mainStatusIcon"); + widgets->StatusLabel = yon_gtk_builder_get_widget(builder,"mainStatusLabel"); + + widgets->SaveLabel = yon_gtk_builder_get_widget(builder,"headerSaveConfigLabel"); + widgets->SaveMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalLocalConfigurationMenuItem"); + widgets->SaveGlobalMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalConfigurationMenuItem"); + widgets->SaveLocalMenuItem = yon_gtk_builder_get_widget(builder,"SaveLocalConfigurationMenuItem"); + widgets->RightBox = yon_gtk_builder_get_widget(builder,"HeaderRightBox"); + + widgets->LoadLabel = yon_gtk_builder_get_widget(builder,"headerLoadConfigLabel"); + widgets->LoadGlobalMenuItem = yon_gtk_builder_get_widget(builder,"LoadGlobalConfigurationMenuItem"); + widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); + widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); + + widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); + widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); + + gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); + + GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem); + + if (main_config.lock_load_global == 1){ + gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0); + } + if (main_config.lock_save_global == 1){ + gtk_widget_set_sensitive(widgets->SaveGlobalMenuItem,0); + gtk_widget_set_sensitive(widgets->SaveMenuItem,0); + } + if (main_config.lock_save_local == 1){ + gtk_widget_set_sensitive(widgets->SaveLocalMenuItem,0); + gtk_widget_set_sensitive(widgets->SaveMenuItem,0); + } + + /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ + // yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING); + + /* Signal connection | Присоединение сигналов */ + g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); + g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); + g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); + + + gtk_widget_show(widgets->Window); + return widgets; +} + +int main(int argc, char *argv[]){ + local=setlocale(LC_ALL, ""); + textdomain (LocaleName); + config_init(); + int option_index=0; + int show_help=0; + int debug_mode=0; + { + struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, + {"lock-help", 0,0, 1}, + {"lock-save", 0,0, 2}, + {"lock-save-local", 0,0, 3}, + {"lock-save-global", 0,0, 4}, + {"lock-load-global", 0,0, 5}, + {"socket-id", 1, 0, 's'}, + {"socket-ext-id", 1,0, 'e'}, + {"socket-trd-id", 1,0, 't'}, + {"debug", 0,0, 'd'}, + { NULL, 0, NULL, 0 } + }; + for (int i=0;iHeadOverlay,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_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_main(); +} \ No newline at end of file diff --git a/source/ublexec.cc b/source/ublexec.cc deleted file mode 100644 index dbf837a..0000000 --- a/source/ublexec.cc +++ /dev/null @@ -1,1067 +0,0 @@ -#include "ublexec.h" -using namespace std; - - -int flag_prog_file = 0; -string name_app_cmd = ""; -string version_application = "2.27"; -int socket_ext_id_I = 0; -int socket_trd_id_I = 0; - -MainWindow* obj_main; -void wrapper_help_show(GtkWidget *self, char* link, gpointer user_data) { - if (self && user_data) {} - obj_main->global_lick_doc = link; - obj_main->aboutWindows->hide(); - obj_main->temp_help_show(); -} - -CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) -: Glib::OptionGroup{p_name, p_description, p_help} { - Glib::OptionEntry socketIDArg; - socketIDArg.set_long_name("socket-id"); - socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); - socketIDArg.set_description("Settings manager socket"); - Glib::OptionEntry socketExtId; - socketExtId.set_long_name("socket-ext-id"); - socketExtId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); - socketExtId.set_description("Settings manager secondary socket"); - Glib::OptionEntry socketTrdId; - socketTrdId.set_long_name("socket-trd-id"); - socketTrdId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); - socketTrdId.set_description("Settings manager secondary socket"); - add_entry(socketIDArg, m_socketID); - add_entry(socketExtId, socket_ext_id_I); - add_entry(socketTrdId, socket_trd_id_I); -} -::Window CmdArgParser::GetSocketID() const{ - return m_socketID; -} - -MainWindow::MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder) - : Gtk::ApplicationWindow(obj), builder{builder} { - this->builder = builder; - this->settings(); -} - -MainWindow::MainWindow(Glib::RefPtr const& builder) { - this->builder = builder; - this->settings(); -} - -void MainWindow::get_builder() { - builder->get_widget("imgHeadBackground", imgHeadBackground); - builder->get_widget("overHead", overHead); - builder->get_widget("btnFilemaneg", btnFilemaneg); - builder->get_widget("btnListApp", btnListApp); - builder->get_widget("btnStart", btnStart); - builder->get_widget("chbTerminal", chbTerminal); - builder->get_widget("chbAnotherUser", chbAnotherUser); - builder->get_widget("cbxExecuteEpriority", cbxExecuteEpriority); - builder->get_widget("cmbUser", cmbUser); - builder->get_widget("spinPriority", spinPriority); - builder->get_widget("scalePriority", scalePriority); - builder->get_widget("rbPkexec", rbPkexec); - builder->get_widget("rbSu", rbSu); - builder->get_widget("rbSudo", rbSudo); - builder->get_widget("wndChooseFileWallpaper", wndChooseFileWallpaper); - builder->get_widget("btnFilemangerExit", btnFilemangerExit); - builder->get_widget("btnFilemangerOk", btnFilemangerOk); - builder->get_widget("lblTimeEpriorityLow", lblTimeEpriorityLow); - builder->get_widget("lblTime4EpriorityHigh", lblTime4EpriorityHigh); - builder->get_widget("messageError", messageError); - builder->get_widget("lblMessageError", lblMessageError); - builder->get_widget("btnMessageErrorOk", btnMessageErrorOk); - builder->get_widget("dialogStartMenu", dialogStartMenu); - builder->get_widget("btnStartMenuOK", btnStartMenuOK); - builder->get_widget("btnStartMenuExit", btnStartMenuExit); - builder->get_widget("lblInfoHead", lblInfoHead); - builder->get_widget("lblinfoCmd", lblinfoCmd); - // builder->get_widget("lblInfoTime", lblInfoTime); - builder->get_widget("labInfoExecutTerm", labInfoExecutTerm); - builder->get_widget("lblInfoUser", lblInfoUser); - builder->get_widget("lblInfoUserOther", lblInfoUserOther); - builder->get_widget("lblInfoUserName", lblInfoUserName); - builder->get_widget("lblInfoNooPriority", lblInfoNooPriority); - builder->get_widget("lblInfoExec", lblInfoExec); - builder->get_widget("lblInfoPriority", lblInfoPriority); - builder->get_widget("boxColor", boxColor); - builder->get_widget("lblGraphics", lblGraphics); - builder->get_widget("lblTools", lblTools); - builder->get_widget("lblInternet", lblInternet); - builder->get_widget("lblMultimedia", lblMultimedia); - builder->get_widget("lblSettings", lblSettings); - builder->get_widget("lblEducation", lblEducation); - builder->get_widget("lblOffice", lblOffice); - builder->get_widget("lblOther", lblOther); - builder->get_widget("lblDevelopment", lblDevelopment); - builder->get_widget("iconGraphics", iconGraphics); - builder->get_widget("iconTools", iconTools); - builder->get_widget("iconInternet", iconInternet); - builder->get_widget("iconMultimedia", iconMultimedia); - builder->get_widget("iconSettings", iconSettings); - builder->get_widget("iconEducation", iconEducation); - builder->get_widget("iconOffice", iconOffice); - builder->get_widget("iconOther", iconOther); - builder->get_widget("iconDevelopment", iconDevelopment); - builder->get_widget("iconSystem", iconSystem); - builder->get_widget("lblSystem", lblSystem); - builder->get_widget("lblHeaderName", lblHeaderName); - builder->get_widget("btnhelp", btnhelp); - builder->get_widget("btnAbout", btnAbout); - builder->get_widget("aboutWindows", aboutWindows); - builder->get_widget("btnSettings", btnSettings); - builder->get_widget("btnBoxAboutDialog", btnBoxAboutDialog); - builder->get_widget("boxAbout", boxAbout); - builder->get_widget("cmbTerminal", cmbTerminal); - builder->get_widget("lblHeaderAboutTopic", lblHeaderAboutTopic); - - builder->get_widget("lblwebHeaderName", lblwebHeaderName); - builder->get_widget("lblhelpText", lblhelpText); - builder->get_widget("lblhelpHeader", lblhelpHeader); - builder->get_widget("chkAlwaysOpenHelp", chkAlwaysOpenHelp); - builder->get_widget("btnReadHelp", btnReadHelp); - builder->get_widget("btnCancelHelp", btnCancelHelp); - builder->get_widget("wndShowWeb", wndShowWeb); - builder->get_widget("lblHeadeWndWeb", lblHeadeWndWeb); - builder->get_widget("txtCmd", CommandEntry); - builder->get_widget("commandCheck", CommandCheck); - builder->get_widget("commandEntry", txtCmd); - - #ifdef WEBKIT_FOUND - builder->get_widget("wndWeb", wndWeb); - #endif -} -void MainWindow::set_sensitive_from_check(){ - int active = CommandCheck->get_active(); - txtCmd->set_sensitive(active); -} - -void MainWindow::set_icon_array() { - array_icon[0] = this->iconGraphics; - array_icon[1] = this->iconTools; - array_icon[2] = this->iconInternet; - array_icon[3] = this->iconMultimedia; - array_icon[4] = this->iconSettings; - array_icon[5] = this->iconEducation; - array_icon[6] = this->iconOffice; - array_icon[7] = this->iconOther; - array_icon[8] = this->iconDevelopment; - array_icon[9] = this->iconSystem; -} - -void MainWindow::template_apps_obj(Gtk::IconView *icon, Glib::RefPtr >k_list_app) { - gtk_list_app = Gtk::ListStore::create(m_Columns); - gtk_list_app->set_sort_column(m_Columns.m_col_description, Gtk::SORT_ASCENDING); - icon->set_model(gtk_list_app); - icon->set_text_column(m_Columns.m_col_description); -} - -void MainWindow::add_CSS() { - Glib::RefPtr cssProvider = Gtk::CssProvider::create(); - cssProvider->load_from_resource(path_css); - Glib::RefPtr styleContext = Gtk::StyleContext::create(); - Glib::RefPtr screen = Gdk::Screen::get_default();//get default screen - styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);//add provider for screen in all application - Glib::RefPtr context_lbl_head = lblInfoHead->get_style_context(); - Glib::RefPtr boxAbout_css = boxAbout->get_style_context(); - imgHeadBackground->set_from_resource(path_img_head_background); - for (auto &view: array_icon) { - Glib::RefPtr view_css = view->get_style_context(); - view_css->add_class("view_app"); - } - context_lbl_head->add_class("textHead"); - if (socket_ext_id_I == 0){ - boxAbout_css->add_class("bkim_no_plug"); - } -} - -void MainWindow::localization() { - time_t now = time(0); - tm *ltm = localtime(&now); - unsigned int year= 1900+ ltm->tm_year; - string str_authors = string(copyright) + to_string(year); - aboutWindows->set_copyright(str_authors); - aboutWindows->set_website(website); - // btnhelp->set_label(str_help); - // btnAbout->set_label(str_about_1); - // aboutWindows->set_comments(define_name_app); - // aboutWindows->set_website_label(home_page ); - // aboutWindows->set_version(_(version_application.c_str())); - // aboutWindows->set_title(space_name_app ); - // lblHeaderAboutTopic->set_label(space_name_app ); - // lblHeaderName->set_text(define_name_app); - // this->set_title(define_name_app); - // btnStart->set_label(str_run); - // wndChooseFileWallpaper->set_title(str_please_select_file); - // dialogStartMenu->set_title(str_selecting_programs); - // lblInfoHead->set_text(define_name_app); - // lblinfoCmd->set_text(str_localization_cmd_line); - // labInfoExecutTerm->set_text(str_run_terminal); - // lblInfoUser->set_text(str_localization_user); - // lblInfoUserOther->set_text(str_run_of_user); - // lblInfoUserName->set_text(str_localization_username); - // lblInfoNooPriority->set_text(str_localization_priority); - // lblInfoExec->set_text(str_change_priority); - // lblInfoPriority->set_text(string(str_localization_priority) + ":"); - // lblMessageError->set_text(str_select_app_program); - // messageError->set_title(str_localization_attention); - // lblGraphics->set_text(str_localization_graphics); - // lblTools->set_text(str_localization_tools); - // lblInternet->set_text(str_localization_internet); - // lblMultimedia->set_text(str_localization_multimedia); - // lblSettings->set_text(str_localization_settings); - // lblEducation->set_text(str_localization_education); - // lblOffice->set_text(str_localization_office); - // lblOther->set_text(str_localization_other); - // lblDevelopment->set_text(str_localization_development); - // lblSystem->set_text(str_localization_system); - // btnListApp->set_tooltip_text(str_application_overview); - // btnFilemaneg->set_tooltip_text(str_file_overview); - // btnMessageErrorOk->set_label(str_close); - // lblhelpHeader->set_text(read_documentation_web); - // lblhelpText->set_text(redirected_documentation); - // btnReadHelp->set_label(read_online); - // btnCancelHelp->set_label(cancel); - // chkAlwaysOpenHelp->set_label(always_redirect); - // lblwebHeaderName->set_label(name_app_1); - // lblHeadeWndWeb->set_label(define_name_app); - // lblwebHeaderName->set_label(define_name_app); - // btnFilemaneg->set_tooltip_text(str_tooltip_filemanager); - // btnListApp->set_tooltip_text(str_tooltip_list_app); -} - -void MainWindow::event() { - g_signal_connect(G_OBJECT(aboutWindows->gobj()), "activate-link", G_CALLBACK(wrapper_help_show), this); - btnCancelHelp->signal_clicked().connect([&]() {wndShowWeb->hide();}); - chkAlwaysOpenHelp->signal_toggled().connect([&]() {flag_open_browser = true;}); - btnReadHelp->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_browser)); - btnhelp->signal_activate().connect(sigc::mem_fun(*this, &MainWindow::open_help)); - btnFilemaneg->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_filemaneg)); - btnListApp->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_list_app)); - btnStart->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::entry_app)); - chbTerminal->signal_toggled().connect([&]() {cmbTerminal->set_sensitive(chbTerminal->get_active());denamic_cmd();}); - chbAnotherUser->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::activ_or_block_other_user)); - spinPriority->signal_value_changed().connect(sigc::mem_fun(*this, &MainWindow::change_scale_priority)); - scalePriority->signal_value_changed().connect(sigc::mem_fun(*this, &MainWindow::change_spin_priority)); - btnFilemangerExit->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::close_filemaneg)); - btnFilemangerOk->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::get_path_filemaneg)); - cbxExecuteEpriority->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::activ_or_block_execute_epriority)); - btnMessageErrorOk->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::message_gui_close)); - btnStartMenuOK->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::start_menu_entry_app)); - btnStartMenuExit->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::close_entry_app)); - btnStartMenuOK->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::ok_close_entry_app)); - iconGraphics->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Graphics)); - iconTools->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Tools)); - iconInternet->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Internet)); - iconMultimedia->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Multimedia)); - iconSettings->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Settings)); - iconEducation->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Education)); - iconOffice->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Office)); - iconOther->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Other)); - iconDevelopment->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Development)); - iconSystem->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_System)); - btnAbout->signal_activate().connect([&]() {aboutWindows->show();}); - cmbUser->signal_changed().connect([&]() {changed_user();this->denamic_cmd();}); - rbSudo->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::sudo_nice)); - txtCmd->signal_focus_out_event().connect(sigc::mem_fun(*this, &MainWindow::focus_out_txt_cmd)); - txtCmd->signal_focus_in_event().connect(sigc::mem_fun(*this, &MainWindow::focus_in_txt_cmd)); - txtCmd->signal_delete_text().connect(sigc::mem_fun(*this, &MainWindow::delete_cmd)); - rbSu->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::sudo_nice)); - rbPkexec->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::sudo_nice)); - CommandCheck->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::set_sensitive_from_check)); - cmbTerminal->signal_changed().connect([&]() {this->denamic_cmd();}); -} - - - -void MainWindow::sudo_nice(){ - string response = this->call("id -Gn"); - if (geteuid() == 0 || cmbUser->get_active_text() == "root" ){ - spinPriority->set_range(-20, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(-20, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice__20); - } - else if (rbSudo->get_active() && response.find("wheel") != string::npos){ - spinPriority->set_range(-20, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(-20, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice__20); - } - else if (rbSu->get_active()){ - spinPriority->set_range(0, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(0, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice_0); - } - else if (rbPkexec->get_active()){ - spinPriority->set_range(0, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(0, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice_0); - } - this->denamic_cmd(); -} - -void MainWindow::changed_user() { - Glib::ustring entry_user = cmbUser->get_active_text(); - string response = this->call("id -Gn"); - bool flag_wheel_sudo = (rbSudo->get_active()==true && response.find("wheel") != string::npos); - if (geteuid() == 0 || entry_user == "root" || flag_wheel_sudo==true) { - spinPriority->set_range(-20, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(-20, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice__20); - } - else{ - spinPriority->set_range(0, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(0, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice_0); - } -} - -void MainWindow::delete_cmd(const int &x, const int &y) { - if (x == 0) {} - if (y > 1) { - chbTerminal->set_active(false); - chbAnotherUser->set_active(false); - cbxExecuteEpriority->set_active(false); - name_app = ""; - path_file = ""; - user_cmd = ""; - txtCmd->set_text(""); - } -} - -bool MainWindow::focus_in_txt_cmd(GdkEventFocus* event) { - if (event) {} - if (user_cmd.length() != 0) { - } - else if (name_app.length() != 0) { - } - else if (path_file.length() != 0) { - } - else{ - user_cmd = txtCmd->get_text(); - } - cmd_old = txtCmd->get_text(); - return true; -} - -void MainWindow::temp_help_show() { - if (flag_open_browser == true) { - this->open_browser(); - } - else { - wndShowWeb->show_all(); - } - -} - -void MainWindow::open_help() { - global_lick_doc = const_link_doc; - temp_help_show(); -} - -void MainWindow::open_browser() { - #ifdef WEBKIT_FOUND - if (my_web_kit) { - gtk_widget_destroy(GTK_WIDGET(my_web_kit)); - } - my_web_kit = WEBKIT_WEB_VIEW(webkit_web_view_new()); - three = Glib::wrap(GTK_WIDGET(my_web_kit)); - wndWeb->add(*three); - webkit_web_view_load_uri(my_web_kit, _(global_lick_doc.c_str())); - wndWeb->show_all(); - webkit_web_view_load_uri(my_web_kit, _(global_lick_doc.c_str())); - wndWeb->show_all(); - #else - this->template_open_browser(global_lick_doc); - #endif - wndShowWeb->hide(); -} - -void MainWindow::template_open_browser(string link_doc) { - string cmd = cmd_xdg + string(_(link_doc.c_str())) + " &"; - string buf = ""; - if (geteuid() == 0) { - string response_user = getlogin(); - int size_s = std::snprintf(nullptr, 0, cmd_execute, response_user.c_str(), cmd.c_str()) + 1; - auto size = static_cast(size_s); - std::unique_ptr buf(new char[ size ]); - std::snprintf(buf.get(), size, cmd_execute, response_user.c_str(), cmd.c_str()); - cmd = string(buf.get(), buf.get() + size - 1); - } - index_error = system(cmd.c_str()); -} - -void MainWindow::icon_clear() { - list_Graphics->clear(); - list_Tools->clear(); - list_Internet->clear(); - list_Multimedia->clear(); - list_Settings->clear(); - list_Education->clear(); - list_Office->clear(); - list_Other->clear(); - list_Development->clear(); - list_System->clear(); -} - -void MainWindow::ok_close_entry_app() { - this->icon_clear(); - dialogStartMenu->hide(); -} - -void MainWindow::select_Graphics() { - this->tempate_icon_select(this->iconGraphics, list_Graphics); -} -void MainWindow::select_Tools() { - this->tempate_icon_select(this->iconTools, list_Tools); -} -void MainWindow::select_Internet() { - this->tempate_icon_select(this->iconInternet, list_Internet); -} -void MainWindow::select_Multimedia() { - this->tempate_icon_select(this->iconMultimedia, list_Multimedia); -} -void MainWindow::select_Settings() { - this->tempate_icon_select(this->iconSettings, list_Settings); -} -void MainWindow::select_Education() { - this->tempate_icon_select(this->iconEducation, list_Education); -} -void MainWindow::select_Office() { - this->tempate_icon_select(this->iconOffice, list_Office); -} -void MainWindow::select_Other() { - this->tempate_icon_select(this->iconOther, list_Other); -} -void MainWindow::select_Development() { - this->tempate_icon_select(this->iconDevelopment, list_Development); -} -void MainWindow::select_System() { - this->tempate_icon_select(this->iconSystem, list_System); -} -void MainWindow::tempate_icon_select(Gtk::IconView *icon, Glib::RefPtr >k_list) { - auto selected = (*icon).get_selected_items(); - if(!selected.empty()) { - this->set_icon_array(); - this->unselect_icon(icon); - const Gtk::TreeModel::Path& path = *selected.begin(); - Gtk::TreeModel::iterator iter = gtk_list->get_iter(path); - Gtk::TreeModel::Row row = *iter; - auto app_name_exec = row[m_Columns.app_name_exec]; - const Glib::ustring description = row[m_Columns.m_col_description]; - // auto name = row[m_Columns.m_col_filename]; - path_file = ""; - name_app = ""; - user_cmd = ""; - CommandEntry->set_text(app_name_exec); - txtCmd->set_text(app_name_exec); - name_app = txtCmd->get_text(); - size_t len_name_app = name_app.length(); - string array_del[] = {"%f", "%F", "%d", "%D", "%n", "%N", "%U"}; - for (auto &del_sim: array_del) { - str_remove(name_app, del_sim); - if (name_app.length() != len_name_app) { - CommandEntry->set_text(name_app); - txtCmd->set_text(name_app); - break; - } - } - this->denamic_cmd(); - - } -} - -void MainWindow::unselect_icon(Gtk::IconView *icon_entry) { - for (int index=0; index<10; ++index) { - Gtk::IconView *icon = this->array_icon[index]; - if (icon_entry != icon) { - icon->unselect_all(); - } - } -} - -void MainWindow::settings() { - obj_main = this; - if (flag_prog_file == 1){ - user_cmd = name_app_cmd; - } - if (flag_prog_file == 2){ - path_file = name_app_cmd; - } - - this->pars_apps(); - this->get_builder(); - this->event(); - this->localization(); - this->set_icon_array(); - this->add_CSS(); - spinPriority->set_range(0, 19); - spinPriority->set_increments(1.0, -1.0); - scalePriority->set_range(0, 19); - scalePriority->set_value(0); - lblTimeEpriorityLow->set_text(nice_19); - lblTime4EpriorityHigh->set_text(nice_0); - scalePriority->set_inverted(true); - Gtk::Widget *boxWidget; - builder->get_widget("boxColor", boxWidget); - overHead->add_overlay(*boxWidget); - this->pars_dir_bin(); - this->pars_dir_terminal(); - this->pars_users(); - this->is_user_wheel(); - cmbUser->set_active_text(user_exec_app); - this->activ_or_block_execute_epriority(); - this->changed_user(); - cmbUser->set_sensitive(false); - lblInfoUserName->set_sensitive(false); - rbPkexec->set_sensitive(false); - rbSu->set_sensitive(false); - rbSudo->set_sensitive(false); - btnBoxAboutDialog->set_visible(false); - cmbTerminal->set_sensitive(false); - ubl_make_plugs(boxAbout, boxAbout, socket_ext_id_I, 0); -} - -void MainWindow::close_entry_app() { - this->icon_clear(); - dialogStartMenu->hide(); -} - -void MainWindow::start_menu_entry_app() {} - -void MainWindow::message_gui_close() { - messageError->hide(); -} - -void MainWindow::activ_or_block_execute_epriority() { - bool flag = cbxExecuteEpriority->get_active(); - scalePriority->set_sensitive(flag); - spinPriority->set_sensitive(flag); - lblTimeEpriorityLow->set_sensitive(flag); - lblTime4EpriorityHigh->set_sensitive(flag); - this->denamic_cmd(); -} - -void MainWindow::open_filemaneg() { - wndChooseFileWallpaper->set_current_folder("/bin/"); - wndChooseFileWallpaper->show(); -} - -void MainWindow::close_filemaneg() { - wndChooseFileWallpaper->hide(); -} - -void MainWindow::get_path_filemaneg() { - name_app = ""; - user_cmd = ""; - path_file = wndChooseFileWallpaper->get_filename(); - if (path_file.length() == 0) {} - else{ - txtCmd->set_text(path_file); - this->close_filemaneg(); - - } - this->denamic_cmd(); -} - -vector MainWindow::find_all(string &text, string &word) { - size_t index{}; - vector list_index; - while ((index = text.find(word, index)) != std::string::npos) - { - index += word.length(); - list_index.push_back(index); - } - return list_index; -} - -void MainWindow::tempalte_row(string Name, string Exec, string path , Glib::RefPtr &dtk_list) { - Gtk::TreeModel::Row row = *(dtk_list->append()); - string s_remove[] = {".png", ".jpg", ".jpeg", ".svg", ".xpm"}; - string str_search = "/"; - if (path.find(str_search) != string::npos){ - vector list_index = this->find_all(path, str_search); - int index = list_index.size(); - if (index>1){ - index = index-1; - index = list_index.at(index); - if (index){ - size_t len_path = path.length(); - path = path.substr(index, len_path); - } - } - } - for (string &del: s_remove){ - if (path.find(del) != string::npos){ - str_remove(path, del); - } - } - row[m_Columns.m_col_filename] = path; - row[m_Columns.m_col_description] = Name; - row[m_Columns.icon_name] = path; - row[m_Columns.app_name_exec] = Exec; - row[m_Columns.float_h_align] = 0.5; - row[m_Columns.float_w_align] = 0.5; -} - -void MainWindow::open_list_app() { - this->template_apps_obj(iconGraphics, list_Graphics); - this->template_apps_obj(iconTools, list_Tools); - this->template_apps_obj(iconInternet, list_Internet); - this->template_apps_obj(iconMultimedia, list_Multimedia); - this->template_apps_obj(iconSettings, list_Settings); - this->template_apps_obj(iconEducation, list_Education); - this->template_apps_obj(iconOffice, list_Office); - this->template_apps_obj(iconOther, list_Other); - this->template_apps_obj(iconDevelopment, list_Development); - this->template_apps_obj(iconSystem, list_System); - string path = ""; - for ( const auto &st_app: list_app) { - for ( const auto &str_categor: st_app.Categories) { - path = st_app.Icon; - if (str_categor == "Graphics") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Graphics); - } - else if (str_categor == "Utility") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Tools); - } - else if (str_categor == "Network") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Internet); - } - else if (str_categor == "AudioVideo") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Multimedia); - } - else if (str_categor == "Settings") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Settings); - } - else if (str_categor == "Education") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Education); - } - else if (str_categor == "Office") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Office); - } - else if (str_categor == "Other") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Other); - } - else if (str_categor == "Development") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_Development); - } - else if (str_categor == "System") { - this->tempalte_row(st_app.Name,st_app.Exec, path, list_System); - } - } - } - dialogStartMenu->show_all(); -} - - -string MainWindow::start_cmd(string user_cmd) { - string str_cmd_terminal = ""; - string str_variants_root = ""; - string str_nice_cmd = ""; - if (chbAnotherUser->get_active()) { - if (rbPkexec->get_active()) { - str_variants_root = "pkexec --user " + cmbUser->get_active_text(); - if (cbxExecuteEpriority->get_active()) { - str_variants_root += " nice -n " + to_string(spinPriority->get_value_as_int()); - } - str_variants_root += " env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY "; - } - else if (rbSu->get_active()) { - chbTerminal->set_active(true); - string str_user = cmbUser->get_active_text(); - if (str_user != "root") { - str_variants_root = "su -l " + cmbUser->get_active_text(); - } - else{ - str_variants_root = "su "; - } - str_variants_root += " -c \" DISPLAY=$DISPLAY "; - if (cbxExecuteEpriority->get_active()) { - str_variants_root += "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; - } - } - else if (rbSudo->get_active()) { - chbTerminal->set_active(true); - if (user_exec_app==cmbUser->get_active_text()) { - str_variants_root = "sudo "; - } - else{ - str_variants_root = "sudo -u " + cmbUser->get_active_text() + " "; - } - if (cbxExecuteEpriority->get_active()) { - str_variants_root += "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; - } - } - } - if (cmbUser->get_active_text().length() != 0) { - string user_cmd_X = "xhost +SI:localuser:"; - user_cmd_X += cmbUser->get_active_text(); - user_cmd_X += " > /dev/null 2>&1"; - index_error = system(user_cmd_X.c_str()); - } - if ((cbxExecuteEpriority->get_active()) && (chbAnotherUser->get_active() == false)) { - str_nice_cmd = "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; - } - if (user_cmd.length() == 0 && name_app.length() == 0 && path_file.length() == 0) { - messageError->set_title(str_localization_attention); - messageError->show(); - return ""; - } - if (chbTerminal->get_active() == true) { - string name_terminal_arr = ""; - string name_terminal = cmbTerminal->get_active_text(); - if (name_terminal.length() != 0) { - int len_termunal_cmd = sizeof(termunal_cmd)/sizeof(*termunal_cmd); - for (int index = 0; index 0) { - if (access(path_file.c_str(), X_OK) != -1) { - cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + " " + path_file; - } - else{ - cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + " xdg-open '" + path_file + "' "; - } - - } - else if (name_app.length() > 0) { - cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + name_app; - } - else if (user_cmd.length() > 0) { - cmd = str_nice_cmd + str_cmd_terminal + str_variants_root + " " + user_cmd; - } - if ((cmd.find("-e su ") != string::npos) || (cmd.find("-x su ") != string::npos)) { - cmd+=" \""; - } - cmd = "nohup " + cmd; - cmd += " > /dev/null 2>&1"; - return cmd; -} - -void MainWindow::call_app(string &cmd) { - if (cmd.length() != 0) { - std::thread t([&](string cmd) {int index = system(cmd.c_str()); if (index){}}, cmd); - t.detach(); - } -} -void MainWindow::denamic_cmd() { - if (chbTerminal->get_active() == true || chbAnotherUser->get_active() == true || cbxExecuteEpriority->get_active() == true) { - if (txtCmd->get_text().length() == 0) { - chbTerminal->set_active(false); - chbAnotherUser->set_active(false); - cbxExecuteEpriority->set_active(false); - path_file = ""; - name_app = ""; - user_cmd = ""; - txtCmd->set_text(user_cmd); - messageError->set_title(str_localization_attention); - messageError->show(); - } - else{ - txtCmd->set_text(this->start_cmd(user_cmd)); - } - } - else{ - if (user_cmd.length() != 0) { - txtCmd->set_text(this->start_cmd(user_cmd)); - } - else if (path_file.length() != 0) { - txtCmd->set_text(this->start_cmd(user_cmd)); - } - else if (name_app.length() != 0) { - txtCmd->set_text(this->start_cmd(user_cmd)); - } - } -} - -string MainWindow::call(string cmd) { - FILE *fp; - int status; - char path[PATH_MAX] = {0}; - fp = popen(cmd.c_str(), "r"); - if (fp == NULL) { - exit(1); - } - while (fgets(path, PATH_MAX, fp) != NULL) { - break; - } - status = pclose(fp); - if (status == -1) { - exit(1); - } - return path; -} - -bool MainWindow::focus_out_txt_cmd(GdkEventFocus* event) { - if (event) {} - if (cmd_old != txtCmd->get_text()) { - user_cmd = txtCmd->get_text(); - } - return true; -} - -void MainWindow::entry_app() { - this->denamic_cmd(); - if (name_app.length() == 0 && path_file.length() == 0) { - } - string cmd = txtCmd->get_text(); - this->call_app(cmd); -} - -void MainWindow::activ_or_block_other_user() { - bool flag = chbAnotherUser->get_active(); - cmbUser->set_sensitive(flag); - lblInfoUserName->set_sensitive(flag); - if (flag_pkexec == true) { - rbPkexec->set_sensitive(flag); - } - if (flag_su == true) { - rbSu->set_sensitive(flag); - } - if (flag_sudo == true) { - rbSudo->set_sensitive(flag); - } - this->denamic_cmd(); -} - -void MainWindow::change_scale_priority() { - scalePriority->set_value(spinPriority->get_value_as_int()); - this->denamic_cmd(); -} - -void MainWindow::change_spin_priority() { - spinPriority->set_value(scalePriority->get_value()); - this->denamic_cmd(); -} - -void MainWindow::pars_dir_bin() { - namespace fs = std::filesystem; - std::string path = "/bin"; - string file_name = ""; - for (const auto & entry: fs::directory_iterator(path)) { - file_name = entry.path().filename().string(); - if (file_name == "su") { - flag_su = true; - } - else if (file_name == "sudo") { - flag_sudo = true; - } - else if (file_name == "pkexec") { - flag_pkexec = true; - } - } - rbPkexec->set_sensitive(flag_pkexec); - rbSu->set_sensitive(flag_su); - rbSudo->set_sensitive(flag_sudo); -} - -void MainWindow::pars_dir_terminal() { - namespace fs = std::filesystem; - std::string path = "/bin"; - string file_name = ""; - string name_terminal = ""; - for (const auto & entry: fs::directory_iterator(path)) { - file_name = entry.path().filename().string(); - int len_termunal_cmd = sizeof(termunal_cmd)/sizeof(*termunal_cmd); - for (int index = 0; index < len_termunal_cmd; ++index) { - name_terminal = termunal_cmd[index]; - size_t index_term = name_terminal.find(" "); - if (index_term != string::npos){ - name_terminal = name_terminal.substr(0, index_term); - if (name_terminal == file_name) { - cmbTerminal->append(name_terminal); - cmbTerminal->set_active_text(name_terminal); - } - } - } - } -} - -void MainWindow::is_user_wheel(){ - string response = this->call("id -Gn"); - if (response.find("wheel") == string::npos){ - flag_sudo = false; - rbSudo->set_sensitive(flag_sudo); - } - size_t user_index = response.find(" "); - if (user_index!=string::npos){ - user_exec_app = response.substr(0, user_index); - } -} - -unsigned short MainWindow::read_uid_min_max(string filename, string search){ - std::string line; - int uid = 0; - string remove_tab = "\t"; - string remove_space = " "; - std::ifstream in(filename); // окрываем файл для чтения - if (in.is_open()){ - while (getline(in, line)){ - try{ - if (line.find(search) != string::npos && (line.find("SYS_"+search) == string::npos)) { - this->str_remove(line, search); - this->str_remove(line, remove_space); - this->str_remove(line, remove_tab); - uid = atoi(line.c_str()); - } - } - catch (int x) { - if (search == "UID_MIN"){ - uid = 1000; - } - else{ - uid = 65534; - } - - } - - } - } - else{ - if (search == "UID_MIN") { - uid = 1000; - } - else{ - uid = 65534; - } - } - in.close(); - return uid; - -} - -void MainWindow::pars_users() { - unsigned short uid_min = this->read_uid_min_max(file_source_login_min_max, "UID_MIN"); - unsigned short uid_max = this->read_uid_min_max(file_source_login_min_max, "UID_MAX"); - while (true) { - errno = 0; - passwd* entry = getpwent(); - if (!entry) { - if (errno) { - break; - } - break; - } - if ((entry->pw_uid >= uid_min && entry->pw_uid < uid_max) || entry->pw_uid == 0) { - cmbUser->append(entry->pw_name); - } - } - endpwent(); -} - -vector MainWindow::split(const std::string &s, char delim) { - std::stringstream ss(s); - std::string item; - std::vector elems; - while (std::getline(ss, item, delim)) { - elems.push_back(item); - } - return elems; -} - -void MainWindow::str_remove(std::string& source, std::string to_remove) { - string::size_type n = to_remove.length(); - for (string::size_type i = source.find(to_remove); - i != string::npos; - i = source.find(to_remove)) - source.erase(i, n); -} - -void MainWindow::pars_apps() { - if (list_app.size() != 0 ) {return;} - namespace fs = std::filesystem; - struct struct_App App; - string file_name = ""; - string str_Categories; - string path = path_all_applications; - for (const auto & entry : fs::directory_iterator(path)) { - file_name = entry.path().filename().string(); - path = string(path_all_applications) +file_name; - if (file_name.find(".desktop") != std::string::npos) { - GKeyFile *gfile=g_key_file_new(); - g_key_file_load_from_file(gfile, path.c_str(), G_KEY_FILE_KEEP_TRANSLATIONS, NULL); - char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", NULL); - char *Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); - char *Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); - char *Categories = g_key_file_get_locale_string(gfile, "Desktop Entry", "Categories", setlocale(LC_ALL, ""), NULL); - char *Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); - char *Mime = g_key_file_get_string(gfile, "Desktop Entry", "MimeType", NULL); - if (Type == NULL) continue; - if (Name == NULL) continue; - if (Exec == NULL) continue; - if (Categories == NULL) continue; - if (Icon == NULL) continue; - str_Categories = Categories; - App.Name = Name; - App.Type = Type; - App.Exec = Exec; - App.Icon = Icon; - if (Mime != NULL) { - App.MimeType = Mime; - } - else{ - App.MimeType = ""; - } - App.Name_desktop = file_name; - App.Categories = split(str_Categories, ';'); - } - list_app.push_back(App); - } -} - -SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder) - : Gtk::Plug{p_socketID} { - MainWindow* wnd = nullptr; - builder->get_widget_derived("window", wnd); - builder->get_widget("plugBox", plugBox); - plugBox->get_parent()->remove(*plugBox); - add(*plugBox); - show_all_children(); -} - -MainWindow::~MainWindow() { -} - -void help() { - cout << str_help_h; -} - - - diff --git a/source/ublexec.h b/source/ublexec.h index f9a0fc5..2bb0188 100644 --- a/source/ublexec.h +++ b/source/ublexec.h @@ -1,340 +1,96 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include "ubl-utils.h" +#include #include -#include -#include -#include -#include -#include -#include -#include "ubl-util-standard.c" -#include +#include +#include +#include +#include +#include #include "../compile/ubl-cmake.h" - #ifdef WEBKIT_FOUND - #include -#endif + #include +#endif +#include "ubl-strings.h" + +#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ublexec" + +#define _(String) gettext(String) + +#define glade_path "/com/ublinux/ui/ublexec.glade" +#define banner_path "/com/ublinux/images/ublexec-banner.png" +#define CssPath "/com/ublinux/css/ublexec.css" +#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) + +#define LocalePath "/usr/share/locale" +#define LocaleName "ublexec" +typedef char* string; +string version_application; + +char *local; + +typedef struct { + int always_open_documentation; + int win_pos_x; + int win_pos_y; + int win_width; + int win_height; + + int socket_id; + int load_socket_id; + int save_socket_id; + + int lock_help; + int lock_save_local; + int lock_save_global; + int lock_load_global; +} config; + +typedef struct { + //Standard + GtkWidget *Window; + GtkWidget *HatLabel; + GtkWidget *PlugBox; -#define str_tooltip_filemanager _("Program view") -#define str_tooltip_list_app _("File view") -#define copyright _("Copyright © UBSoft LLC, 2022 - ") -#define define_name_app _("Run as...") -#define name_app_1 _("ublexec") -#define website _("https://wiki.ublinux.com") -#define home_page _("Project hompage") -#define space_name_app _(" Run as...") -#define str_about_1 _("About") -#define str_help _("Help") -#define read_online _("Read online") -#define cancel _("Cancel") -#define always_redirect _("Always redirect") -#define read_documentation_web _("Would you like to read documentation in the Web?") -#define redirected_documentation _("You will be redirected to documentation website where documentation is\ntranslated and supported by community.") -#define str_help_h _("GTK \"Run applications as another user with the specified priority\" for ""UBLinux\n""\n""Usage: ublexec [OPTIONS...]\n""Options:\n"" -h, --help\t Show this help\n"" -V, --version\t Show package version\n"" -x APP_NAME Running the program\n"" -e FILE_NAME Running the file\n") -#define str_version _("ublexec version: ") -#define nice_19 _("19 (Low)") -#define nice_0 _("0 (High)") -#define nice__20 _("-20 (High)") -#define str_close _("Close") -#define str_localization_system _("System") -#define str_localization_development _("Development") -#define str_localization_other _("Other") -#define str_localization_office _("Office") -#define str_localization_education _("Education") -#define str_localization_settings _("Settings") -#define str_localization_multimedia _("Multimedia") -#define str_localization_internet _("Internet") -#define str_localization_tools _("Tools") -#define str_localization_graphics _("Graphics") -#define str_localization_attention _("Attention") -#define str_localization_priority _("Priority") -#define str_run_of_user _("Run as another user:") -#define str_select_app_program _("Select an executable file or program") -#define str_change_priority _("Change startup priority") -#define str_run_terminal _("Run in the terminal emulator") -#define str_file_overview _("File Overview") -#define str_application_overview _("Application Overview") -#define str_run_applications_as_another _("Run applications as another user\nwith the specified priority") -#define str_localization_username _("User Name:") -#define str_selecting_programs _("Selecting Programs") -#define str_please_select_file _("Please select File") -#define str_localization_cmd_line _("Command Line") -#define str_localization_user _("User") -#define str_localization_team _("Command:") -#define str_run _("Run") + GtkWidget *HeadOverlay; + GtkWidget *HeadImage; + GtkWidget *HeadBox; + GtkWidget *HeadTitleLabel; + GtkWidget *HeadInfoLabel; -#define const_link_doc "https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/ublexec" -#define cmd_xdg "xdg-open " -#define cmd_execute "su -l %s -c \" DISPLAY=$DISPLAY %s \"" -#define path_app "/usr/bin/" -#define path_glade "/com/ublinux/ui/ublexec.glade" -#define path_css "/com/ublinux/css/ublexec.css" -#define app_name "ublexec" -#define path_img_head_background "/com/ublinux/images/ublexec-banner.png" -#define path_all_applications "/usr/share/applications/" -#define file_source_login_min_max "/etc/login.defs" -#define no_print_cmd "nohup %s > /dev/null 2>&1" + GtkWidget *StatusBox; + GtkWidget *StatusIcon; + GtkWidget *StatusLabel; -using namespace std; + GtkWidget *SaveLabel; + GtkWidget *SaveMenuItem; + GtkWidget *SaveGlobalMenuItem; + GtkWidget *SaveLocalMenuItem; + GtkWidget *RightBox; -extern string name_app_cmd; -extern int socket_ext_id_I; -extern int socket_trd_id_I; -extern int flag_prog_file; -extern string version_application; -void me_thread(string cmd); -class CmdArgParser : public Glib::OptionGroup -{ -public: - CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help); - ::Window GetSocketID() const; + GtkWidget *LoadLabel; + GtkWidget *LoadGlobalMenuItem; + GtkWidget *LoadLocalMenuItem; + GtkWidget *LeftBox; -private: - int m_socketID = 0; + GtkWidget *DocumentationMenuItem; + GtkWidget *AboutMenuItem; + // Custom +} main_window; -}; -class MainWindow : public Gtk::ApplicationWindow { -public: - MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); - MainWindow(Glib::RefPtr const& builder); - ~MainWindow(); - void template_apps_obj(Gtk::IconView *icon, Glib::RefPtr >k_list_app); - void get_builder(); - void add_CSS(); - void localization(); - void event(); - void settings(); - void close_entry_app(); - void start_menu_entry_app(); - void message_gui_close(); - void activ_or_block_execute_epriority(); - void open_filemaneg(); - void close_filemaneg(); - void get_path_filemaneg(); - void open_list_app(); - string start_cmd(string user_cmd); - void call_app(string &cmd); - void changed_user(); - void entry_app(); - void execute_another_User(){} - void activ_or_block_other_user(); - void change_scale_priority(); - void change_spin_priority(); - void pars_dir_bin(); - void pars_users(); - void pars_apps(); - void select_Graphics(); - void tmp_desktop(string cmd_name); - void on_item_activated(const Gtk::TreeModel::Path& path); - void tempalte_row(string Name, string Exec, string path , Glib::RefPtr &dtk_list); - void tempate_icon_select(Gtk::IconView *icon, Glib::RefPtr >k_list); - void ok_close_entry_app(); - void select_Tools(); - void select_Internet(); - void select_Multimedia(); - void select_Settings(); - void select_Education(); - void select_Office(); - void select_Other(); - void select_Development(); - void select_System(); - void icon_clear(); - void set_icon_array(); - void delete_cmd(const int &x,const int &y); - void help_show(); - void denamic_cmd(); - void temp_help_show(); - void open_help(); - void is_user_wheel(); - void sudo_nice(); - void template_open_browser(string link_doc); - void open_browser(); - vector find_all(string &text, string &word); - bool focus_out_txt_cmd(GdkEventFocus* event); - bool focus_in_txt_cmd(GdkEventFocus* event); - void unselect_icon(Gtk::IconView *icon_entry); - void pars_dir_terminal(); - unsigned short read_uid_min_max(string filename, string search); - void str_remove(std::string& source, std::string to_remove); - void set_sensitive_from_check(); - string call(string cmd); - vector split(const std::string &s, char delim); - public: - class ModelColumns : public Gtk::TreeModel::ColumnRecord { - public: - ModelColumns() - { - add(m_col_filename); - add(m_col_description); - add(m_col_pixbuf); - add(app_name_exec); - add(float_h_align); - add(float_w_align); - add(icon_name); - - } - Gtk::TreeModelColumn m_col_filename; - Gtk::TreeModelColumn icon_name; - Gtk::TreeModelColumn m_col_description; - Gtk::TreeModelColumn app_name_exec; - Gtk::TreeModelColumn > m_col_pixbuf; - Gtk::TreeModelColumn float_h_align; - Gtk::TreeModelColumn float_w_align; - }; - ModelColumns m_Columns; - public: - Glib::RefPtr builder; - Gtk::Button *btnFilemaneg; - Gtk::Button *btnListApp; - Gtk::Button *btnStart; - Gtk::CheckButton *chbTerminal; - Gtk::CheckButton *chbAnotherUser; - Gtk::CheckButton *cbxExecuteEpriority; - Gtk::ComboBoxText *cmbUser; - Gtk::SpinButton *spinPriority; - Gtk::Scale *scalePriority; - Gtk::RadioButton *rbPkexec; - Gtk::RadioButton *rbSu; - Gtk::RadioButton *rbSudo; - Gtk::Entry *txtCmd; - Gtk::FileChooserDialog *wndChooseFileWallpaper; - Gtk::Button *btnFilemangerExit; - Gtk::Button *btnFilemangerOk; - Gtk::Label *lblTimeEpriority; - Gtk::Label *lblTimeEpriorityLow; - Gtk::Label *lblTime4EpriorityHigh; - Gtk::Label *lblUserName; - Gtk::Window *messageError; - Gtk::Button *btnMessageErrorOk; - Gtk::Label *lblMessageError; - Gtk::Button *btnStartMenuOK; - Gtk::Button *btnStartMenuExit; - Gtk::Window *dialogStartMenu; - Gtk::Box *boxColor; - Gtk::Label *lblInfoHead; - Gtk::Label *lblinfoCmd; - Gtk::Label *lblInfoTime; - Gtk::Label *labInfoExecutTerm; - Gtk::Label *lblInfoUser; - Gtk::Label *lblInfoUserOther; - Gtk::Label *lblInfoUserName; - Gtk::Label *lblInfoNooPriority; - Gtk::Label *lblInfoExec; - Gtk::Label *lblInfoPriority; - Gtk::Label *lblGraphics; - Gtk::Label *lblTools; - Gtk::Label *lblInternet; - Gtk::Label *lblMultimedia; - Gtk::Label *lblSettings; - Gtk::Label *lblEducation; - Gtk::Label *lblOffice; - Gtk::Label *lblOther; - Gtk::Label *lblDevelopment; - Gtk::Label *lblSystem; - Gtk::Label *lblHeaderName; - Gtk::IconView *iconGraphics; - Gtk::IconView *iconTools; - Gtk::IconView *iconInternet; - Gtk::IconView *iconMultimedia; - Gtk::IconView *iconSettings; - Gtk::IconView *iconEducation; - Gtk::IconView *iconOffice; - Gtk::IconView *iconOther; - Gtk::IconView *iconDevelopment; - Gtk::IconView *iconSystem; - Gtk::IconView *iconEntry; - Gtk::MenuItem *btnAbout; - Gtk::MenuItem *btnhelp; - Gtk::AboutDialog *aboutWindows; - Gtk::MenuButton *btnSettings; - Gtk::ButtonBox *btnBoxAboutDialog; - Gtk::ComboBoxText *cmbTerminal; - Glib::RefPtr list_Graphics; - Glib::RefPtr list_Tools; - Glib::RefPtr list_Internet; - Glib::RefPtr list_Multimedia; - Glib::RefPtr list_Settings; - Glib::RefPtr list_Education; - Glib::RefPtr list_Office; - Glib::RefPtr list_Other; - Glib::RefPtr list_Development; - Glib::RefPtr list_System; - Gtk::Image *imgHeadBackground; - Gtk::Overlay *overHead; - Gtk::Widget *boxAbout; - Gtk::Label *lblHeaderAboutTopic; - - Gtk::Label *lblHeadeWndWeb; - Gtk::Label *lblwebHeaderName; - Gtk::Label *lblhelpText; - Gtk::Label *lblhelpHeader; - Gtk::CheckButton *chkAlwaysOpenHelp; - Gtk::Button *btnReadHelp; - Gtk::Button *btnCancelHelp; - Gtk::Window *wndShowWeb; - Gtk::Entry *CommandEntry; - Gtk::CheckButton *CommandCheck; - - #ifdef WEBKIT_FOUND - Gtk::Window *wndWeb; - Gtk::Widget *three; - WebKitWebView *my_web_kit = NULL; - #endif - public: - string termunal_cmd[3] = {"konsole -e ", "xfce4-terminal -x ", "xterm -e "}; - string cmd_old = ""; - string user_exec_app = ""; - string user_cmd = ""; - string user_cmd_old = ""; - string name_app_old = ""; - string path_file_old = ""; - string execute_cmd = ""; - string path_file = ""; - string name_app = ""; - int index_error = 0; - bool flag_pkexec = false; - bool flag_su = false; - bool flag_sudo = false; - bool flag_open_browser = false; - string path_file_name; - string global_lick_doc; - struct struct_App { - string Name_desktop; - string Name; - string Exec; - string Icon; - string MimeType; - string Type; - vector Categories; - }; - list list_app; - set set_categories; - int index_exec_gui_apps = 0; - Gtk::IconView* array_icon[10]; - -}; +typedef struct { + GtkWidget *Window; -class SettingsPlug : public Gtk::Plug{ -public: - Gtk::Window *window; - SettingsPlug(::Window p_socketID, Glib::RefPtr builder); + GtkWidget *HatText; + GtkWidget *HeaderText; + GtkWidget *InfoText; + GtkWidget *AlwaysOpenCheck; -private: - Gtk::Widget *plugBox; - Gtk::Widget *parent; -}; -void help(); -void wrapper_help_show(GtkWidget *self, char* link, gpointer user_data); + GtkWidget *CloseButton; + GtkWidget *AcceptButton; +} documentation_confirmation_window; +main_window *setup_window(); \ No newline at end of file diff --git a/ublexec-application.glade b/ublexec-application.glade new file mode 100644 index 0000000..363dafe --- /dev/null +++ b/ublexec-application.glade @@ -0,0 +1,169 @@ + + + + + + True + False + process-stop-symbolic + + + True + False + emblem-ok-symbolic + + + + + + + + + + + 800 + 600 + False + com.ublinux.ublexec + + + True + False + 5 + 5 + 5 + 5 + vertical + 5 + + + True + True + treestore1 + + + + + + Name + + + + 0 + + + + + + 1 + + + + + + + True + True + 0 + + + + + True + False + 5 + + + Ok + True + True + True + image2 + + + False + True + end + 1 + + + + + Cancel + True + True + True + image1 + + + False + True + end + 2 + + + + + False + True + 1 + + + + + + + True + False + + + True + False + center + Run as... + + + + + + + + True + False + 32 + com.ublinux.ublexec + + + + + True + False + + + True + True + False + True + True + menu1 + none + + + + + + False + True + 0 + + + + + end + 1 + + + + + +