diff --git a/source/ubl-settings-resourcequota.c b/source/ubl-settings-resourcequota.c index d573e12..823dea9 100644 --- a/source/ubl-settings-resourcequota.c +++ b/source/ubl-settings-resourcequota.c @@ -1188,6 +1188,7 @@ int main(int argc, char *argv[]){ exit(0); } } + get_add_config()->size = 0; add_get_cmd_group(CMD_GET_GROUP); add_get_systemd_cgls(CMD_GET_SLICE_SERVICE); gtk_init(&argc,&argv); diff --git a/source/view_add.c b/source/view_add.c index 24c505f..0e1e5b4 100644 --- a/source/view_add.c +++ b/source/view_add.c @@ -1,7 +1,11 @@ #include "view_add.h" add_window *add_widgets = NULL; +add_config obj_add_config; +add_config* get_add_config() { + return &obj_add_config; +} add_window *add_setup_window(char* glade_path) { if (add_widgets == NULL) { @@ -43,11 +47,28 @@ add_window *add_setup_window(char* glade_path) { add_event(add_widgets); add_init_windows(); add_localization(add_widgets); + add_config_init(); } return add_widgets; } +void add_config_init() { + if (obj_add_config.size != 0) { + philos_free_string_array(&obj_add_config.disk, obj_add_config.size); + philos_free_string_array(&obj_add_config.i_o_limit_read, obj_add_config.size); + philos_free_string_array(&obj_add_config.i_o_limit_write, obj_add_config.size); + philos_free_int_array(&obj_add_config.i_o_limit_read_size, obj_add_config.size); + philos_free_int_array(&obj_add_config.i_o_limit_write_size, obj_add_config.size); + } + obj_add_config.disk = NULL; + obj_add_config.i_o_limit_read = NULL; + obj_add_config.i_o_limit_write = NULL; + obj_add_config.i_o_limit_read_size = NULL; + obj_add_config.i_o_limit_write_size = NULL; + obj_add_config.size = 0; +} + void add_init_windows() { if (gtk_combo_box_get_active(GTK_COMBO_BOX(add_widgets->cbxAddQuotaLevel2)) != -1) { gtk_widget_set_sensitive(add_widgets->boxBlockGui, 1); @@ -67,6 +88,90 @@ void add_init_windows() { } } +int check_activ_disk() { + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(&add_widgets->cbtAddDevice)); + disk = yon_char_divide_search(disk," ", -1); + int bool_read = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(add_widgets->chbAddRead)); + int bool_write = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(add_widgets->chbAddWrite)); + if (disk == NULL || obj_add_config.size == 0) { + return 0; + } + return 1; +} + +void add_del_disk() { + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(add_widgets->cbtAddDevice)); + int bool_read = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(add_widgets->chbAddRead)); + int bool_write = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(add_widgets->chbAddWrite)); + if (check_activ_disk() == 0) { + return; + } + if (obj_add_config.disk != NULL && obj_add_config.size != 0) { + int index_find = 0; + for (int index = 0; index < obj_add_config.size; index++) { + char* disk_cfg = yon_char_new(obj_add_config.disk[index]); + if (strstr(disk_cfg, disk) != NULL) { + index_find = index; + break; + } + } + if ((bool_read == 0 && bool_write == 0 && index_find != 0)) { + yon_char_parsed_shrink(obj_add_config.disk,&obj_add_config.size, index_find); + obj_add_config.size++; + remove_element_int_array(obj_add_config.i_o_limit_read_size,&obj_add_config.size, index_find); + obj_add_config.size++; + remove_element_int_array(obj_add_config.i_o_limit_write_size,&obj_add_config.size, index_find); + obj_add_config.size++; + yon_char_parsed_shrink(obj_add_config.i_o_limit_read,&obj_add_config.size, index_find); + obj_add_config.size++; + yon_char_parsed_shrink(obj_add_config.i_o_limit_write,&obj_add_config.size, index_find); + } + } +} +void add_disk_all(){ + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(add_widgets->cbtAddDevice)); + if (check_activ_disk() == 0) { + return; + } + if (obj_add_config.disk != NULL && obj_add_config.size !=0) { + int index_find = 0; + for (int index = 0; index < obj_add_config.size; index++) { + char* disk_cfg = yon_char_new(obj_add_config.disk[index]); + if (strstr(disk_cfg, disk) != NULL) { + index_find = index; + break; + } + } + if (index_find == 0) { + yon_char_parsed_append(obj_add_config.disk,&obj_add_config.size, disk); + obj_add_config.size--; + philos_int_append(obj_add_config.i_o_limit_read_size,&obj_add_config.size,add_get_read_device_size()); + obj_add_config.size--; + philos_int_append(obj_add_config.i_o_limit_write_size,&obj_add_config.size,add_get_write_device_size()); + obj_add_config.size--; + yon_char_parsed_append(obj_add_config.i_o_limit_read,&obj_add_config.size,add_get_read_device()); + obj_add_config.size--; + yon_char_parsed_append(obj_add_config.i_o_limit_write,&obj_add_config.size,add_get_write_device()); + } + } + else { + yon_char_parsed_append(obj_add_config.disk,&obj_add_config.size, disk); + obj_add_config.size--; + philos_int_append(obj_add_config.i_o_limit_read_size,&obj_add_config.size,add_get_read_device_size()); + obj_add_config.size--; + philos_int_append(obj_add_config.i_o_limit_write_size,&obj_add_config.size,add_get_write_device_size()); + obj_add_config.size--; + yon_char_parsed_append(obj_add_config.i_o_limit_read,&obj_add_config.size,add_get_read_device()); + obj_add_config.size--; + yon_char_parsed_append(obj_add_config.i_o_limit_write,&obj_add_config.size,add_get_write_device()); + } + +} +void event_check_io_device() { + add_del_disk(); + add_disk_all(); + add_init_windows(); +} void add_event(add_window *widgets) { g_signal_connect(G_OBJECT(widgets->btnAddCancel),"clicked",G_CALLBACK(add_on_destroy_subwindow),NULL); @@ -75,8 +180,8 @@ void add_event(add_window *widgets) { g_signal_connect(G_OBJECT(widgets->chkSevereRestrictionAdd), "toggled", G_CALLBACK(add_init_windows), NULL); g_signal_connect(G_OBJECT(widgets->chkPaddingFLAdd), "toggled", G_CALLBACK(add_init_windows), NULL); g_signal_connect(G_OBJECT(widgets->chkCPULimitAdd), "toggled", G_CALLBACK(add_init_windows), NULL); - g_signal_connect(G_OBJECT(widgets->chbAddRead), "toggled", G_CALLBACK(add_init_windows), NULL); - g_signal_connect(G_OBJECT(widgets->chbAddWrite), "toggled", G_CALLBACK(add_init_windows), NULL); + g_signal_connect(G_OBJECT(widgets->chbAddRead), "toggled", G_CALLBACK(event_check_io_device), NULL); + g_signal_connect(G_OBJECT(widgets->chbAddWrite), "toggled", G_CALLBACK(event_check_io_device), NULL); g_signal_connect(G_OBJECT(widgets->cbxAddQuotaObj),"changed",G_CALLBACK(add_update_combo_box), NULL); g_signal_connect(G_OBJECT(widgets->cbxAddQuotaLevel2),"changed",G_CALLBACK(add_init_windows), NULL); diff --git a/source/view_add.h b/source/view_add.h index ed82fc7..3b9a9a7 100644 --- a/source/view_add.h +++ b/source/view_add.h @@ -20,6 +20,15 @@ static char* CMD_GET_GROUP; static char* CMD_GET_SLICE_SERVICE; + +typedef struct { + config_str disk; + config_str i_o_limit_read; + config_str i_o_limit_write; + int* i_o_limit_read_size; + int* i_o_limit_write_size; + int size; +} add_config; // Переменные typedef struct { @@ -84,7 +93,9 @@ int add_get_hard_size(); int add_get_limit_cpu_size(); int add_get_limit_swap_size(); int add_get_quota_object_size(); - +add_config* get_add_config(); +void add_config_init(); +void add_disk_all(); void add_set_active_widgets_device_io(GtkWidget *check, GtkWidget *spin, GtkWidget *combo); void add_get_cmd_group(char* cmd_get_group); char* add_get_select_device_to_level_2();