|
|
|
@ -7,6 +7,7 @@ gboolean yon_interface_update(main_window *widgets){
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets);
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets);
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->OptionsEditButton),G_CALLBACK(on_options_open),widgets);
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->OptionsEditButton),G_CALLBACK(on_options_open),widgets);
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets);
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets);
|
|
|
|
|
|
|
|
g_signal_handlers_block_by_func(G_OBJECT(widgets->LayoutChangingCombo),G_CALLBACK(on_options_save),widgets);
|
|
|
|
|
|
|
|
|
|
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0);
|
|
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->KeyboardModelCombo),0);
|
|
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0);
|
|
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0);
|
|
|
|
@ -27,35 +28,42 @@ gboolean yon_interface_update(main_window *widgets){
|
|
|
|
yon_layout_load(layouts_parsed[i],widgets);
|
|
|
|
yon_layout_load(layouts_parsed[i],widgets);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
gtk_list_store_clear(widgets->OptionsList);
|
|
|
|
|
|
|
|
char *options = config(options_parameter);
|
|
|
|
|
|
|
|
if (!yon_char_is_empty(options)){
|
|
|
|
|
|
|
|
gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),options);
|
|
|
|
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
|
|
|
int size;
|
|
|
|
|
|
|
|
config_str parsed = yon_char_parse(options,&size,",");
|
|
|
|
|
|
|
|
gtk_combo_box_set_active_id(GTK_COMBO_BOX(widgets->LayoutChangingCombo),parsed[0]);
|
|
|
|
|
|
|
|
for (int i=1;i<size;i++){
|
|
|
|
|
|
|
|
char *cur_string = (char*)g_hash_table_lookup(main_config.options,parsed[i]);
|
|
|
|
|
|
|
|
if (yon_char_is_empty(cur_string)) continue;
|
|
|
|
|
|
|
|
int option_parsed_size;
|
|
|
|
|
|
|
|
config_str option_parsed = yon_char_parse(cur_string,&option_parsed_size,"|");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gtk_list_store_append(widgets->OptionsList,&iter);
|
|
|
|
|
|
|
|
gtk_list_store_set(widgets->OptionsList,&iter,0,option_parsed[0],1,_(option_parsed[1]),-1);
|
|
|
|
|
|
|
|
yon_char_parsed_free(option_parsed,option_parsed_size);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
yon_char_parsed_free(parsed,size);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
gtk_entry_set_text(GTK_ENTRY(widgets->ManualEntry),"");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char *name = yon_config_get_by_key(num_lock_boot_parameter);
|
|
|
|
char *name = yon_config_get_by_key(num_lock_boot_parameter);
|
|
|
|
if (name) {
|
|
|
|
if (name) {
|
|
|
|
if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),1);
|
|
|
|
if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),1);
|
|
|
|
else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),2);
|
|
|
|
else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0);
|
|
|
|
|
|
|
|
if (main_config.layouts_list){
|
|
|
|
|
|
|
|
int size=0;
|
|
|
|
|
|
|
|
name = yon_config_get_by_key(keyboard_layout_parameter);
|
|
|
|
|
|
|
|
config_str layouts = yon_char_parse(name,&size,",");
|
|
|
|
|
|
|
|
GtkTreeIter iter, itar;
|
|
|
|
|
|
|
|
char *rid,*rname;
|
|
|
|
|
|
|
|
gtk_list_store_clear(widgets->LayoutsList);
|
|
|
|
|
|
|
|
for (int i=0;i<size;i++){
|
|
|
|
|
|
|
|
for_iter(main_config.layouts_list,&iter){
|
|
|
|
|
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(main_config.layouts_list),&iter,0,&rid,1,&rname,-1);
|
|
|
|
|
|
|
|
if (!strcmp(layouts[i],rid)){
|
|
|
|
|
|
|
|
gtk_list_store_append(widgets->LayoutsList,&itar);
|
|
|
|
|
|
|
|
gtk_list_store_set(widgets->LayoutsList,&itar,0,rname,1,rid,2,1,-1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets);
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->KeyboardModelCombo),G_CALLBACK(on_model_changed),widgets);
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->OptionsEditButton),G_CALLBACK(on_options_open),widgets);
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->OptionsEditButton),G_CALLBACK(on_options_open),widgets);
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets);
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->NumLockCombo),G_CALLBACK(on_num_lock_changed),widgets);
|
|
|
|
|
|
|
|
g_signal_handlers_unblock_by_func(G_OBJECT(widgets->LayoutChangingCombo),G_CALLBACK(on_options_save),widgets);
|
|
|
|
return G_SOURCE_REMOVE;
|
|
|
|
return G_SOURCE_REMOVE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -85,10 +93,10 @@ void on_model_changed(GtkComboBoxText *self, main_window *widgets){
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void yon_config_init(){
|
|
|
|
void yon_config_init(){
|
|
|
|
int size;
|
|
|
|
int size;
|
|
|
|
main_config.layouts_store = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
|
|
|
|
|
|
|
|
main_config.models_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
|
|
|
|
main_config.models_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
|
|
|
|
GtkTreeIter iter;
|
|
|
|
GtkTreeIter iter;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
main_config.layouts_store = gtk_tree_store_new(4,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
|
|
|
|
main_config.variants_list = yon_config_load(layouts_variant_command,&main_config.variants_size);
|
|
|
|
main_config.variants_list = yon_config_load(layouts_variant_command,&main_config.variants_size);
|
|
|
|
main_config.layouts_list = yon_config_load(layouts_command,&main_config.layouts_size);
|
|
|
|
main_config.layouts_list = yon_config_load(layouts_command,&main_config.layouts_size);
|
|
|
|
for (int i=0;i<main_config.variants_size;i++){
|
|
|
|
for (int i=0;i<main_config.variants_size;i++){
|
|
|
|
@ -98,6 +106,44 @@ void yon_config_init(){
|
|
|
|
yon_char_remove_last_symbol(main_config.layouts_list[i],'\n');
|
|
|
|
yon_char_remove_last_symbol(main_config.layouts_list[i],'\n');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int size;
|
|
|
|
|
|
|
|
config_str option_commands = yon_char_parsed_new(&size,
|
|
|
|
|
|
|
|
lv2_options_command,
|
|
|
|
|
|
|
|
lv3_options_command,
|
|
|
|
|
|
|
|
ctrl_options_command,
|
|
|
|
|
|
|
|
grp_led_options_command,
|
|
|
|
|
|
|
|
mod_led_options_command,
|
|
|
|
|
|
|
|
keypad_options_command,
|
|
|
|
|
|
|
|
kpdl_options_command,
|
|
|
|
|
|
|
|
caps_options_command,
|
|
|
|
|
|
|
|
altwin_options_command,
|
|
|
|
|
|
|
|
Compose_options_command,
|
|
|
|
|
|
|
|
compat_options_command,
|
|
|
|
|
|
|
|
currencysign_options_command,
|
|
|
|
|
|
|
|
lv5_options_command,
|
|
|
|
|
|
|
|
nbsp_options_command,
|
|
|
|
|
|
|
|
japan_options_command,
|
|
|
|
|
|
|
|
korean_options_command,
|
|
|
|
|
|
|
|
esperanto_options_command,
|
|
|
|
|
|
|
|
solaris_options_command,
|
|
|
|
|
|
|
|
terminate_options_command,
|
|
|
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char *command_full = yon_char_parsed_to_string(option_commands,size,"; ");
|
|
|
|
|
|
|
|
main_config.options = g_hash_table_new(g_str_hash,g_str_equal);
|
|
|
|
|
|
|
|
int options_size;
|
|
|
|
|
|
|
|
config_str options = yon_config_load(command_full,&options_size);
|
|
|
|
|
|
|
|
for(int i=0;i<options_size;i++){
|
|
|
|
|
|
|
|
int parsed_size;
|
|
|
|
|
|
|
|
config_str parsed = yon_char_parse(options[i],&parsed_size,"|");
|
|
|
|
|
|
|
|
g_hash_table_insert(main_config.options,yon_char_new(parsed[0]),yon_char_new(options[i]));
|
|
|
|
|
|
|
|
yon_char_parsed_free(parsed,parsed_size);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
free(command_full);
|
|
|
|
|
|
|
|
yon_char_parsed_free(options,options_size);
|
|
|
|
|
|
|
|
yon_char_parsed_free(option_commands,size);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
main_config.options_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
|
|
|
|
main_config.options_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN);
|
|
|
|
config_str rtn = yon_config_load(get_options_command,&size);
|
|
|
|
config_str rtn = yon_config_load(get_options_command,&size);
|
|
|
|
@ -111,6 +157,30 @@ void yon_config_init(){
|
|
|
|
yon_char_parsed_free(rtn,size);
|
|
|
|
yon_char_parsed_free(rtn,size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void on_compose_switch(GtkWidget *,int status,main_window *widgets){
|
|
|
|
|
|
|
|
switch(status){
|
|
|
|
|
|
|
|
case 0:{
|
|
|
|
|
|
|
|
yon_config_remove_element(options_parameter,"compose:rwin",",");
|
|
|
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
case 1:{
|
|
|
|
|
|
|
|
yon_config_append_element(options_parameter,"compose:rwin",",");
|
|
|
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
yon_interface_update(widgets);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void on_scroll_lock_switch(GtkWidget *,int status,main_window *widgets){
|
|
|
|
|
|
|
|
switch(status){
|
|
|
|
|
|
|
|
case 0:{
|
|
|
|
|
|
|
|
yon_config_remove_element(options_parameter,"grp_led:scroll",",");
|
|
|
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
case 1:{
|
|
|
|
|
|
|
|
yon_config_append_element(options_parameter,"grp_led:scroll",",");
|
|
|
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
yon_interface_update(widgets);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void yon_main_window_complete(main_window *widgets){
|
|
|
|
void yon_main_window_complete(main_window *widgets){
|
|
|
|
widgets = yon_remalloc(widgets,sizeof(main_window));
|
|
|
|
widgets = yon_remalloc(widgets,sizeof(main_window));
|
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
|
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
|
|
|
|
@ -130,9 +200,10 @@ void yon_main_window_complete(main_window *widgets){
|
|
|
|
widgets->ComposeSwitch = yon_gtk_builder_get_widget(builder,"ComposeSwitch");
|
|
|
|
widgets->ComposeSwitch = yon_gtk_builder_get_widget(builder,"ComposeSwitch");
|
|
|
|
widgets->ScrollLockSwitch = yon_gtk_builder_get_widget(builder,"ScrollLockSwitch");
|
|
|
|
widgets->ScrollLockSwitch = yon_gtk_builder_get_widget(builder,"ScrollLockSwitch");
|
|
|
|
widgets->ManualEntry = yon_gtk_builder_get_widget(builder,"ManualEntry");
|
|
|
|
widgets->ManualEntry = yon_gtk_builder_get_widget(builder,"ManualEntry");
|
|
|
|
widgets->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumlockCombo");
|
|
|
|
widgets->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumLockCombo");
|
|
|
|
widgets->TTYLayoutCombo = yon_gtk_builder_get_widget(builder,"TTYLayoutCombo");
|
|
|
|
widgets->TTYLayoutCombo = yon_gtk_builder_get_widget(builder,"TTYLayoutCombo");
|
|
|
|
widgets->LayoutsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"LayoutsList"));
|
|
|
|
widgets->LayoutsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"LayoutsList"));
|
|
|
|
|
|
|
|
widgets->OptionsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"OptionsList"));
|
|
|
|
|
|
|
|
|
|
|
|
/* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */
|
|
|
|
/* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */
|
|
|
|
// yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING);
|
|
|
|
// yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING);
|
|
|
|
@ -142,8 +213,13 @@ void yon_main_window_complete(main_window *widgets){
|
|
|
|
g_signal_connect(G_OBJECT(widgets->LayoutAddButton),"clicked",G_CALLBACK(on_system_layouts_add),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->LayoutAddButton),"clicked",G_CALLBACK(on_system_layouts_add),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->LayoutRemoveButton),"clicked",G_CALLBACK(on_system_layouts_remove),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->LayoutRemoveButton),"clicked",G_CALLBACK(on_system_layouts_remove),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->KeyboardModelCombo),"changed",G_CALLBACK(on_model_changed),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->KeyboardModelCombo),"changed",G_CALLBACK(on_model_changed),widgets);
|
|
|
|
// g_signal_connect(G_OBJECT(widgets->SystemKeyboardOptionsCombo),"clicked",G_CALLBACK(on_options_open),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->OptionsEditButton),"clicked",G_CALLBACK(on_options_open),widgets);
|
|
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->OptionsRemoveButton),"clicked",G_CALLBACK(on_option_remove),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets);
|
|
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->LayoutChangingCombo),"changed",G_CALLBACK(on_options_save),widgets);
|
|
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->ComposeSwitch),"state-set",G_CALLBACK(on_compose_switch),widgets);
|
|
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->ScrollLockSwitch),"state-set",G_CALLBACK(on_scroll_lock_switch),widgets);
|
|
|
|
|
|
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutTree);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutTree);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutAddButton);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutAddButton);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutRemoveButton);
|
|
|
|
g_signal_connect(G_OBJECT(widgets->DefaultLayoutsSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch_inversed),widgets->LayoutRemoveButton);
|
|
|
|
@ -167,6 +243,20 @@ void yon_main_window_complete(main_window *widgets){
|
|
|
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(widgets->KeyboardModelCombo),parsed[0],_(parsed[1]));
|
|
|
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(widgets->KeyboardModelCombo),parsed[0],_(parsed[1]));
|
|
|
|
yon_char_parsed_free(parsed,parsed_size);
|
|
|
|
yon_char_parsed_free(parsed,parsed_size);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int size;
|
|
|
|
|
|
|
|
config_str options = yon_config_load(grp_options_command,&size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int i=0;i<size;i++){
|
|
|
|
|
|
|
|
yon_char_remove_last_symbol(options[i],'\n');
|
|
|
|
|
|
|
|
int parsed_size;
|
|
|
|
|
|
|
|
config_str parsed = yon_char_parse(options[i],&parsed_size,"|");
|
|
|
|
|
|
|
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(widgets->LayoutChangingCombo),parsed[0],_(parsed[1]));
|
|
|
|
|
|
|
|
yon_char_parsed_free(parsed,parsed_size);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
yon_char_parsed_free(options,size);
|
|
|
|
|
|
|
|
}
|
|
|
|
yon_char_parsed_free(models,size);
|
|
|
|
yon_char_parsed_free(models,size);
|
|
|
|
|
|
|
|
|
|
|
|
yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size);
|
|
|
|
yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size);
|
|
|
|
@ -179,7 +269,7 @@ void yon_main_window_complete(main_window *widgets){
|
|
|
|
int main(int argc, char *argv[]){
|
|
|
|
int main(int argc, char *argv[]){
|
|
|
|
setlocale(LC_ALL, "");
|
|
|
|
setlocale(LC_ALL, "");
|
|
|
|
textdomain (LocaleName);
|
|
|
|
textdomain (LocaleName);
|
|
|
|
|
|
|
|
yon_config_init();
|
|
|
|
yon_ubl_connect_config((_template_config*)&main_config);
|
|
|
|
yon_ubl_connect_config((_template_config*)&main_config);
|
|
|
|
yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK);
|
|
|
|
yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK);
|
|
|
|
config_str unfound = NULL;
|
|
|
|
config_str unfound = NULL;
|
|
|
|
|