comparison finch/gntsound.c @ 19146:5ff1231993af

Added sound profiles
author Eric Polino <aluink@pidgin.im>
date Tue, 10 Jul 2007 16:10:06 +0000
parents 3bec25803a00
children 5a6f174bf6dd
comparison
equal deleted inserted replaced
19144:0e30dfac1f46 19146:5ff1231993af
69 GntWidget *while_status; 69 GntWidget *while_status;
70 GntWidget *volume; 70 GntWidget *volume;
71 GntWidget *events; 71 GntWidget *events;
72 GntWidget *window; 72 GntWidget *window;
73 GntWidget *selector; 73 GntWidget *selector;
74 GntWidget *profiles;
74 } SoundPrefDialog; 75 } SoundPrefDialog;
75 76
76 SoundPrefDialog *pref_dialog; 77 SoundPrefDialog *pref_dialog;
77 78
78 #define PLAY_SOUND_TIMEOUT 15000 79 #define PLAY_SOUND_TIMEOUT 15000
79 80
80 static guint mute_login_sounds_timeout = 0; 81 static guint mute_login_sounds_timeout = 0;
81 static gboolean mute_login_sounds = FALSE; 82 static gboolean mute_login_sounds = FALSE;
83 static gchar * pref_string = NULL;
82 84
83 #ifdef USE_GSTREAMER 85 #ifdef USE_GSTREAMER
84 static gboolean gst_init_failed; 86 static gboolean gst_init_failed;
85 #endif /* USE_GSTREAMER */ 87 #endif /* USE_GSTREAMER */
86 88
96 {PURPLE_SOUND_CHAT_SAY, N_("Others talk in chat"), "chat_msg_recv", "receive.wav",NULL}, 98 {PURPLE_SOUND_CHAT_SAY, N_("Others talk in chat"), "chat_msg_recv", "receive.wav",NULL},
97 {PURPLE_SOUND_POUNCE_DEFAULT, NULL, "pounce_default", "alert.wav",NULL}, 99 {PURPLE_SOUND_POUNCE_DEFAULT, NULL, "pounce_default", "alert.wav",NULL},
98 {PURPLE_SOUND_CHAT_NICK, N_("Someone says your screen name in chat"), "nick_said", "alert.wav",NULL} 100 {PURPLE_SOUND_CHAT_NICK, N_("Someone says your screen name in chat"), "nick_said", "alert.wav",NULL}
99 }; 101 };
100 102
103 const char *
104 finch_sound_get_active_profile()
105 {
106 return purple_prefs_get_string(FINCH_PREFS_ROOT "/sound/actprofile");
107 }
108
109 /* This method creates a pref name based on the current active profile.
110 * So if "Home" is the current active profile the pref name
111 * [FINCH_PREFS_ROOT "/sound/profiles/Home/$NAME"] is created.
112 */
113 static gchar *
114 make_pref(const char *name)
115 {
116 g_free(pref_string);
117 pref_string = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s%s",finch_sound_get_active_profile(),name);
118 return pref_string;
119 }
120
121
101 static gboolean 122 static gboolean
102 unmute_login_sounds_cb(gpointer data) 123 unmute_login_sounds_cb(gpointer data)
103 { 124 {
104 mute_login_sounds = FALSE; 125 mute_login_sounds = FALSE;
105 mute_login_sounds_timeout = 0; 126 mute_login_sounds_timeout = 0;
145 166
146 gntconv = FINCH_CONV(conv); 167 gntconv = FINCH_CONV(conv);
147 168
148 has_focus = purple_conversation_has_focus(conv); 169 has_focus = purple_conversation_has_focus(conv);
149 170
150 if (has_focus && !purple_prefs_get_bool(FINCH_PREFS_ROOT "/sound/conv_focus")) 171 if (has_focus && !purple_prefs_get_bool(make_pref("/conv_focus")))
151 { 172 {
152 return; 173 return;
153 } 174 }
154 } 175 }
155 176
278 finch_sound_get_handle() 299 finch_sound_get_handle()
279 { 300 {
280 static int handle; 301 static int handle;
281 302
282 return &handle; 303 return &handle;
304 }
305
306
307 /* This gets called when the active profile changes */
308 static void
309 load_profile(const char *name, PurplePrefType type, gconstpointer val, gpointer null)
310 {
311 if(!purple_prefs_exists(make_pref(""))){
312 purple_prefs_add_none(make_pref(""));
313 purple_prefs_add_none(make_pref("/enabled"));
314 purple_prefs_add_none(make_pref("/file"));
315 purple_prefs_add_bool(make_pref("/enabled/login"), TRUE);
316 purple_prefs_add_path(make_pref("/file/login"), "");
317 purple_prefs_add_bool(make_pref("/enabled/logout"), TRUE);
318 purple_prefs_add_path(make_pref("/file/logout"), "");
319 purple_prefs_add_bool(make_pref("/enabled/im_recv"), TRUE);
320 purple_prefs_add_path(make_pref("/file/im_recv"), "");
321 purple_prefs_add_bool(make_pref("/enabled/first_im_recv"), FALSE);
322 purple_prefs_add_path(make_pref("/file/first_im_recv"), "");
323 purple_prefs_add_bool(make_pref("/enabled/send_im"), TRUE);
324 purple_prefs_add_path(make_pref("/file/send_im"), "");
325 purple_prefs_add_bool(make_pref("/enabled/join_chat"), FALSE);
326 purple_prefs_add_path(make_pref("/file/join_chat"), "");
327 purple_prefs_add_bool(make_pref("/enabled/left_chat"), FALSE);
328 purple_prefs_add_path(make_pref("/file/left_chat"), "");
329 purple_prefs_add_bool(make_pref("/enabled/send_chat_msg"), FALSE);
330 purple_prefs_add_path(make_pref("/file/send_chat_msg"), "");
331 purple_prefs_add_bool(make_pref("/enabled/chat_msg_recv"), FALSE);
332 purple_prefs_add_path(make_pref("/file/chat_msg_recv"), "");
333 purple_prefs_add_bool(make_pref("/enabled/nick_said"), FALSE);
334 purple_prefs_add_path(make_pref("/file/nick_said"), "");
335 purple_prefs_add_bool(make_pref("/enabled/pounce_default"), TRUE);
336 purple_prefs_add_path(make_pref("/file/pounce_default"), "");
337 purple_prefs_add_bool(make_pref("/conv_focus"), TRUE);
338 purple_prefs_add_bool(make_pref("/mute"), FALSE);
339 purple_prefs_add_path(make_pref("/command"), "");
340 purple_prefs_add_string(make_pref("/method"), "automatic");
341 purple_prefs_add_int(make_pref("/volume"), 50);
342 }
283 } 343 }
284 344
285 static void 345 static void
286 finch_sound_init(void) 346 finch_sound_init(void)
287 { 347 {
295 purple_signal_connect(purple_connections_get_handle(), "signed-on", 355 purple_signal_connect(purple_connections_get_handle(), "signed-on",
296 gnt_sound_handle, PURPLE_CALLBACK(account_signon_cb), 356 gnt_sound_handle, PURPLE_CALLBACK(account_signon_cb),
297 NULL); 357 NULL);
298 358
299 purple_prefs_add_none(FINCH_PREFS_ROOT "/sound"); 359 purple_prefs_add_none(FINCH_PREFS_ROOT "/sound");
300 purple_prefs_add_none(FINCH_PREFS_ROOT "/sound/enabled"); 360 purple_prefs_add_string(FINCH_PREFS_ROOT "/sound/actprofile", "default");
301 purple_prefs_add_none(FINCH_PREFS_ROOT "/sound/file"); 361 purple_prefs_add_none(FINCH_PREFS_ROOT "/sound/profiles");
302 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/login", TRUE); 362
303 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/login", ""); 363 purple_prefs_connect_callback(gnt_sound_handle,FINCH_PREFS_ROOT "/sound/actprofile",load_profile,NULL);
304 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/logout", TRUE); 364 purple_prefs_trigger_callback(FINCH_PREFS_ROOT "/sound/actprofile");
305 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/logout", ""); 365
306 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/im_recv", TRUE); 366
307 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/im_recv", "");
308 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/first_im_recv", FALSE);
309 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/first_im_recv", "");
310 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/send_im", TRUE);
311 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/send_im", "");
312 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/join_chat", FALSE);
313 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/join_chat", "");
314 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/left_chat", FALSE);
315 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/left_chat", "");
316 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/send_chat_msg", FALSE);
317 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/send_chat_msg", "");
318 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/chat_msg_recv", FALSE);
319 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/chat_msg_recv", "");
320 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/nick_said", FALSE);
321 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/nick_said", "");
322 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/enabled/pounce_default", TRUE);
323 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/file/pounce_default", "");
324 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/conv_focus", TRUE);
325 purple_prefs_add_bool(FINCH_PREFS_ROOT "/sound/mute", FALSE);
326 purple_prefs_add_path(FINCH_PREFS_ROOT "/sound/command", "");
327 purple_prefs_add_string(FINCH_PREFS_ROOT "/sound/method", "automatic");
328 purple_prefs_add_int(FINCH_PREFS_ROOT "/sound/volume", 50);
329
330 #ifdef USE_GSTREAMER 367 #ifdef USE_GSTREAMER
331 purple_debug_info("sound", "Initializing sound output drivers.\n"); 368 purple_debug_info("sound", "Initializing sound output drivers.\n");
332 if ((gst_init_failed = !gst_init_check(NULL, NULL, &error))) { 369 if ((gst_init_failed = !gst_init_check(NULL, NULL, &error))) {
333 purple_notify_error(NULL, _("GStreamer Failure"), 370 purple_notify_error(NULL, _("GStreamer Failure"),
334 _("GStreamer failed to initialize."), 371 _("GStreamer failed to initialize."),
415 char *uri; 452 char *uri;
416 GstElement *sink = NULL; 453 GstElement *sink = NULL;
417 GstElement *play = NULL; 454 GstElement *play = NULL;
418 GstBus *bus = NULL; 455 GstBus *bus = NULL;
419 #endif 456 #endif
420 if (purple_prefs_get_bool(FINCH_PREFS_ROOT "/sound/mute")) 457 if (purple_prefs_get_bool(make_pref("/mute")))
421 return; 458 return;
422 459
423 method = purple_prefs_get_string(FINCH_PREFS_ROOT "/sound/method"); 460 method = purple_prefs_get_string(make_pref("/method"));
424 461
425 if (!strcmp(method, "none")) { 462 if (!strcmp(method, "none")) {
426 return; 463 return;
427 } else if (!strcmp(method, "beep")) { 464 } else if (!strcmp(method, "beep")) {
428 beep(); 465 beep();
439 const char *sound_cmd; 476 const char *sound_cmd;
440 char *command; 477 char *command;
441 char *esc_filename; 478 char *esc_filename;
442 GError *error = NULL; 479 GError *error = NULL;
443 480
444 sound_cmd = purple_prefs_get_path(FINCH_PREFS_ROOT "/sound/command"); 481 sound_cmd = purple_prefs_get_path(make_pref("/command"));
445 482
446 if (!sound_cmd || *sound_cmd == '\0') { 483 if (!sound_cmd || *sound_cmd == '\0') {
447 purple_debug_error("gntsound", 484 purple_debug_error("gntsound",
448 "'Command' sound method has been chosen, " 485 "'Command' sound method has been chosen, "
449 "but no command has been set."); 486 "but no command has been set.");
467 return; 504 return;
468 } 505 }
469 #ifdef USE_GSTREAMER 506 #ifdef USE_GSTREAMER
470 if (gst_init_failed) /* Perhaps do beep instead? */ 507 if (gst_init_failed) /* Perhaps do beep instead? */
471 return; 508 return;
472 volume = (float)(CLAMP(purple_prefs_get_int(FINCH_PREFS_ROOT "/sound/volume"),0,100)) / 50; 509 volume = (float)(CLAMP(purple_prefs_get_int(make_pref("/volume")),0,100)) / 50;
473 if (!strcmp(method, "automatic")) { 510 if (!strcmp(method, "automatic")) {
474 if (purple_running_gnome()) { 511 if (purple_running_gnome()) {
475 sink = gst_element_factory_make("gconfaudiosink", "sink"); 512 sink = gst_element_factory_make("gconfaudiosink", "sink");
476 } 513 }
477 if (!sink) 514 if (!sink)
551 if (event >= PURPLE_NUM_SOUNDS) { 588 if (event >= PURPLE_NUM_SOUNDS) {
552 purple_debug_error("sound", "got request for unknown sound: %d\n", event); 589 purple_debug_error("sound", "got request for unknown sound: %d\n", event);
553 return; 590 return;
554 } 591 }
555 592
556 enable_pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/enabled/%s", 593 enable_pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s",
594 finch_sound_get_active_profile(),
557 sounds[event].pref); 595 sounds[event].pref);
558 file_pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/file/%s", sounds[event].pref); 596 file_pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", finch_sound_get_active_profile(),sounds[event].pref);
559 597
560 /* check NULL for sounds that don't have an option, ie buddy pounce */ 598 /* check NULL for sounds that don't have an option, ie buddy pounce */
561 if (purple_prefs_get_bool(enable_pref)) { 599 if (purple_prefs_get_bool(enable_pref)) {
562 char *filename = g_strdup(purple_prefs_get_path(file_pref)); 600 char *filename = g_strdup(purple_prefs_get_path(file_pref));
563 if(!filename || !strlen(filename)) { 601 if(!filename || !strlen(filename)) {
572 610
573 g_free(enable_pref); 611 g_free(enable_pref);
574 g_free(file_pref); 612 g_free(file_pref);
575 } 613 }
576 614
615 GList *
616 finch_sound_get_profiles()
617 {
618 return purple_prefs_get_children_names(FINCH_PREFS_ROOT "/sound/profiles");
619 }
620
621 static gboolean
622 profile_exists(const char *name)
623 {
624 GList *itr = NULL;
625 for(itr = finch_sound_get_profiles();itr;itr = itr->next){
626 if(!strcmp(itr->data,name))
627 return TRUE;
628 }
629 return FALSE;
630 }
631
632 void
633 finch_sound_set_active_profile(const char *name)
634 {
635 if(profile_exists(name)){
636 purple_prefs_set_string(FINCH_PREFS_ROOT "/sound/actprofile",name);
637 }
638 }
639
640
577 static void 641 static void
578 save_cb(GntWidget *button, gpointer win) 642 save_cb(GntWidget *button, gpointer win)
579 { 643 {
580 GList * itr; 644 GList * itr;
581 645
582 purple_prefs_set_string(FINCH_PREFS_ROOT "/sound/method", gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->method))); 646 purple_prefs_set_string(make_pref("/method"), gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->method)));
583 purple_prefs_set_path(FINCH_PREFS_ROOT "/sound/command", gnt_entry_get_text(GNT_ENTRY(pref_dialog->command))); 647 purple_prefs_set_path(make_pref("/command"), gnt_entry_get_text(GNT_ENTRY(pref_dialog->command)));
584 purple_prefs_set_bool(FINCH_PREFS_ROOT "/sound/conv_focus",gnt_check_box_get_checked(GNT_CHECK_BOX(pref_dialog->conv_focus))); 648 purple_prefs_set_bool(make_pref("/conv_focus"),gnt_check_box_get_checked(GNT_CHECK_BOX(pref_dialog->conv_focus)));
585 purple_prefs_set_int("/purple/sound/while_status",GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->while_status)))); 649 purple_prefs_set_int("/purple/sound/while_status",GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->while_status))));
586 purple_prefs_set_int(FINCH_PREFS_ROOT "/sound/volume",gnt_slider_get_value(GNT_SLIDER(pref_dialog->volume))); 650 purple_prefs_set_int(make_pref("/volume"),gnt_slider_get_value(GNT_SLIDER(pref_dialog->volume)));
587 651
588 for(itr = gnt_tree_get_rows(GNT_TREE(pref_dialog->events));itr;itr = itr->next){ 652 for(itr = gnt_tree_get_rows(GNT_TREE(pref_dialog->events));itr;itr = itr->next){
589 FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(itr->data)]; 653 FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(itr->data)];
590 char * filepref = g_strdup_printf("%s/sound/file/%s",FINCH_PREFS_ROOT,event->pref); 654 char * filepref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s",finch_sound_get_active_profile(),event->pref);
591 char * boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/enabled/%s",event->pref); 655 char * boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s",finch_sound_get_active_profile(),event->pref);
592 purple_prefs_set_bool(boolpref,gnt_tree_get_choice(GNT_TREE(pref_dialog->events),itr->data)); 656 purple_prefs_set_bool(boolpref,gnt_tree_get_choice(GNT_TREE(pref_dialog->events),itr->data));
593 purple_prefs_set_path(filepref,event->file ? event->file : ""); 657 purple_prefs_set_path(filepref,event->file ? event->file : "");
594 g_free(filepref); 658 g_free(filepref);
595 g_free(boolpref); 659 g_free(boolpref);
596 } 660 }
616 PurpleSoundEventID id = GPOINTER_TO_INT(gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events))); 680 PurpleSoundEventID id = GPOINTER_TO_INT(gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events)));
617 FinchSoundEvent * event = &sounds[id]; 681 FinchSoundEvent * event = &sounds[id];
618 char *pref; 682 char *pref;
619 gboolean temp_value; 683 gboolean temp_value;
620 684
621 pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/enabled/%s", 685 pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s",finch_sound_get_active_profile(),
622 event->pref); 686 event->pref);
623 687
624 temp_value = purple_prefs_get_bool(pref); 688 temp_value = purple_prefs_get_bool(pref);
625 689
626 if (!temp_value) purple_prefs_set_bool(pref, TRUE); 690 if (!temp_value) purple_prefs_set_bool(pref, TRUE);
640 704
641 FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(key)]; 705 FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(key)];
642 g_free(event->file); 706 g_free(event->file);
643 event->file = NULL; 707 event->file = NULL;
644 gnt_tree_change_text(GNT_TREE(pref_dialog->events),key,1,"(default)"); 708 gnt_tree_change_text(GNT_TREE(pref_dialog->events),key,1,"(default)");
709 }
710
711 static void
712 pref_load_cb(GntWidget *button, gpointer null)
713 {
714
715 const gchar * value = gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->profiles));
716
717 purple_prefs_set_string(FINCH_PREFS_ROOT "/sound/actprofile",value);
718
719 }
720
721 static void
722 pref_save_cb(GntWidget *button, gpointer null)
723 {
724
645 } 725 }
646 726
647 static void 727 static void
648 choose_cb(GntWidget *button, gpointer null) 728 choose_cb(GntWidget *button, gpointer null)
649 { 729 {
684 gnt_widget_destroy(pref_dialog->selector); 764 gnt_widget_destroy(pref_dialog->selector);
685 g_free(pref_dialog); 765 g_free(pref_dialog);
686 pref_dialog = NULL; 766 pref_dialog = NULL;
687 } 767 }
688 768
769 static void
770 reload_pref_window(GntComboBox *box, gpointer oldkey, gpointer newkey, gpointer null)
771 {
772 gint i;
773 purple_prefs_set_string(FINCH_PREFS_ROOT "/sound/actprofile",(gchar *)newkey);
774 gnt_combo_box_set_selected(GNT_COMBO_BOX(pref_dialog->method),(gchar *)purple_prefs_get_string(make_pref("/method")));
775 gnt_entry_set_text(GNT_ENTRY(pref_dialog->command),purple_prefs_get_path(make_pref("/command")));
776 gnt_check_box_set_checked(GNT_CHECK_BOX(pref_dialog->conv_focus),purple_prefs_get_bool(make_pref("/conv_focus")));
777 gnt_combo_box_set_selected(GNT_COMBO_BOX(pref_dialog->while_status),GINT_TO_POINTER(purple_prefs_get_int("/purple" "/sound/while_status")));
778 gnt_slider_set_value(GNT_SLIDER(pref_dialog->volume),CLAMP(purple_prefs_get_int(make_pref("/volume")),0,100));
779 for(i = 0;i < PURPLE_NUM_SOUNDS;i++){
780 FinchSoundEvent * event = &sounds[i];
781 gchar *boolpref;
782 gchar *filepref;
783 const char * profile = finch_sound_get_active_profile();
784
785 boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s",profile,event->pref);
786
787 filepref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s",profile,event->pref);
788 event->file = g_strdup(purple_prefs_get_path(filepref));
789 if(event->label == NULL){
790 continue;
791 }
792
793 gnt_tree_change_text(GNT_TREE(pref_dialog->events),GINT_TO_POINTER(i),0,event->label);
794 gnt_tree_change_text(GNT_TREE(pref_dialog->events),GINT_TO_POINTER(i),1,event->file[0] ? g_path_get_basename(event->file) : "(default)");
795 gnt_tree_set_choice(GNT_TREE(pref_dialog->events),GINT_TO_POINTER(i),purple_prefs_get_bool(boolpref));
796 g_free(boolpref);
797 g_free(filepref);
798 }
799 }
800
689 void 801 void
690 finch_sounds_show_all(void) 802 finch_sounds_show_all(void)
691 { 803 {
692 GntWidget *box; 804 GntWidget *box; GntWidget *cmbox; GntWidget *slider;
693 GntWidget *cmbox;
694 GntWidget *slider;
695 GntWidget *entry; 805 GntWidget *entry;
696 GntWidget *chkbox; 806 GntWidget *chkbox;
697 GntWidget *button; 807 GntWidget *button;
698 GntWidget *label; 808 GntWidget *label;
699 GntWidget *tree; 809 GntWidget *tree;
700 GntWidget *win; 810 GntWidget *win;
701 811
812 GList *itr,*list;
702 gint i; 813 gint i;
703 814
704 if(pref_dialog){ 815 if(pref_dialog){
705 gnt_window_present(pref_dialog->window); 816 gnt_window_present(pref_dialog->window);
706 return; 817 return;
707 } 818 }
708
709 819
710 pref_dialog = g_new0(SoundPrefDialog,1); 820 pref_dialog = g_new0(SoundPrefDialog,1);
711 821
712 pref_dialog->window = win = gnt_window_box_new(FALSE,TRUE); 822 pref_dialog->window = win = gnt_window_box_new(FALSE,TRUE);
713 gnt_box_set_pad(GNT_BOX(win),0); 823 gnt_box_set_pad(GNT_BOX(win),0);
722 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"alsa","ALSA"); 832 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"alsa","ALSA");
723 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"esd","ESD"); 833 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"esd","ESD");
724 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"beep",_("Console Beep")); 834 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"beep",_("Console Beep"));
725 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"custom",_("Command")); 835 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"custom",_("Command"));
726 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"nosound",_("No Sound")); 836 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),"nosound",_("No Sound"));
727 gnt_combo_box_set_selected(GNT_COMBO_BOX(cmbox),(gchar *)purple_prefs_get_string(FINCH_PREFS_ROOT "/sound/method"));
728 837
729 label = gnt_label_new_with_format(_("Sound Method"),GNT_TEXT_FLAG_BOLD); 838 label = gnt_label_new_with_format(_("Sound Method"),GNT_TEXT_FLAG_BOLD);
730 gnt_box_add_widget(GNT_BOX(win),label); 839 gnt_box_add_widget(GNT_BOX(win),label);
731 box = gnt_hbox_new(TRUE); 840 box = gnt_hbox_new(TRUE);
732 gnt_box_set_fill(GNT_BOX(box),FALSE); 841 gnt_box_set_fill(GNT_BOX(box),FALSE);
737 846
738 box = gnt_hbox_new(TRUE); 847 box = gnt_hbox_new(TRUE);
739 gnt_box_set_pad(GNT_BOX(box),0); 848 gnt_box_set_pad(GNT_BOX(box),0);
740 gnt_box_set_fill(GNT_BOX(box),FALSE); 849 gnt_box_set_fill(GNT_BOX(box),FALSE);
741 gnt_box_add_widget(GNT_BOX(box),gnt_label_new(_("Sound Command\n(%s for filename)"))); 850 gnt_box_add_widget(GNT_BOX(box),gnt_label_new(_("Sound Command\n(%s for filename)")));
742 pref_dialog->command = entry = gnt_entry_new(purple_prefs_get_path(FINCH_PREFS_ROOT "/sound/command")); 851 pref_dialog->command = entry = gnt_entry_new("");
743 gnt_box_add_widget(GNT_BOX(box),entry); 852 gnt_box_add_widget(GNT_BOX(box),entry);
744 gnt_box_add_widget(GNT_BOX(win),box); 853 gnt_box_add_widget(GNT_BOX(win),box);
745 854
746 gnt_box_add_widget(GNT_BOX(win), gnt_line_new(FALSE)); 855 gnt_box_add_widget(GNT_BOX(win), gnt_line_new(FALSE));
747 856
748 gnt_box_add_widget(GNT_BOX(win),gnt_label_new_with_format(_("Sound Options"),GNT_TEXT_FLAG_BOLD)); 857 gnt_box_add_widget(GNT_BOX(win),gnt_label_new_with_format(_("Sound Options"),GNT_TEXT_FLAG_BOLD));
749 pref_dialog->conv_focus = chkbox = gnt_check_box_new(_("Sounds when conversation has focus")); 858 pref_dialog->conv_focus = chkbox = gnt_check_box_new(_("Sounds when conversation has focus"));
750 gnt_check_box_set_checked(GNT_CHECK_BOX(chkbox),purple_prefs_get_bool(FINCH_PREFS_ROOT "/sound/conv_focus"));
751 gnt_box_add_widget(GNT_BOX(win),chkbox); 859 gnt_box_add_widget(GNT_BOX(win),chkbox);
752 860
753 box = gnt_hbox_new(TRUE); 861 box = gnt_hbox_new(TRUE);
754 gnt_box_set_pad(GNT_BOX(box),0); 862 gnt_box_set_pad(GNT_BOX(box),0);
755 gnt_box_set_fill(GNT_BOX(box),FALSE); 863 gnt_box_set_fill(GNT_BOX(box),FALSE);
756 gnt_box_add_widget(GNT_BOX(box),gnt_label_new("Enable Sounds:")); 864 gnt_box_add_widget(GNT_BOX(box),gnt_label_new("Enable Sounds:"));
757 pref_dialog->while_status = cmbox = gnt_combo_box_new(); 865 pref_dialog->while_status = cmbox = gnt_combo_box_new();
758 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(3),_("Always")); 866 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(3),_("Always"));
759 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(1),_("Only when available")); 867 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(1),_("Only when available"));
760 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(2),_("Only when not available")); 868 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(2),_("Only when not available"));
761 gnt_combo_box_set_selected(GNT_COMBO_BOX(cmbox),GINT_TO_POINTER(purple_prefs_get_int("/purple" "/sound/while_status")));
762 gnt_box_add_widget(GNT_BOX(box),cmbox); 869 gnt_box_add_widget(GNT_BOX(box),cmbox);
763 gnt_box_add_widget(GNT_BOX(win),box); 870 gnt_box_add_widget(GNT_BOX(win),box);
764 871
765 box = gnt_hbox_new(TRUE); 872 box = gnt_hbox_new(TRUE);
766 gnt_box_set_pad(GNT_BOX(box),0); 873 gnt_box_set_pad(GNT_BOX(box),0);
769 876
770 pref_dialog->volume = slider = gnt_slider_new(FALSE,100,0); 877 pref_dialog->volume = slider = gnt_slider_new(FALSE,100,0);
771 gnt_slider_set_step(GNT_SLIDER(slider),5); 878 gnt_slider_set_step(GNT_SLIDER(slider),5);
772 label = gnt_label_new(""); 879 label = gnt_label_new("");
773 gnt_slider_reflect_label(GNT_SLIDER(slider),GNT_LABEL(label)); 880 gnt_slider_reflect_label(GNT_SLIDER(slider),GNT_LABEL(label));
774 gnt_slider_set_value(GNT_SLIDER(slider),CLAMP(purple_prefs_get_int(FINCH_PREFS_ROOT "/sound/volume"),0,100));
775 gnt_box_set_pad(GNT_BOX(box),1); 881 gnt_box_set_pad(GNT_BOX(box),1);
776 gnt_box_add_widget(GNT_BOX(box),slider); 882 gnt_box_add_widget(GNT_BOX(box),slider);
777 gnt_box_add_widget(GNT_BOX(box),label); 883 gnt_box_add_widget(GNT_BOX(box),label);
778 gnt_box_add_widget(GNT_BOX(win),box); 884 gnt_box_add_widget(GNT_BOX(win),box);
779 885
784 gnt_tree_set_column_titles(GNT_TREE(tree),_("Event"),_("File")); 890 gnt_tree_set_column_titles(GNT_TREE(tree),_("Event"),_("File"));
785 gnt_tree_set_show_title(GNT_TREE(tree),TRUE); 891 gnt_tree_set_show_title(GNT_TREE(tree),TRUE);
786 892
787 for(i = 0;i < PURPLE_NUM_SOUNDS;i++){ 893 for(i = 0;i < PURPLE_NUM_SOUNDS;i++){
788 FinchSoundEvent * event = &sounds[i]; 894 FinchSoundEvent * event = &sounds[i];
789 gchar *boolpref; 895
790 gchar *filepref;
791
792 boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/enabled/%s", event->pref);
793
794 filepref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/file/%s", event->pref);
795 event->file = g_strdup(purple_prefs_get_path(filepref));
796 if(event->label == NULL){ 896 if(event->label == NULL){
797 continue; 897 continue;
798 } 898 }
799 899
800 gnt_tree_add_choice(GNT_TREE(tree), GINT_TO_POINTER(i), 900 gnt_tree_add_choice(GNT_TREE(tree), GINT_TO_POINTER(i),
801 gnt_tree_create_row(GNT_TREE(tree),event->label,event->file[0] ? g_path_get_basename(event->file) : "(default)"), 901 gnt_tree_create_row(GNT_TREE(tree),"",""),
802 NULL, NULL); 902 NULL, NULL);
803 gnt_tree_set_choice(GNT_TREE(tree),GINT_TO_POINTER(i),purple_prefs_get_bool(boolpref));
804 g_free(boolpref);
805 g_free(filepref);
806 } 903 }
807 904
808 gnt_tree_adjust_columns(GNT_TREE(tree)); 905 gnt_tree_adjust_columns(GNT_TREE(tree));
809 gnt_box_add_widget(GNT_BOX(win),tree); 906 gnt_box_add_widget(GNT_BOX(win),tree);
810 907
818 button = gnt_button_new(_("Choose...")); 915 button = gnt_button_new(_("Choose..."));
819 g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(choose_cb),NULL); 916 g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(choose_cb),NULL);
820 gnt_box_add_widget(GNT_BOX(box),button); 917 gnt_box_add_widget(GNT_BOX(box),button);
821 gnt_box_add_widget(GNT_BOX(win),box); 918 gnt_box_add_widget(GNT_BOX(win),box);
822 919
920 gnt_box_add_widget(GNT_BOX(win), gnt_line_new(FALSE));
921
922 gnt_box_add_widget(GNT_BOX(win),gnt_label_new_with_format(_("Profiles"),GNT_TEXT_FLAG_BOLD));
923 box = gnt_hbox_new(FALSE);
924 pref_dialog->profiles = cmbox = gnt_combo_box_new();
925 list = itr = finch_sound_get_profiles();
926 for(;itr;itr = itr->next){
927 gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox),itr->data,itr->data);
928 }
929 g_signal_connect(G_OBJECT(cmbox),"selection-changed",G_CALLBACK(reload_pref_window),NULL);
930 g_list_free(list);
931 gnt_box_add_widget(GNT_BOX(box),cmbox);
932 button = gnt_button_new("Load");
933 g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(pref_load_cb),NULL);
934 gnt_box_add_widget(GNT_BOX(box),button);
935 button = gnt_button_new("Save");
936 g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(pref_save_cb),NULL);
937 gnt_box_add_widget(GNT_BOX(box),button);
938 gnt_box_add_widget(GNT_BOX(win),box);
939
940
941 /* Add new stuff before this */
823 box = gnt_hbox_new(FALSE); 942 box = gnt_hbox_new(FALSE);
824 gnt_box_set_pad(GNT_BOX(box),0); 943 gnt_box_set_pad(GNT_BOX(box),0);
825 gnt_box_set_fill(GNT_BOX(box),TRUE); 944 gnt_box_set_fill(GNT_BOX(box),TRUE);
826 button = gnt_button_new(_("Save")); 945 button = gnt_button_new(_("Save"));
827 g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(save_cb),win); 946 g_signal_connect(G_OBJECT(button),"activate",G_CALLBACK(save_cb),win);
831 gnt_box_add_widget(GNT_BOX(box),button); 950 gnt_box_add_widget(GNT_BOX(box),button);
832 gnt_box_add_widget(GNT_BOX(win),box); 951 gnt_box_add_widget(GNT_BOX(win),box);
833 952
834 g_signal_connect(G_OBJECT(win),"destroy",G_CALLBACK(release_pref_dialog),NULL); 953 g_signal_connect(G_OBJECT(win),"destroy",G_CALLBACK(release_pref_dialog),NULL);
835 954
955 reload_pref_window(NULL,NULL,(gchar *)finch_sound_get_active_profile(),NULL);
956
836 gnt_widget_show(win); 957 gnt_widget_show(win);
837 958
838 } 959 }
839 960
840 static PurpleSoundUiOps sound_ui_ops = 961 static PurpleSoundUiOps sound_ui_ops =