prefs.c
上传用户:ledjyj
上传日期:2014-08-27
资源大小:2639k
文件大小:26k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /*
  2.  *  This program is free software; you can redistribute it and/or modify
  3.  *  it under the terms of the GNU General Public License as published by
  4.  *  the Free Software Foundation; either version 2 of the License, or
  5.  *  (at your option) any later version.
  6.  *
  7.  *  This program is distributed in the hope that it will be useful,
  8.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.  *  GNU Library General Public License for more details.
  11.  *
  12.  *  You should have received a copy of the GNU General Public License
  13.  *  along with this program; if not, write to the Free Software
  14.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15.  */
  16. #include <gconf/gconf-client.h>
  17. #include <profiles/audio-profile-choose.h>
  18. #include <string.h>
  19. #include "config.h"
  20. #include "prefs.h"
  21. #include "trayicon.h"
  22. #include "gui.h"
  23. #include "rec_tech.h"
  24. static GtkWidget *device_entry;
  25. static GtkWidget *mixer_combo;
  26. static GtkWidget *mute_on_exit_cb;
  27. static GtkWidget *list_view;
  28. static GtkListStore *list_store;
  29. static GtkTreeSelection *selection;
  30. gboolean save_settings(void)
  31. {
  32. gint i, count;
  33. gchar *buffer;
  34. preset *ps;
  35. GConfClient* client = NULL;
  36. if (!gconf_is_initialized())
  37. return FALSE;
  38. client = gconf_client_get_default();
  39. if (!client)
  40. return FALSE;
  41. /* Store general settings */
  42. gconf_client_set_string(client, "/apps/gnomeradio/device", settings.device, NULL);
  43. gconf_client_set_string(client, "/apps/gnomeradio/mixer", settings.mixer, NULL);
  44. gconf_client_set_string(client, "/apps/gnomeradio/mixer-device", settings.mixer_dev, NULL);
  45. gconf_client_set_bool(client, "/apps/gnomeradio/mute-on-exit", settings.mute_on_exit, NULL);
  46. /*gconf_client_set_float(client, "/apps/gnomeradio/volume", volume->value, NULL);*/
  47. gconf_client_set_float(client, "/apps/gnomeradio/last-freq", adj->value/STEPS, NULL);
  48. /* Store recording settings */
  49. /* gconf_client_set_string(client, "/apps/gnomeradio/recording/audiodevice", rec_settings.audiodevice, NULL);
  50. gconf_client_set_bool(client, "/apps/gnomeradio/recording/record-as-mp3", rec_settings.mp3, NULL);
  51. gconf_client_set_string(client, "/apps/gnomeradio/recording/sample-rate", rec_settings.rate, NULL);
  52. gconf_client_set_string(client, "/apps/gnomeradio/recording/sample-format", rec_settings.sample, NULL);
  53. gconf_client_set_bool(client, "/apps/gnomeradio/recording/record-in-stereo", rec_settings.stereo, NULL);
  54. gconf_client_set_string(client, "/apps/gnomeradio/recording/encoder", rec_settings.encoder, NULL);
  55. gconf_client_set_string(client, "/apps/gnomeradio/recording/bitrate", rec_settings.bitrate, NULL);
  56. */
  57. gconf_client_set_string(client, "/apps/gnomeradio/recording/destination", rec_settings.destination, NULL);
  58. gconf_client_set_string(client, "/apps/gnomeradio/recording/profile", rec_settings.profile, NULL);
  59. /* Store the presets */
  60. count = g_list_length(settings.presets);
  61. gconf_client_set_int(client, "/apps/gnomeradio/presets/presets", count, NULL);
  62. for (i=0;i<count;i++)
  63. {
  64. ps = g_list_nth_data(settings.presets, i);
  65. buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/name", i);
  66. gconf_client_set_string(client, buffer, ps->title, NULL); 
  67. g_free(buffer);
  68. buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/freqency", i);
  69. gconf_client_set_float(client, buffer, ps->freq, NULL); 
  70. g_free(buffer);
  71. }
  72. gconf_client_set_int(client, "/apps/gnomeradio/presets/last", mom_ps, NULL);
  73. /*g_print("Storing Settings in GConf databasen");*/
  74. return TRUE;
  75. }
  76. gboolean load_settings(void)
  77. {
  78. gint i, count;
  79. gchar *buffer;
  80. preset *ps;
  81. GConfClient *client = NULL;
  82. double freq;
  83. settings.presets = NULL;
  84. if (!gconf_is_initialized())
  85. return FALSE;
  86. client = gconf_client_get_default();
  87. if (!client)
  88. return FALSE;
  89. /* Load general settings */
  90. settings.device = gconf_client_get_string(client, "/apps/gnomeradio/device" , NULL);
  91. if (!settings.device)
  92. settings.device = g_strdup("/dev/radio");
  93. settings.mixer = gconf_client_get_string(client, "/apps/gnomeradio/mixer", NULL);
  94. if (!settings.mixer)
  95. settings.mixer = g_strdup("line");
  96. settings.mixer_dev = gconf_client_get_string(client, "/apps/gnomeradio/mixer-device", NULL);
  97. if (!settings.mixer_dev)
  98. settings.mixer_dev = g_strdup("/dev/mixer");
  99. settings.mute_on_exit = gconf_client_get_bool(client, "/apps/gnomeradio/mute-on-exit", NULL);
  100. /*volume->value = gconf_client_get_float(client, "/apps/gnomeradio/volume", NULL);*/
  101. freq = gconf_client_get_float(client, "/apps/gnomeradio/last-freq", NULL);
  102. if ((freq < FREQ_MIN) || (freq > FREQ_MAX))
  103. adj->value = FREQ_MIN * STEPS;
  104. else
  105. adj->value = freq * STEPS;
  106. /* Load recording settings */
  107. /* rec_settings.audiodevice = gconf_client_get_string(client, "/apps/gnomeradio/recording/audiodevice", NULL);
  108. if (!rec_settings.audiodevice)
  109. rec_settings.audiodevice = g_strdup("/dev/audio");
  110. rec_settings.mp3 = gconf_client_get_bool(client, "/apps/gnomeradio/recording/record-as-mp3", NULL);
  111. rec_settings.rate = gconf_client_get_string(client, "/apps/gnomeradio/recording/sample-rate", NULL);
  112. if (!rec_settings.rate)
  113. rec_settings.rate = g_strdup("44100");
  114. rec_settings.sample = gconf_client_get_string(client, "/apps/gnomeradio/recording/sample-format", NULL);
  115. if (!rec_settings.sample)
  116. rec_settings.sample = g_strdup("16");
  117. rec_settings.stereo = gconf_client_get_bool(client, "/apps/gnomeradio/recording/record-in-stereo", NULL);
  118. rec_settings.encoder = gconf_client_get_string(client, "/apps/gnomeradio/recording/encoder", NULL);
  119. if (!rec_settings.encoder)
  120. rec_settings.encoder = g_strdup("oggenc");
  121. rec_settings.bitrate = gconf_client_get_string(client, "/apps/gnomeradio/recording/bitrate", NULL);
  122. if (!rec_settings.bitrate)
  123. rec_settings.bitrate = g_strdup("192");*/
  124. rec_settings.destination = gconf_client_get_string(client, "/apps/gnomeradio/recording/destination", NULL);
  125. if (!rec_settings.destination)
  126. rec_settings.destination = g_strdup(g_get_home_dir());
  127. rec_settings.profile = gconf_client_get_string(client, "/apps/gnomeradio/recording/profile", NULL);
  128. if (!rec_settings.profile)
  129. rec_settings.profile = g_strdup("cdlossy");
  130. /* Load the presets */
  131. count = gconf_client_get_int(client, "/apps/gnomeradio/presets/presets", NULL);
  132. for (i=0;i<count;i++)
  133. {
  134. ps = malloc(sizeof(preset));
  135. buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/name", i);
  136. ps->title = gconf_client_get_string(client, buffer, NULL); 
  137. g_free(buffer);
  138. if (!ps->title)
  139. ps->title = g_strdup(_("unnamed"));
  140. buffer = g_strdup_printf("/apps/gnomeradio/presets/%d/freqency", i);
  141. freq = gconf_client_get_float(client, buffer, NULL); 
  142. if ((freq < FREQ_MIN) || (freq > FREQ_MAX))
  143. ps->freq = FREQ_MIN;
  144. else
  145. ps->freq = freq;
  146. g_free(buffer);
  147. settings.presets = g_list_append(settings.presets, (gpointer)ps);
  148. }
  149. mom_ps = gconf_client_get_int(client, "/apps/gnomeradio/presets/last", NULL);
  150. if (mom_ps >= count)
  151. mom_ps = -1;
  152. return TRUE;
  153. }
  154. static void mute_on_exit_toggled_cb(GtkWidget* widget, gpointer data)
  155. {
  156. settings.mute_on_exit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mute_on_exit_cb));
  157. }
  158. static gboolean device_entry_activate_cb(GtkWidget *widget, gpointer data)
  159. {
  160. const gchar *text = gtk_entry_get_text(GTK_ENTRY(device_entry));
  161. if (!strcmp(settings.device, text)) return FALSE;
  162. if (settings.device) g_free(settings.device);
  163. settings.device = g_strdup(text);
  164. start_radio(TRUE, data);
  165. return FALSE;
  166. }
  167. static gboolean mixer_combo_change_cb(GtkComboBox *combo, gpointer data)
  168. {
  169. GList *mixer_devs;
  170. int active;
  171. gchar *mixer_dev, *tmp;
  172. g_assert(combo);
  173. mixer_devs = g_object_get_data(G_OBJECT(combo), "mixer_devs");
  174. active = gtk_combo_box_get_active(combo);
  175. g_assert(active > -1);
  176. mixer_dev = (gchar*)g_list_nth_data(mixer_devs, active);
  177. g_assert(mixer_dev);
  178. if (g_str_equal(mixer_dev, settings.mixer))
  179. return FALSE;
  180. if (settings.mixer) g_free(settings.mixer);
  181. settings.mixer = g_strdup(mixer_dev);
  182. if ((tmp = strstr(settings.mixer, " (")))
  183. tmp[0] = '';
  184. start_mixer(TRUE, data);
  185. return FALSE;
  186. }
  187. /*static gboolean bitrate_combo_change_cb(GtkComboBox *combo, gpointer data)
  188. {
  189. GList *bitrates;
  190. gint active;
  191. gchar *bitrate;
  192. g_assert(combo);
  193. bitrates = g_object_get_data(G_OBJECT(combo), "bitrates");
  194. active = gtk_combo_box_get_active(combo);
  195. g_assert(active > -1);
  196. bitrate = (gchar*)g_list_nth_data(bitrates, active);
  197. g_assert(bitrate);
  198. if (rec_settings.bitrate) g_free(rec_settings.bitrate);
  199. rec_settings.bitrate = g_strdup(bitrate);
  200. return FALSE;
  201. }*/
  202. /*static gboolean encoder_combo_change_cb(GtkComboBox *combo, gpointer bitrate_combo)
  203. {
  204. GList *encoders;
  205. gint active;
  206. gchar *encoder;
  207. g_assert(combo);
  208. encoders = g_object_get_data(G_OBJECT(combo), "encoders");
  209. active = gtk_combo_box_get_active(combo);
  210. g_assert(active > -1);
  211. encoder = (gchar*)g_list_nth_data(encoders, active);
  212. g_assert(encoder);
  213. if (g_str_equal(encoder, _("Wave file"))) rec_settings.mp3 = FALSE;
  214. else {
  215. rec_settings.mp3 = TRUE;
  216. if (rec_settings.encoder) g_free(rec_settings.encoder);
  217. rec_settings.encoder = g_strdup(encoder);
  218. }
  219. gtk_widget_set_sensitive(bitrate_combo, rec_settings.mp3);
  220. return FALSE;
  221. }*/
  222. static gboolean profile_combo_change_cb(GtkComboBox *combo, gpointer userdata)
  223. {
  224. GMAudioProfile* profile = gm_audio_profile_choose_get_active(GTK_WIDGET(combo));
  225. g_assert(rec_settings.profile);
  226. g_free(rec_settings.profile);
  227. rec_settings.profile = g_strdup(gm_audio_profile_get_id(profile));
  228. return FALSE;
  229. }
  230. static void add_button_clicked_cb(GtkWidget *widget, gpointer data)
  231. {
  232. preset *ps;
  233. gchar *buffer;
  234. GtkTreeIter iter = {0};
  235. GtkAdjustment* v_scb;
  236. GtkTreePath *path = NULL;
  237. GList* menuitems;
  238. GtkWidget *menuitem;
  239. ps = malloc(sizeof(preset));
  240. ps->title = g_strdup(_("unnamed"));
  241. ps->freq = rint(adj->value) / STEPS;
  242. settings.presets = g_list_append(settings.presets, (gpointer) ps);
  243. buffer = g_strdup_printf("%.2f", ps->freq);
  244. gtk_list_store_append(list_store, &iter);
  245. gtk_list_store_set(list_store, &iter, 0, ps->title, 1, buffer, -1);
  246. g_free(buffer);
  247. gtk_tree_selection_unselect_all(selection);
  248. v_scb = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(list_view));
  249. gtk_adjustment_set_value(v_scb, v_scb->upper);
  250. gtk_combo_box_append_text(GTK_COMBO_BOX(preset_combo), ps->title);
  251. mom_ps = g_list_length(settings.presets) - 1;
  252. preset_combo_set_item(mom_ps);
  253. menuitems = GTK_MENU_SHELL(tray_menu)->children;
  254. menuitem = gtk_menu_item_new_with_label(ps->title); 
  255. gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, mom_ps);
  256. g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, (gpointer)mom_ps);
  257. gtk_widget_show(menuitem);
  258. buffer = g_strdup_printf("%d", g_list_length(settings.presets) - 1);
  259. path = gtk_tree_path_new_from_string(buffer);
  260. g_free(buffer);
  261. gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
  262. gtk_tree_path_free(path);
  263. }
  264. static void del_button_clicked_cb(GtkWidget *widget, gpointer data)
  265. {
  266. GtkTreePath *path = NULL;
  267. GtkTreeViewColumn *focus_column = NULL;
  268. GtkTreeIter iter;
  269. preset *ps;
  270. int *row;
  271. GList* menuitems;
  272. GtkWidget *menuitem;
  273. gtk_tree_view_get_cursor(GTK_TREE_VIEW(list_view), &path, &focus_column);
  274. if (!path) return;
  275. row = gtk_tree_path_get_indices(path);
  276. g_assert(row);
  277. g_assert(*row < g_list_length(settings.presets));
  278. ps = g_list_nth_data(settings.presets, *row);
  279. g_assert(ps);
  280. settings.presets = g_list_remove(settings.presets, (gpointer)ps);
  281. g_free(ps->title);
  282. g_free(ps);
  283. gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
  284. gtk_list_store_remove(list_store, &iter);
  285. gtk_combo_box_remove_text(GTK_COMBO_BOX(preset_combo), *row + 1);
  286. if (--mom_ps < 0) mom_ps = 0;
  287. if (!g_list_length(settings.presets)) mom_ps = -1;
  288. preset_combo_set_item(mom_ps);
  289. menuitems = GTK_MENU_SHELL(tray_menu)->children;
  290. g_assert(*row < g_list_length(menuitems));
  291. menuitem = g_list_nth_data(menuitems, *row);
  292. gtk_widget_destroy(menuitem);
  293. gtk_tree_path_prev(path);
  294. gtk_tree_view_set_cursor(GTK_TREE_VIEW(list_view), path, NULL, FALSE);
  295. gtk_tree_path_free(path);
  296. }
  297. static void destination_button_clicked_cb(GtkWidget *button, gpointer data)
  298. {
  299. GtkWidget *dialog;
  300. dialog = gtk_file_chooser_dialog_new(_("Choose a destination folder"), NULL, 
  301. GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, 
  302. GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 
  303. GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
  304. NULL);
  305. gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), rec_settings.destination);
  306. if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
  307. if (rec_settings.destination) g_free(rec_settings.destination);
  308. rec_settings.destination = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
  309. gtk_button_set_label(GTK_BUTTON(button), rec_settings.destination);
  310. }
  311. gtk_widget_destroy (dialog);
  312. }
  313. static gboolean list_view_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
  314. {
  315. if (event->keyval == GDK_Delete)
  316. del_button_clicked_cb(widget, user_data);
  317. if (event->keyval == GDK_Insert)
  318. add_button_clicked_cb(widget, user_data);
  319. return FALSE;
  320. }
  321. static void name_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path_str, gchar *new_val, gpointer user_data)
  322. {
  323. GtkTreePath *path = NULL;
  324. GtkTreeIter iter;
  325. preset *ps;
  326. int *row;
  327. GList* menuitems;
  328. GtkWidget *menuitem;
  329. path = gtk_tree_path_new_from_string(path_str);
  330. row = gtk_tree_path_get_indices(path);
  331. g_assert(row);
  332. g_assert(*row < g_list_length(settings.presets));
  333. ps = g_list_nth_data(settings.presets, *row);
  334. g_assert(ps);
  335. if (ps->title) g_free(ps->title);
  336. ps->title = g_strdup(new_val);
  337. gtk_combo_box_remove_text(GTK_COMBO_BOX(preset_combo), *row + 1);
  338. gtk_combo_box_insert_text(GTK_COMBO_BOX(preset_combo), *row + 1, ps->title);
  339. preset_combo_set_item(mom_ps);
  340. menuitems = GTK_MENU_SHELL(tray_menu)->children;
  341. g_assert(mom_ps < g_list_length(menuitems));
  342. menuitem = g_list_nth_data(menuitems, mom_ps);
  343. gtk_widget_destroy(menuitem);
  344. menuitem = gtk_menu_item_new_with_label(ps->title); 
  345. gtk_menu_shell_insert(GTK_MENU_SHELL(tray_menu), menuitem, *row);
  346. g_signal_connect(G_OBJECT(menuitem), "activate", (GCallback)preset_menuitem_activate_cb, (gpointer)mom_ps);
  347. gtk_widget_show(menuitem);
  348. gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
  349. gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, new_val, -1);
  350. gtk_tree_path_free(path);
  351. }
  352. static void freq_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path_str, gchar *new_val, gpointer user_data)
  353. {
  354. GtkTreePath *path = NULL;
  355. GtkTreeIter iter;
  356. preset *ps;
  357. int *row;
  358. double value;
  359. gchar *freq_str;
  360. if (sscanf(new_val, "%lf", &value) != 1) return;
  361. if (value < FREQ_MIN) value = FREQ_MIN;
  362. if (value > FREQ_MAX) value = FREQ_MAX;
  363. value = rint(value * STEPS) / STEPS;
  364. freq_str = g_strdup_printf("%.2f", value);
  365. path = gtk_tree_path_new_from_string(path_str);
  366. row = gtk_tree_path_get_indices(path);
  367. g_assert(row);
  368. g_assert(*row < g_list_length(settings.presets));
  369. ps = g_list_nth_data(settings.presets, *row);
  370. g_assert(ps);
  371. ps->freq = value;
  372. gtk_adjustment_set_value(adj, value * STEPS);
  373. mom_ps = *row;
  374. preset_combo_set_item(mom_ps);
  375. gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store), &iter, path);
  376. gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 1, freq_str, -1);
  377. g_free(freq_str);
  378. gtk_tree_path_free(path);
  379. }
  380. static void
  381. list_view_cursor_changed_cb(GtkWidget *widget, gpointer data)
  382. {
  383. int *row;
  384. GtkTreePath *path = NULL;
  385. GtkTreeViewColumn *focus_column = NULL;
  386. gtk_tree_view_get_cursor(GTK_TREE_VIEW(list_view), &path, &focus_column);
  387. if (!path) return;
  388. row = gtk_tree_path_get_indices(path);
  389. g_assert(row);
  390. mom_ps = *row;
  391. preset_combo_set_item(mom_ps);
  392. return;
  393. }
  394. static void free_string_list(GList *list)
  395. {
  396. if (!list) return;
  397. g_list_foreach(list, (GFunc)g_free, NULL);
  398. g_list_free(list);
  399. }
  400. GtkWidget* prefs_window(GtkWidget *app)
  401. {
  402. GtkWidget *dialog;
  403. GtkWidget *box, *sbox, *pbox, *rbox;
  404. GtkWidget *settings_box, *presets_box, *record_box;
  405. GtkWidget *settings_label, *presets_label, *record_label;
  406. GtkWidget *s_indent_label, *p_indent_label, *r_indent_label;
  407. GtkWidget *destination_label;
  408. GtkWidget *destination_button;
  409. GtkWidget *profile_combo;
  410. GtkWidget *mixer_eb, *profile_eb;
  411. GtkWidget *preset_box;
  412. GtkWidget *settings_table, *record_table;
  413. GtkWidget *device_label, *mixer_label;
  414. GtkWidget *button_box;
  415. GtkWidget *add_button, *del_button;
  416. GtkWidget *scrolled_window;
  417. GtkCellRenderer *cellrenderer;
  418. GtkTreeViewColumn *list_column;
  419. GList *mixer_devs, *profiles, *ptr;
  420. gint i, active;
  421. char *settings_hdr, *presets_hdr, *record_hdr;
  422. preset* ps;
  423. dialog = gtk_dialog_new_with_buttons(_("Gnomeradio Settings"), GTK_WINDOW(app), 
  424. GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
  425. GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, 
  426. GTK_STOCK_HELP, GTK_RESPONSE_HELP,
  427. NULL);
  428. gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
  429. gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE);
  430. box = gtk_vbox_new(FALSE, 18);
  431. gtk_container_set_border_width(GTK_CONTAINER(box), 12);
  432. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), box, TRUE, TRUE, 0);
  433. settings_box = gtk_vbox_new(FALSE, 6);
  434. gtk_box_pack_start(GTK_BOX(box), settings_box, TRUE, TRUE, 0);
  435. settings_hdr = g_strconcat("<span weight="bold">", _("General Settings"), "</span>", NULL);
  436. settings_label = gtk_label_new(settings_hdr);
  437. gtk_misc_set_alignment(GTK_MISC(settings_label), 0, 0.5);
  438. gtk_label_set_use_markup(GTK_LABEL(settings_label), TRUE);
  439. g_free(settings_hdr);
  440. gtk_box_pack_start(GTK_BOX(settings_box), settings_label, TRUE, TRUE, 0);
  441. presets_box = gtk_vbox_new(FALSE, 6);
  442. gtk_box_pack_start(GTK_BOX(box), presets_box, TRUE, TRUE, 0);
  443. presets_hdr = g_strconcat("<span weight="bold">", _("Presets"), "</span>", NULL);
  444. presets_label = gtk_label_new(presets_hdr);
  445. gtk_misc_set_alignment(GTK_MISC(presets_label), 0, 0.5);
  446. gtk_label_set_use_markup(GTK_LABEL(presets_label), TRUE);
  447. g_free(presets_hdr);
  448. gtk_box_pack_start(GTK_BOX(presets_box), presets_label, TRUE, TRUE, 0);
  449. record_box = gtk_vbox_new(FALSE, 6);
  450. gtk_box_pack_start(GTK_BOX(box), record_box, TRUE, TRUE, 0);
  451. record_hdr = g_strconcat("<span weight="bold">", _("Record Settings"), "</span>", NULL);
  452. record_label = gtk_label_new(record_hdr);
  453. gtk_misc_set_alignment(GTK_MISC(record_label), 0, 0.5);
  454. gtk_label_set_use_markup(GTK_LABEL(record_label), TRUE);
  455. g_free(record_hdr);
  456. gtk_box_pack_start(GTK_BOX(record_box), record_label, TRUE, TRUE, 0);
  457. /* The general settings part */
  458. sbox = gtk_hbox_new(FALSE, 0);
  459. gtk_box_pack_start(GTK_BOX(settings_box), sbox, TRUE, TRUE, 0);
  460. s_indent_label = gtk_label_new("    ");
  461. gtk_box_pack_start(GTK_BOX(sbox), s_indent_label, FALSE, FALSE, 0);
  462. settings_table = gtk_table_new(3, 2, FALSE);
  463. gtk_table_set_row_spacings(GTK_TABLE(settings_table), 5);
  464. gtk_table_set_col_spacings(GTK_TABLE(settings_table), 15);
  465. gtk_box_pack_start(GTK_BOX(sbox), settings_table, TRUE, TRUE, 0);
  466. device_label = gtk_label_new(_("Radio Device:"));
  467. gtk_misc_set_alignment(GTK_MISC(device_label), 0.0f, 0.5f); 
  468. device_entry = gtk_entry_new();
  469. gtk_entry_set_text(GTK_ENTRY(device_entry), settings.device);
  470. gtk_table_attach_defaults(GTK_TABLE(settings_table), device_label, 0, 1, 0, 1);
  471. gtk_table_attach_defaults(GTK_TABLE(settings_table), device_entry, 1, 2, 0, 1);
  472. mixer_label = gtk_label_new(_("Mixer Source:"));
  473. gtk_misc_set_alignment(GTK_MISC(mixer_label), 0.0f, 0.5f);
  474. mixer_eb = gtk_event_box_new();
  475. mixer_combo = gtk_combo_box_new_text();
  476. gtk_container_add(GTK_CONTAINER(mixer_eb), mixer_combo);
  477. ptr = mixer_devs = get_mixer_recdev_list();
  478. for (i = 0, active = 0; ptr; ptr = g_list_next(ptr)) {
  479. gtk_combo_box_append_text(GTK_COMBO_BOX(mixer_combo), ptr->data);
  480. if (g_str_equal(ptr->data, settings.mixer)) active = i;
  481. ++i;
  482. }
  483. gtk_combo_box_set_active(GTK_COMBO_BOX(mixer_combo), active);
  484. g_object_set_data_full(G_OBJECT(mixer_combo), "mixer_devs", mixer_devs, (GDestroyNotify)free_string_list);
  485. gtk_table_attach_defaults(GTK_TABLE(settings_table), mixer_label, 0, 1, 1, 2);
  486. gtk_table_attach_defaults(GTK_TABLE(settings_table), mixer_eb, 1, 2, 1, 2);
  487. mute_on_exit_cb = gtk_check_button_new_with_label(_("Mute on exit?"));
  488. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_on_exit_cb), settings.mute_on_exit);
  489. gtk_table_attach_defaults(GTK_TABLE(settings_table), mute_on_exit_cb, 0, 2, 2, 3);
  490. g_signal_connect(GTK_OBJECT(device_entry), "hide", GTK_SIGNAL_FUNC(device_entry_activate_cb), app);
  491. g_signal_connect(GTK_OBJECT(device_entry), "activate", GTK_SIGNAL_FUNC(device_entry_activate_cb), NULL);
  492. g_signal_connect(GTK_OBJECT(mixer_combo), "changed", GTK_SIGNAL_FUNC(mixer_combo_change_cb), app);
  493. g_signal_connect(GTK_OBJECT(mute_on_exit_cb), "toggled", GTK_SIGNAL_FUNC(mute_on_exit_toggled_cb), NULL);
  494. gtk_tooltips_set_tip(tooltips, device_entry, _("Specify the radio-device (in most cases /dev/radio)"), NULL);
  495. gtk_tooltips_set_tip(tooltips, mixer_eb, 
  496. _("Choose the mixer source (line, line1, etc.) that is able to control the volume of your radio"), NULL);
  497. gtk_tooltips_set_tip(tooltips, mute_on_exit_cb, _("If unchecked, gnomeradio won't mute after exiting"), NULL);
  498. /* The presets part */
  499. pbox = gtk_hbox_new(FALSE, 0);
  500. gtk_box_pack_start(GTK_BOX(presets_box), pbox, TRUE, TRUE, 0);
  501. p_indent_label = gtk_label_new("    ");
  502. gtk_box_pack_start(GTK_BOX(pbox), p_indent_label, FALSE, FALSE, 0);
  503. preset_box = gtk_vbox_new(FALSE, 10);
  504. gtk_box_pack_start(GTK_BOX(pbox), preset_box, TRUE, TRUE, 0);
  505. scrolled_window = gtk_scrolled_window_new(NULL, NULL);
  506. list_store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
  507. list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
  508. gtk_container_add(GTK_CONTAINER(scrolled_window), list_view);
  509. gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
  510. gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  511. gtk_widget_set_size_request(list_view, 200, 150);
  512. gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list_view), FALSE);
  513. selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list_view));
  514. gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
  515. /*gtk_tree_selection_select_path(selection, gtk_tree_path_new_from_string("0"));
  516. gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc)list_view_select_cb, NULL, NULL);*/
  517. cellrenderer = gtk_cell_renderer_text_new();
  518. cellrenderer->mode = GTK_CELL_RENDERER_MODE_EDITABLE;
  519. GTK_CELL_RENDERER_TEXT(cellrenderer)->editable = TRUE;
  520. list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 0, NULL);
  521. gtk_tree_view_column_set_min_width(list_column, 150);
  522. gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
  523. g_signal_connect(GTK_OBJECT(cellrenderer), "edited", GTK_SIGNAL_FUNC(name_cell_edited_cb), NULL);
  524. cellrenderer = gtk_cell_renderer_text_new();
  525. cellrenderer->mode = GTK_CELL_RENDERER_MODE_EDITABLE;
  526. cellrenderer->xalign = 1.0f;
  527. GTK_CELL_RENDERER_TEXT(cellrenderer)->editable = TRUE;
  528. list_column = gtk_tree_view_column_new_with_attributes(NULL, cellrenderer, "text", 1, NULL);
  529. gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), list_column);
  530. g_signal_connect(GTK_OBJECT(cellrenderer), "edited", GTK_SIGNAL_FUNC(freq_cell_edited_cb), NULL);
  531. button_box = gtk_hbox_new(FALSE, 12);
  532. add_button = gtk_button_new_from_stock(GTK_STOCK_ADD);
  533. del_button = gtk_button_new_from_stock(GTK_STOCK_DELETE);
  534. gtk_box_pack_end(GTK_BOX(button_box), del_button, FALSE, FALSE, 0);
  535. gtk_box_pack_end(GTK_BOX(button_box), add_button, FALSE, FALSE, 0);
  536. gtk_box_pack_start(GTK_BOX(preset_box), scrolled_window, TRUE, TRUE, 0);
  537. gtk_box_pack_start(GTK_BOX(preset_box), button_box, TRUE, TRUE, 0);
  538. for (i=0;i<g_list_length(settings.presets);i++) {
  539. GtkTreeIter iter = {0};
  540. char *buffer;
  541. ps = g_list_nth_data(settings.presets, i);
  542. buffer = g_strdup_printf("%0.2f", ps->freq);
  543. gtk_list_store_append(list_store, &iter);
  544. gtk_list_store_set(list_store, &iter, 0, ps->title, 1, buffer, -1);
  545. g_free(buffer);
  546. }
  547. g_signal_connect(GTK_OBJECT(add_button), "clicked", GTK_SIGNAL_FUNC(add_button_clicked_cb), NULL);
  548. g_signal_connect(GTK_OBJECT(del_button), "clicked", GTK_SIGNAL_FUNC(del_button_clicked_cb), NULL);
  549. g_signal_connect(GTK_OBJECT(list_view), "key-press-event", GTK_SIGNAL_FUNC(list_view_key_press_event_cb), NULL);
  550. g_signal_connect(GTK_OBJECT(list_view), "cursor-changed", GTK_SIGNAL_FUNC(list_view_cursor_changed_cb), NULL);
  551. gtk_tooltips_set_tip(tooltips, add_button, _("Add a new preset"), NULL);
  552. gtk_tooltips_set_tip(tooltips, del_button, _("Remove preset from List"), NULL);
  553. /* The record settings part */
  554. rbox = gtk_hbox_new(FALSE, 0);
  555. gtk_box_pack_start(GTK_BOX(record_box), rbox, TRUE, TRUE, 0);
  556. r_indent_label = gtk_label_new("    ");
  557. gtk_box_pack_start(GTK_BOX(rbox), r_indent_label, FALSE, FALSE, 0);
  558. record_table = gtk_table_new(2, 2, FALSE);
  559. gtk_table_set_col_spacings(GTK_TABLE(record_table), 15);
  560. gtk_table_set_row_spacings(GTK_TABLE(record_table), 5);
  561. destination_label = gtk_label_new(_("Destination directory:"));
  562. gtk_misc_set_alignment(GTK_MISC(destination_label), 0.0f, 0.5f);
  563. destination_button = gtk_button_new();
  564. gtk_button_set_label(GTK_BUTTON(destination_button), rec_settings.destination);
  565. profile_eb = gtk_event_box_new();
  566. profile_combo = gm_audio_profile_choose_new();
  567. gtk_container_add(GTK_CONTAINER(profile_eb), profile_combo);
  568. gm_audio_profile_choose_set_active(profile_combo, rec_settings.profile);
  569. gtk_table_attach_defaults(GTK_TABLE(record_table), destination_label, 0, 1, 0, 1);
  570. gtk_table_attach_defaults(GTK_TABLE(record_table), destination_button, 1, 2, 0, 1);
  571. gtk_table_attach_defaults(GTK_TABLE(record_table), profile_eb, 0, 2, 1, 2);
  572. g_signal_connect(GTK_OBJECT(destination_button), "clicked", GTK_SIGNAL_FUNC(destination_button_clicked_cb), NULL);
  573. g_signal_connect(GTK_OBJECT(profile_combo), "changed", GTK_SIGNAL_FUNC(profile_combo_change_cb), NULL);
  574. gtk_tooltips_set_tip(tooltips, profile_eb, _("Choose the Media Profile that should be used to record."), NULL);
  575. gtk_box_pack_start(GTK_BOX(rbox), record_table, TRUE, TRUE, 0);
  576. gtk_widget_show_all(dialog);
  577. return dialog;
  578. }