diff --git a/gresource.xml b/gresource.xml
index a1da154..ef6c431 100644
--- a/gresource.xml
+++ b/gresource.xml
@@ -18,5 +18,6 @@
grub-parameters.csv
grub-terminal-input.csv
grub-terminal-output.csv
+ grub-melody.csv
\ No newline at end of file
diff --git a/grub-melody.csv b/grub-melody.csv
new file mode 100644
index 0000000..070f201
--- /dev/null
+++ b/grub-melody.csv
@@ -0,0 +1,2 @@
+Option|Tone code
+ubbeep|480 900 2 1000 2 800 2 400 2 600 3
\ No newline at end of file
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 594b711..37dad89 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -40,6 +40,7 @@ set(DEPENDFILES
../grub-parameters.csv
../grub-terminal-input.csv
../grub-terminal-output.csv
+ ../grub-melody.csv
../gresource.xml
../ubl-settings-bootloader-banner.png
../ubl-settings-bootloader.css
diff --git a/source/ubl-settings-bootloader-melody.c b/source/ubl-settings-bootloader-melody.c
index 931ad51..24c4704 100644
--- a/source/ubl-settings-bootloader-melody.c
+++ b/source/ubl-settings-bootloader-melody.c
@@ -5,6 +5,29 @@ void on_ringtone_accept(GtkWidget *,dictionary *dict){
yon_ringtone_window *window = yon_dictionary_get_data(dict->first->next,yon_ringtone_window*);
const char *username = gtk_entry_get_text(GTK_ENTRY(window->NameEntry));
const char *password = gtk_entry_get_text(GTK_ENTRY(window->CodeEntry));
+ if (!yon_char_is_empty(window->prev_name)){
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->BootUsersList);
+ for_iter(model,&iter){
+ char *name;
+ int user_created;
+ gtk_tree_model_get(model,&iter,1,&name,3,&user_created,-1);
+ if (user_created){
+ if (!strcmp(name,username)){
+ dialog_confirmation_data *data = yon_confirmation_dialog_data_new();
+ data->action_text = USER_EXIST_LABEL(username);
+ if (yon_confirmation_dialog_call(window->Window,data)!=GTK_RESPONSE_ACCEPT){
+ return;
+ }
+ break;
+ }
+ } else {
+ yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NAME_OCCUPIED_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
+ yon_ubl_status_highlight_incorrect(window->NameEntry);
+ return;
+ }
+ }
+ }
// if (yon_char_is_empty(username)){
// yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
// yon_ubl_status_highlight_incorrect(window->NameEntry);
@@ -23,20 +46,15 @@ void on_ringtone_accept(GtkWidget *,dictionary *dict){
}
}
yon_window_config_add_instant_parameter((char*)username,"melodies",(char*)password,YON_TYPE_STRING);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ChooseCheck))){
- yon_config_register(GRUB_PLAY_parameter,GRUB_PLAY_command,(char*)password);
- } else {
- char *config_melody = config(GRUB_PLAY_parameter);
- if (!yon_char_is_empty(config_melody)&&!strcmp(config_melody,password)){
- yon_config_remove_by_key(GRUB_PLAY_parameter);
- }
- }
gtk_widget_destroy(window->Window);
yon_interface_update(widgets);
}
void on_ringtone_add_clicked(GtkWidget *,main_window *widgets){
yon_ringtone_window *window = yon_ringtone_window_new();
+ char *title = RINGTONE_ADD_TITLE_LABEL;
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),title,icon_path,"ringtone_add_window");
+ gtk_label_set_text(GTK_LABEL(window->TitleLabel),title);
dictionary *dict = NULL;
yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets);
@@ -57,9 +75,12 @@ void on_ringtone_edit_clicked(GtkWidget *,main_window *widgets){
int is_chosen;
char *name, *code;
gtk_tree_model_get(model,&iter,0,&is_chosen,1,&name,2,&code,-1);
+ char *title = RINGTONE_EDIT_TITLE_LABEL(name);
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),title,icon_path,"ringtone_add_window");
+ gtk_label_set_text(GTK_LABEL(window->TitleLabel),title);
+ free(title);
window->prev_name = yon_char_new(name);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->ChooseCheck),is_chosen);
gtk_entry_set_text(GTK_ENTRY(window->NameEntry),name);
gtk_entry_set_text(GTK_ENTRY(window->CodeEntry),code);
dictionary *dict = NULL;
@@ -83,6 +104,7 @@ void on_ringtone_remove_clicked(GtkWidget *,main_window *widgets){
data->data=NULL;
data->function=NULL;
data->action_text = RINGTONE_REMOVE_CONFIRM_LABEL(name);
+ data->title = RINGTONE_DELETE_TITLE_LABEL(name);
if (yon_confirmation_dialog_call(widgets->Window,data)==GTK_RESPONSE_ACCEPT){
char *config_code = config(GRUB_PLAY_parameter);
yon_window_config_erase_instant_parameter(name,"melodies");
@@ -101,7 +123,6 @@ yon_ringtone_window *yon_ringtone_window_new(){
window->Window = yon_gtk_builder_get_widget(builder,"MainWindow");
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
window->TitleLabel = yon_gtk_builder_get_widget(builder,"TitleLabel");
- window->ChooseCheck = yon_gtk_builder_get_widget(builder,"ChooseCheck");
window->NameEntry = yon_gtk_builder_get_widget(builder,"NameEntry");
window->CodeEntry = yon_gtk_builder_get_widget(builder,"CodeEntry");
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
diff --git a/source/ubl-settings-bootloader-user.c b/source/ubl-settings-bootloader-user.c
index 524f2b9..71f8a40 100644
--- a/source/ubl-settings-bootloader-user.c
+++ b/source/ubl-settings-bootloader-user.c
@@ -4,6 +4,22 @@ void on_user_accept(GtkWidget *,dictionary *dict){
main_window *widgets = yon_dictionary_get_data(dict->first,main_window*);
yon_user_window *window = yon_dictionary_get_data(dict->first->next,yon_user_window*);
const char *username = gtk_entry_get_text(GTK_ENTRY(window->UsernameEntry));
+
+ if (!yon_char_is_empty(window->prev_name)){
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->BootUsersList);
+ for_iter(model,&iter){
+ char *name;
+ gtk_tree_model_get(model,&iter,1,&name,-1);
+ if (!strcmp(name,username)){
+ dialog_confirmation_data *data = yon_confirmation_dialog_data_new();
+ data->action_text = USER_EXIST_LABEL(username);
+ if (yon_confirmation_dialog_call(window->Window,data)!=GTK_RESPONSE_ACCEPT){
+ return;
+ }
+ }
+ }
+ }
const char *password = gtk_entry_get_text(GTK_ENTRY(window->PasswordEntry));
if (yon_char_is_empty(username)){
yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE);
@@ -61,7 +77,9 @@ void on_user_accept(GtkWidget *,dictionary *dict){
void on_user_add_clicked(GtkWidget *,main_window *widgets){
yon_user_window *window = yon_user_window_new();
-
+ char *title = USER_ADD_TITLE_LABEL;
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),title,icon_path,"ringtone_add_window");
+ gtk_label_set_text(GTK_LABEL(window->TitleLabel),title);
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);
@@ -81,6 +99,9 @@ void on_user_edit_clicked(GtkWidget *,main_window *widgets){
int is_admin;
char *name;
gtk_tree_model_get(model,&iter,0,&is_admin,1,&name,-1);
+ char *title = USER_EDIT_TITLE_LABEL(name);
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),title,icon_path,"ringtone_add_window");
+ gtk_label_set_text(GTK_LABEL(window->TitleLabel),title);
window->prev_name = yon_char_new(name);
char *password = config(GRUB_PASSWORD(name));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->AdminCheck),is_admin);
@@ -107,6 +128,7 @@ void on_user_remove_clicked(GtkWidget *,main_window *widgets){
gtk_tree_model_get(model,&iter,1,&name,-1);
dialog_confirmation_data *data = yon_confirmation_dialog_data_new();
data->action_text = USER_REMOVE_CONFIRM_LABEL(name);
+ data->title = USER_DELETE_TITLE_LABEL(name);
if (yon_confirmation_dialog_call(widgets->Window,data)==GTK_RESPONSE_ACCEPT){
yon_config_remove_by_key(GRUB_PASSWORD(name));
yon_interface_update(widgets);
diff --git a/source/ubl-settings-bootloader.c b/source/ubl-settings-bootloader.c
index eff6fc9..d4d7786 100644
--- a/source/ubl-settings-bootloader.c
+++ b/source/ubl-settings-bootloader.c
@@ -189,17 +189,37 @@ void yon_interface_update(main_window *widgets){
}
}
{
+ GtkTreeIter iter;
+ int ringtones_size;
+ config_str standard_ringtones = yon_resource_open_file(melody_path,&ringtones_size);
+ for (int i=1;iBootRingtoneList,&iter);
+ gtk_list_store_set(widgets->BootRingtoneList,&iter,0,0,1,key,2,code,-1);
+ }
char *ringtone = config(GRUB_PLAY_parameter);
gsize size=0;
config_str codes = yon_window_config_get_section("melodies",&size);
- GtkTreeIter iter;
for (gsize i=0;iBootRingtoneList,&iter);
- gtk_list_store_set(widgets->BootRingtoneList,&iter,0,!yon_char_is_empty(ringtone)&&!strcmp(ringtone,cur_code),1,name,2,cur_code,-1);
+ int found = 0;
+ for_iter(GTK_TREE_MODEL(widgets->BootRingtoneList),&iter){
+ char *key;
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->BootRingtoneList),&iter,1,&key,-1);
+ if (!strcmp(key,name)){
+ found = 1;
+ break;
+ }
+ }
+ if (!found){
+ gtk_list_store_append(widgets->BootRingtoneList,&iter);
+ }
+ gtk_list_store_set(widgets->BootRingtoneList,&iter,0,!yon_char_is_empty(ringtone)&&!strcmp(ringtone,cur_code),1,name,2,cur_code,3,1,-1);
free(cur_code);
free(name);
}
@@ -442,6 +462,56 @@ void on_output_option_switch(GtkCellRenderer *,char *path, main_window *widgets)
}
}
+
+void on_tree_view_selection_changed(GtkWidget *self, main_window *widgets){
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+ if (self == widgets->BootUsersTree){
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->BootUsersTree)),&model,&iter)) {
+ gtk_widget_set_sensitive(widgets->BootUsersEditButton,1);
+ gtk_widget_set_sensitive(widgets->BootUsersRemoveButton,1);
+ } else {
+ gtk_widget_set_sensitive(widgets->BootUsersEditButton,0);
+ gtk_widget_set_sensitive(widgets->BootUsersRemoveButton,0);
+ }
+ } else if (self == widgets->BootRingtoneTree){
+
+ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->BootRingtoneTree)),&model,&iter)) {
+ int user_created;
+ gtk_tree_model_get(model,&iter,3,&user_created,-1);
+ if (user_created){
+ gtk_widget_set_sensitive(widgets->BootRingtoneEditButton,1);
+ gtk_widget_set_sensitive(widgets->BootRingtoneRemoveButton,1);
+ } else {
+ gtk_widget_set_sensitive(widgets->BootRingtoneEditButton,0);
+ gtk_widget_set_sensitive(widgets->BootRingtoneRemoveButton,0);
+ }
+ } else {
+ gtk_widget_set_sensitive(widgets->BootRingtoneEditButton,0);
+ gtk_widget_set_sensitive(widgets->BootRingtoneRemoveButton,0);
+ }
+ }
+}
+
+void on_melody_toggled(GtkCellRenderer *, char *path, main_window *widgets){
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->BootRingtoneList);
+ GtkTreePath *cur_path = gtk_tree_path_new_from_string(path);
+
+ for_iter(model,&iter){
+ GtkTreePath *compare_path = gtk_tree_model_get_path(model,&iter);
+ if (gtk_tree_path_compare(cur_path,compare_path)){
+ gtk_list_store_set(widgets->BootRingtoneList,&iter,0,0,-1);
+ } else {
+ gtk_list_store_set(widgets->BootRingtoneList,&iter,0,1,-1);
+ char *code;
+ gtk_tree_model_get(model,&iter,2,&code,-1);
+ yon_config_register(GRUB_PLAY_parameter,GRUB_PLAY_command,(char*)code);
+ }
+ gtk_tree_path_free(compare_path);
+ }
+ gtk_tree_path_free(cur_path);
+}
// standard functions
/**config_init()
@@ -534,6 +604,7 @@ void yon_main_window_complete(main_window *widgets){
widgets->KernelParametersList = GTK_LIST_STORE(gtk_builder_get_object(builder,"KernelParametersList"));
widgets->InputTerminalList = GTK_LIST_STORE(gtk_builder_get_object(builder,"InputTerminalList"));
widgets->OutputTerminalList = GTK_LIST_STORE(gtk_builder_get_object(builder,"OutputTerminalList"));
+ widgets->MelodyChosenCellRenderer = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"MelodyChosenCellRenderer"));
}
@@ -545,6 +616,7 @@ void yon_main_window_complete(main_window *widgets){
g_signal_connect(G_OBJECT(widgets->BootRingtoneEditButton),"clicked",G_CALLBACK(on_ringtone_edit_clicked),widgets);
g_signal_connect(G_OBJECT(widgets->BootRingtoneRemoveButton),"clicked",G_CALLBACK(on_ringtone_remove_clicked),widgets);
+ g_signal_connect(G_OBJECT(widgets->MelodyChosenCellRenderer),"toggled",G_CALLBACK(on_melody_toggled),widgets);
g_signal_connect(G_OBJECT(widgets->KernelChooseCell),"toggled",G_CALLBACK(on_kernel_parameter_switch),widgets);
g_signal_connect(G_OBJECT(widgets->InputChosenCell),"toggled",G_CALLBACK(on_input_option_switch),widgets);
g_signal_connect(G_OBJECT(widgets->OutputChosenCell),"toggled",G_CALLBACK(on_output_option_switch),widgets);
@@ -567,6 +639,9 @@ void yon_main_window_complete(main_window *widgets){
g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),NULL);
g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),NULL);
g_signal_connect(G_OBJECT(widgets->SaveCustomMenuItem),"activate",G_CALLBACK(on_config_custom_save),NULL);
+
+ g_signal_connect(G_OBJECT(widgets->BootUsersTree),"cursor-changed",G_CALLBACK(on_tree_view_selection_changed),widgets);
+ g_signal_connect(G_OBJECT(widgets->BootRingtoneTree),"cursor-changed",G_CALLBACK(on_tree_view_selection_changed),widgets);
yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size);
yon_save_window_set_postsave_function(on_save_done,widgets);
@@ -586,9 +661,9 @@ int main(int argc, char *argv[]){
yon_ubl_setup_arguments(argc,argv,&unfound,&size,NULL);
gtk_init(&argc,&argv);
template_main_window *widgets = yon_ubl_window_setup();
- yon_main_window_complete((main_window*)widgets);
char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL);
yon_window_config_load(path);
+ yon_main_window_complete((main_window*)widgets);
main_config.launch_arguments=yon_char_parsed_copy(argv,argc);
main_config.launch_size=argc;
if (getuid()!=0){
diff --git a/source/ubl-settings-bootloader.h b/source/ubl-settings-bootloader.h
index 2ff40b0..b435921 100644
--- a/source/ubl-settings-bootloader.h
+++ b/source/ubl-settings-bootloader.h
@@ -32,6 +32,7 @@
#define kernel_options_path "resource:///com/ublinux/csv/grub-parameters.csv"
#define terminal_input_path "resource:///com/ublinux/csv/grub-terminal-input.csv"
#define terminal_output_path "resource:///com/ublinux/csv/grub-terminal-output.csv"
+#define melody_path "resource:///com/ublinux/csv/grub-melody.csv"
#define LocaleName "ubl-settings-bootloader"
@@ -126,6 +127,7 @@ typedef struct {
GtkWidget *OutputTerminalEntry;
GtkWidget *OutputTerminalTree;
+ GtkCellRenderer *MelodyChosenCellRenderer;
GtkCellRenderer *KernelChooseCell;
GtkCellRenderer *OutputChosenCell;
GtkCellRenderer *InputChosenCell;
@@ -174,7 +176,6 @@ typedef struct {
GtkWidget *StatusBox;
GtkWidget *TitleLabel;
- GtkWidget *ChooseCheck;
GtkWidget *NameEntry;
GtkWidget *CodeEntry;
@@ -272,4 +273,6 @@ void on_menu_chosen(GtkWidget *, yon_menu_item *item);
void on_submenu_open(GtkWidget *,yon_menu_item *item);
void on_children_clean(GtkWidget*, yon_menu_window *window);
gboolean yon_on_revealer_switched (yon_menu_window *window);
-void yon_save_window_hide_passwords(template_saving_window *window);
\ No newline at end of file
+void yon_save_window_hide_passwords(template_saving_window *window);
+void on_tree_view_selection_changed(GtkWidget *self, main_window *widgets);
+void on_melody_toggled(GtkCellRenderer *self, char *path, main_window *widgets);
\ No newline at end of file
diff --git a/source/ubl-strings.h b/source/ubl-strings.h
index 41f9dba..97ec6fb 100644
--- a/source/ubl-strings.h
+++ b/source/ubl-strings.h
@@ -52,14 +52,18 @@
#define USER_ADD_TITLE_LABEL _("Add user")
#define USER_EDIT_TITLE_LABEL(target) yon_char_unite(_("Edit user")," - ", target,NULL)
+#define USER_DELETE_TITLE_LABEL(target) yon_char_unite(_("Delete user")," - ",target,NULL)
#define ADMINISTRATOR_LABEL _("Administrator")
#define USER_NAME_LABEL _("User name:")
#define USER_PASSWORD_LABEL _("User password:")
#define USER_REMOVE_CONFIRM_LABEL(target) yon_char_unite(_("Are you sure you want to remove user")," ",target," ",_("from boot menu users"),"?",NULL)
+ #define USER_EXIST_LABEL(target) yon_char_unite("User"," ", target," ", _("is already exists. Do you really want to save user")," ",target,"?",NULL)
#define RINGTONE_ADD_TITLE_LABEL _("Add ringtone")
#define RINGTONE_EDIT_TITLE_LABEL(target) yon_char_unite(_("Edit ringtone")," - ", target,NULL)
+#define RINGTONE_DELETE_TITLE_LABEL(target) yon_char_unite(_("Delete ringtone")," - ",target,NULL)
#define CHOSEN_LABEL _("Chosen")
#define NAME_TEXT_LABEL _("Name:")
#define MELODY_CODE_TEXT_LABEL _("Melody code:")
- #define RINGTONE_REMOVE_CONFIRM_LABEL(target) yon_char_unite(_("Are you sure you want to remove ringtone")," ",target,"?",NULL)
\ No newline at end of file
+ #define RINGTONE_REMOVE_CONFIRM_LABEL(target) yon_char_unite(_("Are you sure you want to remove ringtone")," ",target,"?",NULL)
+ #define NAME_OCCUPIED_LABEL _("This ringtone name is already used by standard ringtone")
\ No newline at end of file
diff --git a/ubl-settings-bootloader-ringtone.glade b/ubl-settings-bootloader-ringtone.glade
index 49d1026..3dabd79 100644
--- a/ubl-settings-bootloader-ringtone.glade
+++ b/ubl-settings-bootloader-ringtone.glade
@@ -3,6 +3,16 @@
+
+
diff --git a/ubl-settings-bootloader.glade b/ubl-settings-bootloader.glade
index 67b2691..79ecf1d 100644
--- a/ubl-settings-bootloader.glade
+++ b/ubl-settings-bootloader.glade
@@ -11,6 +11,8 @@
+
+
@@ -396,6 +398,7 @@
True
+ False
False
document-edit-symbolic