From cf88c5596723be665eddbf0daf17f76397f42553 Mon Sep 17 00:00:00 2001 From: Enris Nogare von Tein <ent13@inf.ufpr.br> Date: Wed, 29 Jun 2016 11:31:48 -0300 Subject: [PATCH] Commented the code. Changed "imagem" in the GUI to "sistema" making it easier for the common user understand Signed-off-by: Enris Nogare von Tein <ent13@inf.ufpr.br> --- useful/stg312/.size.out | 2 +- useful/stg312/.upid.out | 2 +- useful/stg312/openslx_gui | Bin 95371 -> 95098 bytes useful/stg312/openslx_gui.c | 43 +++--- useful/stg312/openslx_gui.h | 1 - useful/stg312/openslx_gui_v01.glade | 33 ++-- useful/stg312/stg4.c | 225 +++++++++------------------- useful/stg312/upload-utils.c | 95 ++++++------ useful/stg312/upload-utils.h | 1 - useful/stg312/utils.c | 9 +- 10 files changed, 157 insertions(+), 254 deletions(-) diff --git a/useful/stg312/.size.out b/useful/stg312/.size.out index 3d41a09d..0d998574 100644 --- a/useful/stg312/.size.out +++ b/useful/stg312/.size.out @@ -1 +1 @@ -1729544 testando-sem-o-move-zuado.r1.tar.gz +1729704 teste-versao-comentada.r1.tar.gz diff --git a/useful/stg312/.upid.out b/useful/stg312/.upid.out index 3423dee6..bc0a8da6 100644 --- a/useful/stg312/.upid.out +++ b/useful/stg312/.upid.out @@ -1 +1 @@ -{"uploadid":"yDeom6yODgayCGLSwnCqfvTyqWrg0p1PyUc","status":"ok","code":"003","msg":"New upload succesful"} \ No newline at end of file +{"uploadid":"SKwGngE2ZgVnuqkUUMZrASSGPktr5iWQQeb","status":"ok","code":"003","msg":"New upload succesful"} \ No newline at end of file diff --git a/useful/stg312/openslx_gui b/useful/stg312/openslx_gui index 12e9e866b242509371b2841bace8d660e767ccde..a60e4435be36a17ef973b96338014689d38f500b 100755 GIT binary patch delta 38596 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 delta 39351 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 diff --git a/useful/stg312/openslx_gui.c b/useful/stg312/openslx_gui.c index d02d7163..d3520483 100644 --- a/useful/stg312/openslx_gui.c +++ b/useful/stg312/openslx_gui.c @@ -16,6 +16,7 @@ #include <jansson.h> #include "upload-utils.h" +//FUnção que mostra a tela de upload antigo, caso ele exista void tela_upload_antigo(GtkWidget *w,gpointer p){ GtkWidget *window_upload_antigo, *janela_ant, *button_continua_upload, *button_nao_continua, *label_nome_imagem, *label_parte_upload; GtkBuilder *builder; @@ -24,7 +25,7 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ old_upload = malloc(255*sizeof(char)); dados *data_ant = p; //Pega os dados recebidos pela chamada da função - janela_ant = (GtkWidget*) data_ant->dado1; + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = gtk_builder_new(); //Cria um novo Builder gtk gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets @@ -35,7 +36,7 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ label_nome_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "label_nome_imagem")); label_parte_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_parte_upload")); - upload_in_progress = fopen(".progress.out", "a+"); + upload_in_progress = fopen(".progress.out", "a+"); //Abre o arquivo para ler os dados do upload antigo, abre com a+ para poder dar rewind printf("Linha %d\n", __LINE__); rewind(upload_in_progress); fscanf(upload_in_progress, "%s", old_upload); @@ -49,21 +50,23 @@ void tela_upload_antigo(GtkWidget *w,gpointer p){ data_ant->dado1 = window_upload_antigo; g_signal_connect(window_upload_antigo, "destroy", G_CALLBACK(sair), NULL); - g_signal_connect(button_continua_upload, "clicked", G_CALLBACK(faz_upload_teste), data_ant); + g_signal_connect(button_continua_upload, "clicked", G_CALLBACK(faz_upload_teste), data_ant); //Isso chama a teste pois o upload.c lida com os dados do arquivo a ser feito o upload. g_signal_connect(button_nao_continua, "clicked", G_CALLBACK(tela_principal), data_ant); - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_upload_antigo); } +//tela principal do programa, chamada após o login void tela_principal(GtkWidget *w,gpointer p){ GtkWidget *janela_principal, *janela_ant, *button_stg4, *button_ajuda_tela_principal, *button_stg4_update, *label_greeting; GtkBuilder *builder; int status; + //Se não encontrou o arquivo .speed.out, calcula a velocidade de upload do usuário. if((access(".speed.out", F_OK) == -1)){ puts("Entrou no if"); - g_spawn_command_line_sync("./squash.sh 1", NULL, NULL, &status, NULL); // Executa o script + g_spawn_command_line_sync("speedtest-cli --bytes --simple > .speed.out", NULL, NULL, &status, NULL); // Executa o script } builder = gtk_builder_new(); //Cria um novo Builder gtk @@ -71,11 +74,11 @@ void tela_principal(GtkWidget *w,gpointer p){ dados *data_ant = p; //Pega os dados recebidos pela chamada da função - FILE *upload_antigo = fopen(".progress.out", "w"); + FILE *upload_antigo = fopen(".progress.out", "w"); //Zera o arquivo de upload antigo, o programa só chega aqui se o usuario ja lidou com o upload antigo fclose(upload_antigo); - if(data_ant){ - janela_ant = (GtkWidget*) data_ant->dado1; + //if(data_ant){ //ver se isso faz alguma coisa + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela char *greeting_text; greeting_text = malloc(255*sizeof(char)); @@ -83,23 +86,20 @@ void tela_principal(GtkWidget *w,gpointer p){ user_info dados_do_user; if(janela_ant){ - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior } - pega_dados_do_usuario(&dados_do_user); + pega_dados_do_usuario(&dados_do_user); //Pega os dados do usuário recebidos no login puts(dados_do_user.name); puts(dados_do_user.login); puts(dados_do_user.email); puts(dados_do_user.city); - gera_arquivo_dados_usuario(); + gera_arquivo_dados_usuario(); //Cria o user_data.info strcpy(greeting_text, dados_do_user.name); strcat(greeting_text, "!"); label_greeting = GTK_WIDGET(gtk_builder_get_object(builder, "label_greeting")); gtk_label_set_text(GTK_LABEL(label_greeting), greeting_text); - /* - * FAZ LOGIN - */ - } + //} @@ -112,7 +112,6 @@ void tela_principal(GtkWidget *w,gpointer p){ data->dado1 = janela_principal; data->builder = builder; data->dado2 = button_stg4; - data->control = 0; g_signal_connect(janela_principal, "destroy", G_CALLBACK(sair), NULL); g_signal_connect (G_OBJECT (janela_principal), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla @@ -124,6 +123,7 @@ void tela_principal(GtkWidget *w,gpointer p){ gtk_widget_show_all(janela_principal); } +//Função que mostra a tela de login para o usuario void tela_login(){ GtkWidget *window_login, *button_login, *entry_login, *entry_passwd, *label_login_erro; @@ -150,20 +150,18 @@ void tela_login(){ data->dado3 = entry_login; data->dado4 = entry_passwd; data->dado5 = label_login_erro; - data->control = 0; printf("Linha %d\n", __LINE__); g_signal_connect (G_OBJECT (window_login), "key_press_event", G_CALLBACK (on_key_press), data); printf("Linha %d\n", __LINE__); g_signal_connect(entry_passwd, "activate", G_CALLBACK(faz_login), data); - g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login), data); - //g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login_dummy), data); - //g_signal_connect(entry_passwd, "activate", G_CALLBACK(faz_login_dummy), data); + g_signal_connect(button_login, "clicked", G_CALLBACK(faz_login), data); //Caso ele aperte enter com o foco no password printf("Linha %d\n", __LINE__); gtk_widget_show_all(window_login); } +// Main int main(int argc, char *argv[]){ XInitThreads(); gtk_init(&argc, &argv); //Inicia o GTK @@ -175,7 +173,7 @@ int main(int argc, char *argv[]){ pid_t pid; int status; - if (argc == 1){ + if (argc == 1){ //Caso seja chamado para mostrar a GUI GtkCssProvider *provider; GdkDisplay *display; @@ -194,7 +192,7 @@ int main(int argc, char *argv[]){ gtk_main(); }else{ - if (argc == 6){ + if (argc == 6){ //Se for a opção com parametros @@ -207,7 +205,6 @@ int main(int argc, char *argv[]){ gtk_entry_set_text(GTK_ENTRY(login), argv[4]); gtk_entry_set_text(GTK_ENTRY(senha), argv[5]); - data->control = 2; data->dado3 = login; data->dado4 = senha; diff --git a/useful/stg312/openslx_gui.h b/useful/stg312/openslx_gui.h index c506f53b..ddadd400 100644 --- a/useful/stg312/openslx_gui.h +++ b/useful/stg312/openslx_gui.h @@ -24,7 +24,6 @@ typedef struct dados{ GtkWidget *dado6; GtkBuilder *builder; GPid pid; - int control; user_info informacoes; }dados; diff --git a/useful/stg312/openslx_gui_v01.glade b/useful/stg312/openslx_gui_v01.glade index 1072e67e..9dab03a9 100644 --- a/useful/stg312/openslx_gui_v01.glade +++ b/useful/stg312/openslx_gui_v01.glade @@ -94,7 +94,7 @@ O programa irá sair agora.</property> <property name="can_focus">False</property> <property name="halign">start</property> <property name="valign">center</property> - <property name="label" translatable="yes">Destino da Imagem:</property> + <property name="label" translatable="yes">Destino do sistema:</property> </object> </child> </object> @@ -122,7 +122,7 @@ O programa irá sair agora.</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="tooltip_text" translatable="yes">Nome da imagem desejada. Pode um nome qualquer permitido pelo Linux. Ex: ubuntu, meu_ubuntu, meu_linux, escola_xxxxx</property> - <property name="text" translatable="yes">nome-imagem</property> + <property name="text" translatable="yes">nome-sistema</property> </object> </child> </object> @@ -131,7 +131,7 @@ O programa irá sair agora.</property> <object class="GtkLabel" id="label3"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Nome da Imagem:</property> + <property name="label" translatable="yes">Nome do seu sistema:</property> </object> </child> </object> @@ -162,8 +162,8 @@ O programa irá sair agora.</property> </child> <child> <object class="GtkCheckButton" id="check_button_remove"> - <property name="label" translatable="yes">Remover imagem -não compactada?</property> + <property name="label" translatable="yes">Remover sistema +não compactado?</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -252,11 +252,11 @@ não compactada?</property> <object class="GtkLabel" id="label_info"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="label" translatable="yes">Bem vindo ao Gerador de novas Imagens + <property name="label" translatable="yes">Bem vindo ao Gerador de novos sistemas do Openslx! -Por essa interface você poderá gerar sua -própria imagem Linux com os pacotes +Por essa interface você poderá gerar seu +próprio sistema Linux com os pacotes de seu interesse! Para iniciar o processo clique em algum @@ -298,7 +298,7 @@ Se precisar de ajuda, ative <property name="can_focus">False</property> <child> <object class="GtkButton" id="button_stg4"> - <property name="label" translatable="yes">Gerar sua imagem!</property> + <property name="label" translatable="yes">Gerar seu sistema!</property> <property name="name">gerar</property> <property name="width_request">300</property> <property name="height_request">50</property> @@ -386,7 +386,7 @@ Se precisar de ajuda, ative <property name="can_focus">False</property> <child> <object class="GtkButton" id="button_stg4_update"> - <property name="label" translatable="yes">Atualizar sua imagem!</property> + <property name="label" translatable="yes">Atualizar seus sistemas!</property> <property name="name">atualizar</property> <property name="width_request">300</property> <property name="height_request">50</property> @@ -468,6 +468,7 @@ Se precisar de ajuda, ative <property name="pixbuf">pic.png</property> </object> <object class="GtkWindow" id="window_stg4_inic"> + <property name="name">instal_window</property> <property name="can_focus">False</property> <property name="title" translatable="yes">OpenSLX - Stateless extensions</property> <property name="resizable">False</property> @@ -628,12 +629,12 @@ instalar softwares</property> <property name="halign">start</property> <property name="valign">center</property> <property name="label" translatable="yes">Upload completo! -Aguarde alguns minutos e sua imagem estará +Aguarde alguns minutos e seu sistema estará disponível no nosso site para configuração. Clique no botão abaixo para ser levado ao site. Nele faça login com o mesmo login e senha que usou para logar aqui -e clique em Gerenciamento de Imagens. Edite as configurações da -imagem que fez upload e ela estará pronta para uso! +e clique em Gerenciamento de Imagens. Edite as configurações do sistema +que fez upload e ele estará pronta para uso! Caso o navegador não abra, entre no site: http://slxbox.dev.c3sl.br @@ -764,8 +765,8 @@ http://slxbox.dev.c3sl.br <property name="can_focus">False</property> <property name="halign">start</property> <property name="valign">center</property> - <property name="label" translatable="yes">A sua imagem foi gerada com sucesso! -Agora faça upload da imagem para nosso servidor!</property> + <property name="label" translatable="yes">O seu sistema foi gerado com sucesso! +Agora faça upload dele para nosso servidor!</property> </object> </child> </object> @@ -1095,7 +1096,7 @@ Agora faça upload da imagem para nosso servidor!</property> <property name="message_type">warning</property> <property name="buttons">ok</property> <property name="text" translatable="yes">Atenção!</property> - <property name="secondary_text" translatable="yes">Não é possível criar imagens com espaços no nome.</property> + <property name="secondary_text" translatable="yes">Não é possível criar sistemas com espaços no nome.</property> <child internal-child="vbox"> <object class="GtkBox" id="messagedialog-vbox3"> <property name="can_focus">False</property> diff --git a/useful/stg312/stg4.c b/useful/stg312/stg4.c index 97eb07ea..da1ab36e 100644 --- a/useful/stg312/stg4.c +++ b/useful/stg312/stg4.c @@ -12,77 +12,66 @@ #include <gdk/gdk.h> #include <glib.h> -//void stg4_tela_confirmacao_upload(GtkWidget *w,gpointer p){ +//Ultima tela do sistema, mostra ao usuario o que ele deve fazer para ter a imagem habilitada void stg4_tela_confirmacao_upload(GPid pid, gint status,gpointer p){ - //pid_t pid; // Para quando for implementado - GtkWidget *window_stg4_upload_confirm, *janela_ant, *button_return_upload_confirm, *button_site; //*loading_screen; // Para quando for implementado + + GtkWidget *window_stg4_upload_confirm, *janela_ant, *button_return_upload_confirm, *button_site; GtkBuilder *builder; dados *data_ant = p; //Pega os dados recebidos pela chamada da função - ///////// GtkWidget *loading; loading = data_ant->dado6; pid = data_ant->pid; - //gtk_widget_show(window); - checa_sucesso(); - g_spawn_close_pid(pid); - ///////////// - - puts("Aqui"); + checa_sucesso(); //Checa sucesso do upload + g_spawn_close_pid(pid); //Fecha o processo de upload que estava rodando + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela - puts("Aqui8"); - janela_ant = (GtkWidget*) data_ant->dado1; - puts("Aqui7"); builder = gtk_builder_new(); //Cria um novo Builder gtk gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets - puts("Aqui6"); + window_stg4_upload_confirm = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_upload_confirm")); - puts("Aqui9"); - g_signal_connect(window_stg4_upload_confirm, "destroy", G_CALLBACK(chama_tela_principal), NULL); - puts("Aqui10"); + + g_signal_connect(window_stg4_upload_confirm, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela + button_return_upload_confirm = GTK_WIDGET(gtk_builder_get_object(builder, "button_return_upload_confirm")); button_site = GTK_WIDGET(gtk_builder_get_object(builder, "button_site")); - puts("Aqui11"); - //loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); - puts("Aqui2"); struct dados *data = malloc(sizeof(*data)); data->dado1 = window_stg4_upload_confirm; - data->dado6 = window_stg4_upload_confirm; data->builder = builder; data->dado2 = button_return_upload_confirm; - data->control = 0; g_signal_connect (G_OBJECT (window_stg4_upload_confirm), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_return_upload_confirm, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); g_signal_connect(button_site, "clicked", G_CALLBACK(abre_site), data); - puts("Aqui3"); - gtk_widget_hide(janela_ant); - puts("Aqui4"); + + gtk_widget_hide(janela_ant); //Esconde a janela anterior + gtk_widget_hide(loading); gtk_widget_show_all(window_stg4_upload_confirm); - puts("Aqui5"); + } +//Isso não est implementado ainda, só ignore void stg4_tela_img_select(GtkWidget *w,gpointer p){ - //pid_t pid; // Para quando for implementado - GtkWidget *window_escolha_imagem, *janela_ant, *button_update_img; //*loading_screen; // Para quando for implementado + + GtkWidget *window_escolha_imagem, *janela_ant, *button_update_img; GtkBuilder *builder; dados *data_ant = p; //Pega os dados recebidos pela chamada da função - janela_ant = (GtkWidget*) data_ant->dado1; + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = data_ant->builder; int status; window_escolha_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "window_escolha_imagem")); - g_signal_connect(window_escolha_imagem, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_escolha_imagem, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela button_update_img = GTK_WIDGET(gtk_builder_get_object(builder, "button_update_img")); //loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); @@ -92,14 +81,13 @@ void stg4_tela_img_select(GtkWidget *w,gpointer p){ data->dado1 = window_escolha_imagem; data->builder = builder; data->dado2 = button_update_img; - data->control = 0; g_signal_connect (G_OBJECT (window_escolha_imagem), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_escolha_imagem); } -// // A função que exibe a 3a tela do programa, a tela final +// // A função que exibe a 2a tela do programa, a tela de upload void stg4_2a_tela(GPid pid, gint status,gpointer p){ GtkWidget *window_stg4_final, *button_stg4_final_sair, *janela_ant, *button_help_4at, *button_stg4_upload, *label_tempo_upload; @@ -110,7 +98,7 @@ void stg4_2a_tela(GPid pid, gint status,gpointer p){ dados *data_ant = p; //Pega os dados recebidos pela chamada da função - janela_ant = (GtkWidget*) data_ant->dado1; + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = gtk_builder_new(); //Cria um novo Builder gtk gtk_builder_add_from_file (builder, "openslx_gui_v01.glade", NULL); //Carrega as coisas do arquivo .glade para utilizar nos widgets @@ -118,58 +106,47 @@ void stg4_2a_tela(GPid pid, gint status,gpointer p){ GtkWidget *loading; loading = data_ant->dado6; pid = data_ant->pid; + checa_sucesso(); //Checa sucesso da criação da imagem + g_spawn_close_pid(pid); //Fecha o processo de criação de imagem que estava rodando - //gtk_widget_show(window); - checa_sucesso(); - g_spawn_close_pid(pid); window_stg4_final = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_final")); - g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela struct dados *data = malloc(sizeof(*data)); - - data->dado2 = window_stg4_final; - data->control = 0; - button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at")); button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair")); button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload")); label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload")); - printf("Linha %d\n", __LINE__); + strcpy(texto_tempo_upload, "Tempo estimado de upload: "); - sprintf(temp, "%d",calcula_tempo_upload() ); - printf("Linha %d\n", __LINE__); + sprintf(temp, "%d",calcula_tempo_upload() ); //Estima o tempo de upload de imagem strcat(texto_tempo_upload, temp); - printf("Linha %d\n", __LINE__); strcat(texto_tempo_upload, " segundos"); - printf("Linha %d\n", __LINE__); - gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload); - printf("Linha %d\n", __LINE__); + gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload); //Modifica o texto para o tempo calculado + data->dado2 = button_stg4_final_sair; - data->dado3 = data_ant->dado4; - data->dado4 = data_ant->dado3; - data->dado5 = data_ant->dado5; + data->dado3 = data_ant->dado4; //Nome da imagem + data->dado4 = data_ant->dado3; //Pasta da imagem data->dado1 = window_stg4_final; data->builder = builder; - printf("Linha %d\n", __LINE__); + g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL); - printf("Linha %d\n", __LINE__); + g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data); //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data); - //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_dummy), data); - printf("Linha %d\n", __LINE__); - g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); - printf("Linha %d\n", __LINE__); - gtk_widget_hide(janela_ant); - printf("Linha %d\n", __LINE__); + + + g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); //Caso o usuario não queira fazer upload por algum motivo, volta para a janela principal + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_hide(loading); gtk_widget_show_all(window_stg4_final); - printf("Linha %d\n", __LINE__); } +//Função que chama o script que gera a imagem do usuario. void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ GPid pid; @@ -179,7 +156,7 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ int i; char *version, *home, *tmscripts, *pasta_do_stg4, *number_of_parts_str, **argv; - argv = malloc(10*sizeof(char*)); + argv = malloc(10*sizeof(char*)); //Vetor de argumentos para a g_spawn for (i=0; i < 10; i++){ argv[i] = malloc(255*sizeof(char)); } @@ -194,108 +171,52 @@ void stg4_clique_2a_tela(GtkWidget *w,gpointer p){ window_stg4_final = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_final")); - g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_stg4_final, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela loading_screen = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); gtk_widget_show(loading_screen); struct dados *data = malloc(sizeof(*data)); - acha_tm_scripts(tmscripts); - - strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); - - strcat(version, ".r1"); - - strcpy(home, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3))); - + acha_tm_scripts(tmscripts); //Acha a pasta tm_scripts no sistema + strcpy(version, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); //Pega o nome da imagem que o usuario informou + strcat(version, ".r1"); //versão será lidada pela api depois, por isso é a versão .r1 + strcpy(home, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado3))); //Pega a pasta que o usuário decidiu que a imagem será gerada strcpy(pasta_do_stg4, home); - strcat(home, "/pasta-"); - strcat(home, version); - strcat(tmscripts, "/scripts"); - - //gboolean g_spawn_async_with_pipes (const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, - // GSpawnChildSetupFunc child_setup, gpointer user_data, GPid *child_pid, GError **error); + strcat(home, "/pasta-"); //Adiciona o nome da pasta gerada para comportar a imagem não compactada + strcat(home, version); //adiciona o nome da imagem + strcat(tmscripts, "/scripts"); //Adiciona /scripts para apontar para aonde está o script de clonagem do stage4 - //strcpy(argv[0], CLONE_STG4_SCRIPT_DUMMY); + //strcpy(argv[0], CLONE_STG4_SCRIPT_DUMMY); //Se quiser testar a GUI e não gerar uma nova imagem, descomente essa linha e comente a debaixo strcpy(argv[0], CLONE_STG4_SCRIPT); - strcpy(argv[1], tmscripts); - strcpy(argv[2], pasta_do_stg4); - strcpy(argv[3], "local"); - strcpy(argv[4], home ); - strcpy(argv[5], version); - - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6))) + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data_ant->dado6))) //Caso o usuário tenha selecioando que quer remover a imagem não compactada strcpy(argv[6], "1"); else strcpy(argv[6], "0"); - sprintf(number_of_parts_str, "%d", NUMBER_OF_PARTS); + sprintf(number_of_parts_str, "%d", NUMBER_OF_PARTS); //Passa como argumento o número de partes que foi dividida a imagem strcpy(argv[7], number_of_parts_str); - argv[8] = NULL; - - if(g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL)){ - puts("Deu certo o spawn"); - } + argv[8] = NULL;//ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação + g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL);//NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync data->dado6 = loading_screen; data->dado2 = window_stg4_final; - data->dado4 = data_ant->dado4; - data->dado3 = data_ant->dado3; - data->dado5 = data_ant->dado5; - data->control = 0; + data->dado4 = data_ant->dado4; //Nome da imagem + data->dado3 = data_ant->dado3; //Pasta da imagem data->dado1 = data_ant->dado1; data->pid = pid; - handler = stg4_2a_tela; - //handler = sai_do_script_teste; + handler = stg4_2a_tela; //Função que será chamada quando o g_spawn sair - g_child_watch_add(pid, handler, data); - /* printf("Linha %d\n", __LINE__); + g_child_watch_add(pid, handler, data); //Chama o handler quando o spawn acabar - printf("Linha %d\n", __LINE__); - button_help_4at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_4at")); - button_stg4_final_sair = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_final_sair")); - button_stg4_upload = GTK_WIDGET(gtk_builder_get_object(builder, "button_stg4_upload")); - label_tempo_upload = GTK_WIDGET(gtk_builder_get_object(builder, "label_tempo_upload")); - printf("Linha %d\n", __LINE__); - strcpy(texto_tempo_upload, "Tempo estimado de upload: "); - sprintf(temp, "%d",calcula_tempo_upload() ); - printf("Linha %d\n", __LINE__); - strcat(texto_tempo_upload, temp); - printf("Linha %d\n", __LINE__); - strcat(texto_tempo_upload, " segundos"); - printf("Linha %d\n", __LINE__); - gtk_label_set_text(GTK_LABEL(label_tempo_upload), texto_tempo_upload); - printf("Linha %d\n", __LINE__); - data->dado2 = button_stg4_final_sair; - data->dado3 = data_ant->dado4; - data->dado4 = data_ant->dado3; - data->dado5 = data_ant->dado5; - data->dado1 = window_stg4_final; - data->builder = builder; - printf("Linha %d\n", __LINE__); - g_signal_connect (G_OBJECT (window_stg4_final), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla - g_signal_connect(button_help_4at, "clicked", G_CALLBACK(help_screen), NULL); - printf("Linha %d\n", __LINE__); - //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload), data); - g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_teste), data); - //g_signal_connect(button_stg4_upload, "clicked", G_CALLBACK(faz_upload_dummy), data); - printf("Linha %d\n", __LINE__); - g_signal_connect(button_stg4_final_sair, "clicked", G_CALLBACK(mata_janela_e_chama_tela_principal), data); - printf("Linha %d\n", __LINE__); - gtk_widget_hide(janela_ant); - printf("Linha %d\n", __LINE__); - gtk_widget_show_all(window_stg4_final); - printf("Linha %d\n", __LINE__); -*/ } @@ -306,50 +227,46 @@ void stg4_clique_1a_tela(GtkWidget *w,gpointer p){ GtkBuilder *builder; dados *data_ant = p; //Pega os dados recebidos pela chamada da função - janela_ant = (GtkWidget*) data_ant->dado1; + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = data_ant->builder; window_stg4_escolha = GTK_WIDGET(gtk_builder_get_object(builder, "window_stg4_escolha")); - g_signal_connect(window_stg4_escolha, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_stg4_escolha, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela check_button_remove = GTK_WIDGET(gtk_builder_get_object(builder, "check_button_remove")); button_help_2at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_2at")); file_chooser_local = GTK_WIDGET(gtk_builder_get_object(builder, "file_chooser_local")); button_clonar = GTK_WIDGET(gtk_builder_get_object(builder, "button_clonar")); entry_imagem = GTK_WIDGET(gtk_builder_get_object(builder, "entry_imagem")); - //entry_versao = GTK_WIDGET(gtk_builder_get_object(builder, "entry_versao")); - gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(file_chooser_local), TRUE); + gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(file_chooser_local), TRUE); //Ativa a opção de criar diretórios do gtk_filechooser gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(file_chooser_local), "/home"); struct dados *data = malloc(sizeof(*data)); data->dado1 = window_stg4_escolha; data->builder = builder; - data->dado2 = button_clonar; - data->dado3 = file_chooser_local; - data->dado4 = entry_imagem; - //data->dado5 = entry_versao; - data->dado6 = check_button_remove; - data->control = 0; + data->dado2 = button_clonar; //Para se o page-up for pressionado, ele avança pro próximo passo + data->dado3 = file_chooser_local; //Guarda a pasta selecionada por ele + data->dado4 = entry_imagem; //Guarda o nome da imagem + data->dado6 = check_button_remove; //Guarda se o usuario selecionou que quer deletar a imagem não compactada g_signal_connect(entry_imagem, "activate", G_CALLBACK(stg4_clique_2a_tela), data); - //g_signal_connect(entry_versao, "activate", G_CALLBACK(stg4_clique_2a_tela), data); g_signal_connect (G_OBJECT (window_stg4_escolha), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_help_2at, "clicked", G_CALLBACK(help_screen), data); g_signal_connect(button_clonar, "clicked", G_CALLBACK(stg4_clique_2a_tela_caller), data); - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_stg4_escolha); } -//função que exibe a primeira tela do stg 4, informando o usuário que ele iniciou o programa +//função que exibe a primeira tela do processo de clonagem, informando o usuário que ele deve instalar os pacotes desejados void stg4_inicio(GtkWidget *w,gpointer p){ GtkWidget *window_stg4_inic, *janela_ant, *button_geren, *button_stg4_proximo, *button_help_1at; GtkBuilder *builder; dados *data_ant = p; //Pega os dados recebidos pela chamada da função - janela_ant = (GtkWidget*) data_ant->dado1; + janela_ant = (GtkWidget*) data_ant->dado1; //Pega a janela antiga que chamou essa nova janela builder = data_ant->builder; button_help_1at = GTK_WIDGET(gtk_builder_get_object(builder, "button_help_1at")); @@ -359,25 +276,23 @@ void stg4_inicio(GtkWidget *w,gpointer p){ //button_shell = GTK_WIDGET(gtk_builder_get_object(builder, "button_shell")); - g_signal_connect(window_stg4_inic, "destroy", G_CALLBACK(chama_tela_principal), NULL); + g_signal_connect(window_stg4_inic, "destroy", G_CALLBACK(chama_tela_principal), NULL); //Chama a tela principal ao destruir essa janela struct dados *data = malloc(sizeof(*data)); data->dado1 = window_stg4_inic; data->builder = builder; data->dado2 = button_stg4_proximo; - data->control = 1; g_signal_connect (G_OBJECT (window_stg4_inic), "key_press_event", G_CALLBACK (on_key_press), data); //Conecta os sinais pra quando apertar uma tecla g_signal_connect(button_help_1at, "clicked", G_CALLBACK(help_screen), data); - if(!(strcmp(gtk_widget_get_name(w), "atualizar"))){ + if(!(strcmp(gtk_widget_get_name(w), "atualizar"))){ //Caso ele tenha clicado no botão de atualizar uma imagem g_signal_connect(button_stg4_proximo, "clicked", G_CALLBACK(stg4_tela_img_select), data); }else{ - g_signal_connect(button_stg4_proximo, "clicked", G_CALLBACK(stg4_clique_1a_tela), data); + g_signal_connect(button_stg4_proximo, "clicked", G_CALLBACK(stg4_clique_1a_tela), data); //Caso ele tenha clicado em gerar imagem } g_signal_connect(button_geren, "clicked", G_CALLBACK(abre_software_center), data); - //g_signal_connect(button_shell, "clicked", G_CALLBACK(abre_shell), data); - gtk_widget_hide(janela_ant); + gtk_widget_hide(janela_ant); //Esconde a janela anterior gtk_widget_show_all(window_stg4_inic); diff --git a/useful/stg312/upload-utils.c b/useful/stg312/upload-utils.c index e3521a05..b6abb937 100644 --- a/useful/stg312/upload-utils.c +++ b/useful/stg312/upload-utils.c @@ -39,7 +39,7 @@ void logout(){ curl_easy_setopt(curl, CURLOPT_URL, API_URL); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "request=logout"); - curl_easy_perform(curl); + curl_easy_perform(curl); //faz logout } } @@ -59,9 +59,9 @@ int checa_upload_antigo(){ puts(old_upload); if(!(strcmp(old_upload, "Upload"))){ - return 1; + return 1; //Tem um upload antigo } - return 0; + return 0; //Não tem um upload antigo, continua normalmente } //Estima o tempo de upload, não faz a estimativa correta, mas só deus sabe como fazer essa joça realmente. O curl faz muita coisa que demora mais que só o upload, eu assumo @@ -74,37 +74,37 @@ int calcula_tempo_upload(){ velocidade = malloc(255*sizeof(char)); int velocidade_f; - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le lixo e joga fora puts(velocidade); - fscanf(velocidade_upload, "%s", velocidade); + fscanf(velocidade_upload, "%s", velocidade); //Le a velocidade de upload puts(velocidade); puts("vai calcular"); - velocidade_f = atoi(velocidade); + velocidade_f = atoi(velocidade); //Transforma em float puts("calculou"); puts("chegou aqui"); - return(10*(1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. *10 pois o curl demora muito mais que só fazer o upload + return((1953)/velocidade_f*3); // *3 para levar em conta problemas de rede. } //Função que gera o arquivo de dados do usuario, tanto os que foram recebidos do banco quanto informaçõs de sistema. Esse arquivo // sera submetido junto à imagem quando o upload for feito. void gera_arquivo_dados_usuario(){ - user_info dados_do_user; - pega_dados_do_usuario(&dados_do_user); + user_info dados_do_user; //Estrutura definida em openslx_gui.h para guardar os dados do usuario + pega_dados_do_usuario(&dados_do_user); //Abre o arquivo gerado no Login e coloca os dados do usuario na estrutura dados_do_user FILE *user_data_file; - user_data_file = fopen("user_data.info", "wr"); + user_data_file = fopen("user_data.info", "wr"); //Arquivo com os dados do usuario que será feito o upload fputs("Nome do criador da imagem: ", user_data_file); fputs(dados_do_user.name, user_data_file); @@ -116,13 +116,13 @@ void gera_arquivo_dados_usuario(){ fputs(dados_do_user.city, user_data_file); time_t timer; - time(&timer); + time(&timer); //pega o tempo de criação da imagem fputs("\nData da criação da imagem: ", user_data_file); - fputs(ctime(&timer), user_data_file); + fputs(ctime(&timer), user_data_file); //Coloca o tempo de criação da imagem no arquivo fclose(user_data_file); - system("uname -a >> user_data.info"); - system("lsb_release -a >> user_data.info"); + system("uname -a >> user_data.info"); //Coloca informações sobre o usuario no arquivo + system("lsb_release -a >> user_data.info"); //Coloca informações sobre o sistema no arquivo @@ -314,7 +314,7 @@ int checa_sucesso_get_info(){ } //Função que faz o Login do usuario no sistema. Utiliza a biblioteca Libcurlc para realizar as requisições http. -// Guarda as saidas em arquivos para uso posterios. Guarda o cookie para uso posterios tbm +// Guarda as saidas em arquivos para uso posterior. Guarda o cookie para uso posterior tbm int faz_login_dummy(GtkWidget *w, gpointer p){ dados *data_ant = p; //Pega os dados recebidos pela chamada da função tela_principal(NULL, data_ant); @@ -332,9 +332,9 @@ int faz_login(GtkWidget *w, gpointer p){ resp = malloc(255*sizeof(char)); puts("teste"); puts(gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); - strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); + strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); //Login do usuario strcat(data, "&passwd="); - strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); + strcat(data, gtk_entry_get_text(GTK_ENTRY(data_ant->dado4))); //Senha do usuario strcat(data, "&request=login"); puts(data); @@ -367,7 +367,7 @@ int faz_login(GtkWidget *w, gpointer p){ if(checa_sucesso_do_login()){ //Se o login foi bem sucedido, pega as informações do usuário printf("Linha %d\n", __LINE__); - char *data2="request=getinfo"; + char *data2="request=getinfo"; //Muda a requisição para getinfo, recebendo os dados do usuario curl_easy_setopt(curl, CURLOPT_WRITEDATA, dados_do_user); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); @@ -392,26 +392,21 @@ int faz_login(GtkWidget *w, gpointer p){ curl_easy_cleanup(curl); if(checa_upload_antigo()){ //Verifica se existe um upload antigo nessa máquina - tela_upload_antigo(NULL, data_ant); + tela_upload_antigo(NULL, data_ant); //Se tiver, chama a tela de uplaod antigo }else{ - if(data_ant->control == 0){ - tela_principal(NULL, data_ant); - } + tela_principal(NULL, data_ant); //Se não, chama a tela principal } return 1; } printf("Linha %d\n", __LINE__); } printf("Linha %d\n", __LINE__); - gtk_label_set_text(GTK_LABEL(data_ant->dado5), "Login nao encontrado!"); + gtk_label_set_text(GTK_LABEL(data_ant->dado5), "Login nao encontrado!"); //O login não foi bem sucedido printf("Linha %d\n", __LINE__); return 0; } //Função que faz o upload da imagem + dados para a api do site. Atualmente faz upload só de UM arquivo -void faz_upload_dummy(GtkWidget *w, gpointer p){ - // stg4_tela_confirmacao_upload(NULL, p); -}//Função de teste dummy //função de teste que faz upload da imagem teste.r1 void faz_upload_teste(GtkWidget *w, gpointer p){ @@ -423,7 +418,7 @@ void faz_upload_teste(GtkWidget *w, gpointer p){ struct dados *data = malloc(sizeof(*data)); GPid pid; GChildWatchFunc handler; - char **argv; + char **argv; //Vetor de argumentos para a g_spawn argv = malloc(10*sizeof(char*)); for (i=0; i < 10; i++){ argv[i] = malloc(255*sizeof(char)); @@ -434,19 +429,17 @@ void faz_upload_teste(GtkWidget *w, gpointer p){ loading = GTK_WIDGET(gtk_builder_get_object(builder, "loading_screen")); gtk_widget_show_all(loading); - strcpy(argv[0], "./upload"); - strcpy(argv[1], "/home/ent13/Desktop/pasta-teste"); - strcpy(argv[2], "teste"); - strcpy(argv[3], ".r1"); - argv[4] = NULL; + strcpy(argv[0], "./upload"); //Comando a ser invocado pelo shell + strcpy(argv[1], "/home/ent13/Desktop/pasta-teste"); //Local do arquivo de uplaod teste + strcpy(argv[2], "teste"); //nome da imagem + strcpy(argv[3], ".r1"); //versão da imagem + argv[4] = NULL; //ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync - handler = stg4_tela_confirmacao_upload; + handler = stg4_tela_confirmacao_upload; //Função a ser chamada quando o g_spawn sair data->dado6 = loading; data->dado1 = data_ant->dado1; data->pid = pid; - g_child_watch_add(pid, handler, data); - // stg4_tela_confirmacao_upload(NULL, p); - + g_child_watch_add(pid, handler, data); //Chamará a função apontada por handler ao sair do processo criado pelo g_spawn } void faz_upload(GtkWidget *w, gpointer p){ @@ -459,7 +452,7 @@ void faz_upload(GtkWidget *w, gpointer p){ int i; GPid pid; GChildWatchFunc handler; - char **argv; + char **argv; //Vetor de argumentos do G_spawn argv = malloc(10*sizeof(char*)); for (i=0; i < 10; i++){ argv[i] = malloc(255*sizeof(char)); @@ -475,22 +468,20 @@ void faz_upload(GtkWidget *w, gpointer p){ gtk_widget_show_all(loading); printf("Linha %d\n", __LINE__); - strcpy(argv[0], "./upload"); - strcpy(argv[1], gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado4))); - strcpy(argv[2], gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); - strcpy(argv[3], ".r1"); - argv[4] = NULL; + strcpy(argv[0], "./upload"); //Comando a ser invocado pelo shell + strcpy(argv[1], gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data_ant->dado4))); //Caminho para a imagem criada pelo usuario + strcpy(argv[2], gtk_entry_get_text(GTK_ENTRY(data_ant->dado3))); //Nome da imagem + strcpy(argv[3], ".r1"); //versão, isso será depois lidado pela api, por isso o .r1 + argv[4] = NULL; //ESSE ULTIMO PARAMETRO DEVE SER NULO, ele é o sentinela e informa o g_spawn onde acabam os parametros de invocação printf("Linha %d\n", __LINE__); g_spawn_async_with_pipes(NULL, argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD,NULL,NULL, &pid, NULL, NULL, NULL, NULL); //NAO USE FORK PARA SPAWNAR SCRIPTS, use essa função. Documentação em: https://developer.gnome.org/glib/stable/glib-Spawning-Processes.html#g-spawn-sync printf("Linha %d\n", __LINE__); - handler = stg4_tela_confirmacao_upload; + handler = stg4_tela_confirmacao_upload; //Função a ser chamada quando o g_spawn sair data->dado6 = loading; data->dado1 = data_ant->dado1; data->pid = pid; printf("Linha %d\n", __LINE__); - g_child_watch_add(pid, handler, data); - //stg4_tela_confirmacao_upload(NULL, p); - + g_child_watch_add(pid, handler, data); //Chamará a função apontada por handler ao sair do processo criado pelo g_spawn } diff --git a/useful/stg312/upload-utils.h b/useful/stg312/upload-utils.h index 82e030c1..1dd972c4 100644 --- a/useful/stg312/upload-utils.h +++ b/useful/stg312/upload-utils.h @@ -17,7 +17,6 @@ void gera_arquivo_dados_usuario(); int checa_sucesso_do_login(); void pega_dados_do_usuario(user_info *dados); int checa_sucesso_get_info(); -int faz_login_dummy(GtkWidget *w, gpointer p); int faz_login(GtkWidget *w, gpointer p); void faz_upload_dummy(GtkWidget *w, gpointer p); void faz_upload_teste(GtkWidget *w, gpointer p); diff --git a/useful/stg312/utils.c b/useful/stg312/utils.c index 90ff9b13..9c279842 100644 --- a/useful/stg312/utils.c +++ b/useful/stg312/utils.c @@ -42,15 +42,16 @@ gboolean on_key_press (GtkWidget *w, GdkEventKey *event, gpointer p){ window = w; dados *data_ant = p; //Pega os dados recebidos pela chamada da função button = data_ant->dado2; //Botão que da continuidade ao software, dado->2 por comodidade. + puts(gtk_widget_get_name(w)); switch (event->keyval){ - case GDK_KEY_F10: //Apertoyu f10 + case GDK_KEY_F10: //Apertou f10 help_screen(NULL, NULL); break; - case GDK_KEY_F6: //Apertoyu f6 - if(data_ant->control == 1) + case GDK_KEY_F6: //Apertou f6 + if(!strcmp(gtk_widget_get_name(w), "instal_window")) abre_shell(NULL, NULL); break; @@ -269,7 +270,7 @@ void mata_janela_e_chama_tela_principal(GtkWidget *w, gpointer p){ puts("teste2"); janela_ant = data_ant->dado1; puts("teste"); - gtk_widget_hide(janela_ant);//Nao achou isso, nao cuspiu teste 4 + gtk_widget_hide(janela_ant); //Esconde a janela anterior//Nao achou isso, nao cuspiu teste 4 puts("teste4"); g_signal_emit_by_name(janela_ant, "destroy"); puts("teste5"); -- GitLab