📄 uif_sfont.c
字号:
save_as = FALSE: just saves it returns: NULL if just saved it or ignored, or file selection widget pointer *--------------------------------- */GtkWidget *uisf_save_sfont (gint save_as){ SFItemID itemid, pitemid; GtkCTreeNode *node; UISFont *uisf; UIVBank *uivb; GTokenValue *val; GtkWidget *savewin; if (!(itemid = sftree_get_selection_single ())) return (NULL); if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return (NULL); uisf = SFTREE_UPFIND_UISF (node); /* if not a sound font, then its a virtual bank */ if (!uisf) uivb = SFTREE_UPFIND_UIVB (node); /* Save As not requested and not first save, then just save it */ if (uisf) /* ?: sound font? */ { if (!save_as && uisf->sf->sffd && uisf->sf->beensaved) { uisf_cb_save_continue (uisf->sf->fname, itemid); return (NULL); } pitemid = uisf->sf->itemid; /* parent (sfont) item ID */ } else /* ?: no, virtual bank */ { if (!save_as && uivb->vbnk->beensaved) { uisf_cb_save_continue (uivb->vbnk->fname, itemid); return (NULL); } pitemid = uivb->vbnk->itemid; /* parent (vbank) item ID */ } /* Save As, i.e. pops a save file selection window */ /* check if save file selection dialog already active */ if (util_activate_unique_dialog ("savesf", pitemid)) return (NULL); /* pop save dialog window */ savewin = gtk_file_selection_new ((uisf != NULL) ? _("Save Sound Font") : _("Save Virtual Bank")); util_register_unique_dialog (savewin, "savesf", pitemid); /* if save path isn't set, use default sfont path from smurf.cfg */ if (!uisf_sfont_save_path) { val = smurfcfg_get_val (SMURFCFG_DEF_SFONT_PATH); uisf_sfont_save_path = g_strdup (val->v_string); } if (strlen (uisf_sfont_save_path)) gtk_file_selection_set_filename (GTK_FILE_SELECTION (savewin), uisf_sfont_save_path); gtk_object_set_data (GTK_OBJECT (GTK_FILE_SELECTION (savewin)->ok_button), "savewin", savewin); gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (savewin)->ok_button), "clicked", (GtkSignalFunc) uisf_cb_saveas_dialog_okay, GINT_TO_POINTER (itemid)); gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (savewin)-> cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (savewin)); gtk_widget_show (savewin); return (savewin);}static voiduisf_cb_saveas_dialog_okay (GtkWidget * btn, SFItemID itemid){ GtkCTreeNode *node; UISFont *uisf; UIVBank *uivb; GtkWidget *popup; /* popup used for overwrite confirmation */ GtkWidget *savewin; /* save file selection widget */ gchar *fname; struct stat st; gchar *s; /* get save file selection widget */ savewin = gtk_object_get_data (GTK_OBJECT (btn), "savewin"); if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) { gtk_widget_destroy (savewin); return; } uisf = SFTREE_UPFIND_UISF (node); if (!uisf) uivb = SFTREE_UPFIND_UIVB (node); else uivb = NULL; fname = gtk_file_selection_get_filename (GTK_FILE_SELECTION (savewin)); if (strlen (fname) == 0) return; if ((uisf && uisf_find_sfont_by_fname (fname, uisf->sf)) || (uivb && uisf_find_vbank_by_fname (fname, uivb->vbnk))) { util_quick_popup ( _("That sound font is currently loaded and should not be saved over"), NULL); return; } if (!strlen (g_basename (fname))) { logit (LogFubar, _("No file specified in path '%s'"), fname); return; } if (stat (fname, &st) != -1) { /* file exists? */ s = g_strdup_printf (_("Overwrite existing file '%s'?"), fname); popup = util_quick_popup (s, _("OK"), uisf_cb_save_ovrwrite_okay, itemid, _("Cancel"), NULL, NULL, NULL); g_free (s); gtk_object_set_data (GTK_OBJECT (popup), "savewin", savewin); return; } if (uisf_cb_save_continue (fname, itemid)) { g_free (uisf_sfont_save_path); /* free old save path */ s = g_dirname (fname); /* new save path */ uisf_sfont_save_path = g_strconcat (s, G_DIR_SEPARATOR_S, NULL); g_free (s); gtk_widget_destroy (savewin); /* destroy save dialog on success */ }}/* user confirmed file overwrite for sound font save */static voiduisf_cb_save_ovrwrite_okay (gpointer data, GtkWidget *popdog){ GtkCTreeNode *node; GtkWidget *savewin; /* save file selection widget */ gchar *fname; SFItemID itemid = GPOINTER_TO_INT (data); savewin = gtk_object_get_data (GTK_OBJECT (popdog), "savewin"); gtk_widget_destroy (popdog); if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return; fname = gtk_file_selection_get_filename (GTK_FILE_SELECTION (savewin)); if (uisf_cb_save_continue (fname, itemid)) gtk_widget_destroy (savewin); /* destroy save dialog on success */}static gintuisf_cb_save_continue (gchar * fname, SFItemID itemid){ GtkCTreeNode *node; UISFont *uisf; UIVBank *uivb; gchar *dirname; FILE *tmpfd; gchar *tmpfname; gint mksfd = -1; struct stat st; gint retval; if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return (FAIL); uisf = SFTREE_UPFIND_UISF (node); if (!uisf) uivb = SFTREE_UPFIND_UIVB (node); dirname = g_dirname (fname); /* stat the target directory */ if (stat (dirname, &st) == -1) { g_free (dirname); return (logit (LogFubar | LogErrno, _("Target directory doesn't exist or error occured"))); } /* is it really a directory? (is this necessary?) */ if (!S_ISDIR (st.st_mode)) { g_free (dirname); return (logit (LogFubar, _("Target path is not a directory"))); } tmpfname = g_strconcat (dirname, G_DIR_SEPARATOR_S "smurf_tmp.XXXXXX", NULL); g_free (dirname); /* string from g_dirname() needs to be freed */ if ((mksfd = mkstemp (tmpfname)) == -1 || !(tmpfd = fdopen (mksfd, "w+"))) { if (mksfd != -1) { unlink (tmpfname); close (mksfd); } logit (LogFubar | LogErrno, _("Unable to open temp file '%s' for writing"), tmpfname); g_free (tmpfname); return (FAIL); } if (uisf) retval = sfsave_file (uisf->sf, tmpfd); else retval = vbank_save (uivb->vbnk, tmpfd); if (!retval) { fclose (tmpfd); if (unlink (tmpfname) == -1) logit (LogWarn, _("Could not delete temporary file '%s'"), tmpfname); g_free (tmpfname); return (FAIL); } if (rename (tmpfname, fname) == -1) { /* sample file offsets need restoration (sfload.c)? */ if (uisf) /* only valid if a sound font */ sfsave_undo_sample_posofs (); /* restore sample file offsets */ logit (LogFubar | LogErrno, _("Failed to rename temp file to destination file name")); fclose (tmpfd); if (unlink (tmpfname) == -1) logit (LogWarn, _("Could not delete temporary file \"%s\""), tmpfname); g_free (tmpfname); return (FAIL); } g_free (tmpfname); if (uisf) /* ?: sound font? */ { uisf->sf->up2date = TRUE; /* sfont is now up to date */ uisf->sf->beensaved = TRUE; /* the sound font has now been saved */ if (uisf->sf->sffd) fclose (uisf->sf->sffd); /* close old sound font fd */ uisf->sf->sffd = tmpfd; /* assign new fd */ fflush (tmpfd); /* flush all writes to disk, fd stays open */ /* update sound font file name */ sfont_set_fname (uisf->sf, fname); sftree_update_sfont_node_label (uisf); /* ohh! Didn't need it after all (see sfload.c) */ sfsave_free_sample_posofs (); } else /* ?: No, virtual bank */ { uivb->vbnk->up2date = TRUE; /* vbank now up to date */ uivb->vbnk->beensaved = TRUE; /* been saved now */ vbank_set_fname (uivb->vbnk, fname); sftree_update_vbank_node_label (uivb); fclose (tmpfd); /* close file descriptor */ } return (OK);}/* pops a dialog to edit/view sound font info (itemid should be sf node) */voiduisf_sfont_info (void){ SFItemID itemid; GtkCTreeNode *node; UISFont *uisf; SFData *sf; GtkWidget *infowin; GtkWidget *lbl; GtkWidget *entry; GtkWidget *text; gchar *s, *s2, *s3; if (!(itemid = sftree_get_selection_single ())) return; if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) return; uisf = SFTREE_UPFIND_UISF (node); sf = uisf->sf; /* check if info dialog already active for this sound font */ if (util_activate_unique_dialog ("sfinfo", sf->itemid)) return; infowin = create_infowin (); util_register_unique_dialog (infowin, "sfinfo", sf->itemid); gtk_object_set_data (GTK_OBJECT (infowin), "itemid",GINT_TO_POINTER (itemid)); entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENinam"); s = sfont_get_info (sf, INAM_ID); if (s) gtk_entry_set_text (GTK_ENTRY (entry), s); entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENieng"); s = sfont_get_info (sf, IENG_ID); if (s) gtk_entry_set_text (GTK_ENTRY (entry), s); entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicop"); s = sfont_get_info (sf, ICOP_ID); if (s) gtk_entry_set_text (GTK_ENTRY (entry), s); entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENiprd"); s = sfont_get_info (sf, IPRD_ID); if (s) gtk_entry_set_text (GTK_ENTRY (entry), s); entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicrd"); s = sfont_get_info (sf, ICRD_ID); if (s) gtk_entry_set_text (GTK_ENTRY (entry), s); lbl = gtk_object_get_data (GTK_OBJECT (infowin), "LBLiver"); s = g_strdup_printf ("%d.%d", sf->version.major, sf->version.minor); gtk_label_set_text (GTK_LABEL (lbl), s); g_free (s); s = sfont_get_info (sf, ISFT_ID); s2 = strchr (s, ':'); if (s2) { s3 = g_strndup (s, (gint) (s2 - s)); s2 = g_strdup (s2 + 1); } else { s3 = g_strdup (s); s2 = g_strdup (""); } entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENcreate"); gtk_entry_set_text (GTK_ENTRY (entry), s3); g_free (s3); entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENedit"); gtk_entry_set_text (GTK_ENTRY (entry), s2); g_free (s2); if (!(s = sfont_get_info (sf, ISNG_ID))) s = ""; lbl = gtk_object_get_data (GTK_OBJECT (infowin), "LBLisng"); gtk_label_set_text (GTK_LABEL (lbl), s); if ((s = sfont_get_info (sf, IROM_ID))) s = g_strdup_printf ("%s v%d.%d", s, sf->romver.major, sf->romver.minor); else s = g_strdup (""); lbl = gtk_object_get_data (GTK_OBJECT (infowin), "LBLirom"); gtk_label_set_text (GTK_LABEL (lbl), s); g_free (s); text = gtk_object_get_data (GTK_OBJECT (infowin), "TXTicmt"); s = sfont_get_info (sf, ICMT_ID); if (s) { s2 = str_crlf2lf (s); gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, s2, -1); g_free (s2); } gtk_widget_show (infowin);}voiduisf_cb_sfont_info_date_today (GtkWidget * btn, GtkWidget * entry){ time_t t; struct tm *tm; gchar s[41]; time (&t); tm = localtime (&t); strftime (s, 40, "%B %e, %Y", tm); gtk_entry_set_text (GTK_ENTRY (entry), s);}voiduisf_cb_sfont_info_okay (GtkWidget * btn, GtkWidget *infowin){ SFItemID itemid; GtkCTreeNode *node; UISFont *uisf; SFData *sf; SFItemID sfitemid; GtkWidget *entry; GtkWidget *text; gchar *s, *s2; itemid = GPOINTER_TO_INT(gtk_object_get_data (GTK_OBJECT (infowin),"itemid")); if (!(node = SFTREE_LOOKUP_ITEMID (itemid))) { /* node still exists? */ gtk_widget_destroy (infowin); return; } uisf = SFTREE_UPFIND_UISF (node); sf = uisf->sf; sfitemid = sf->itemid; sfdo_group(_("Modified sound font info")); /* start undo group */ entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENinam"); s = gtk_entry_get_text (GTK_ENTRY (entry)); s2 = sfont_get_info (sf, INAM_ID); if (strcmp (s, s2) != 0) { dofunc_sfinfo_save (sfitemid, INAM_ID); sfont_set_info (sf, INAM_ID, s); sftree_update_sfont_node_label (uisf); /* update sfont tree label */ } entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENieng"); s = gtk_entry_get_text (GTK_ENTRY (entry)); s2 = sfont_get_info (sf, IENG_ID); if (strcmp (s, s2) != 0) { dofunc_sfinfo_save (sfitemid, IENG_ID); sfont_set_info (sf, IENG_ID, s); } entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicop"); s = gtk_entry_get_text (GTK_ENTRY (entry)); s2 = sfont_get_info (sf, ICOP_ID); if (strcmp (s, s2) != 0) { dofunc_sfinfo_save (sfitemid, ICOP_ID); sfont_set_info (sf, ICOP_ID, s); } entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENiprd"); s = gtk_entry_get_text (GTK_ENTRY (entry)); s2 = sfont_get_info (sf, IPRD_ID); if (strcmp (s, s2) != 0) { dofunc_sfinfo_save (sfitemid, IPRD_ID); sfont_set_info (sf, IPRD_ID, s); } entry = gtk_object_get_data (GTK_OBJECT (infowin), "ENicrd"); s = gtk_entry_get_text (GTK_ENTRY (entry)); s2 = sfont_get_info (sf, ICRD_ID); if (strcmp (s, s2) != 0) { dofunc_sfinfo_save (sfitemid, ICRD_ID); sfont_set_info (sf, ICRD_ID, s); } text = gtk_object_get_data (GTK_OBJECT (infowin), "TXTicmt"); s2 = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1); s = str_lf2crlf (s2); /* convert end of line characters */ g_free (s2); /* yeah, that is awefully large, but who knows what someone might want to store here, perhaps complementary ascii pictures of cows mating */ if (strlen (s) > 65535) s2[65535] = '\0'; s2 = sfont_get_info (sf, ICMT_ID); if (strcmp (s, s2) != 0) { dofunc_sfinfo_save (sfitemid, ICMT_ID); sfont_set_info (sf, ICMT_ID, s); } g_free (s); sfdo_done(); /* done with undo group */ gtk_widget_destroy (infowin);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -