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

驱动编程

开发平台:

Unix_Linux

  1. /* gui.c
  2.  *
  3.  * Copyright (C) 2001 J鰎gen Scheibengruber
  4.  *
  5.  * This program is free software; you can redistribute it and/or 
  6.  * modify it under the terms of the GNU General Public License as 
  7.  * published by the Free Software Foundation; either version 2 of the
  8.  * License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  18.  * USA
  19.  */
  20. /*** the gui to gnomeradio */
  21. #include <config.h>
  22. #include <gnome.h>
  23. #include <gconf/gconf-client.h>
  24. #include <math.h>
  25. #include "eggtrayicon.h"
  26. #include "bacon-volume.h"
  27. #include "gui.h"
  28. #include "trayicon.h"
  29. #include "tech.h"
  30. #include "rec_tech.h"
  31. #include "lirc.h"
  32. #include "prefs.h"
  33. #include "record.h"
  34. #include "../data/pixmaps/digits.xpm"
  35. #include "../data/pixmaps/signal.xpm"
  36. #include "../data/pixmaps/stereo.xpm"
  37. #include "../data/pixmaps/freq_up.xpm"
  38. #include "../data/pixmaps/freq_down.xpm"
  39. #define DIGIT_WIDTH 20
  40. #define DIGIT_HEIGTH 30
  41. #define SIGNAL_WIDTH 25
  42. #define STEREO_WIDTH 35
  43. #define SCAN_SPEED 20
  44. #define TRANSLATORS "TRANSLATORS"
  45. static GtkWidget *drawing_area;
  46. static GdkPixmap *digits, *signal_s, *stereo;
  47. static GtkWidget *freq_scale;
  48. static GtkWidget *rec_pixmap;
  49. static int timeout_id, bp_timeout_id = -1, bp_timeout_steps = 0;
  50. static gboolean is_first_start(void)
  51. {
  52. GConfClient *client = gconf_client_get_default();
  53. if (!client)
  54. return TRUE;
  55. return !gconf_client_get_bool(client, "/apps/gnomeradio/first_time_flag", NULL);
  56. }
  57. static void set_first_time_flag(void)
  58. {
  59. GConfClient *client = gconf_client_get_default();
  60. if (!client)
  61. return;
  62. gconf_client_set_bool(client, "/apps/gnomeradio/first_time_flag", TRUE, NULL);
  63. }
  64. typedef struct {
  65. GtkWidget *dialog;
  66. GtkWidget *progress;
  67. GList *stations;
  68. GtkWidget *label;
  69. } FreqScanData;
  70. static gboolean initial_frequency_scan_cb(gpointer data)
  71. {
  72. static gfloat freq = FREQ_MIN - 4.0f/STEPS;
  73. FreqScanData *fsd = data;
  74. g_assert(fsd);
  75. if (freq > FREQ_MAX) {
  76. gtk_widget_destroy(fsd->dialog);
  77. timeout_id = 0;
  78. return FALSE;
  79. }
  80. if (radio_check_station(freq)) {
  81. char *text = g_strdup_printf(_("%d stations found"), g_list_length(fsd->stations) + 1);
  82. gfloat *f = g_malloc(sizeof(gfloat));
  83. gtk_label_set_text(GTK_LABEL(fsd->label), text);
  84. g_free(text);
  85. g_print("%.2f is a stationn", freq);
  86. *f = freq;
  87. fsd->stations = g_list_append(fsd->stations, f);
  88. }
  89. gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(fsd->progress), MAX(0, (freq - FREQ_MIN)/(FREQ_MAX - FREQ_MIN)));
  90. freq += 1.0/STEPS;
  91. radio_setfreq(freq);
  92. return TRUE;
  93. }
  94. static void initial_frequency_scan(GtkWidget *app)
  95. {
  96. FreqScanData data;
  97. GtkWidget *title;
  98. char *title_hdr;
  99. data.stations = NULL;
  100. data.dialog = gtk_dialog_new_with_buttons(_("Scanning"),
  101. GTK_WINDOW(app), DIALOG_FLAGS, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
  102. gtk_dialog_set_has_separator(GTK_DIALOG(data.dialog), FALSE);
  103. gtk_window_set_resizable(GTK_WINDOW(data.dialog), FALSE);
  104. title_hdr = g_strconcat("<span weight="bold">", _("Scanning for available stations:"), "</span>", NULL);
  105. title = gtk_label_new(title_hdr);
  106. gtk_misc_set_alignment(GTK_MISC(title), 0, 0.5);
  107. gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
  108. g_free(title_hdr);
  109. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(data.dialog)->vbox), title, FALSE, FALSE, 6);
  110. data.progress = gtk_progress_bar_new();
  111. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(data.dialog)->vbox), data.progress, TRUE, FALSE, 6);
  112. data.label = gtk_label_new(_("No stations found"));
  113. gtk_misc_set_alignment(GTK_MISC(data.label), 0, 0.5);
  114. gtk_box_pack_start(GTK_BOX(GTK_DIALOG(data.dialog)->vbox), data.label, TRUE, FALSE, 6);
  115. gtk_widget_show_all(data.dialog);
  116. radio_mute();
  117. timeout_id = g_timeout_add(1000/SCAN_SPEED, (GSourceFunc)initial_frequency_scan_cb, (gpointer)&data);
  118. int response = gtk_dialog_run(GTK_DIALOG(data.dialog));
  119. radio_unmute();
  120. if (timeout_id) {
  121. g_source_remove(timeout_id);
  122. timeout_id = 0;
  123. gtk_widget_destroy(data.dialog);
  124. } else {
  125. if (g_list_length(data.stations) > 0) {
  126. gfloat f = *((gfloat*)data.stations->data);
  127. adj->value = f*STEPS;
  128. radio_setfreq(f);
  129. GtkWidget *dialog;
  130. GList *ptr;
  131. char *text;
  132. text = g_strdup_printf(_("%d stations found. nDo you want to add them as presets?n"),
  133. g_list_length(data.stations));
  134. dialog = gtk_message_dialog_new(GTK_WINDOW(app), DIALOG_FLAGS, GTK_MESSAGE_QUESTION,
  135. GTK_BUTTONS_YES_NO, text);
  136. g_free(text);
  137. int response = gtk_dialog_run(GTK_DIALOG(dialog));
  138. gtk_widget_destroy(dialog);
  139. for (ptr = data.stations; ptr; ptr = ptr->next) {
  140. if (response == GTK_RESPONSE_YES) {
  141. preset *ps = g_malloc0(sizeof(preset));
  142. ps->title = g_strdup(_("unnamed"));
  143. ps->freq = *((gfloat*)ptr->data);
  144. settings.presets = g_list_append(settings.presets, ps);
  145. }
  146. g_free(ptr->data);
  147. }
  148. }
  149. }
  150. }
  151. static void prefs_button_clicked_cb(GtkButton *button, gpointer app)
  152. {
  153. GtkWidget* dialog;
  154. gint choise;
  155. dialog = prefs_window(app);
  156. /* Michael Jochum <e9725005@stud3.tuwien.ac.at> proposed to not use gnome_dialog_set_parent()
  157.    but following instead. */
  158. gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(app));
  159. gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
  160. /*gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app));*/
  161. choise = GTK_RESPONSE_HELP;
  162. while (choise == GTK_RESPONSE_HELP)
  163. {
  164. choise = gtk_dialog_run(GTK_DIALOG(dialog)); 
  165. switch (choise)
  166. {
  167. case GTK_RESPONSE_HELP:
  168. display_help_cb("gnomeradio-settings");
  169. break;
  170. default:
  171. /* We need the hide signal to get the value of the device_entry */
  172. gtk_widget_hide_all(dialog);
  173. gtk_widget_destroy(dialog);
  174. }
  175. }
  176. }
  177. void start_radio(gboolean restart, GtkWidget *app)
  178. {
  179. if (restart)
  180. radio_stop();
  181. if (!radio_init(settings.device)) 
  182. {
  183. char *caption = g_strdup_printf(_("Could not open device "%s"!"), settings.device);
  184. char *detail = g_strdup_printf(_("Check your settings and make sure that no othern"
  185. "program is using %s.nAlso make sure that you have read-access to it."), settings.device);
  186. show_error_message(caption, detail);
  187. g_free(caption);
  188. g_free(detail);
  189. if (!restart)
  190. prefs_button_clicked_cb(NULL, app);
  191. }
  192. }
  193. void start_mixer(gboolean restart, GtkWidget *app)
  194. {
  195. gint res, vol;
  196. if (restart)
  197. mixer_close();
  198. res = mixer_init(settings.mixer_dev, settings.mixer);
  199. if (res <1) 
  200. {
  201. char *buffer;
  202. if (res == -1)
  203. buffer = g_strdup_printf(_("Mixer source "%s" is not a valid source!"), settings.mixer);
  204. else 
  205. buffer = g_strdup_printf(_("Could not open "%s"!"), settings.mixer_dev);
  206. show_error_message(buffer, NULL);
  207. g_free(buffer);
  208. }
  209. vol = mixer_get_volume();
  210. if (vol >= 0) {
  211. bacon_volume_button_set_value(BACON_VOLUME_BUTTON(mute_button), vol);
  212. /*gtk_adjustment_set_value(volume, (double)vol);*/
  213. }
  214. }
  215. GList* get_mixer_recdev_list(void)
  216. {
  217. int i;
  218. char **array, *dev;
  219. GList *result = NULL;
  220. array = mixer_get_rec_devices();
  221. if (!array)
  222. return NULL;
  223. i = 0;
  224. dev = array[i];
  225. while (dev)
  226. {
  227. char *text = g_strdup(dev);
  228. result = g_list_append(result, text);
  229. free(dev);
  230. dev = array[++i];
  231. }
  232. free(array);
  233. return result;
  234. }
  235. static gboolean redraw_status_window(void)
  236. {
  237. GdkWindow *real_window, *window;
  238. GdkGC *gc;
  239. int win_width, win_height;
  240. int val, freq[5], signal_strength, is_stereo;
  241. val = (int)(rint(adj->value/STEPS * 100.0));
  242. freq[0] = val / 10000;
  243. freq[1] = (val % 10000) / 1000;
  244. freq[2] = (val % 1000) / 100; 
  245. freq[3] = (val % 100) / 10;
  246. freq[4] = val % 10;
  247. signal_strength = radio_getsignal();
  248. is_stereo = radio_getstereo();
  249. if (signal_strength > 3) signal_strength = 3;
  250. if (signal_strength < 0) signal_strength = 0;
  251. is_stereo = (is_stereo == 1) ? 1 : 0;
  252. real_window = drawing_area->window;
  253. if (real_window == NULL)
  254. /* UI has not been realized yet */
  255. return TRUE;
  256. gc = gdk_gc_new(real_window);
  257. gdk_drawable_get_size(real_window, &win_width, &win_height);
  258. /* use doublebuffering to avoid flickering */
  259. window = gdk_pixmap_new(real_window, win_width, win_height, -1);
  260. gdk_draw_rectangle(window, gc, TRUE, 0, 0, win_width, win_height);
  261. win_width -= 5;
  262. if (freq[0]) gdk_draw_drawable(window, gc, digits, freq[0] * DIGIT_WIDTH, 0, win_width - DIGIT_WIDTH*6, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  263. else gdk_draw_rectangle(window, gc, TRUE, win_width - DIGIT_WIDTH*6, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  264. gdk_draw_drawable(window, gc, digits, freq[1] * DIGIT_WIDTH, 0, win_width - DIGIT_WIDTH*5, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  265. gdk_draw_drawable(window, gc, digits, freq[2] * DIGIT_WIDTH, 0, win_width - DIGIT_WIDTH*4, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  266. gdk_draw_drawable(window, gc, digits, 10 * DIGIT_WIDTH, 0, win_width - DIGIT_WIDTH*3, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  267. gdk_draw_drawable(window, gc, digits, freq[3] * DIGIT_WIDTH, 0, win_width - DIGIT_WIDTH*2, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  268. gdk_draw_drawable(window, gc, digits, freq[4] * DIGIT_WIDTH, 0, win_width - DIGIT_WIDTH*1, 5, DIGIT_WIDTH, DIGIT_HEIGTH);
  269. gdk_draw_drawable(window, gc, signal_s, signal_strength * SIGNAL_WIDTH, 0, win_width - DIGIT_WIDTH*6-SIGNAL_WIDTH, 5, SIGNAL_WIDTH, DIGIT_HEIGTH);
  270. gdk_draw_drawable(window, gc, stereo, is_stereo * STEREO_WIDTH, 0, win_width - DIGIT_WIDTH*6-SIGNAL_WIDTH-STEREO_WIDTH, 5, STEREO_WIDTH, DIGIT_HEIGTH);
  271. /* draw the pixmap to the real window */
  272. gdk_draw_drawable(real_window, gc, window, 0, 0, 0, 0, win_width + 5, win_height);
  273. g_object_unref(G_OBJECT(gc));
  274. g_object_unref(G_OBJECT(window));
  275. return TRUE;
  276. }
  277. static gboolean expose_event_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
  278. {
  279. redraw_status_window();
  280. return TRUE;
  281. }
  282. void exit_gnome_radio(void)
  283. {
  284. if (settings.mute_on_exit)
  285. {
  286. radio_mute();
  287. radio_stop();
  288. }
  289. mixer_close();
  290. save_settings();
  291. gtk_main_quit();
  292. }
  293. const char* get_preset(float freq, int *num)
  294. {
  295. GList *node = settings.presets;
  296. int i = *num = -1;
  297. for (;node;)
  298. {
  299. ++i;
  300. preset *ps = (preset*)node->data;
  301. if (fabs(ps->freq - freq) < 0.01)
  302. {
  303. *num = i;
  304. return ps->title;
  305. }
  306. node = node->next;
  307. }
  308. return NULL;
  309. }
  310. static void adj_value_changed_cb(GtkAdjustment* data, gpointer window)
  311. {
  312. char *buffer;
  313. float freq = rint(adj->value)/STEPS;
  314. const char *preset_title = get_preset(freq, &mom_ps);
  315. preset_combo_set_item(mom_ps);
  316. redraw_status_window();
  317. if (preset_title)
  318. buffer = g_strdup_printf(_("Gnomeradio - %s"), preset_title);
  319. else
  320. buffer = g_strdup_printf(_("Gnomeradio - %.2f MHz"), freq);
  321. gtk_window_set_title(GTK_WINDOW(window), buffer);
  322. if (tray_icon) gtk_tooltips_set_tip(tooltips, tray_icon, buffer, NULL);
  323. g_free(buffer);
  324. buffer = g_strdup_printf(_("Frequency: %.2f MHz"), freq);
  325. gtk_tooltips_set_tip(tooltips, freq_scale, buffer, NULL);
  326. g_free(buffer);
  327. radio_setfreq(adj->value/STEPS);
  328. }
  329. static void volume_value_changed_cb(BaconVolumeButton *button, gpointer user_data)
  330. {
  331. char *text;
  332. int vol = (int)(bacon_volume_button_get_value(BACON_VOLUME_BUTTON(mute_button)) + 0.5f);
  333. mixer_set_volume(vol);
  334. /* text = g_strdup_printf(_("Volume: %d%%"), vol);
  335. gtk_tooltips_set_tip(tooltips, vol_scale, text, NULL);
  336. g_free(text);*/
  337. g_assert(tray_menu);
  338. g_signal_handler_block(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
  339. gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mute_menuitem), vol == 0);
  340. g_signal_handler_unblock(G_OBJECT(mute_menuitem), mute_menuitem_toggled_cb_id);
  341. }
  342. #if 0
  343. static gboolean poll_volume_change(gpointer data)
  344. {
  345. int vol;
  346. if ((vol = mixer_get_volume()) < 0)
  347. return FALSE;
  348. if (vol != (int)volume->value)
  349. {
  350. g_print("external volume change detectedn");
  351. gtk_adjustment_set_value(volume, (double)vol);
  352. }
  353. return TRUE;
  354. }
  355. #endif
  356. static void change_frequency(gpointer data)
  357. {
  358. gboolean increase = (gboolean)data;
  359. if (increase)
  360. {
  361. if (adj->value >= FREQ_MAX*STEPS)
  362. gtk_adjustment_set_value(adj, FREQ_MIN*STEPS);
  363. else
  364. gtk_adjustment_set_value(adj, adj->value+1);
  365. }
  366. else
  367. {
  368. if (adj->value <= FREQ_MIN*STEPS)
  369. gtk_adjustment_set_value(adj, FREQ_MAX*STEPS);
  370. else
  371. gtk_adjustment_set_value(adj, adj->value-1);
  372. }
  373. }
  374. static gboolean change_frequency_timeout(gpointer data)
  375. {
  376. change_frequency(data);
  377. if (bp_timeout_steps < 10)
  378. {
  379. gtk_timeout_remove(bp_timeout_id);
  380. bp_timeout_id = gtk_timeout_add(200 - 20*bp_timeout_steps,
  381. (GtkFunction)change_frequency_timeout, data);
  382. bp_timeout_steps++; 
  383. }
  384. return TRUE;
  385. }
  386. static void step_button_pressed_cb(GtkButton *button, gpointer data)
  387. {
  388. bp_timeout_id = gtk_timeout_add(500, (GtkFunction)change_frequency_timeout, data);
  389. }
  390. static void step_button_clicked_cb(GtkButton *button, gpointer data)
  391. {
  392. change_frequency(data);
  393. }
  394. static void step_button_released_cb(GtkButton *button, gpointer data)
  395. {
  396. if (bp_timeout_id > -1)
  397. gtk_timeout_remove(bp_timeout_id);
  398. bp_timeout_id = -1;
  399. bp_timeout_steps = 0;
  400. }
  401. static gboolean scan_freq(gpointer data)
  402. {
  403. static gint start, mom, max;
  404. gint dir = (gint)(data);
  405. if (!max) {
  406. max = (FREQ_MAX - FREQ_MIN) * STEPS;
  407. }
  408. if (radio_check_station(adj->value/STEPS) || (start > max)) {
  409. start = mom = 0;
  410. radio_unmute();
  411. timeout_id = 0;
  412. return FALSE;
  413. }
  414. if (!mom) {
  415. mom = adj->value;
  416. }
  417. if (mom > FREQ_MAX*STEPS) 
  418. mom = FREQ_MIN*STEPS;
  419. else if (mom < FREQ_MIN*STEPS)
  420. mom = FREQ_MAX*STEPS;
  421. else
  422. mom = mom + dir;
  423. start += 1;
  424. gtk_adjustment_set_value(adj, mom);
  425. return TRUE;
  426. }
  427. void scfw_button_clicked_cb(GtkButton *button, gpointer data)
  428. {
  429. if (timeout_id) {
  430. gtk_timeout_remove(timeout_id);
  431. timeout_id = 0;
  432. radio_unmute();
  433. return;
  434. }
  435. radio_mute();
  436. timeout_id = gtk_timeout_add(1000/SCAN_SPEED, (GtkFunction)scan_freq, (gpointer)1);
  437. }
  438. void scbw_button_clicked_cb(GtkButton *button, gpointer data)
  439. {
  440. if (timeout_id) {
  441. gtk_timeout_remove(timeout_id);
  442. timeout_id = 0;
  443. radio_unmute();
  444. return;
  445. }
  446. radio_mute();
  447. timeout_id = gtk_timeout_add(1000/SCAN_SPEED, (GtkFunction)scan_freq, (gpointer)(-1));
  448. }
  449. void preset_combo_set_item(gint i)
  450. {
  451. if (i < -1) return;
  452. if (preset_combo == NULL) return;
  453. gtk_combo_box_set_active(GTK_COMBO_BOX(preset_combo), i + 1);
  454. }
  455. static void preset_combo_change_cb(GtkWidget *combo, gpointer data)
  456. {
  457. preset* ps;
  458. mom_ps = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) - 1;
  459. if (mom_ps < 0) return;
  460. ps = (preset*)g_list_nth_data(settings.presets, mom_ps);
  461. gtk_adjustment_set_value(adj, ps->freq * STEPS);
  462. }
  463. void change_preset(gboolean next)
  464. {
  465. preset *ps;
  466. int len = g_list_length(settings.presets);
  467. if (len < 1)
  468. return;
  469. if (next)
  470. mom_ps = (mom_ps + 1) % len;
  471. else
  472. mom_ps = (mom_ps - 1 + len) % len;
  473. ps = g_list_nth_data(settings.presets, mom_ps);
  474. gtk_adjustment_set_value(adj, ps->freq*STEPS);
  475. preset_combo_set_item(mom_ps);
  476. }
  477. static void quit_button_clicked_cb(GtkButton *button, gpointer data)
  478. {
  479. exit_gnome_radio();
  480. }
  481. void tray_icon_items_set_sensible(gboolean sensible)
  482. {
  483. GList* menuitems;
  484. GtkWidget *menuitem;
  485. int i, cnt = g_list_length(settings.presets);
  486. menuitems = GTK_MENU_SHELL(tray_menu)->children;
  487. g_assert(cnt + 6 == g_list_length(menuitems));
  488. /* Disable the presets */
  489. for (i = 0; i < cnt; i++) {
  490. menuitem = g_list_nth_data(menuitems, i);
  491. gtk_widget_set_sensitive(menuitem, sensible);
  492. }
  493. /* Disable the mute button (separator => +1) */
  494. menuitem = g_list_nth_data(menuitems, cnt + 1);
  495. gtk_widget_set_sensitive(menuitem, sensible);
  496. /* Disable the record button */
  497. menuitem = g_list_nth_data(menuitems, cnt + 2);
  498. gtk_widget_set_sensitive(menuitem, sensible);
  499. /* Disable the quit button */
  500. menuitem = g_list_nth_data(menuitems, cnt + 5);
  501. gtk_widget_set_sensitive(menuitem, sensible);
  502. }
  503. static int start_recording(const gchar *destination, const char* station, const char* time)
  504. {
  505. GtkWidget *dialog;
  506. Recording* recording;
  507. char *filename;
  508. if (!mixer_set_rec_device())
  509. {
  510. GtkWidget *dialog;
  511. dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
  512. "Could not set "%s" as recording Source", settings.mixer);
  513. gtk_dialog_run (GTK_DIALOG (dialog));
  514. gtk_widget_destroy (dialog);
  515. return -1;
  516. }
  517. /* You can translate the filename for a recording:
  518.  * args for this format are: path, station title, time 
  519.  */ 
  520. filename = g_strdup_printf(_("%s/%s_%s"), 
  521.   destination, 
  522.   station, 
  523.   time);
  524. recording = recording_start(filename);
  525. g_free(filename);
  526. if (!recording)
  527. return -1;
  528. tray_icon_items_set_sensible(FALSE);
  529. recording->station = g_strdup(station);
  530. dialog = record_status_window(recording);
  531. run_status_window(recording);
  532. return 1;
  533. }
  534. void rec_button_clicked_cb(GtkButton *button, gpointer app)
  535. {
  536. GtkWidget *dialog;
  537. char *station;
  538. char time_str[100];
  539. time_t t;
  540. t = time(NULL);
  541. /* consult man strftime to translate this. This is a filename, so don't use "/" or ":", please */
  542. strftime(time_str, 100, _("%B-%d-%Y_%H-%M-%S"), localtime(&t));
  543. if (mom_ps < 0) {
  544. station = g_strdup_printf(_("%.2f MHz"), rint(adj->value)/STEPS);
  545. } else {
  546. g_assert(mom_ps < g_list_length(settings.presets));
  547. preset* ps = g_list_nth_data(settings.presets, mom_ps);
  548. g_assert(ps);
  549. station = g_strdup(ps->title);
  550. }
  551. /* if (!check_filename(filename)) {
  552. GtkWidget *errdialog;
  553. errdialog = gtk_message_dialog_new(GTK_WINDOW(app), DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
  554. _("Error opening file '%s':n%s"), filename, strerror(errno));
  555. gtk_dialog_run (GTK_DIALOG (errdialog));
  556. gtk_widget_destroy (errdialog);
  557. } else */
  558. start_recording(rec_settings.destination, station, time_str);
  559. g_free(station);
  560. }
  561. void toggle_volume(void)
  562. {
  563. static int old_vol;
  564. int vol = mixer_get_volume();
  565. if (vol) {
  566. old_vol = vol;
  567. vol = 0;
  568. } else {
  569. vol = old_vol;
  570. }
  571. mixer_set_volume(vol);
  572. bacon_volume_button_set_value(BACON_VOLUME_BUTTON(mute_button), vol);
  573. /*gtk_adjustment_set_value(volume, vol);*/
  574. }
  575. static void mute_button_toggled_cb(GtkButton *button, gpointer data)
  576. {
  577. if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mute_button)))
  578. {
  579. gtk_tooltips_set_tip(tooltips, mute_button, _("Unmute"), NULL);
  580. }
  581. else
  582. {
  583. gtk_tooltips_set_tip(tooltips, mute_button, _("Mute"), NULL);
  584. }
  585. toggle_volume();
  586. }
  587. static void about_button_clicked_cb(GtkButton *button, gpointer data)
  588. {
  589. GdkPixbuf *app_icon;
  590. GtkIconTheme *icontheme;
  591. static GtkWidget *about;
  592. const char *authors[] = {"J枚rgen Scheibengruber <mfcn@gmx.de>", NULL};
  593. char *text;
  594. /* Feel free to put your names here translators :-) */
  595. char *translators = _("TRANSLATORS");
  596. if (about)
  597. {
  598. gtk_window_present(GTK_WINDOW(about));
  599. return;
  600. }
  601. icontheme = gtk_icon_theme_get_default();
  602. app_icon = gtk_icon_theme_load_icon(icontheme, "gnomeradio", 48, 0, NULL);
  603. #ifdef HAVE_LIRC
  604. text =_("Gnomeradio is a FM-Tuner application for the GNOME desktop. "
  605. "It should work with all tuner hardware that is supported by the video4linux drivers.nn"
  606. "This version has been compiled with LIRC support.");
  607. #else
  608. text =_("Gnomeradio is a FM-Tuner application for the GNOME desktop. "
  609. "It should work with all tuner hardware that is supported by the video4linux drivers.nn"
  610. "This version has been compiled without LIRC support.");
  611. #endif
  612. about = gnome_about_new ("Gnomeradio", VERSION, "Copyright 2001 - 2006 J枚rgen Scheibengruber",
  613. text, (const char **) authors, NULL, 
  614. strcmp("TRANSLATORS", translators) ? translators : NULL, 
  615. app_icon);
  616. gtk_widget_show(about);
  617. g_object_add_weak_pointer(G_OBJECT(about), (gpointer)&about);
  618. g_object_add_weak_pointer(G_OBJECT(about), (gpointer)&app_icon);
  619. }
  620. static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data)
  621. {
  622. exit_gnome_radio();
  623. return TRUE;
  624. }
  625. void display_help_cb(char *topic)
  626. {
  627. GError *error = NULL;
  628. gnome_help_display(PACKAGE, topic, &error);
  629. if (error)
  630. {
  631. GtkWidget *dialog;
  632. dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
  633. error->message);
  634. gtk_dialog_run (GTK_DIALOG (dialog));
  635. gtk_widget_destroy (dialog);
  636. g_error_free (error);
  637. error = NULL;
  638. }
  639. }
  640. void toggle_mainwindow_visibility(GtkWidget *app)
  641. {
  642. static gint posx, posy;
  643. if (GTK_WIDGET_VISIBLE(app))
  644. {
  645. gtk_window_get_position(GTK_WINDOW(app), &posx, &posy);
  646. gtk_widget_hide(app);
  647. }
  648. else
  649. {
  650. if ((posx >= 0) && (posy >= 0))
  651. gtk_window_move(GTK_WINDOW(app), posx, posy);
  652. gtk_window_present(GTK_WINDOW(app));
  653. }
  654. }
  655. GtkWidget* gnome_radio_gui(void)
  656. {
  657. GtkWidget *app;
  658. GtkWidget *prefs_button, *quit_button, *scfw_button, *scbw_button;
  659. GtkWidget *stfw_button, *stbw_button, *about_button, *rec_button;
  660. GtkWidget *prefs_pixmap, *quit_pixmap, *scfw_pixmap, *scbw_pixmap;
  661. GtkWidget *stfw_pixmap, *stbw_pixmap, *about_pixmap;
  662. GtkWidget *vol_up_pixmap, *vol_down_pixmap, *freq_up_pixmap, *freq_down_pixmap;
  663. GdkPixbuf *vol_up_pixbuf, *vol_down_pixbuf, *freq_up_pixbuf, *freq_down_pixbuf;
  664. GtkWidget *hbox1, *hbox2, *vbox, *menubox, *freq_vol_box;
  665. GtkWidget *vseparator1, *vseparator2, *vseparator4;
  666. GtkWidget *label;
  667. GtkWidget *frame;
  668. gchar *text;
  669. app = gnome_app_new(PACKAGE, _("Gnomeradio"));
  670. gtk_window_set_resizable(GTK_WINDOW(app), FALSE);
  671. /*gtk_window_set_policy(GTK_WINDOW(app), FALSE, FALSE, FALSE);*/
  672. gtk_window_set_wmclass(GTK_WINDOW(app), "gnomeradio", "Gnomeradio");
  673. frame = gtk_frame_new(NULL);
  674. quit_pixmap = gtk_image_new_from_stock(GTK_STOCK_QUIT, GTK_ICON_SIZE_BUTTON);
  675. prefs_pixmap = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_LARGE_TOOLBAR);
  676. scfw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_FORWARD, GTK_ICON_SIZE_LARGE_TOOLBAR);
  677. scbw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_REWIND, GTK_ICON_SIZE_LARGE_TOOLBAR);
  678. stfw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_NEXT, GTK_ICON_SIZE_LARGE_TOOLBAR);
  679. stbw_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS, GTK_ICON_SIZE_LARGE_TOOLBAR);
  680. about_pixmap = gtk_image_new_from_stock(GTK_STOCK_ABOUT, GTK_ICON_SIZE_LARGE_TOOLBAR);
  681. /*mute_pixmap = gtk_image_new_from_stock(GNOME_STOCK_VOLUME, GTK_ICON_SIZE_LARGE_TOOLBAR);*/
  682. rec_pixmap = gtk_image_new_from_stock(GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_LARGE_TOOLBAR);
  683. /*help_pixmap = gtk_image_new_from_stock(GTK_STOCK_HELP, GTK_ICON_SIZE_LARGE_TOOLBAR);*/
  684. quit_button = gtk_button_new();
  685. prefs_button = gtk_button_new();
  686. scfw_button = gtk_button_new();
  687. scbw_button = gtk_button_new();
  688. stfw_button = gtk_button_new();
  689. stbw_button = gtk_button_new();
  690. about_button = gtk_button_new();
  691. /*mute_button = gtk_toggle_button_new();*/
  692. mute_button = bacon_volume_button_new(GTK_ICON_SIZE_LARGE_TOOLBAR, 0, 100, 1);
  693. gtk_button_set_relief(GTK_BUTTON(mute_button), GTK_RELIEF_NORMAL);
  694. rec_button = gtk_button_new();
  695. /*help_button = gtk_button_new();*/
  696. gtk_container_add(GTK_CONTAINER(quit_button), quit_pixmap);
  697. gtk_container_add(GTK_CONTAINER(prefs_button), prefs_pixmap);
  698. gtk_container_add(GTK_CONTAINER(scfw_button), scfw_pixmap);
  699. gtk_container_add(GTK_CONTAINER(scbw_button), scbw_pixmap);
  700. gtk_container_add(GTK_CONTAINER(stfw_button), stfw_pixmap);
  701. gtk_container_add(GTK_CONTAINER(stbw_button), stbw_pixmap);
  702. gtk_container_add(GTK_CONTAINER(about_button), about_pixmap);
  703. /*gtk_container_add(GTK_CONTAINER(mute_button), mute_pixmap);*/
  704. gtk_container_add(GTK_CONTAINER(rec_button), rec_pixmap);
  705. /*gtk_container_add(GTK_CONTAINER(help_button), help_pixmap);*/
  706. vbox = gtk_vbox_new(FALSE, 0);
  707. hbox1 = gtk_hbox_new(FALSE, 0);
  708. hbox2 = gtk_hbox_new(FALSE, 0);
  709. menubox = gtk_vbox_new(FALSE, 0);
  710. freq_vol_box = gtk_hbox_new(FALSE, 0);
  711. adj = GTK_ADJUSTMENT(gtk_adjustment_new(SUNSHINE*STEPS, FREQ_MIN*STEPS, FREQ_MAX*STEPS+1, 1, STEPS, 1));
  712. /* volume = GTK_ADJUSTMENT(gtk_adjustment_new(100, 0, 101, 1, 10, 1)); */
  713. preset_combo = gtk_combo_box_new_text();
  714. g_signal_connect(GTK_OBJECT(preset_combo), "changed", GTK_SIGNAL_FUNC(preset_combo_change_cb), NULL);
  715. gtk_widget_set_size_request(preset_combo, 10, -1);
  716. label = gtk_label_new(_("Presets:"));
  717. freq_scale = gtk_hscale_new(adj);
  718. /*gtk_range_set_update_policy(GTK_RANGE(freq_scale), GTK_UPDATE_DELAYED);*/
  719. /*vol_scale = gtk_hscale_new(volume);*/
  720. /*vol_up_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)vol_up_xpm);
  721. vol_down_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)vol_down_xpm);*/
  722. freq_up_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)freq_up_xpm);
  723. freq_down_pixbuf = gdk_pixbuf_new_from_xpm_data((const char**)freq_down_xpm);
  724. /*vol_up_pixmap = gtk_image_new_from_pixbuf(vol_up_pixbuf);
  725. vol_down_pixmap = gtk_image_new_from_pixbuf(vol_down_pixbuf);*/
  726. freq_up_pixmap = gtk_image_new_from_pixbuf(freq_up_pixbuf);
  727. freq_down_pixmap = gtk_image_new_from_pixbuf(freq_down_pixbuf);
  728. /*gtk_widget_set_usize(freq_scale, 160, 10);*/
  729. /*gtk_widget_set_size_request(freq_scale, 160, -1);*/
  730. gtk_widget_realize(app);
  731. drawing_area = gtk_drawing_area_new();
  732. digits = gdk_pixmap_create_from_xpm_d (app->window, NULL, NULL, digits_xpm);
  733. signal_s = gdk_pixmap_create_from_xpm_d (app->window, NULL, NULL, signal_xpm);
  734. stereo = gdk_pixmap_create_from_xpm_d (app->window, NULL, NULL, stereo_xpm);
  735. vseparator1 = gtk_vseparator_new();
  736. vseparator2 = gtk_vseparator_new();
  737. /*vseparator3 = gtk_vseparator_new();*/
  738. vseparator4 = gtk_vseparator_new();
  739. gtk_scale_set_digits(GTK_SCALE(freq_scale), 0);
  740. gtk_scale_set_draw_value(GTK_SCALE(freq_scale), FALSE);
  741. /* gtk_scale_set_digits(GTK_SCALE(vol_scale), 0);
  742. gtk_scale_set_draw_value(GTK_SCALE(vol_scale), FALSE);
  743. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mute_button), mixer_get_volume() == 0);*/
  744. gtk_widget_set_size_request(drawing_area, DIGIT_WIDTH*6+10+SIGNAL_WIDTH+STEREO_WIDTH, DIGIT_HEIGTH+10);
  745. gtk_container_add(GTK_CONTAINER(frame), drawing_area);
  746. gtk_box_pack_start(GTK_BOX(hbox2), scbw_button, FALSE, FALSE, 2);
  747. gtk_box_pack_start(GTK_BOX(hbox2), stbw_button, FALSE, FALSE, 2);
  748. gtk_box_pack_start(GTK_BOX(hbox2), stfw_button, FALSE, FALSE, 2);
  749. gtk_box_pack_start(GTK_BOX(hbox2), scfw_button, FALSE, FALSE, 2);
  750. gtk_box_pack_start(GTK_BOX(hbox2), vseparator1, FALSE, FALSE, 2);
  751. gtk_box_pack_start(GTK_BOX(hbox2), mute_button, FALSE, FALSE, 2);
  752. /*gtk_box_pack_start(GTK_BOX(hbox2), vseparator2, TRUE, TRUE, 3);*/
  753. gtk_box_pack_start(GTK_BOX(hbox2), rec_button, FALSE, FALSE, 2);
  754. gtk_box_pack_start(GTK_BOX(hbox2), vseparator4, FALSE, FALSE, 2);
  755. /*gtk_box_pack_start(GTK_BOX(hbox2), help_button, FALSE, FALSE, 2);*/
  756. gtk_box_pack_start(GTK_BOX(hbox2), prefs_button, FALSE, FALSE, 2);
  757. gtk_box_pack_start(GTK_BOX(hbox2), about_button, FALSE, FALSE, 2);
  758. /*gtk_box_pack_start(GTK_BOX(hbox2), quit_button, FALSE, FALSE, 2);*/
  759. gtk_box_pack_start(GTK_BOX(hbox1), frame, FALSE, FALSE, 3);
  760. gtk_box_pack_start(GTK_BOX(hbox1), menubox, TRUE, TRUE, 3);
  761. gtk_box_pack_start(GTK_BOX(menubox), label, TRUE, TRUE, 0);
  762. gtk_box_pack_start(GTK_BOX(menubox), preset_combo, TRUE, TRUE, 0);
  763. gtk_box_pack_start(GTK_BOX(freq_vol_box), freq_down_pixmap, FALSE, FALSE, 2);
  764. gtk_box_pack_start(GTK_BOX(freq_vol_box), freq_scale, TRUE, TRUE, 0);
  765. gtk_box_pack_start(GTK_BOX(freq_vol_box), freq_up_pixmap, FALSE, FALSE, 2);
  766. /*gtk_box_pack_start(GTK_BOX(freq_vol_box), vseparator3, FALSE, FALSE, 2);
  767. gtk_box_pack_start(GTK_BOX(freq_vol_box), vol_down_pixmap, FALSE, FALSE, 2);
  768. gtk_box_pack_start(GTK_BOX(freq_vol_box), vol_scale, TRUE, TRUE, 0);
  769. gtk_box_pack_start(GTK_BOX(freq_vol_box), vol_up_pixmap, FALSE, FALSE, 2);*/
  770. gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 4);
  771. gtk_box_pack_start(GTK_BOX(vbox), freq_vol_box, TRUE, TRUE, 2);
  772. gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 4);
  773. gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
  774. gtk_container_set_border_width(GTK_CONTAINER(vbox), 3);
  775. gtk_container_set_border_width(GTK_CONTAINER(frame), 2);
  776. gnome_app_set_contents(GNOME_APP(app), vbox);
  777. /*status = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_NEVER);*/
  778. /*gnome_app_set_statusbar(GNOME_APP(app), status);*/
  779. tooltips = gtk_tooltips_new();
  780. g_signal_connect(GTK_OBJECT(app), "delete_event", GTK_SIGNAL_FUNC(delete_event_cb), NULL);
  781. g_signal_connect(GTK_OBJECT(quit_button), "clicked", GTK_SIGNAL_FUNC(quit_button_clicked_cb), NULL);
  782. g_signal_connect(GTK_OBJECT(adj), "value-changed", GTK_SIGNAL_FUNC(adj_value_changed_cb), (gpointer) app);
  783. g_signal_connect(GTK_OBJECT(mute_button), "value-changed", GTK_SIGNAL_FUNC(volume_value_changed_cb), NULL);
  784. g_signal_connect(GTK_OBJECT(stfw_button), "pressed", GTK_SIGNAL_FUNC(step_button_pressed_cb), (gpointer)TRUE);
  785. g_signal_connect(GTK_OBJECT(stbw_button), "pressed", GTK_SIGNAL_FUNC(step_button_pressed_cb), (gpointer)FALSE);
  786. g_signal_connect(GTK_OBJECT(stfw_button), "clicked", GTK_SIGNAL_FUNC(step_button_clicked_cb), (gpointer)TRUE);
  787. g_signal_connect(GTK_OBJECT(stbw_button), "clicked", GTK_SIGNAL_FUNC(step_button_clicked_cb), (gpointer)FALSE);
  788. g_signal_connect(GTK_OBJECT(stfw_button), "released", GTK_SIGNAL_FUNC(step_button_released_cb), NULL);
  789. g_signal_connect(GTK_OBJECT(stbw_button), "released", GTK_SIGNAL_FUNC(step_button_released_cb), NULL);
  790. g_signal_connect(GTK_OBJECT(scfw_button), "clicked", GTK_SIGNAL_FUNC(scfw_button_clicked_cb), NULL);
  791. g_signal_connect(GTK_OBJECT(scbw_button), "clicked", GTK_SIGNAL_FUNC(scbw_button_clicked_cb), NULL);
  792. g_signal_connect(GTK_OBJECT(about_button), "clicked", GTK_SIGNAL_FUNC(about_button_clicked_cb), NULL);
  793. g_signal_connect(GTK_OBJECT(rec_button), "clicked", GTK_SIGNAL_FUNC(rec_button_clicked_cb), (gpointer) app);
  794. g_signal_connect(GTK_OBJECT(prefs_button), "clicked", GTK_SIGNAL_FUNC(prefs_button_clicked_cb), (gpointer) app);
  795. g_signal_connect(GTK_OBJECT(drawing_area), "expose-event", GTK_SIGNAL_FUNC(expose_event_cb), NULL);
  796. gtk_tooltips_set_tip(tooltips, scbw_button, _("Scan Backwards"), NULL);
  797. gtk_tooltips_set_tip(tooltips, scfw_button, _("Scan Forwards"), NULL);
  798. gtk_tooltips_set_tip(tooltips, stbw_button, _("0.05 MHz Backwards"), NULL);
  799. gtk_tooltips_set_tip(tooltips, stfw_button, _("0.05 MHz Forwards"), NULL);
  800. gtk_tooltips_set_tip(tooltips, about_button, _("About Gnomeradio"), NULL);
  801. gtk_tooltips_set_tip(tooltips, rec_button, _("Record radio as Wave, OGG or MP3"), NULL);
  802. gtk_tooltips_set_tip(tooltips, prefs_button, _("Edit your Preferences"), NULL);
  803. gtk_tooltips_set_tip(tooltips, mute_button, _("Adjust the Volume"), NULL);
  804. gtk_tooltips_set_tip(tooltips, quit_button, _("Quit"), NULL);
  805. text = g_strdup_printf(_("Frequency: %.2f MHz"), adj->value/STEPS);
  806. gtk_tooltips_set_tip(tooltips, freq_scale, text, NULL);
  807. g_free(text);
  808. /* text = g_strdup_printf(_("Volume: %d%%"), (gint)volume->value);
  809. gtk_tooltips_set_tip(tooltips, vol_scale, text, NULL);
  810. g_free(text);*/
  811. return app;
  812. }
  813. static void
  814. session_die_cb(GnomeClient* client, gpointer client_data)
  815. {
  816. if (settings.mute_on_exit)
  817. {
  818. radio_mute();
  819. radio_stop();
  820. }
  821. mixer_close();
  822. gtk_main_quit();
  823. exit (0);
  824. }
  825. static void 
  826. save_session_cb(GnomeClient *client, gint phase, GnomeSaveStyle save_style,
  827. gint is_shutdown, GnomeInteractStyle interact_style,
  828. gint is_fast, gpointer client_data)
  829. {
  830. save_settings();
  831. }
  832. static void
  833. gconf_error_handler(GConfClient *client, GError *error)
  834. {
  835. g_print("GConf error: %sn", error->message);
  836. }
  837. static gboolean
  838. key_press_event_cb(GtkWidget *app, GdkEventKey *event, gpointer data)
  839. {
  840. int vol = (int)(bacon_volume_button_get_value(BACON_VOLUME_BUTTON(mute_button)) + 0.5f);
  841. switch (event->keyval)
  842. {
  843. case GDK_F1: display_help_cb(NULL);
  844. break;
  845. case GDK_m: 
  846. toggle_volume();
  847. break;
  848. case GDK_q: 
  849. exit_gnome_radio();
  850. break;
  851. case GDK_r: 
  852. rec_button_clicked_cb(NULL, app);
  853. break;
  854. case GDK_f: 
  855. scfw_button_clicked_cb(NULL, NULL);
  856. break;
  857. case GDK_b: 
  858. scbw_button_clicked_cb(NULL, NULL);
  859. break;
  860. case GDK_n: 
  861. change_preset(TRUE);
  862. break;
  863. case GDK_p: 
  864. change_preset(FALSE);
  865. break;
  866. case GDK_KP_Add:
  867. case GDK_plus:
  868. bacon_volume_button_set_value(BACON_VOLUME_BUTTON(mute_button), vol > 95 ? 100 : vol + 5);
  869. /*gtk_adjustment_set_value(volume, (volume->value > 95) ? 100 : volume->value+5);*/
  870. break;
  871. case GDK_minus:
  872. case GDK_KP_Subtract: 
  873. bacon_volume_button_set_value(BACON_VOLUME_BUTTON(mute_button), vol < 5 ? 0 : vol - 5);
  874. /*gtk_adjustment_set_value(volume,(volume->value < 5) ? 0 : volume->value-5);*/
  875. break;
  876. }
  877. return FALSE;
  878. }
  879. int main(int argc, char* argv[])
  880. {
  881. GtkWidget* app;
  882. GList *ptr;
  883. GnomeClient *client;
  884. GError *err = NULL;
  885. int redraw_timeout_id;
  886. gboolean do_scan = FALSE;
  887. #if GNOME_14 
  888. GOptionContext *ctx;
  889. const GOptionEntry entries[] = {
  890. { "scan", 0, 0, G_OPTION_ARG_NONE, &do_scan, N_("Scan for stations"), NULL },
  891. { NULL }
  892. };
  893. #endif
  894. bindtextdomain(PACKAGE, GNOMELOCALEDIR);  
  895. bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
  896. textdomain(PACKAGE);
  897. g_set_application_name(_("Gnomeradio"));
  898. #if GNOME_14
  899. ctx = g_option_context_new("- Gnomeradio");
  900. g_option_context_add_main_entries(ctx, entries, GETTEXT_PACKAGE);  
  901. g_option_context_add_group(ctx, gst_init_get_option_group());
  902. g_option_context_set_ignore_unknown_options(ctx, TRUE);
  903. #endif
  904. gnome_program_init(PACKAGE, VERSION, 
  905. LIBGNOMEUI_MODULE, argc, argv, 
  906. GNOME_PROGRAM_STANDARD_PROPERTIES,
  907. #if GNOME_14
  908. GNOME_PARAM_GOPTION_CONTEXT, ctx,
  909. #endif
  910. NULL);
  911. gtk_window_set_default_icon_name("gnomeradio");
  912. /* Main app */
  913. app = gnome_radio_gui();
  914. /* Initizialize GStreamer */
  915. gst_init(&argc, &argv);
  916. /* Initizialize Gconf */
  917. if (!gconf_init(argc, argv, &err)) {
  918. char *details;
  919. details = g_strdup_printf(_("%snnChanges to the settings won't be saved."), err->message);
  920. show_warning_message(_("Failed to init GConf!"), details);
  921. g_error_free(err); 
  922. g_free(details);
  923. err = NULL;
  924. } else {
  925. gconf_client_set_global_default_error_handler((GConfClientErrorHandlerFunc)gconf_error_handler);
  926. gconf_client_set_error_handling(gconf_client_get_default(),  GCONF_CLIENT_HANDLE_ALL);
  927. gnome_media_profiles_init(gconf_client_get_default());
  928. }
  929. load_settings();
  930. create_tray_menu(app);
  931. gtk_combo_box_append_text(GTK_COMBO_BOX(preset_combo), _("manual"));
  932. for (ptr = settings.presets; ptr; ptr = g_list_next(ptr)) {
  933. preset *ps = (preset*)ptr->data;
  934. gtk_combo_box_append_text(GTK_COMBO_BOX(preset_combo), ps->title);
  935. }
  936. preset_combo_set_item(mom_ps);
  937. start_mixer(FALSE, app);
  938. start_radio(FALSE, app);
  939. if (is_first_start() || do_scan) {
  940. if (!radio_is_init()) {
  941. g_message(_("Could not scan. Radio is not initialized."));
  942. } else {
  943. initial_frequency_scan(app);
  944. set_first_time_flag();
  945. }
  946. }
  947. gtk_widget_show_all(app);
  948. /* Create an tray icon */
  949. create_tray_icon(app);
  950. adj_value_changed_cb(NULL, (gpointer) app);
  951. /*volume_value_changed_cb(NULL, NULL);*/
  952. #ifdef HAVE_LIRC
  953. if(!my_lirc_init())
  954. {
  955. /* GtkWidget *dialog;
  956. dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
  957. _("Could not start lirc"));
  958. gtk_dialog_run (GTK_DIALOG (dialog));
  959. gtk_widget_destroy (dialog);
  960. */
  961. g_message(_("Could not start lirc!"));
  962. }
  963. else
  964. start_lirc();
  965. #endif
  966. /* Connect the Session Management signals
  967.  */
  968. client = gnome_master_client();
  969. g_signal_connect(GTK_OBJECT(client), "save_yourself",
  970. GTK_SIGNAL_FUNC(save_session_cb), NULL);
  971. g_signal_connect(GTK_OBJECT(client), "die",
  972. GTK_SIGNAL_FUNC(session_die_cb), NULL);
  973. g_signal_connect(GTK_OBJECT(app), "key-press-event",
  974. GTK_SIGNAL_FUNC(key_press_event_cb), NULL);
  975. /* Redraw the status window every 3 seconds
  976.  * Necessary, because the mono/stereo reception
  977.  * needs some time to be correctly detected
  978.  */
  979. redraw_timeout_id = gtk_timeout_add(3000, (GtkFunction)redraw_status_window, NULL);
  980. /* Checks if the volume has been changed by an 
  981.  * external app
  982.  */
  983. /*gtk_timeout_add(100, (GtkFunction)poll_volume_change, NULL);*/
  984. gtk_main();
  985. #ifdef HAVE_LIRC
  986. my_lirc_deinit();
  987. #endif
  988. return 0;
  989. }
  990. static show_message(GtkMessageType type, const char* text, const char* details)
  991. {
  992. GtkWidget *dialog;
  993. g_assert(text);
  994. dialog = gtk_message_dialog_new(NULL, DIALOG_FLAGS, type, GTK_BUTTONS_CLOSE,
  995. text);
  996. if (details) {
  997. gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), details);
  998. }
  999. gtk_dialog_run(GTK_DIALOG (dialog));
  1000. gtk_widget_destroy(dialog);
  1001. }
  1002. void show_error_message(const char* error, const char* details)
  1003. {
  1004. show_message(GTK_MESSAGE_ERROR, error, details);
  1005. }
  1006. void show_warning_message(const char* warning, const char* details)
  1007. {
  1008. show_message(GTK_MESSAGE_WARNING, warning, details);
  1009. }