From 20eecdbe123c68d4fe1ebd65cc66764095417fed Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 27 Jan 2020 17:08:12 -0300 Subject: [PATCH] Implementing linux "create desktop icon" action. --- src/objects/linux/savedesktopicon.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 120 insertions(+), 7 deletions(-) diff --git a/src/objects/linux/savedesktopicon.c b/src/objects/linux/savedesktopicon.c index e65c3ed..aa112fa 100644 --- a/src/objects/linux/savedesktopicon.c +++ b/src/objects/linux/savedesktopicon.c @@ -56,11 +56,11 @@ StartupNotify=true Categories=GTK;GNOME;TerminalEmulator OnlyShowIn=GNOME;Unity X-Desktop-File-Install-Version=0.23 - */ static const struct _entry { + const gchar * key; const gchar * label; const gchar * tooltip; gint width; @@ -75,12 +75,21 @@ X-Desktop-File-Install-Version=0.23 }, { + .key = "Name", .label = N_("Launcher name"), .width = 20, // .n_chars = 128 }, { + .key = "GenericName", + .label = N_("Generic name"), + .width = 20, +// .n_chars = 128 + }, + + { + .key = "Comment", .label = N_("Comment"), .width = 30, // .n_chars = 128 @@ -130,6 +139,7 @@ X-Desktop-File-Install-Version=0.23 // Create entry fields GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); + debug("Dialog=%p inputs=%p",dialog,inputs); GtkGrid * grid = GTK_GRID(gtk_grid_new()); @@ -150,6 +160,8 @@ X-Desktop-File-Install-Version=0.23 gtk_grid_attach(grid,label,0,ix,1,1); inputs[ix] = gtk_entry_new(); + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); // gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars); gtk_widget_set_hexpand(inputs[ix],FALSE); @@ -166,9 +178,12 @@ X-Desktop-File-Install-Version=0.23 gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),v3270_get_url(terminal)); - gtk_entry_set_text(GTK_ENTRY(inputs[2]),v3270_get_url(terminal)); - gtk_entry_set_input_hints(GTK_ENTRY(inputs[2]),GTK_INPUT_HINT_SPELLCHECK); + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); + gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); + + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); + gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); + gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK); gtk_widget_show_all(GTK_WIDGET(grid)); return dialog; @@ -178,11 +193,109 @@ X-Desktop-File-Install-Version=0.23 debug("%s(%d)",__FUNCTION__,response_id); + if(response_id == GTK_RESPONSE_APPLY) { + + static const char * key_file_data = + "[Desktop Entry]\n" \ + "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \ + "Terminal=false\n" \ + "Type=Application\n" \ + "StartupNotify=true\n" \ + "Categories=GTK;GNOME;TerminalEmulator\n" \ + "OnlyShowIn=GNOME;Unity\n"; + + GError * error = NULL; + size_t ix; + + GKeyFile * keyfile = g_key_file_new(); + g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL); + +#ifdef DEBUG + { + g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL); + debug("\n%s\n",dbg_data); + } +#endif // DEBUG + + + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs"); + debug("dialog=%p inputs=%p",dialog,inputs); + + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { + if(entries[ix].key) { + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); + g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix]))); + } + } + + // Get session filename + const gchar * session_file = v3270_get_session_filename(terminal); + + /* + if(!session_file) { + + // No session file, create one. + + // Check for configdir + g_autofree gchar * configdir = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME),"sessions",NULL); + g_mkdir_with_parents(configdir,0755); - gtk_widget_destroy(dialog); + // Create a base name + g_autofree gchar * basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(inputs[0]))); - if(response_id == GTK_RESPONSE_OK) { + gchar *ptr = strrchr(basename,'.'); + if(ptr) + *ptr = 0; + ix = time(NULL); + gchar * new_session_file = g_strdup_printf("%s/%s.3270",configdir,basename); + while(!g_file_test(new_session_file,G_FILE_TEST_EXISTS)) { + g_free(new_session_file); + new_session_file = g_strdup_printf("%s/%s_%08lx.3270",configdir,basename,(unsigned long) ix++); + } + + g_message("Saving session to %s",new_session_file); + v3270_set_session_filename(terminal,new_session_file); + g_free(new_session_file); + + } + */ + + // Get program file name + // https://stackoverflow.com/questions/4517425/how-to-get-program-path + { + char buffer[4096]; + g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid()); + + int bytes = readlink(pidfile,buffer,4095); + + if(bytes >= 0) + buffer[bytes] = '\0'; + + g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_get_session_filename(terminal)); + g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); + + } + + g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[0])),&error); + + if(error) { + + g_message("%s",error->message); + + + g_error_free(error); + + } else { + + g_message("File \"%s\" was saved",gtk_entry_get_text(GTK_ENTRY(inputs[0]))); + + } + + + g_key_file_free(keyfile); } - } + gtk_widget_destroy(dialog); + +} -- libgit2 0.21.2