uif_pref.c

来自「A GTK sound font editor. Sound font file」· C语言 代码 · 共 907 行 · 第 1/2 页

C
907
字号
/*================================================================== * uif_pref.c - User interface routines for preferences * * Smurf Sound Font Editor * Copyright (C) 1999-2001 Josh Green * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA or point your web browser to http://www.gnu.org. * * To contact the author of this program: * Email: Josh Green <jgreen@users.sourceforge.net> * Smurf homepage: http://smurf.sourceforge.net *==================================================================*/#include "config.h"#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gtk/gtk.h>#include "uif_pref.h"#include "uif_sftree.h"#include "uif_piano.h"#include "glade_interface.h"#include "uiface.h"#include "smurfcfg.h"#include "widgets/popdog.h"#include "sfont.h"		/* to set sfont_minsamloop/pad */#include "wavetable.h"		/* list of wavetable drivers */#include "sequencer.h"		/* list of sequencer drivers */#include "midi.h"		/* list of midi drivers */#include "util.h"#include "i18n.h"/* Prototypes */static void pref_apply_changes (GtkWidget * prefwin);static void pref_save_piano_keytable (void);static void pref_cb_path_browse_ok (GtkWidget * btn, GtkWidget * filesel);static void pref_cb_vkeyb_selection_done (GtkWidget * menu,					  GtkWidget * prefwin);static void pref_toggle_sensitive_widgets (GtkWidget * btn,					   GtkWidget * prefwin, gchar **names);static void pref_cb_mthru_selection_done (GtkWidget * menu,					  GtkWidget * prefwin);static void pref_load_piano_key_clist (GtkWidget * clist, gboolean lowoct);static void pref_update_keycapture_msg (GtkWidget *prefwin);static gboolean pref_keycapture;  /* if piano key capture is in effect */static gboolean pref_change_all_keys;  /* change all keys active? */static gchar *keynames[] ={  "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};guint pref_temp_keytable [UIPIANO_TOTAL_NUMKEYS];voidpref_create (void){  GtkWidget *prefwin;  GtkWidget *widg;  GtkWidget *menu, *item;  GTokenValue *val;  gchar *s;  gint i, i2;  gint sfspec;  if (util_activate_unique_dialog ("pref", 0)) return;  prefwin = create_prefwin ();  util_register_unique_dialog (prefwin, "pref", 0);  /* Initialize the General notebook page */  val = smurfcfg_get_val (SMURFCFG_DEF_SFONT_PATH);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENsfpath");  gtk_entry_set_text (GTK_ENTRY (widg), val->v_string);  val = smurfcfg_get_val (SMURFCFG_DEF_SAMPLE_PATH);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENsampath");  gtk_entry_set_text (GTK_ENTRY (widg), val->v_string);  val = smurfcfg_get_val (SMURFCFG_VBNK_SEARCH_PATH);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENvbnkpaths");  gtk_entry_set_text (GTK_ENTRY (widg), val->v_string);  val = smurfcfg_get_val (SMURFCFG_SAVE_WIN_GEOM);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKwingeom");  if (val->v_int)    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);  val = smurfcfg_get_val (SMURFCFG_SET_WIN_POS);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKwinpos");  if (val->v_int)    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);  val = smurfcfg_get_val (SMURFCFG_SET_PANE_SIZE);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKpanesize");  if (val->v_int)    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKtips");  if (smurfcfg_get_val (SMURFCFG_TIPS_ENABLED)->v_int)    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKsplash");  if (smurfcfg_get_val (SMURFCFG_DISABLE_SPLASH)->v_int)    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);  val = smurfcfg_get_val (SMURFCFG_QUIT_CONFIRM);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPquit");  if (val->v_int <= SMURFCFG_QUIT_CONFIRM_NEVER)    gtk_option_menu_set_history (GTK_OPTION_MENU (widg), val->v_int);  /* Initialize the Sound Font notebook page */  val = smurfcfg_get_val (SMURFCFG_TEMP_AUDIBLE_BANK);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBbank");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)val->v_int);  val = smurfcfg_get_val (SMURFCFG_TEMP_AUDIBLE_PRESET);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBpset");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)val->v_int);  val = smurfcfg_get_val (SMURFCFG_WAVETBL_SAM_CACHING);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPsamcache");  i = val->v_int;  if (i < 0 || i > 2) i = 2;  gtk_option_menu_set_history (GTK_OPTION_MENU (widg), i);  val = smurfcfg_get_val (SMURFCFG_SAM_SFSPEC);  sfspec = val->v_int;  if (sfspec)    widg = gtk_object_get_data (GTK_OBJECT (prefwin), "RADsamspec");  else    widg = gtk_object_get_data (GTK_OBJECT (prefwin), "RADsamcustom");  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);  val = smurfcfg_get_val (SMURFCFG_SAM_MINLOOP);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBminloop");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (gfloat) val->v_int);  if (sfspec)    gtk_widget_set_sensitive (widg, FALSE);  val = smurfcfg_get_val (SMURFCFG_SAM_MINLOOPPAD);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBminpad");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (gfloat) val->v_int);  if (sfspec)    gtk_widget_set_sensitive (widg, FALSE);  val = smurfcfg_get_val (SMURFCFG_SAM_BUF_WASTE);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmaxwaste");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (gfloat) val->v_int);  val = smurfcfg_get_val (SMURFCFG_SAM_CH1_POSTFIX);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENleftch");  gtk_entry_set_text (GTK_ENTRY (widg), val->v_string);  val = smurfcfg_get_val (SMURFCFG_SAM_CH2_POSTFIX);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENrightch");  gtk_entry_set_text (GTK_ENTRY (widg), val->v_string);  /* Initialize the Driver config page */  /* wavetable driver frame */  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPwavtbl");  menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (widg));  s = smurfcfg_get_val (SMURFCFG_WAVETBL_DRIVER)->v_string;  /* add list of compiled in drivers to menu (AUTO already added) */  for (i = 0, i2 = 0; i < WTBL_COUNT; i++)    {      /* if this driver is the current setting, save index for later */      if (strcmp (s, wtbl_drivers[i].name) == 0)	i2 = i + 1;      item = gtk_menu_item_new_with_label (_(wtbl_drivers[i].name));      gtk_widget_show (item);      gtk_menu_append (GTK_MENU (menu), item);    }  gtk_option_menu_set_history (GTK_OPTION_MENU (widg), i2);  val = smurfcfg_get_val (SMURFCFG_WAVETBL_OSSDEV);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENwtblossdev");  gtk_entry_set_text (GTK_ENTRY (widg), val->v_string);  /* Virtual Keyboard driver frame */  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPvkeyb");  menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (widg));  gtk_signal_connect (GTK_OBJECT (menu), "selection-done",		      (GtkSignalFunc) pref_cb_vkeyb_selection_done, prefwin);  s = smurfcfg_get_val (SMURFCFG_SEQ_DRIVER)->v_string;  /* add list of compiled in drivers to menu (AUTO already added) */  for (i = 0, i2 = 0; i < SEQ_COUNT; i++)    {      /* if this driver is the current setting, save index for later */      if (strcmp (s, seq_drivers[i].name) == 0)	i2 = i + 1;      item = gtk_menu_item_new_with_label (_(seq_drivers[i].name));      gtk_widget_show (item);      gtk_menu_append (GTK_MENU (menu), item);    }  gtk_option_menu_set_history (GTK_OPTION_MENU (widg), i2);  /* "selection-done" signal is not activated by gtk_option_menu_set_history */  pref_cb_vkeyb_selection_done (menu, prefwin);  i = smurfcfg_get_val (SMURFCFG_SEQ_ALSACLIENT)->v_int;  if (i == 0)			/* client #0 is for AUTO */    {      widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKvkauto");      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);      i = 1;      i2 = 0;    }  else    i2 = smurfcfg_get_val (SMURFCFG_SEQ_ALSAPORT)->v_int;  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBvkclient");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)i);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBvkport");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)i2);  /* Midi thru driver frame */  /* MIDI driver selection menu */  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPmidi");  menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (widg));  gtk_signal_connect (GTK_OBJECT (menu), "selection-done",		      (GtkSignalFunc) pref_cb_mthru_selection_done, prefwin);  s = smurfcfg_get_val (SMURFCFG_MIDI_DRIVER)->v_string;  for (i = 0, i2 = 0; i < MIDI_COUNT; i++)    {      /* if this driver is the current setting, save index for later */      if (strcmp (s, midi_drivers[i].name) == 0)	i2 = i + 1;      item = gtk_menu_item_new_with_label (_(midi_drivers[i].name));      gtk_widget_show (item);      gtk_menu_append (GTK_MENU (menu), item);    }  gtk_option_menu_set_history (GTK_OPTION_MENU (widg), i2);  /* "selection-done" signal is not activated by gtk_option_menu_set_history */  pref_cb_mthru_selection_done (menu, prefwin);  i = smurfcfg_get_val (SMURFCFG_MIDI_ALSA_INCLIENT)->v_int;  if (i == 0)			/* client #0 is for AUTO */    {      widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKmtinauto");      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);      i = 1;      i2 = 0;    }  else    i2 = smurfcfg_get_val (SMURFCFG_MIDI_ALSA_INPORT)->v_int;  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmtinclient");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)i);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmtinport");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)i2);  i = smurfcfg_get_val (SMURFCFG_MIDI_ALSA_OUTCLIENT)->v_int;  if (i == 0)			/* client #0 is for AUTO */    {      widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKmtoutauto");      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widg), TRUE);      i = 1;      i2 = 0;    }  else    i2 = smurfcfg_get_val (SMURFCFG_MIDI_ALSA_OUTPORT)->v_int;  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmtoutclient");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)i);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmtoutport");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (float)i2);  val = smurfcfg_get_val (SMURFCFG_MIDI_ALSACARD);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmtcard");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (gfloat) val->v_int);  val = smurfcfg_get_val (SMURFCFG_MIDI_ALSADEVICE);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmtdev");  gtk_spin_button_set_value (GTK_SPIN_BUTTON (widg), (gfloat) val->v_int);  /* Piano key mapping frame */  /* copy key codes to temporary array */  for (i = 0; i < UIPIANO_TOTAL_NUMKEYS; i++)    pref_temp_keytable[i] = uipiano_keytable[i];  /* load piano key CLIST */  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CLSTkeys");  pref_load_piano_key_clist (widg, TRUE);  pref_keycapture = FALSE;  pref_change_all_keys = FALSE;  gtk_widget_show (prefwin);}/* user said Okay to preferences, so apply all pref changes */voidpref_cb_set_pref_okay (GtkWidget * btn, GtkWidget * prefwin){  pref_apply_changes (prefwin);}/* user clicked "Save Preferences" button, apply pref changes, save smurfcfg */voidpref_cb_save_pref_clicked (GtkWidget * btn, GtkWidget * prefwin){  pref_apply_changes (prefwin);  smurfcfg_save ();}/* applies changes user made to preferences to smurfcfg vars */static voidpref_apply_changes (GtkWidget * prefwin){  GTokenValue val;  GtkWidget *widg;  gint i, i2;  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENsfpath");  val.v_string = gtk_entry_get_text (GTK_ENTRY (widg));  smurfcfg_set_val (SMURFCFG_DEF_SFONT_PATH, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENsampath");  val.v_string = gtk_entry_get_text (GTK_ENTRY (widg));  smurfcfg_set_val (SMURFCFG_DEF_SAMPLE_PATH, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENvbnkpaths");  val.v_string = gtk_entry_get_text (GTK_ENTRY (widg));  smurfcfg_set_val (SMURFCFG_VBNK_SEARCH_PATH, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKwingeom");  val.v_int = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_SAVE_WIN_GEOM, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKwinpos");  val.v_int = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_SET_WIN_POS, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKpanesize");  val.v_int = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_SET_PANE_SIZE, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKtips");  val.v_int = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_TIPS_ENABLED, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKsplash");  val.v_int = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_DISABLE_SPLASH, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPquit");  UTIL_OPMENU_INDEX (val.v_int, widg);  smurfcfg_set_val (SMURFCFG_QUIT_CONFIRM, &val);  /* sound font tab */  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBbank");  val.v_int = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_TEMP_AUDIBLE_BANK, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBpset");  val.v_int = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_TEMP_AUDIBLE_PRESET, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPsamcache");  UTIL_OPMENU_INDEX (val.v_int, widg);  smurfcfg_set_val (SMURFCFG_WAVETBL_SAM_CACHING, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "RADsamspec");  val.v_int = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widg));  smurfcfg_set_val (SMURFCFG_SAM_SFSPEC, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBminloop");  val.v_int = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  val.v_int = CLAMP (val.v_int, 1, 99);	/* clamp to slightly sane vals */  smurfcfg_set_val (SMURFCFG_SAM_MINLOOP, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBminpad");  val.v_int = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  val.v_int = CLAMP (val.v_int, 1, 99);	/* clamp to slightly sane vals */  smurfcfg_set_val (SMURFCFG_SAM_MINLOOPPAD, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENleftch");  val.v_string = gtk_entry_get_text (GTK_ENTRY (widg));  smurfcfg_set_val (SMURFCFG_SAM_CH1_POSTFIX, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENrightch");  val.v_string = gtk_entry_get_text (GTK_ENTRY (widg));  smurfcfg_set_val (SMURFCFG_SAM_CH2_POSTFIX, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "SPBmaxwaste");  val.v_int = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widg));  val.v_int = CLAMP (val.v_int, 0, 100); /* slightly sane? */  smurfcfg_set_val (SMURFCFG_SAM_BUF_WASTE, &val);  /* drivers tab */  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPwavtbl");  UTIL_OPMENU_INDEX (i, widg);  if (i == 0)    val.v_string = "AUTO";  else    val.v_string = wtbl_drivers[i - 1].name;  smurfcfg_set_val (SMURFCFG_WAVETBL_DRIVER, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "ENwtblossdev");  val.v_string = gtk_entry_get_text (GTK_ENTRY (widg));  smurfcfg_set_val (SMURFCFG_WAVETBL_OSSDEV, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "OPvkeyb");  UTIL_OPMENU_INDEX (i, widg);  if (i == 0)    val.v_string = "AUTO";  else    val.v_string = seq_drivers[i - 1].name;  smurfcfg_set_val (SMURFCFG_SEQ_DRIVER, &val);  widg = gtk_object_get_data (GTK_OBJECT (prefwin), "CHKvkauto");

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?