|
|
|
|
@ -1,79 +1,11 @@
|
|
|
|
|
#include "libublsettingsui-gtk3.h"
|
|
|
|
|
#include "libublsettingsui-gtk3-save.h"
|
|
|
|
|
|
|
|
|
|
struct loaded_config {
|
|
|
|
|
dictionary_fields(loaded_config);
|
|
|
|
|
char *section;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template_saving_window *yon_saving_window_new();
|
|
|
|
|
|
|
|
|
|
struct loaded_config *yon_config_convert_parameter(config_str parsed, int size);
|
|
|
|
|
|
|
|
|
|
/**function and argument, which called after successful config saving.
|
|
|
|
|
* Example:
|
|
|
|
|
* void on_save_done(main_window *widgets, config_str output, int size)
|
|
|
|
|
/*
|
|
|
|
|
==============
|
|
|
|
|
saving section
|
|
|
|
|
==============
|
|
|
|
|
*/
|
|
|
|
|
void (*save_success_function)(void*,config_str,int)=NULL;
|
|
|
|
|
void *save_success_argument=NULL;
|
|
|
|
|
void (*save_failure_function)(void*,config_str,int)=NULL;
|
|
|
|
|
void *save_failure_argument=NULL;
|
|
|
|
|
|
|
|
|
|
void yon_save_window_set_postsave_function(void *function, void *data){
|
|
|
|
|
save_success_function=function;
|
|
|
|
|
save_success_argument=data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void yon_save_window_set_postsave_failure_function(void *function, void *data){
|
|
|
|
|
save_failure_function=function;
|
|
|
|
|
save_failure_argument=data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void on_save_window_parameter_switched(GtkCellRendererToggle *self, gchar *path, template_saving_window *window){
|
|
|
|
|
GtkTreeIter iter,itar;
|
|
|
|
|
if (path){
|
|
|
|
|
if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&itar,path)){
|
|
|
|
|
gboolean is_active;
|
|
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&is_active,-1);
|
|
|
|
|
gtk_list_store_set(window->list,&itar,0,!is_active,-1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
int once_active=0;
|
|
|
|
|
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter);
|
|
|
|
|
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){
|
|
|
|
|
int is_active;
|
|
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&is_active,-1);
|
|
|
|
|
if (is_active){
|
|
|
|
|
once_active=1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!once_active) gtk_widget_set_sensitive(window->SaveButton,0);
|
|
|
|
|
else gtk_widget_set_sensitive(window->SaveButton,1);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template_debug_window *template_debugger_window_new(){
|
|
|
|
|
template_debug_window *window = malloc(sizeof(template_debug_window));
|
|
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug);
|
|
|
|
|
window->Window=yon_gtk_builder_get_widget(builder,"Window");
|
|
|
|
|
window->HeaderTopic=yon_gtk_builder_get_widget(builder,"HeaderTopic");
|
|
|
|
|
window->HeaderImage=yon_gtk_builder_get_widget(builder,"HeaderImage");
|
|
|
|
|
window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
|
|
|
|
|
window->Vte=yon_gtk_builder_get_widget(builder,"DebuggerTerminal");
|
|
|
|
|
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
|
|
|
|
|
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
|
|
|
|
|
gtk_window_set_icon_name(GTK_WINDOW(window->Window),yon_char_append("com.ublinux.",template_app_information.app_tech_name));
|
|
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
|
|
|
|
|
|
|
|
|
|
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DebugWindow");
|
|
|
|
|
return window;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct save_return {
|
|
|
|
|
void *save_success_argument;
|
|
|
|
|
config_str file_return;
|
|
|
|
|
int file_save;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
gboolean _yon_postsave_function_start(struct save_return *data){
|
|
|
|
|
save_success_function(data->save_success_argument,data->file_return,data->file_save);
|
|
|
|
|
@ -200,34 +132,210 @@ config_str yon_loaded_config_convert_to_save_command(struct loaded_config *targe
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int yon_config_parameter_prepare_elements(config_str target, int *size){
|
|
|
|
|
int success = 0;
|
|
|
|
|
for (int i=0;i<(*size);i++){
|
|
|
|
|
char *start_bracket_replaced_string = yon_char_replace(target[i],"[","[\"");
|
|
|
|
|
char *end_bracket_replaced_string = yon_char_replace(start_bracket_replaced_string,"]","\"]");
|
|
|
|
|
target[i] = end_bracket_replaced_string;
|
|
|
|
|
}
|
|
|
|
|
return success;
|
|
|
|
|
void yon_save_window_set_postsave_function(void *function, void *data){
|
|
|
|
|
save_success_function=function;
|
|
|
|
|
save_success_argument=data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void on_save_parameters(GtkWidget *self, template_saving_window *window){
|
|
|
|
|
void yon_save_window_set_postsave_failure_function(void *function, void *data){
|
|
|
|
|
save_failure_function=function;
|
|
|
|
|
save_failure_argument=data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
==============
|
|
|
|
|
window section
|
|
|
|
|
==============
|
|
|
|
|
*/
|
|
|
|
|
void yon_save_window_set_status(template_saving_window *window,char *path,YON_CONFIG_TYPE type){
|
|
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
|
|
yon_ubl_status_box_render(SAVE_PROCESS_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
window->type=type;
|
|
|
|
|
window->custom_save_path=path;
|
|
|
|
|
if (type==YON_CONFIG_BOTH){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
} else if (type==YON_CONFIG_GLOBAL){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
|
|
|
|
|
} else if (type==YON_CONFIG_LOCAL){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
} else if (type==YON_CONFIG_CUSTOM){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_CUSTOM_STATE_LABEL(path),BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
}
|
|
|
|
|
textdomain(template_app_information.app_locale);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int saved_size;
|
|
|
|
|
struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window);
|
|
|
|
|
gboolean yon_save_window_destroy_if_empty(template_saving_window *window){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter)){
|
|
|
|
|
gtk_widget_destroy(window->Window);
|
|
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
|
|
yon_ubl_status_box_render(NOTHING_TO_SAVE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
|
|
|
textdomain(template_app_information.app_locale);
|
|
|
|
|
if (save_failure_function){
|
|
|
|
|
|
|
|
|
|
int size=0;
|
|
|
|
|
config_str commands = yon_loaded_config_convert_to_save_command(saved_parameters,&size,window->type!=YON_CONFIG_CUSTOM? yon_config_get_type_path(window->type):window->custom_save_path);
|
|
|
|
|
yon_config_parameter_prepare_elements(commands,&size);
|
|
|
|
|
struct save_return *data = malloc(sizeof(struct save_return));
|
|
|
|
|
data->save_success_argument = save_failure_argument;
|
|
|
|
|
data->file_return = NULL;
|
|
|
|
|
data->file_save = 0;
|
|
|
|
|
gdk_threads_add_idle((GSourceFunc)_yon_postsave_failure_function_start,data);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *final_command = yon_char_parsed_to_string(commands,size,";");
|
|
|
|
|
pthread_t thread_id;
|
|
|
|
|
pthread_create(&thread_id, NULL, (void *)_yon_saving_threaded,final_command);
|
|
|
|
|
void on_save_window_parameter_switched(GtkCellRendererToggle *self, gchar *path, template_saving_window *window){
|
|
|
|
|
GtkTreeIter iter,itar;
|
|
|
|
|
if (path){
|
|
|
|
|
if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->list),&itar,path)){
|
|
|
|
|
gboolean is_active;
|
|
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&itar,0,&is_active,-1);
|
|
|
|
|
gtk_list_store_set(window->list,&itar,0,!is_active,-1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
int once_active=0;
|
|
|
|
|
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter);
|
|
|
|
|
for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->list),&iter)){
|
|
|
|
|
int is_active;
|
|
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&is_active,-1);
|
|
|
|
|
if (is_active){
|
|
|
|
|
once_active=1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!once_active) gtk_widget_set_sensitive(window->SaveButton,0);
|
|
|
|
|
else gtk_widget_set_sensitive(window->SaveButton,1);
|
|
|
|
|
|
|
|
|
|
yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"SaveWindow");
|
|
|
|
|
on_subwindow_close(self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template_saving_window *yon_saving_window_new(){
|
|
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_saving);
|
|
|
|
|
template_saving_window *window = malloc(sizeof(template_saving_window));
|
|
|
|
|
window->Window = yon_gtk_builder_get_widget(builder,"Window");
|
|
|
|
|
window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage");
|
|
|
|
|
window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic");
|
|
|
|
|
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
|
|
|
|
|
window->ParametersTree = yon_gtk_builder_get_widget(builder,"ParametersTree");
|
|
|
|
|
window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton");
|
|
|
|
|
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
|
|
|
|
|
window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ToggleCell"));
|
|
|
|
|
window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1"));
|
|
|
|
|
window->OldValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"OldValueColumn"));
|
|
|
|
|
window->OldValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"OldValueCell"));
|
|
|
|
|
window->NewValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"NewValueColumn"));
|
|
|
|
|
window->NewValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"NewValueCell"));
|
|
|
|
|
window->filteredModel = GTK_TREE_MODEL(gtk_builder_get_object(builder,"listfilter1"));
|
|
|
|
|
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"SaveWindow");
|
|
|
|
|
char *icon_name = yon_char_append("com.ublinux.",template_app_information.app_tech_name);
|
|
|
|
|
gtk_window_set_icon_name(GTK_WINDOW(window->Window),icon_name);
|
|
|
|
|
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
|
|
|
|
|
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
|
|
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
|
|
|
|
|
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
|
|
|
|
|
g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_save_parameters),window);
|
|
|
|
|
g_signal_connect(G_OBJECT(window->ToggleCell),"toggled", G_CALLBACK(on_save_window_parameter_switched),window);
|
|
|
|
|
return window;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
======================
|
|
|
|
|
config getting section
|
|
|
|
|
======================
|
|
|
|
|
*/
|
|
|
|
|
char *yon_get_compare_config_command(va_list args,char *path,YON_CONFIG_TYPE type){
|
|
|
|
|
char *cur_command;
|
|
|
|
|
char *compare_command="";
|
|
|
|
|
while ((cur_command=va_arg(args,char*))){
|
|
|
|
|
char *temp=cur_command;
|
|
|
|
|
cur_command = yon_config_parameter_prepare_command(cur_command,type!=YON_CONFIG_CUSTOM?yon_config_get_type_path(type):path,NULL,NULL);
|
|
|
|
|
char *temp_command = yon_char_unite(compare_command,!yon_char_is_empty(compare_command)?";":"",cur_command,NULL);
|
|
|
|
|
if (!yon_char_is_empty(compare_command)) free(compare_command);
|
|
|
|
|
compare_command = temp_command;
|
|
|
|
|
}
|
|
|
|
|
return yon_char_is_empty(compare_command)?NULL:compare_command;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void yon_save_window_loaded_config_init(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){
|
|
|
|
|
if (current_loaded){
|
|
|
|
|
struct loaded_config *current = NULL;
|
|
|
|
|
for_dictionaries(current,current_loaded){
|
|
|
|
|
if (!yon_config_check_ignore(current->key)){
|
|
|
|
|
dictionary *dict = NULL;
|
|
|
|
|
if (!yon_config_compare_ignore_get(current->key)){
|
|
|
|
|
dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value
|
|
|
|
|
}
|
|
|
|
|
gboolean status=0;
|
|
|
|
|
status = yon_config_get_status(current->key);
|
|
|
|
|
if (dict&&!yon_char_is_empty((char*)dict->data)&&status!=-2){
|
|
|
|
|
if (strcmp((char*)dict->data,(char*)current->data)){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
if (status==0||status==-2) status = 0;
|
|
|
|
|
else status=1;
|
|
|
|
|
char *old_val = yon_char_new(current->data);
|
|
|
|
|
char *new_val = yon_char_new(dict->data);
|
|
|
|
|
if (strstr(old_val,"&")) {old_val = yon_char_replace(old_val,"&","\003");old_val = yon_char_replace(old_val,"\003","&");}
|
|
|
|
|
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<");
|
|
|
|
|
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">");
|
|
|
|
|
if (strstr(new_val,"&")) {int sz = 0; config_str new_val_parsed = yon_char_parse(new_val,&sz,"&");new_val = yon_char_parsed_to_string(new_val_parsed,sz,"&"); yon_char_parsed_free(new_val_parsed,sz);}
|
|
|
|
|
if (strstr(new_val,">")) new_val = yon_char_replace(new_val,">","<");
|
|
|
|
|
if (strstr(new_val,"<")) new_val = yon_char_replace(new_val,"<",">");
|
|
|
|
|
char *compare_string = yon_char_unite("<s>",(char*)new_val,"</s>\n",(char*)old_val,NULL);
|
|
|
|
|
gtk_list_store_append(window->list,&iter);
|
|
|
|
|
gtk_list_store_set(window->list,&iter,0,status,1,current->key,2,(char*)dict->data,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
|
|
|
|
|
free(compare_string);
|
|
|
|
|
}
|
|
|
|
|
} else if ((strcmp((char*)current->data,""))&&status!=-2){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
if (status==0||status==-2) status = 0;
|
|
|
|
|
else status=1;
|
|
|
|
|
char *old_val = yon_char_new(current->data);
|
|
|
|
|
if (strstr(old_val,"&")) {int sz = 0; config_str old_val_parsed = yon_char_parse(old_val,&sz,"&");old_val = yon_char_parsed_to_string(old_val_parsed,sz,"&"); yon_char_parsed_free(old_val_parsed,sz);}
|
|
|
|
|
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<");
|
|
|
|
|
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">");
|
|
|
|
|
char *compare_string = yon_char_unite("\n",(char*)old_val,NULL);
|
|
|
|
|
gtk_list_store_append(window->list,&iter);
|
|
|
|
|
gtk_list_store_set(window->list,&iter,0,status,1,current->key,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
|
|
|
|
|
free(compare_string);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void yon_save_window_compared_config_init_unfound(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){
|
|
|
|
|
if (config_compare){
|
|
|
|
|
struct loaded_config *current = NULL;
|
|
|
|
|
for_dictionaries(current,config_compare){
|
|
|
|
|
if (!yon_config_check_ignore(current->key)){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
dictionary *dict = yon_dictionary_get((dictionary**)¤t_loaded,current->key);
|
|
|
|
|
if (!dict){
|
|
|
|
|
GdkRGBA rgba;
|
|
|
|
|
rgba.alpha=0.8;
|
|
|
|
|
rgba.red=1;
|
|
|
|
|
rgba.blue=0.3;
|
|
|
|
|
rgba.green=0.65;
|
|
|
|
|
char *rgba_string = gdk_rgba_to_string(&rgba);
|
|
|
|
|
int status=0;
|
|
|
|
|
char *compare_string = yon_char_unite((char*)current->data,"\n",NULL);
|
|
|
|
|
gtk_list_store_append(window->list,&iter);
|
|
|
|
|
gtk_list_store_set(window->list,&iter,0,0,1,current->key,2,(char*)current->data,4,compare_string,5,rgba_string,6,1,7,current->section,-1);
|
|
|
|
|
free(compare_string);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int yon_config_parameter_prepare_elements(config_str target, int *size){
|
|
|
|
|
int success = 0;
|
|
|
|
|
for (int i=0;i<(*size);i++){
|
|
|
|
|
char *start_bracket_replaced_string = yon_char_replace(target[i],"[","[\"");
|
|
|
|
|
char *end_bracket_replaced_string = yon_char_replace(start_bracket_replaced_string,"]","\"]");
|
|
|
|
|
target[i] = end_bracket_replaced_string;
|
|
|
|
|
}
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct loaded_config *yon_config_convert_parameter(config_str parsed, int size){
|
|
|
|
|
@ -347,19 +455,17 @@ struct loaded_config *yon_config_get_compared(char *command){
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *yon_custom_config_init(){
|
|
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
|
|
GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,SAVE_LABEL,GTK_RESPONSE_ACCEPT,NULL);
|
|
|
|
|
textdomain(template_app_information.app_locale);
|
|
|
|
|
filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_OPEN);
|
|
|
|
|
|
|
|
|
|
yon_gtk_window_setup(GTK_WINDOW(dialog->Window),NULL,template_app_information.app_title,yon_char_unite("com.ublinux.",template_app_information.app_tech_name,NULL),"ConfigFilechooserWindow");
|
|
|
|
|
|
|
|
|
|
GtkFileFilter *filter = gtk_file_filter_new();
|
|
|
|
|
gtk_window_set_icon_name(GTK_WINDOW(dialog),yon_char_append("com.ublinux.",template_app_information.app_tech_name));
|
|
|
|
|
gtk_file_filter_add_pattern(filter,"*.ini");
|
|
|
|
|
gtk_file_filter_set_name(filter, "*.ini");
|
|
|
|
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
|
|
|
|
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->MainFileChooser),filter);
|
|
|
|
|
if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){
|
|
|
|
|
|
|
|
|
|
int response = gtk_dialog_run(GTK_DIALOG(dialog));
|
|
|
|
|
if (response == GTK_RESPONSE_ACCEPT){
|
|
|
|
|
char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
|
|
|
|
char *file = dialog->last_success_selection;
|
|
|
|
|
if (!yon_char_is_empty(file)){
|
|
|
|
|
if (!strstr(file,".ini")) file = yon_char_append(file,".ini");
|
|
|
|
|
if (access(file,0)!=F_OK){
|
|
|
|
|
@ -372,138 +478,56 @@ char *yon_custom_config_init(){
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *path = yon_char_unite("'",file,"'",NULL);
|
|
|
|
|
free(file);
|
|
|
|
|
gtk_widget_destroy(dialog);
|
|
|
|
|
gtk_widget_destroy(dialog->Window);
|
|
|
|
|
return path;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
gtk_widget_destroy(dialog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char *yon_get_compare_config_command(va_list args,char *path,YON_CONFIG_TYPE type){
|
|
|
|
|
char *cur_command;
|
|
|
|
|
char *compare_command="";
|
|
|
|
|
while ((cur_command=va_arg(args,char*))){
|
|
|
|
|
char *temp=cur_command;
|
|
|
|
|
cur_command = yon_config_parameter_prepare_command(cur_command,type!=YON_CONFIG_CUSTOM?yon_config_get_type_path(type):path,NULL,NULL);
|
|
|
|
|
char *temp_command = yon_char_unite(compare_command,!yon_char_is_empty(compare_command)?";":"",cur_command,NULL);
|
|
|
|
|
if (!yon_char_is_empty(compare_command)) free(compare_command);
|
|
|
|
|
compare_command = temp_command;
|
|
|
|
|
}
|
|
|
|
|
return yon_char_is_empty(compare_command)?NULL:compare_command;
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
============
|
|
|
|
|
init section
|
|
|
|
|
============
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void yon_save_window_loaded_config_init(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){
|
|
|
|
|
if (current_loaded){
|
|
|
|
|
struct loaded_config *current = NULL;
|
|
|
|
|
for_dictionaries(current,current_loaded){
|
|
|
|
|
if (!yon_config_check_ignore(current->key)){
|
|
|
|
|
dictionary *dict = NULL;
|
|
|
|
|
if (!yon_config_compare_ignore_get(current->key)){
|
|
|
|
|
dict = yon_dictionary_get((dictionary**)&config_compare,current->key); // get old parameter value
|
|
|
|
|
}
|
|
|
|
|
gboolean status=0;
|
|
|
|
|
status = yon_config_get_status(current->key);
|
|
|
|
|
if (dict&&!yon_char_is_empty((char*)dict->data)&&status!=-2){
|
|
|
|
|
if (strcmp((char*)dict->data,(char*)current->data)){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
if (status==0||status==-2) status = 0;
|
|
|
|
|
else status=1;
|
|
|
|
|
char *old_val = yon_char_new(current->data);
|
|
|
|
|
char *new_val = yon_char_new(dict->data);
|
|
|
|
|
if (strstr(old_val,"&")) {old_val = yon_char_replace(old_val,"&","\003");old_val = yon_char_replace(old_val,"\003","&");}
|
|
|
|
|
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<");
|
|
|
|
|
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">");
|
|
|
|
|
if (strstr(new_val,"&")) {int sz = 0; config_str new_val_parsed = yon_char_parse(new_val,&sz,"&");new_val = yon_char_parsed_to_string(new_val_parsed,sz,"&"); yon_char_parsed_free(new_val_parsed,sz);}
|
|
|
|
|
if (strstr(new_val,">")) new_val = yon_char_replace(new_val,">","<");
|
|
|
|
|
if (strstr(new_val,"<")) new_val = yon_char_replace(new_val,"<",">");
|
|
|
|
|
char *compare_string = yon_char_unite("<s>",(char*)new_val,"</s>\n",(char*)old_val,NULL);
|
|
|
|
|
gtk_list_store_append(window->list,&iter);
|
|
|
|
|
gtk_list_store_set(window->list,&iter,0,status,1,current->key,2,(char*)dict->data,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
|
|
|
|
|
free(compare_string);
|
|
|
|
|
}
|
|
|
|
|
} else if ((strcmp((char*)current->data,""))&&status!=-2){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
if (status==0||status==-2) status = 0;
|
|
|
|
|
else status=1;
|
|
|
|
|
char *old_val = yon_char_new(current->data);
|
|
|
|
|
if (strstr(old_val,"&")) {int sz = 0; config_str old_val_parsed = yon_char_parse(old_val,&sz,"&");old_val = yon_char_parsed_to_string(old_val_parsed,sz,"&"); yon_char_parsed_free(old_val_parsed,sz);}
|
|
|
|
|
if (strstr(old_val,">")) old_val = yon_char_replace(old_val,">","<");
|
|
|
|
|
if (strstr(old_val,"<")) old_val = yon_char_replace(old_val,"<",">");
|
|
|
|
|
char *compare_string = yon_char_unite("\n",(char*)old_val,NULL);
|
|
|
|
|
gtk_list_store_append(window->list,&iter);
|
|
|
|
|
gtk_list_store_set(window->list,&iter,0,status,1,current->key,3,(char*)current->data,4,compare_string,6,1,7,yon_config_get_section_for_key(current->key),-1);
|
|
|
|
|
free(compare_string);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void on_save_parameters(GtkWidget *self, template_saving_window *window){
|
|
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
|
|
yon_ubl_status_box_render(SAVE_PROCESS_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
textdomain(template_app_information.app_locale);
|
|
|
|
|
|
|
|
|
|
void yon_save_window_compared_config_init_unfound(template_saving_window *window, struct loaded_config *current_loaded, struct loaded_config *config_compare){
|
|
|
|
|
if (config_compare){
|
|
|
|
|
struct loaded_config *current = NULL;
|
|
|
|
|
for_dictionaries(current,config_compare){
|
|
|
|
|
if (!yon_config_check_ignore(current->key)){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
dictionary *dict = yon_dictionary_get((dictionary**)¤t_loaded,current->key);
|
|
|
|
|
if (!dict){
|
|
|
|
|
GdkRGBA rgba;
|
|
|
|
|
rgba.alpha=0.8;
|
|
|
|
|
rgba.red=1;
|
|
|
|
|
rgba.blue=0.3;
|
|
|
|
|
rgba.green=0.65;
|
|
|
|
|
char *rgba_string = gdk_rgba_to_string(&rgba);
|
|
|
|
|
int status=0;
|
|
|
|
|
char *compare_string = yon_char_unite((char*)current->data,"\n",NULL);
|
|
|
|
|
gtk_list_store_append(window->list,&iter);
|
|
|
|
|
gtk_list_store_set(window->list,&iter,0,0,1,current->key,2,(char*)current->data,4,compare_string,5,rgba_string,6,1,7,current->section,-1);
|
|
|
|
|
free(compare_string);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
int saved_size;
|
|
|
|
|
struct loaded_config *saved_parameters = yon_save_window_get_saved_parameters(window);
|
|
|
|
|
|
|
|
|
|
gboolean yon_save_window_destroy_if_empty(template_saving_window *window){
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->list),&iter)){
|
|
|
|
|
gtk_widget_destroy(window->Window);
|
|
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
|
|
yon_ubl_status_box_render(NOTHING_TO_SAVE_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
|
|
|
|
|
textdomain(template_app_information.app_locale);
|
|
|
|
|
if (save_failure_function){
|
|
|
|
|
int size=0;
|
|
|
|
|
config_str commands = yon_loaded_config_convert_to_save_command(saved_parameters,&size,window->type!=YON_CONFIG_CUSTOM? yon_config_get_type_path(window->type):window->custom_save_path);
|
|
|
|
|
yon_config_parameter_prepare_elements(commands,&size);
|
|
|
|
|
|
|
|
|
|
struct save_return *data = malloc(sizeof(struct save_return));
|
|
|
|
|
data->save_success_argument = save_failure_argument;
|
|
|
|
|
data->file_return = NULL;
|
|
|
|
|
data->file_save = 0;
|
|
|
|
|
gdk_threads_add_idle((GSourceFunc)_yon_postsave_failure_function_start,data);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
return 1;
|
|
|
|
|
char *final_command = yon_char_parsed_to_string(commands,size,";");
|
|
|
|
|
pthread_t thread_id;
|
|
|
|
|
pthread_create(&thread_id, NULL, (void *)_yon_saving_threaded,final_command);
|
|
|
|
|
|
|
|
|
|
yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"SaveWindow");
|
|
|
|
|
on_subwindow_close(self);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void yon_save_window_set_status(template_saving_window *window,char *path,YON_CONFIG_TYPE type){
|
|
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
|
|
window->type=type;
|
|
|
|
|
window->custom_save_path=path;
|
|
|
|
|
if (type==YON_CONFIG_BOTH){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
} else if (type==YON_CONFIG_GLOBAL){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_GLOBAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
template_debug_window *template_debugger_window_new(){
|
|
|
|
|
template_debug_window *window = malloc(sizeof(template_debug_window));
|
|
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_debug);
|
|
|
|
|
window->Window=yon_gtk_builder_get_widget(builder,"Window");
|
|
|
|
|
window->HeaderTopic=yon_gtk_builder_get_widget(builder,"HeaderTopic");
|
|
|
|
|
window->HeaderImage=yon_gtk_builder_get_widget(builder,"HeaderImage");
|
|
|
|
|
window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
|
|
|
|
|
window->Vte=yon_gtk_builder_get_widget(builder,"DebuggerTerminal");
|
|
|
|
|
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
|
|
|
|
|
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
|
|
|
|
|
gtk_window_set_icon_name(GTK_WINDOW(window->Window),yon_char_append("com.ublinux.",template_app_information.app_tech_name));
|
|
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
|
|
|
|
|
|
|
|
|
|
} else if (type==YON_CONFIG_LOCAL){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_LOCAL_STATE_LABEL,BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
} else if (type==YON_CONFIG_CUSTOM){
|
|
|
|
|
yon_ubl_status_box_spawn_infinite(GTK_CONTAINER(window->StatusBox),"savingTarget",SAVING_CUSTOM_STATE_LABEL(path),BACKGROUND_IMAGE_INFO_TYPE);
|
|
|
|
|
}
|
|
|
|
|
textdomain(template_app_information.app_locale);
|
|
|
|
|
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"DebugWindow");
|
|
|
|
|
return window;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){
|
|
|
|
|
@ -542,42 +566,3 @@ template_saving_window *yon_save_proceed(char *path,YON_CONFIG_TYPE type, ...){
|
|
|
|
|
on_save_window_parameter_switched(NULL,NULL,window);
|
|
|
|
|
return window;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template_saving_window *yon_saving_window_new(){
|
|
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_saving);
|
|
|
|
|
template_saving_window *window = malloc(sizeof(template_saving_window));
|
|
|
|
|
window->Window = yon_gtk_builder_get_widget(builder,"Window");
|
|
|
|
|
window->HeaderImage = yon_gtk_builder_get_widget(builder,"HeaderImage");
|
|
|
|
|
window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic");
|
|
|
|
|
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
|
|
|
|
|
window->ParametersTree = yon_gtk_builder_get_widget(builder,"ParametersTree");
|
|
|
|
|
window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton");
|
|
|
|
|
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
|
|
|
|
|
window->ToggleCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"ToggleCell"));
|
|
|
|
|
window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1"));
|
|
|
|
|
window->OldValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"OldValueColumn"));
|
|
|
|
|
window->OldValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"OldValueCell"));
|
|
|
|
|
window->NewValueColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"NewValueColumn"));
|
|
|
|
|
window->NewValueCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"NewValueCell"));
|
|
|
|
|
window->filteredModel = GTK_TREE_MODEL(gtk_builder_get_object(builder,"listfilter1"));
|
|
|
|
|
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"SaveWindow");
|
|
|
|
|
char *icon_name = yon_char_append("com.ublinux.",template_app_information.app_tech_name);
|
|
|
|
|
gtk_window_set_icon_name(GTK_WINDOW(window->Window),icon_name);
|
|
|
|
|
gtk_window_set_title(GTK_WINDOW(window->Window),template_app_information.app_title);
|
|
|
|
|
gtk_label_set_text(GTK_LABEL(window->HeaderTopic),template_app_information.app_title);
|
|
|
|
|
gtk_image_set_from_pixbuf(GTK_IMAGE(window->HeaderImage),gtk_icon_theme_load_icon_for_scale(gtk_icon_theme_get_default(),yon_char_append("com.ublinux.",template_app_information.app_tech_name),32,1,GTK_ICON_LOOKUP_FORCE_SIZE,NULL));
|
|
|
|
|
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
|
|
|
|
|
g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_save_parameters),window);
|
|
|
|
|
g_signal_connect(G_OBJECT(window->ToggleCell),"toggled", G_CALLBACK(on_save_window_parameter_switched),window);
|
|
|
|
|
return window;
|
|
|
|
|
}
|
|
|
|
|
#define default_config_command(target, data) yon_char_unite("ubconfig --source default --raw get ",target," ",data,NULL)
|
|
|
|
|
char *yon_get_default_label_with_parameter(char *section, char *parameter){
|
|
|
|
|
int size;
|
|
|
|
|
config_str parsed = yon_config_load(default_config_command(section,parameter),&size);
|
|
|
|
|
if (parsed){
|
|
|
|
|
yon_char_remove_last_symbol(parsed[0],'\n');
|
|
|
|
|
char *default_string = yon_char_unite(DEFAULT_LABEL," ","(",parsed[0],")",NULL);
|
|
|
|
|
return default_string;
|
|
|
|
|
}
|
|
|
|
|
}
|