|
|
#include "ubl-settings-services.h"
|
|
|
|
|
|
config main_config;
|
|
|
|
|
|
//functions
|
|
|
|
|
|
void yon_load_proceed(YON_CONFIG_TYPE type){
|
|
|
if (yon_config_load_register(type,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL)){
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_config_local_load(GtkWidget *self,main_window *widgets){
|
|
|
if (!main_config.update_thread_active){
|
|
|
main_config.update_thread_active=1;
|
|
|
if (self){};
|
|
|
yon_load_proceed(YON_CONFIG_LOCAL);
|
|
|
yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
|
|
|
g_thread_new("",(GThreadFunc)yon_interface_update,widgets);
|
|
|
main_config.load_mode=1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void on_config_global_load(GtkWidget *self,main_window *widgets){
|
|
|
if (!main_config.update_thread_active){
|
|
|
main_config.update_thread_active=1;
|
|
|
if (self){};
|
|
|
yon_load_proceed(YON_CONFIG_GLOBAL);
|
|
|
yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
|
|
|
g_thread_new("",(GThreadFunc)yon_interface_update,widgets);
|
|
|
main_config.load_mode=0;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_config_global_local_save(){
|
|
|
yon_save_proceed(NULL,YON_CONFIG_BOTH,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL);
|
|
|
}
|
|
|
|
|
|
void on_config_local_save(){
|
|
|
yon_save_proceed("local",YON_CONFIG_LOCAL,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_config_global_save(){
|
|
|
yon_save_proceed("global",YON_CONFIG_GLOBAL,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data)
|
|
|
{
|
|
|
if (error){};
|
|
|
if (!terminal) return;
|
|
|
if (pid == -1) printf("Error\n\n\n");
|
|
|
else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data));
|
|
|
}
|
|
|
|
|
|
void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){
|
|
|
char **commands=new_arr(char*,2);
|
|
|
gchar **envp = g_get_environ();
|
|
|
commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL"));
|
|
|
commands[1]=NULL;
|
|
|
char **env=new_arr(char*,2);
|
|
|
env[0]="";
|
|
|
env[1]=NULL;
|
|
|
vte_terminal_set_size(VTE_TERMINAL(terminal),10,15);
|
|
|
VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL);
|
|
|
vte_terminal_set_pty(VTE_TERMINAL(terminal),pty);
|
|
|
char *install_command=yon_char_unite("clear;tput cup 0 0 && tput ed; ",command," ; sleep 5; stty -echo; unset PS1","\n",NULL);
|
|
|
if(endwork_function)
|
|
|
g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument);
|
|
|
vte_terminal_spawn_async(VTE_TERMINAL(terminal),
|
|
|
VTE_PTY_DEFAULT,
|
|
|
NULL,
|
|
|
commands,
|
|
|
NULL,
|
|
|
0,
|
|
|
NULL, NULL,
|
|
|
NULL,
|
|
|
-1,
|
|
|
NULL,
|
|
|
child_ready,
|
|
|
install_command);
|
|
|
vte_pty_spawn_async(pty,
|
|
|
NULL,
|
|
|
commands,
|
|
|
NULL,
|
|
|
0,
|
|
|
NULL, NULL,
|
|
|
NULL,
|
|
|
-1,
|
|
|
NULL,
|
|
|
NULL,
|
|
|
NULL);
|
|
|
vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1);
|
|
|
vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE);
|
|
|
vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE);
|
|
|
gtk_widget_show_all(terminal);
|
|
|
}
|
|
|
|
|
|
// standard functions
|
|
|
|
|
|
void on_config_autostart_clicked(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreeIter iter;
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
gboolean status = 0;
|
|
|
char *name;
|
|
|
gtk_tree_model_get(model,&iter,0,&status,5,&name,-1);
|
|
|
char *parsed_name = yon_char_divide(name, yon_char_find_last(name,'.'));
|
|
|
free(name);
|
|
|
name=parsed_name;
|
|
|
gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,0,!status,-1);
|
|
|
char *config_sting = yon_config_get_by_key("SERVICESSTART");
|
|
|
int size;
|
|
|
config_str parsed = yon_char_parse(config_sting,&size,",");
|
|
|
int place = yon_char_parsed_check_exist(parsed,size,name);
|
|
|
if (status==0){
|
|
|
if (place ==-1){
|
|
|
if (!yon_config_append("SERVICESSTART",name,",")){
|
|
|
yon_config_register("SERVICESSTART","[config]",name);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (place !=-1){
|
|
|
parsed = yon_char_parsed_rip(parsed,&size,place);
|
|
|
if (parsed)
|
|
|
yon_config_set("SERVICESSTART",yon_char_parsed_to_string(parsed,size,","));
|
|
|
else yon_config_remove_by_key("SERVICESSTART");
|
|
|
}
|
|
|
}
|
|
|
yon_char_parsed_free(parsed,size);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void on_config_autostop_clicked(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreeIter iter;
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
gboolean status = 0;
|
|
|
char *name;
|
|
|
gtk_tree_model_get(model,&iter,1,&status,5,&name,-1);
|
|
|
char *parsed_name = yon_char_divide(name, yon_char_find_last(name,'.'));
|
|
|
free(name);
|
|
|
name=parsed_name;
|
|
|
gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,1,!status,-1);
|
|
|
char *config_sting = yon_config_get_by_key("SERVICESNOSTART");
|
|
|
int size;
|
|
|
config_str parsed = yon_char_parse(config_sting,&size,",");
|
|
|
int place = yon_char_parsed_check_exist(parsed,size,name);
|
|
|
if (status==0){
|
|
|
if (place ==-1){
|
|
|
if (!yon_config_append("SERVICESNOSTART",name,",")){
|
|
|
yon_config_register("SERVICESNOSTART","[config]",name);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (place !=-1){
|
|
|
parsed = yon_char_parsed_rip(parsed,&size,place);
|
|
|
if (parsed)
|
|
|
yon_config_set("SERVICESNOSTART",yon_char_parsed_to_string(parsed,size,","));
|
|
|
else yon_config_remove_by_key("SERVICESNOSTART");
|
|
|
}
|
|
|
}
|
|
|
yon_char_parsed_free(parsed,size);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_config_block_clicked(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreeIter iter;
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
gboolean status = 0;
|
|
|
char *name;
|
|
|
gtk_tree_model_get(model,&iter,2,&status,5,&name,-1);
|
|
|
char *parsed_name = yon_char_divide(name, yon_char_find_last(name,'.'));
|
|
|
free(name);
|
|
|
name=parsed_name;
|
|
|
gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,2,!status,-1);
|
|
|
char *config_sting = yon_config_get_by_key("SERVICESMASK");
|
|
|
int size;
|
|
|
config_str parsed = yon_char_parse(config_sting,&size,",");
|
|
|
int place = yon_char_parsed_check_exist(parsed,size,name);
|
|
|
if (status==0){
|
|
|
if (place ==-1){
|
|
|
if (!yon_config_append("SERVICESMASK",name,",")){
|
|
|
yon_config_register("SERVICESMASK","[config]",name);
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
if (place !=-1){
|
|
|
parsed = yon_char_parsed_rip(parsed,&size,place);
|
|
|
if (parsed)
|
|
|
yon_config_set("SERVICESMASK",yon_char_parsed_to_string(parsed,size,","));
|
|
|
else yon_config_remove_by_key("SERVICESMASK");
|
|
|
}
|
|
|
}
|
|
|
yon_char_parsed_free(parsed,size);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_system_autostart_clicked(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreeIter iter;
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
gboolean status = 0;
|
|
|
char *service_name;
|
|
|
gtk_tree_model_get(model,&iter,3,&status,5,&service_name,-1);
|
|
|
gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,3,!status,-1);
|
|
|
yon_launch((!status)==1 ? service_enable_command(service_name) : \
|
|
|
service_disable_command(service_name));
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_system_launch_clicked(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreeIter iter;
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
gboolean status = 0;
|
|
|
char *service_name;
|
|
|
gtk_tree_model_get(model,&iter,4,&status,5,&service_name,-1);
|
|
|
gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,4,!status,-1);
|
|
|
yon_launch((!status)==1 ? service_start_command(service_name) : \
|
|
|
service_stop_command(service_name));
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
gboolean yon_service_source_check(GtkTreeModel *model, GtkTreeIter *iter,void *data){
|
|
|
if (data){};
|
|
|
int type;
|
|
|
gtk_tree_model_get(model,iter,8,&type,-1);
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
void on_source_changed(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreePath *path = gtk_tree_path_new();
|
|
|
GtkTreeModel *model = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),path);
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model),(GtkTreeModelFilterVisibleFunc)yon_service_source_check,NULL,NULL);
|
|
|
}
|
|
|
|
|
|
gboolean on_service_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){
|
|
|
if (data){};
|
|
|
int type;
|
|
|
gtk_tree_model_get(model,iter,7,&type,-1);
|
|
|
if (type==1)
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
gboolean on_socket_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){
|
|
|
if (data){};
|
|
|
int type;
|
|
|
gtk_tree_model_get(model,iter,7,&type,-1);
|
|
|
if (type==2)
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
gboolean on_autostart_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){
|
|
|
if (data){};
|
|
|
gboolean type;
|
|
|
gtk_tree_model_get(model,iter,0,&type,-1);
|
|
|
if (type)
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
gboolean on_stopped_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){
|
|
|
if (data){};
|
|
|
gboolean type;
|
|
|
gtk_tree_model_get(model,iter,1,&type,-1);
|
|
|
if (type)
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
gboolean on_blocked_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){
|
|
|
if (data){};
|
|
|
gboolean type;
|
|
|
gtk_tree_model_get(model,iter,2,&type,-1);
|
|
|
if (type)
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void on_type_changed(GtkWidget *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
switch (gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo))){
|
|
|
case 0:
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(widgets->liststore2));
|
|
|
break;
|
|
|
case 1:
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.ServiceFilter));
|
|
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter));
|
|
|
break;
|
|
|
case 2:
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.SocketFilter));
|
|
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.SocketFilter));
|
|
|
break;
|
|
|
case 3:
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.AutolaunchFilter));
|
|
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.AutolaunchFilter));
|
|
|
break;
|
|
|
case 4:
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.StoppedFilter));
|
|
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.StoppedFilter));
|
|
|
break;
|
|
|
case 5:
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.BlockedFilter));
|
|
|
gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.BlockedFilter));
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void on_service_update(GtkWidget *self, terminal_window* window){
|
|
|
if (self){};
|
|
|
yon_terminal_integrated_start(window->SystemTerminal,service_info_command(window->target),NULL,NULL);
|
|
|
GdkRGBA rgba;
|
|
|
vte_terminal_get_color_background_for_draw(VTE_TERMINAL(window->SystemTerminal),&rgba);
|
|
|
vte_terminal_set_color_cursor(VTE_TERMINAL(window->SystemTerminal),&rgba);
|
|
|
}
|
|
|
|
|
|
terminal_window *yon_terminal_window_new(){
|
|
|
terminal_window *window = malloc(sizeof(terminal_window));
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_terminal);
|
|
|
window->Window = yon_gtk_builder_get_widget(builder,"MonitorWindow");
|
|
|
window->SystemTerminal = yon_gtk_builder_get_widget(builder,"SystemTerminal");
|
|
|
window->UpdateButton = yon_gtk_builder_get_widget(builder,"UpdateButton");
|
|
|
window->webHeaderNameLabel = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel");
|
|
|
window->target=NULL;
|
|
|
yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"terminal_window");
|
|
|
|
|
|
g_signal_connect(G_OBJECT(window->UpdateButton),"clicked",G_CALLBACK(on_service_update),window);
|
|
|
gtk_widget_show(window->Window);
|
|
|
return window;
|
|
|
|
|
|
}
|
|
|
|
|
|
void on_info_clicked(GtkWidget *self, main_window *widgets){
|
|
|
if (self){}
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
GtkTreeIter iter;
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
char *service_name;
|
|
|
gtk_tree_model_get(model,&iter,5,&service_name,-1);
|
|
|
if (!yon_char_is_empty(service_name)){
|
|
|
terminal_window *window = yon_terminal_window_new();
|
|
|
window->target=service_name;
|
|
|
char *header = yon_char_unite(STATUS_LABEL," ",service_name,NULL);
|
|
|
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),header);
|
|
|
gtk_window_set_title(GTK_WINDOW(window->Window),header);
|
|
|
free(header);
|
|
|
on_service_update(NULL,window);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void *yon_unthreaded_config_load(void *widgets){
|
|
|
if (main_config.load_mode==1){
|
|
|
on_config_local_load(NULL,(main_window*)widgets);
|
|
|
} else if (main_config.load_mode==0){
|
|
|
on_config_global_load(NULL,(main_window*)widgets);
|
|
|
}
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
void on_update(GtkWidget *self,main_window *widgets){
|
|
|
if (!main_config.update_thread_active){
|
|
|
if (self){}
|
|
|
yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
|
|
|
if (yon_unthreaded_config_load(widgets)){};
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void *yon_interface_update(main_window *widgets){
|
|
|
int size;
|
|
|
GtkTreeIter iter;
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),NULL);
|
|
|
config_str services = yon_config_load(load_services_command,&size);
|
|
|
for (int i=0;i<size;i++){
|
|
|
int parsed_size;
|
|
|
if (services[i][strlen(services[i])-1]=='\n') services[i][strlen(services[i])-1]='\0';
|
|
|
config_str parsed = yon_char_parse(services[i],&parsed_size,";");
|
|
|
gtk_list_store_append(widgets->liststore2,&iter);
|
|
|
int type;
|
|
|
char *description = parsed[parsed_size-1];
|
|
|
if (strstr(parsed[0],".socket"))
|
|
|
type = 2;
|
|
|
else type = 1;
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,5,parsed[0],6,description,7,type,-1);
|
|
|
}
|
|
|
int launched_size;
|
|
|
config_str launched_parsed = yon_config_load(load_launched_command,&launched_size);
|
|
|
int enabled_size;
|
|
|
config_str enabled_parsed = yon_config_load(load_enabled_command,&enabled_size);
|
|
|
yon_char_parsed_divide_search_full(launched_parsed,launched_size,"\n",-1);
|
|
|
yon_char_parsed_divide_search_full(enabled_parsed,enabled_size,"\n",-1);
|
|
|
char *launched = yon_char_parsed_to_string(launched_parsed,launched_size,",");
|
|
|
char *enabled = yon_char_parsed_to_string(enabled_parsed,enabled_size,",");
|
|
|
char *start = yon_config_get_by_key("SERVICESSTART");
|
|
|
char *stop = yon_config_get_by_key("SERVICESSROP");
|
|
|
char *block = yon_config_get_by_key("SERVICESMASK");
|
|
|
if (!yon_char_is_empty(launched)&&launched[strlen(launched)-1]=='\n') launched[strlen(launched)-1]='\0';
|
|
|
if (!yon_char_is_empty(enabled)&&enabled[strlen(enabled)-1]=='\n') enabled[strlen(enabled)-1]='\0';
|
|
|
if (!yon_char_is_empty(start)&&start[strlen(start)-1]=='\n') start[strlen(start)-1]='\0';
|
|
|
if (!yon_char_is_empty(stop)&&stop[strlen(stop)-1]=='\n') stop[strlen(stop)-1]='\0';
|
|
|
if (!yon_char_is_empty(block)&&block[strlen(block)-1]=='\n') block[strlen(block)-1]='\0';
|
|
|
int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->liststore2),&iter);
|
|
|
for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->liststore2),&iter)){
|
|
|
char *name;
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,5,&name,-1);
|
|
|
char *name_parsed = yon_char_divide(name,yon_char_find_last(name,'.'));
|
|
|
free(name);
|
|
|
if (!yon_char_is_empty(start)){
|
|
|
if (strstr(start,name_parsed))
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,0,1,-1);
|
|
|
else
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,0,0,-1);
|
|
|
}
|
|
|
if (!yon_char_is_empty(stop)){
|
|
|
if (strstr(stop,name_parsed))
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,1,1,-1);
|
|
|
else
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,1,0,-1);
|
|
|
}
|
|
|
if (!yon_char_is_empty(block)){
|
|
|
if (strstr(block,name_parsed))
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,2,1,-1);
|
|
|
else
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,2,0,-1);
|
|
|
}
|
|
|
if (!yon_char_is_empty(launched)){
|
|
|
if (strstr(launched,name_parsed))
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,4,1,-1);
|
|
|
else
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,4,0,-1);
|
|
|
}
|
|
|
if (!yon_char_is_empty(enabled)){
|
|
|
if (strstr(enabled,name_parsed))
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,3,1,-1);
|
|
|
else
|
|
|
gtk_list_store_set(widgets->liststore2,&iter,3,0,-1);
|
|
|
}
|
|
|
free(name_parsed);
|
|
|
}
|
|
|
textdomain(template_ui_LocaleName);
|
|
|
if (main_config.load_mode){
|
|
|
yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
|
|
|
} else {
|
|
|
yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
|
|
|
}
|
|
|
textdomain(LocaleName);
|
|
|
gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(widgets->liststore2));
|
|
|
main_config.update_thread_active=0;
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
void on_column_resize(GtkTreeViewColumn *self,GParamSpec *pspec,main_window *widgets){
|
|
|
if (self||pspec){}
|
|
|
GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->MainTree));
|
|
|
int width_configuration = gtk_tree_view_column_get_width(g_list_nth_data(list,0))+gtk_tree_view_column_get_width(g_list_nth_data(list,1))+gtk_tree_view_column_get_width(g_list_nth_data(list,2));
|
|
|
int width_system = gtk_tree_view_column_get_width(g_list_nth_data(list,3))+gtk_tree_view_column_get_width(g_list_nth_data(list,4));
|
|
|
g_list_free(list);
|
|
|
gtk_tree_view_column_set_fixed_width(gtk_tree_view_get_column(GTK_TREE_VIEW(widgets->MainUpperTree),0),width_configuration);
|
|
|
gtk_tree_view_column_set_fixed_width(gtk_tree_view_get_column(GTK_TREE_VIEW(widgets->MainUpperTree),1),width_system);
|
|
|
}
|
|
|
|
|
|
GtkWidget *yon_menu_separator_create() {
|
|
|
GtkWidget *menu_item = gtk_separator_menu_item_new();
|
|
|
|
|
|
gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"sepat");
|
|
|
gtk_widget_show(menu_item);
|
|
|
gtk_widget_set_sensitive(menu_item,0);
|
|
|
return menu_item;
|
|
|
}
|
|
|
|
|
|
GtkWidget *yon_menu_button_create(char *icon_name, char *text) {
|
|
|
GtkWidget *menu_item = gtk_menu_item_new();
|
|
|
GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
|
|
|
GtkWidget *icon;
|
|
|
// GtkWidget *check;
|
|
|
if(icon_name){
|
|
|
icon = gtk_image_new_from_icon_name(icon_name,GTK_ICON_SIZE_BUTTON);
|
|
|
// check = gtk_check_button_new();
|
|
|
gtk_box_pack_start(GTK_BOX(box),icon,0,0,5);
|
|
|
// gtk_box_pack_end(GTK_BOX(box),check,0,0,5);
|
|
|
}
|
|
|
GtkWidget *label = gtk_label_new(text);
|
|
|
gtk_box_pack_start(GTK_BOX(box),label,0,0,5);
|
|
|
gtk_container_add(GTK_CONTAINER(menu_item),box);
|
|
|
gtk_widget_show_all(menu_item);
|
|
|
return menu_item;
|
|
|
}
|
|
|
|
|
|
gboolean on_context_menu_open(GtkWidget *self,GdkEventButton *event, main_window *widgets){
|
|
|
if (self){};
|
|
|
if (event->button==3){
|
|
|
main_config.rmb_clicked=1;
|
|
|
menu_obj *menu_object = g_malloc0(sizeof(menu_obj));
|
|
|
GtkWidget *menu = gtk_menu_new();
|
|
|
gtk_menu_set_reserve_toggle_size(GTK_MENU(menu),0);
|
|
|
GtkWidget *menu_item_configuration_in_config = yon_menu_button_create(NULL,CONFIG_CONFIGURATION_LABEL);
|
|
|
gtk_widget_set_sensitive(menu_item_configuration_in_config,0);
|
|
|
GtkWidget *menu_item_autostart_config = yon_menu_button_create("media-playback-start-symbolic",AUTOSTART_LABEL);
|
|
|
GtkWidget *menu_item_autostop = yon_menu_button_create("media-playback-stop-symbolic",AUTOSTOP_LABEL);
|
|
|
GtkWidget *menu_item_block = yon_menu_button_create("process-stop-symbolic",BLOCK_LABEL);
|
|
|
GtkWidget *menu_item_separator1 = yon_menu_separator_create();
|
|
|
GtkWidget *menu_item_configuration_in_system = yon_menu_button_create(NULL,SYSTEM_CONFIGURATION_LABEL);
|
|
|
gtk_widget_set_sensitive(menu_item_configuration_in_system,0);
|
|
|
GtkWidget *menu_item_autostart_system = yon_menu_button_create("media-playback-start-symbolic",AUTOSTART_LABEL);
|
|
|
GtkWidget *menu_item_launched = yon_menu_button_create("emoji-flags-symbolic",LAUNCHED_LABEL);
|
|
|
GtkWidget *menu_item_separator2 = yon_menu_separator_create();
|
|
|
GtkWidget *menu_item_reload = yon_menu_button_create("emblem-synchronizing-symbolic",SERVICE_RELOAD_LABEL);
|
|
|
GtkWidget *menu_item_status = yon_menu_button_create("dialog-information-symbolic",STATUS_LABEL);
|
|
|
menu_object->Menu = menu;
|
|
|
menu_object->MenuConfigAutostart = menu_item_autostart_config;
|
|
|
menu_object->MenuConfigAutostop = menu_item_autostop;
|
|
|
menu_object->MenuConfigBlock = menu_item_block;
|
|
|
menu_object->MenuSystemAutostart = menu_item_autostart_system;
|
|
|
menu_object->MenuSystemLaunched = menu_item_launched;
|
|
|
menu_object->MenuReloadConfig = menu_item_reload;
|
|
|
menu_object->MenuStatus = menu_item_status;
|
|
|
g_signal_connect(G_OBJECT(menu_item_autostart_config),"activate",G_CALLBACK(on_config_autostart_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(menu_item_autostop),"activate",G_CALLBACK(on_config_autostop_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(menu_item_block),"activate",G_CALLBACK(on_config_block_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(menu_item_autostart_system),"activate",G_CALLBACK(on_system_autostart_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(menu_item_launched),"activate",G_CALLBACK(on_system_launch_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(menu_item_reload),"activate",G_CALLBACK(on_update),widgets);
|
|
|
g_signal_connect(G_OBJECT(menu_item_status),"activate",G_CALLBACK(on_info_clicked),widgets);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_configuration_in_config);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_autostart_config);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_autostop);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_block);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_separator1);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_configuration_in_system);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_autostart_system);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_launched);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_separator2);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_reload);
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_status);
|
|
|
widgets->RMBMenu=menu;
|
|
|
widgets->menu=menu_object;
|
|
|
gtk_widget_show_all(widgets->RMBMenu);
|
|
|
// gtk_widget_show_all(widgets->menu->Menu);
|
|
|
gtk_menu_popup_at_pointer(GTK_MENU(menu),NULL);
|
|
|
return 0;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/**config_init()
|
|
|
* [EN]
|
|
|
*
|
|
|
* [RU]
|
|
|
* Функция инициализации всех параметров конфигурации
|
|
|
*/
|
|
|
void config_init(){
|
|
|
main_config.always_open_documentation=0;
|
|
|
main_config.socket_id=-1;
|
|
|
main_config.save_socket_id=-1;
|
|
|
main_config.load_socket_id=-1;
|
|
|
main_config.lock_help=0;
|
|
|
main_config.lock_help=0;
|
|
|
main_config.lock_load_global=0;
|
|
|
main_config.lock_save_global=0;
|
|
|
main_config.lock_save_local=0;
|
|
|
main_config.load_mode=1;
|
|
|
main_config.update_thread_active=0;
|
|
|
}
|
|
|
|
|
|
void on_activate(GtkTreeView *self, main_window *widgets){
|
|
|
if (self){};
|
|
|
GtkTreeIter iter;
|
|
|
GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2);
|
|
|
char *name=NULL;
|
|
|
char *description=NULL;
|
|
|
if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){
|
|
|
gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,5,&name,6,&description,-1);
|
|
|
gtk_label_set_text(GTK_LABEL(widgets->ServiceLabel),name);
|
|
|
gtk_label_set_text(GTK_LABEL(widgets->DescriptionLabel),description);
|
|
|
menu_obj *menu=widgets->menu;
|
|
|
if (main_config.rmb_clicked){
|
|
|
gtk_menu_popup_at_pointer(GTK_MENU(menu->Menu),NULL);
|
|
|
}
|
|
|
}
|
|
|
main_config.rmb_clicked=0;
|
|
|
}
|
|
|
|
|
|
/**yon_main_window_complete(main_window *widgets)
|
|
|
* [EN]
|
|
|
*
|
|
|
* [RU]
|
|
|
* Функция настройки основного окна приложения. [widgets] - структура со стандартным интерфейсом.
|
|
|
*/
|
|
|
void yon_main_window_complete(main_window *widgets){
|
|
|
widgets = yon_remalloc(widgets,sizeof(main_window));
|
|
|
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
|
|
|
gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0);
|
|
|
// Custom widgets configuration
|
|
|
|
|
|
widgets->liststore1=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1"));
|
|
|
widgets->liststore2=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore2"));
|
|
|
widgets->BoxMain=yon_gtk_builder_get_widget(builder,"BoxMain");
|
|
|
widgets->ServiceSourceCombo=yon_gtk_builder_get_widget(builder,"ServiceSourceCombo");
|
|
|
widgets->ServiceTypeCombo=yon_gtk_builder_get_widget(builder,"ServiceTypeCombo");
|
|
|
widgets->SearchEntry=yon_gtk_builder_get_widget(builder,"SearchEntry");
|
|
|
widgets->UpdateButton=yon_gtk_builder_get_widget(builder,"UpdateButton");
|
|
|
widgets->ConfigAutostartButton=yon_gtk_builder_get_widget(builder,"ConfigAutostartButton");
|
|
|
widgets->ConfigAutostopButton=yon_gtk_builder_get_widget(builder,"ConfigAutostopButton");
|
|
|
widgets->ConfigBlockButton=yon_gtk_builder_get_widget(builder,"ConfigBlockButton");
|
|
|
widgets->SystemAutostartButton=yon_gtk_builder_get_widget(builder,"SystemAutostartButton");
|
|
|
widgets->SystemLaunchButton=yon_gtk_builder_get_widget(builder,"SystemLaunchButton");
|
|
|
widgets->InfoButton=yon_gtk_builder_get_widget(builder,"InfoButton");
|
|
|
widgets->LogButton=yon_gtk_builder_get_widget(builder,"LogButton");
|
|
|
widgets->MainUpperTree=yon_gtk_builder_get_widget(builder,"MainUpperTree");
|
|
|
widgets->MainTree=yon_gtk_builder_get_widget(builder,"MainTree");
|
|
|
widgets->DescriptionLabel=yon_gtk_builder_get_widget(builder,"DescriptionLabel");
|
|
|
widgets->ServiceLabel=yon_gtk_builder_get_widget(builder,"ServiceLabel");
|
|
|
gtk_style_context_add_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemmiddlemargin");
|
|
|
GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->MainTree));
|
|
|
yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->MainTree));
|
|
|
g_signal_connect(G_OBJECT(widgets->MainTree),"button-press-event",G_CALLBACK(on_context_menu_open),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->ConfigAutostartButton),"clicked",G_CALLBACK(on_config_autostart_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->ConfigAutostopButton),"clicked",G_CALLBACK(on_config_autostop_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->ConfigBlockButton),"clicked",G_CALLBACK(on_config_block_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->SystemAutostartButton),"clicked",G_CALLBACK(on_system_autostart_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->SystemLaunchButton),"clicked",G_CALLBACK(on_system_launch_clicked),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->UpdateButton),"clicked",G_CALLBACK(on_update),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->InfoButton),"clicked",G_CALLBACK(on_info_clicked),widgets);
|
|
|
// g_signal_connect(G_OBJECT(widgets->LogButton),"clicked",G_CALLBACK(on_status_show),widgets);
|
|
|
g_signal_connect(G_OBJECT(g_list_nth_data(list,0)),"notify::width",G_CALLBACK(on_column_resize),widgets);
|
|
|
g_signal_connect(G_OBJECT(g_list_nth_data(list,1)),"notify::width",G_CALLBACK(on_column_resize),widgets);
|
|
|
g_signal_connect(G_OBJECT(g_list_nth_data(list,2)),"notify::width",G_CALLBACK(on_column_resize),widgets);
|
|
|
g_signal_connect(G_OBJECT(g_list_nth_data(list,3)),"notify::width",G_CALLBACK(on_column_resize),widgets);
|
|
|
g_signal_connect(G_OBJECT(g_list_nth_data(list,4)),"notify::width",G_CALLBACK(on_column_resize),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->MainTree),"cursor-changed",G_CALLBACK(on_activate),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->ServiceTypeCombo),"changed",G_CALLBACK(on_type_changed),widgets);
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets);
|
|
|
g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets);
|
|
|
|
|
|
g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_global_local_save),NULL);
|
|
|
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_list_free(list);
|
|
|
main_config.ServiceFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL);
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter),(GtkTreeModelFilterVisibleFunc)on_service_filter,NULL,NULL);
|
|
|
main_config.SocketFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL);
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.SocketFilter),(GtkTreeModelFilterVisibleFunc)on_socket_filter,NULL,NULL);
|
|
|
main_config.AutolaunchFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL);
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.AutolaunchFilter),(GtkTreeModelFilterVisibleFunc)on_autostart_filter,NULL,NULL);
|
|
|
main_config.StoppedFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL);
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.StoppedFilter),(GtkTreeModelFilterVisibleFunc)on_stopped_filter,NULL,NULL);
|
|
|
main_config.BlockedFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL);
|
|
|
gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.BlockedFilter),(GtkTreeModelFilterVisibleFunc)on_blocked_filter,NULL,NULL);
|
|
|
gtk_tree_view_set_search_entry(GTK_TREE_VIEW(widgets->MainTree),GTK_ENTRY(widgets->SearchEntry));
|
|
|
yon_load_proceed(YON_CONFIG_LOCAL);
|
|
|
yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
|
|
|
if (!main_config.update_thread_active){
|
|
|
main_config.update_thread_active=1;
|
|
|
g_thread_new("",(GThreadFunc)yon_interface_update,widgets);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
int main(int argc, char *argv[]){
|
|
|
local=setlocale(LC_ALL, "");
|
|
|
textdomain (LocaleName);
|
|
|
config_init();
|
|
|
int option_index=0;
|
|
|
int show_help=0;
|
|
|
{
|
|
|
struct option long_options[] = {
|
|
|
{"help", 0, 0, 'h'},
|
|
|
{"version", 0, 0, 'V'},
|
|
|
{"lock-help", 0,0, 1},
|
|
|
{"lock-save", 0,0, 2},
|
|
|
{"lock-save-local", 0,0, 3},
|
|
|
{"lock-save-global", 0,0, 4},
|
|
|
{"lock-load-global", 0,0, 5},
|
|
|
{"socket-id", 1, 0, 's'},
|
|
|
{"socket-ext-id", 1,0, 'e'},
|
|
|
{"socket-trd-id", 1,0, 't'},
|
|
|
{"clear-config", 0,0, 'c'},
|
|
|
{ NULL, 0, NULL, 0 }
|
|
|
};
|
|
|
for (int i=0;i<argc;i++){
|
|
|
int argument=getopt_long(argc,argv,"hVvs:e:t:c",long_options,&option_index);
|
|
|
switch(argument){
|
|
|
case 'h':
|
|
|
show_help=1;
|
|
|
break;
|
|
|
case 'v':
|
|
|
case 'V':
|
|
|
printf("%s\n",VERSION_LABEL);
|
|
|
exit(0);
|
|
|
break;
|
|
|
case 's':
|
|
|
if(optarg)
|
|
|
main_config.socket_id=atoi(optarg);
|
|
|
break;
|
|
|
case 'e':
|
|
|
if(optarg)
|
|
|
main_config.save_socket_id=atoi(optarg);
|
|
|
break;
|
|
|
case 't':
|
|
|
if(optarg)
|
|
|
main_config.load_socket_id=atoi(optarg);
|
|
|
break;
|
|
|
case 'c': if (system(yon_char_unite("rm -rfd ", yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",NULL))){};
|
|
|
break;
|
|
|
case 1:
|
|
|
main_config.lock_help=1;
|
|
|
break;
|
|
|
case 2:
|
|
|
main_config.lock_save_local=1;
|
|
|
main_config.lock_save_global=1;
|
|
|
break;
|
|
|
case 3:
|
|
|
main_config.lock_save_local=1;
|
|
|
break;
|
|
|
case 4:
|
|
|
main_config.lock_save_global=1;
|
|
|
break;
|
|
|
case 5:
|
|
|
main_config.lock_load_global=1;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (show_help==1&&main_config.lock_help!=1){
|
|
|
printf("%s\n",HELP_LABEL);
|
|
|
exit(0);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (getuid()!=0){
|
|
|
main_config.lock_load_global=1;
|
|
|
main_config.lock_save_global=1;
|
|
|
main_config.lock_save_local=1;
|
|
|
}
|
|
|
gtk_init(&argc,&argv);
|
|
|
yon_ubl_connect_config((_template_config*)&main_config);
|
|
|
yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK);
|
|
|
template_main_window *widgets = yon_ubl_window_setup();
|
|
|
yon_main_window_complete((main_window*)widgets);
|
|
|
gtk_main();
|
|
|
return 0;
|
|
|
} |