diff --git a/source/ubl-settings-logging.c b/source/ubl-settings-logging.c index b2fa289..58dc974 100644 --- a/source/ubl-settings-logging.c +++ b/source/ubl-settings-logging.c @@ -10,7 +10,9 @@ config main_config; * [RU] * Закрывает окно, в котором расположен виджет [self]. */ -void on_close_subwindow(GtkWidget *self){ +void on_close_subwindow(GtkWidget *self, char *window){ + if(window) + yon_window_config_custom_window_set(GTK_WINDOW(gtk_widget_get_toplevel(self)),window); gtk_widget_destroy(gtk_widget_get_toplevel(self)); } @@ -281,6 +283,7 @@ void on_inspector_open(GtkWidget *self, main_window *widgets){ window->UpdateButton=yon_gtk_builder_get_widget(builder,"UpdateButton"); window->LoggingTerminal=yon_gtk_builder_get_widget(builder,"LoggingTerminal"); window->JournalActionsBox=yon_gtk_builder_get_widget(builder,"JournalActionsBox"); + yon_window_config_custom_window_setup(GTK_WINDOW(window->MainWindow),"InspectorWindow"); gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL); gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); GtkTreeModel *model = GTK_TREE_MODEL(widgets->list); @@ -305,6 +308,7 @@ void on_inspector_open(GtkWidget *self, main_window *widgets){ g_signal_connect(G_OBJECT(window->ShowAllBootsButton),"clicked", G_CALLBACK(on_inspector_update),window); g_signal_connect(G_OBJECT(window->ShowAllUnitsButton),"clicked", G_CALLBACK(on_inspector_update),window); g_signal_connect(G_OBJECT(window->ShowInitTreeButton),"clicked", G_CALLBACK(on_inspector_update),window); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gtk_tree_model_get(model,&iter,0,&name,1,&paths,-1); if (strcmp(name,"journald")){ @@ -455,7 +459,7 @@ void on_rules_accept(GtkWidget *self, dictionary *dict){ !public_read&&public_write&&public_exec ? 3 : \ 0; gtk_entry_set_text(entry,yon_char_unite(yon_char_from_int(owner),yon_char_from_int(group),yon_char_from_int(public),NULL)); - gtk_widget_destroy(window->Window); + on_close_subwindow(window->Window,"RulesWindow"); } void on_rules_update(GtkWidget *self, logrotate_rules_window *window){ @@ -513,11 +517,12 @@ void on_rules_open(GtkWidget *self,GtkEntry *entry){ window->FinalEntry=yon_gtk_builder_get_widget(builder,"FinalEntry"); window->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton"); window->SaveButton=yon_gtk_builder_get_widget(builder,"SaveButton"); + yon_window_config_custom_window_set(GTK_WINDOW(window->Window),"RulesWindow"); gtk_window_set_title(GTK_WINDOW(window->Window),TITLE_LABEL); dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"entry",entry); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),"RulesWindow"); g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_rules_accept),dict); g_signal_connect(G_OBJECT(window->UserReadCheck),"toggled",G_CALLBACK(on_rules_update),window); @@ -546,7 +551,7 @@ void on_filechooser_save(GtkWidget *self, dictionary *dict){ logrotate_filechooser_window *dialog = yon_dictionary_get_data(dict->first->next,logrotate_filechooser_window*); char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog->FileChooser)); gtk_entry_set_text(GTK_ENTRY(window->FileAmountEntry),filename); - gtk_widget_destroy(dialog->FileChooser); + on_close_subwindow(dialog->FileChooser,"FileDialog"); } void on_filechooser_open(GtkWidget *self, logrotate_configure_window *window){ @@ -556,6 +561,7 @@ void on_filechooser_open(GtkWidget *self, logrotate_configure_window *window){ dialog->FileOrDirCheck = yon_gtk_builder_get_widget(builder,"FileOrDirCheck"); dialog->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); dialog->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + yon_window_config_custom_window_set(GTK_WINDOW(dialog->FileChooser),"FileDialog"); gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(window->MainWindow)); dictionary *dict = NULL; @@ -563,7 +569,7 @@ void on_filechooser_open(GtkWidget *self, logrotate_configure_window *window){ yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog); g_signal_connect(G_OBJECT(dialog->FileOrDirCheck),"toggled",G_CALLBACK(on_filechooser_mode_switch),dialog); - g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),"FileDialog"); g_signal_connect(G_OBJECT(dialog->AcceptButton),"clicked",G_CALLBACK(on_filechooser_save),dict); gtk_widget_show(dialog->FileChooser); } @@ -854,7 +860,7 @@ void on_logrotate_save(GtkWidget *self, dictionary *dict){ } paths=yon_char_replace(paths,",","\n"); gtk_list_store_set(main_config.logrotate_list,&iter,0,log_name,1,paths,2,gtk_entry_get_text(GTK_ENTRY(window->LogDescriptionEntry)),-1); - on_close_subwindow(window->MainWindow); + on_close_subwindow(window->MainWindow,"LogrotateWindow"); } } @@ -923,6 +929,8 @@ logrotate_configure_window *yon_logrotate_window_new(char *paths, logrotate_wind window->CommandAfterEntry=yon_gtk_builder_get_widget(builder,"CommandAfterEntry"); window->EndworkCommandEntry=yon_gtk_builder_get_widget(builder,"EndworkCommandEntry"); window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox"); + + yon_window_config_custom_window_get(GTK_WINDOW(window->MainWindow),"LogrotateWindow"); gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL); if (dialog) gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(dialog->Window)); @@ -1308,13 +1316,14 @@ void on_logrotate_tab_open(GtkWidget *self, main_window *widgets){ window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); window->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + yon_window_config_custom_window_get(GTK_WINDOW(window->Window),"LogrotateTabWindow"); gtk_window_set_title(GTK_WINDOW(window->Window),TITLE_LABEL); gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree),GTK_TREE_MODEL(main_config.logrotate_list)); gtk_tree_view_set_model(GTK_TREE_VIEW(window->AppsMainTree),GTK_TREE_MODEL(main_config.logrotate_apps_list)); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); - g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),"LogrotateTabWindow"); + g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_close_subwindow),"LogrotateTabWindow"); g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_logrotate_add),window); g_signal_connect(G_OBJECT(window->RemoveButton),"clicked",G_CALLBACK(on_logrotate_remove),window); g_signal_connect(G_OBJECT(window->ConfigureButton),"clicked",G_CALLBACK(on_logrotate_edit),window); @@ -1461,7 +1470,7 @@ void on_journald_save(GtkWidget *self, journald_window *window){ yon_config_register(JOURNALD("MaxLevelConsole"),"logging",yon_char_from_int(forwardempty-1)); else yon_config_remove_by_key(JOURNALD("MaxLevelConsole")); - on_close_subwindow(window->MainWindow); + on_close_subwindow(window->MainWindow,"JournaldWindow"); } journald_window *yon_journald_open(GtkWidget *self, main_window *widgets){ @@ -1502,6 +1511,8 @@ journald_window *yon_journald_open(GtkWidget *self, main_window *widgets){ window->LowerTimeButton=yon_gtk_builder_get_widget(builder,"LowerTimeButton"); window->headerTopic=yon_gtk_builder_get_widget(builder,"headerTopic"); + yon_window_config_custom_window_get(GTK_WINDOW(window->MainWindow),"JournaldWindow"); + gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); { int sz; @@ -1511,7 +1522,7 @@ journald_window *yon_journald_open(GtkWidget *self, main_window *widgets){ } gtk_window_set_title(GTK_WINDOW(window->MainWindow),TITLE_LABEL); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),"JournaldWindow"); g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_journald_save),window); g_signal_connect(G_OBJECT(window->LogIntervalCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),window->LogIntervalSpin); @@ -1631,11 +1642,15 @@ void on_log_save(GtkWidget *self, dictionary *dict){ if (!yon_char_is_empty(name)){ GtkTreeModel *model = GTK_TREE_MODEL(widgets->list); GtkTreeIter iter; - if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)) + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gtk_list_store_append(widgets->list,&iter); + yon_window_config_custom_window_set(GTK_WINDOW(window->MainWindow),"AddWindow"); + } else { + yon_window_config_custom_window_set(GTK_WINDOW(window->MainWindow),"EditWindow"); + } gtk_list_store_set(widgets->list,&iter,0,name,1,pathse,2,&desc ? desc : "",-1); } - on_close_subwindow(self); + on_close_subwindow(self,NULL); } add_log_window *on_add_open(main_window *widgets){ @@ -1660,7 +1675,6 @@ add_log_window *on_add_open(main_window *widgets){ dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked", G_CALLBACK(on_close_subwindow),NULL); g_signal_connect(G_OBJECT(window->SaveButton),"clicked", G_CALLBACK(on_log_save),dict); return window; } @@ -1728,6 +1742,8 @@ void on_log_add(GtkWidget *self, main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(widgets->list); GtkTreeIter iter; add_log_window *window = on_add_open(widgets); + yon_window_config_custom_window_get(GTK_WINDOW(window->MainWindow),"AddWindow"); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked", G_CALLBACK(on_close_subwindow),"AddWindow"); gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree))); gtk_widget_show(window->MainWindow); gtk_widget_hide(window->StatisticsFrame); @@ -1740,6 +1756,8 @@ void on_log_edit(GtkWidget *self,main_window *widgets){ GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ add_log_window *window = on_add_open(widgets); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked", G_CALLBACK(on_close_subwindow),"EditWindow"); + yon_window_config_custom_window_get(GTK_WINDOW(window->MainWindow),"EditWindow"); gtk_widget_show(window->MainWindow); gtk_widget_hide(window->StatisticsFrame); char *name; diff --git a/source/ubl-utils.c b/source/ubl-utils.c index b405491..89518c8 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -1334,12 +1334,17 @@ config_str yon_config_load(char *command, int *str_len){ } } -/**int yon_config_save_registered(char *path, char *section) +/**int yon_config_save_registered(char *path) * [EN] - * Saves config with [command] + * Saves config at [path] config. + * [path] can be: + * system + * global * [RU] - * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: - * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" + * Сохраняет конфигурацию в [path] конфиг. + * [path] может быть + * system - локальный конфиг + * global - глобальный конфиг */ int yon_config_save_registered(char *path){ check_config{ @@ -1376,10 +1381,15 @@ int yon_config_save_registered(char *path){ /**int yon_config_force_save_registered(char *path, char *section) * [EN] - * Saves config with [command] + * Force config to save at [path] config ignoring parameter save status. + * [path] can be: + * system + * global * [RU] - * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: - * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" + * Принудительно сохраняет конфигурацию в [path] конфиг игнорируя статус параметра. + * [path] может быть + * system - локальный конфиг + * global - глобальный конфиг */ int yon_config_force_save_registered(char *path){ check_config{ @@ -1868,6 +1878,17 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end } } + void yon_window_config_add_instant_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){ + switch (val_type){ + case YON_TYPE_BOOLEAN: g_key_file_set_boolean(__yon_window_config_file,section,param_name,*((gboolean*)tracked_value)); + break; + case YON_TYPE_INT: g_key_file_set_integer(__yon_window_config_file,section,param_name,*((int*)tracked_value)); + break; + case YON_TYPE_STRING: g_key_file_set_string(__yon_window_config_file,section,param_name,(char*)tracked_value); + break; + } + } + 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)); @@ -1901,6 +1922,81 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end } } + void yon_on_window_config_custom_window_destroy(GtkWindow *window, char *window_name){ + if (!gtk_window_is_maximized(window)){ + int height=0; + int width=0; + int X=0; + int Y=0; + gtk_window_get_position(window,&X,&Y); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosX"),"window",&X,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosY"),"window",&Y,YON_TYPE_INT); + + } + } + + void yon_on_window_config_custom_window_resize(GtkWindow *window, char *window_name){ + if (!gtk_window_is_maximized(window)){ + int height=0; + int width=0; + int X=0; + int Y=0; + gtk_window_get_size(window,&width,&height); + gtk_window_get_position(window,&X,&Y); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"Width"),"window",&width,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"Height"),"window",&height,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosX"),"window",&X,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosY"),"window",&Y,YON_TYPE_INT); + } + + } + + void yon_window_config_custom_window_setup(GtkWindow *window, char *window_name){ + int height=0; + int width=0; + int X=0; + int Y=0; + yon_window_config_get_parameter("window",yon_char_append(window_name,"Width"),&width,YON_TYPE_INT); + yon_window_config_get_parameter("window",yon_char_append(window_name,"Height"),&height,YON_TYPE_INT); + yon_window_config_get_parameter("window",yon_char_append(window_name,"PosX"),&X,YON_TYPE_INT); + yon_window_config_get_parameter("window",yon_char_append(window_name,"PosY"),&Y,YON_TYPE_INT); + if (width&&height) + gtk_window_resize(window,width,height); + if (X&&Y) + gtk_window_move(window,X,Y); + char *signals_window_name = yon_char_new(window_name); + g_signal_connect(G_OBJECT(window),"check-resize",G_CALLBACK(yon_on_window_config_custom_window_resize),signals_window_name); + g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_window_config_custom_window_destroy),signals_window_name); + } + + void yon_window_config_custom_window_get(GtkWindow *window, char *window_name){ + int height=0; + int width=0; + int X=0; + int Y=0; + yon_window_config_get_parameter("window",yon_char_append(window_name,"Width"),&width,YON_TYPE_INT); + yon_window_config_get_parameter("window",yon_char_append(window_name,"Height"),&height,YON_TYPE_INT); + yon_window_config_get_parameter("window",yon_char_append(window_name,"PosX"),&X,YON_TYPE_INT); + yon_window_config_get_parameter("window",yon_char_append(window_name,"PosY"),&Y,YON_TYPE_INT); + if (width&&height) + gtk_window_resize(window,width,height); + if (X&&Y) + gtk_window_move(window,X,Y); + } + + void yon_window_config_custom_window_set(GtkWindow *window, char *window_name){ + int height=0; + int width=0; + int X=0; + int Y=0; + gtk_window_get_size(window,&width,&height); + gtk_window_get_position(window,&X,&Y); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"Width"),"window",&width,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"Height"),"window",&height,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosX"),"window",&X,YON_TYPE_INT); + yon_window_config_add_instant_parameter(yon_char_append(window_name,"PosY"),"window",&Y,YON_TYPE_INT); + } + 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"); diff --git a/source/ubl-utils.h b/source/ubl-utils.h index d488149..e01b857 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -288,6 +288,12 @@ 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); +void yon_window_config_custom_window_setup(GtkWindow *window, char *window_name); + +void yon_window_config_custom_window_get(GtkWindow *window, char *window_name); + +void yon_window_config_custom_window_set(GtkWindow *window, char *window_name); + 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);