static void test_cb(GntWidget *button, gpointer null) { PurpleSoundEventID id = GPOINTER_TO_INT(gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events))); FinchSoundEvent * event = &sounds[id]; char *enabled, *file, *tmpfile, *volpref; gboolean temp_value; int volume; enabled = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s", finch_sound_get_active_profile(), event->pref); file = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", finch_sound_get_active_profile(), event->pref); volpref = g_strdup(make_pref("/volume")); temp_value = purple_prefs_get_bool(enabled); tmpfile = g_strdup(purple_prefs_get_path(file)); volume = purple_prefs_get_int(volpref); purple_prefs_set_path(file, event->file); if (!temp_value) purple_prefs_set_bool(enabled, TRUE); purple_prefs_set_int(volpref, gnt_slider_get_value(GNT_SLIDER(pref_dialog->volume))); purple_sound_play_event(id, NULL); if (!temp_value) purple_prefs_set_bool(enabled, FALSE); purple_prefs_set_path(file, tmpfile); purple_prefs_set_int(volpref, volume); g_free(enabled); g_free(file); g_free(tmpfile); g_free(volpref); }
static void finch_sound_play_event(PurpleSoundEventID event) { char *enable_pref; char *file_pref; if ((event == PURPLE_SOUND_BUDDY_ARRIVE) && mute_login_sounds) return; if (event >= PURPLE_NUM_SOUNDS || event >= G_N_ELEMENTS(sounds)) { purple_debug_error("sound", "got request for unknown sound: %d\n", event); return; } enable_pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s", finch_sound_get_active_profile(), sounds[event].pref); file_pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", finch_sound_get_active_profile(), sounds[event].pref); /* check NULL for sounds that don't have an option, ie buddy pounce */ if (purple_prefs_get_bool(enable_pref)) { char *filename = g_strdup(purple_prefs_get_path(file_pref)); if (!filename || !strlen(filename)) { g_free(filename); /* XXX Consider creating a constant for "sounds/purple" to be shared with Pidgin */ filename = g_build_filename(DATADIR, "sounds", "purple", sounds[event].def, NULL); } purple_sound_play_file(filename, NULL); g_free(filename); } g_free(enable_pref); g_free(file_pref); }
static void load_pref_window(const char * profile) { gint i; finch_sound_set_active_profile(profile); gnt_combo_box_set_selected(GNT_COMBO_BOX(pref_dialog->method), (gchar *)purple_prefs_get_string(make_pref("/method"))); gnt_entry_set_text(GNT_ENTRY(pref_dialog->command), purple_prefs_get_path(make_pref("/command"))); gnt_check_box_set_checked(GNT_CHECK_BOX(pref_dialog->conv_focus), purple_prefs_get_bool(make_pref("/conv_focus"))); gnt_combo_box_set_selected(GNT_COMBO_BOX(pref_dialog->while_status), GINT_TO_POINTER(purple_prefs_get_int("/purple" "/sound/while_status"))); gnt_slider_set_value(GNT_SLIDER(pref_dialog->volume), CLAMP(purple_prefs_get_int(make_pref("/volume")), 0, 100)); for (i = 0; i < PURPLE_NUM_SOUNDS; i++) { FinchSoundEvent * event = &sounds[i]; gchar *boolpref; gchar *filepref, *basename = NULL; const char * profile = finch_sound_get_active_profile(); filepref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", profile, event->pref); g_free(event->file); event->file = g_strdup(purple_prefs_get_path(filepref)); g_free(filepref); if (event->label == NULL) { continue; } boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s", profile, event->pref); gnt_tree_change_text(GNT_TREE(pref_dialog->events), GINT_TO_POINTER(i), 0, event->label); gnt_tree_change_text(GNT_TREE(pref_dialog->events), GINT_TO_POINTER(i), 1, event->file[0] ? (basename = g_path_get_basename(event->file)) : _("(default)")); g_free(basename); gnt_tree_set_choice(GNT_TREE(pref_dialog->events), GINT_TO_POINTER(i), purple_prefs_get_bool(boolpref)); g_free(boolpref); } gnt_tree_set_selected(GNT_TREE(pref_dialog->profiles), (gchar *)finch_sound_get_active_profile()); gnt_widget_draw(pref_dialog->window); }
static void reload_pref_window(const char *profile) { if (!strcmp(profile, finch_sound_get_active_profile())) return; load_pref_window(profile); }
/* This method creates a pref name based on the current active profile. * So if "Home" is the current active profile the pref name * [FINCH_PREFS_ROOT "/sound/profiles/Home/$NAME"] is created. */ static gchar * make_pref(const char *name) { static char pref_string[512]; g_snprintf(pref_string, sizeof(pref_string), FINCH_PREFS_ROOT "/sound/profiles/%s%s", finch_sound_get_active_profile(), name); return pref_string; }
static void save_cb(GntWidget *button, gpointer win) { GList * itr; purple_prefs_set_string(make_pref("/method"), gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->method))); purple_prefs_set_path(make_pref("/command"), gnt_entry_get_text(GNT_ENTRY(pref_dialog->command))); purple_prefs_set_bool(make_pref("/conv_focus"), gnt_check_box_get_checked(GNT_CHECK_BOX(pref_dialog->conv_focus))); purple_prefs_set_int("/purple/sound/while_status", GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->while_status)))); for (itr = gnt_tree_get_rows(GNT_TREE(pref_dialog->events)); itr; itr = itr->next) { FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(itr->data)]; char * filepref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", finch_sound_get_active_profile(), event->pref); char * boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s", finch_sound_get_active_profile(), event->pref); purple_prefs_set_bool(boolpref, gnt_tree_get_choice(GNT_TREE(pref_dialog->events), itr->data)); purple_prefs_set_path(filepref, event->file ? event->file : ""); g_free(filepref); g_free(boolpref); } gnt_widget_destroy(GNT_WIDGET(win)); }
static void prof_del_cb(GntWidget *button, gpointer null) { const char * profile = gnt_entry_get_text(GNT_ENTRY(pref_dialog->new_profile)); gchar * pref; if (!strcmp(profile, DEFAULT_PROFILE)) return; pref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s", profile); purple_prefs_remove(pref); g_free(pref); if (!strcmp(pref_dialog->original_profile, profile)) { g_free(pref_dialog->original_profile); pref_dialog->original_profile = g_strdup(DEFAULT_PROFILE); } if(!strcmp(profile, finch_sound_get_active_profile())) reload_pref_window(DEFAULT_PROFILE); gnt_tree_remove(GNT_TREE(pref_dialog->profiles), (gchar *) profile); }
void finch_sounds_show_all(void) { GntWidget *box, *tmpbox, *splitbox, *cmbox, *slider; GntWidget *entry; GntWidget *chkbox; GntWidget *button; GntWidget *label; GntWidget *tree; GntWidget *win; gint i; GList *itr, *list; if (pref_dialog) { gnt_window_present(pref_dialog->window); return; } pref_dialog = g_new0(SoundPrefDialog, 1); pref_dialog->original_profile = g_strdup(finch_sound_get_active_profile()); pref_dialog->window = win = gnt_window_box_new(FALSE, TRUE); gnt_box_set_pad(GNT_BOX(win), 0); gnt_box_set_toplevel(GNT_BOX(win), TRUE); gnt_box_set_title(GNT_BOX(win), _("Sound Preferences")); gnt_box_set_fill(GNT_BOX(win), TRUE); gnt_box_set_alignment(GNT_BOX(win), GNT_ALIGN_MID); /* Profiles */ splitbox = gnt_hbox_new(FALSE); gnt_box_set_pad(GNT_BOX(splitbox), 0); gnt_box_set_alignment(GNT_BOX(splitbox), GNT_ALIGN_TOP); box = gnt_vbox_new(FALSE); gnt_box_set_pad(GNT_BOX(box), 0); gnt_box_add_widget(GNT_BOX(box), gnt_label_new_with_format(_("Profiles"), GNT_TEXT_FLAG_BOLD)); pref_dialog->profiles = tree = gnt_tree_new(); gnt_tree_set_hash_fns(GNT_TREE(tree), g_str_hash, g_str_equal, g_free); gnt_tree_set_compare_func(GNT_TREE(tree), (GCompareFunc)g_ascii_strcasecmp); g_signal_connect(G_OBJECT(tree), "selection-changed", G_CALLBACK(prof_load_cb), NULL); itr = list = finch_sound_get_profiles(); for (; itr; itr = itr->next) { /* Do not free itr->data. It's the stored as a key for the tree, and will * be freed when the tree is destroyed. */ gnt_tree_add_row_after(GNT_TREE(tree), itr->data, gnt_tree_create_row(GNT_TREE(tree), itr->data), NULL, NULL); } g_list_free(list); gnt_box_add_widget(GNT_BOX(box), tree); pref_dialog->new_profile = entry = gnt_entry_new(""); gnt_box_add_widget(GNT_BOX(box), entry); tmpbox = gnt_hbox_new(FALSE); button = gnt_button_new("Add"); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(prof_add_cb), entry); gnt_box_add_widget(GNT_BOX(tmpbox), button); button = gnt_button_new("Delete"); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(prof_del_cb), NULL); gnt_box_add_widget(GNT_BOX(tmpbox), button); gnt_box_add_widget(GNT_BOX(box), tmpbox); gnt_box_add_widget(GNT_BOX(splitbox), box); gnt_box_add_widget(GNT_BOX(splitbox), gnt_vline_new()); /* Sound method */ box = gnt_vbox_new(FALSE); gnt_box_set_pad(GNT_BOX(box), 0); pref_dialog->method = cmbox = gnt_combo_box_new(); gnt_tree_set_hash_fns(GNT_TREE(GNT_COMBO_BOX(cmbox)->dropdown), g_str_hash, g_str_equal, NULL); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "automatic", _("Automatic")); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "alsa", "ALSA"); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "esd", "ESD"); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "beep", _("Console Beep")); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "custom", _("Command")); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "nosound", _("No Sound")); label = gnt_label_new_with_format(_("Sound Method"), GNT_TEXT_FLAG_BOLD); gnt_box_add_widget(GNT_BOX(box), label); tmpbox = gnt_hbox_new(TRUE); gnt_box_set_fill(GNT_BOX(tmpbox), FALSE); gnt_box_set_pad(GNT_BOX(tmpbox), 0); gnt_box_add_widget(GNT_BOX(tmpbox), gnt_label_new(_("Method: "))); gnt_box_add_widget(GNT_BOX(tmpbox), cmbox); gnt_box_add_widget(GNT_BOX(box), tmpbox); tmpbox = gnt_hbox_new(TRUE); gnt_box_set_pad(GNT_BOX(tmpbox), 0); gnt_box_set_fill(GNT_BOX(tmpbox), FALSE); gnt_box_add_widget(GNT_BOX(tmpbox), gnt_label_new(_("Sound Command\n(%s for filename)"))); pref_dialog->command = entry = gnt_entry_new(""); gnt_box_add_widget(GNT_BOX(tmpbox), entry); gnt_box_add_widget(GNT_BOX(box), tmpbox); gnt_box_add_widget(GNT_BOX(box), gnt_line_new(FALSE)); /* Sound options */ gnt_box_add_widget(GNT_BOX(box), gnt_label_new_with_format(_("Sound Options"), GNT_TEXT_FLAG_BOLD)); pref_dialog->conv_focus = chkbox = gnt_check_box_new(_("Sounds when conversation has focus")); gnt_box_add_widget(GNT_BOX(box), chkbox); tmpbox = gnt_hbox_new(TRUE); gnt_box_set_pad(GNT_BOX(tmpbox), 0); gnt_box_set_fill(GNT_BOX(tmpbox), FALSE); gnt_box_add_widget(GNT_BOX(tmpbox), gnt_label_new("Enable Sounds:")); pref_dialog->while_status = cmbox = gnt_combo_box_new(); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), GINT_TO_POINTER(3), _("Always")); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), GINT_TO_POINTER(1), _("Only when available")); gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), GINT_TO_POINTER(2), _("Only when not available")); gnt_box_add_widget(GNT_BOX(tmpbox), cmbox); gnt_box_add_widget(GNT_BOX(box), tmpbox); tmpbox = gnt_hbox_new(TRUE); gnt_box_set_pad(GNT_BOX(tmpbox), 0); gnt_box_set_fill(GNT_BOX(tmpbox), FALSE); gnt_box_add_widget(GNT_BOX(tmpbox), gnt_label_new(_("Volume(0-100):"))); pref_dialog->volume = slider = gnt_slider_new(FALSE, 100, 0); gnt_slider_set_step(GNT_SLIDER(slider), 5); gnt_slider_set_small_step(GNT_SLIDER(slider), 1); gnt_slider_set_large_step(GNT_SLIDER(slider), 20); label = gnt_label_new(""); gnt_slider_reflect_label(GNT_SLIDER(slider), GNT_LABEL(label)); gnt_box_set_pad(GNT_BOX(tmpbox), 1); gnt_box_add_widget(GNT_BOX(tmpbox), slider); gnt_box_add_widget(GNT_BOX(tmpbox), label); gnt_box_add_widget(GNT_BOX(box), tmpbox); gnt_box_add_widget(GNT_BOX(splitbox), box); gnt_box_add_widget(GNT_BOX(win), splitbox); gnt_box_add_widget(GNT_BOX(win), gnt_hline_new()); /* Sound events */ gnt_box_add_widget(GNT_BOX(win), gnt_label_new_with_format(_("Sound Events"), GNT_TEXT_FLAG_BOLD)); pref_dialog->events = tree = gnt_tree_new_with_columns(2); gnt_tree_set_column_titles(GNT_TREE(tree), _("Event"), _("File")); gnt_tree_set_show_title(GNT_TREE(tree), TRUE); for (i = 0; i < PURPLE_NUM_SOUNDS; i++) { FinchSoundEvent * event = &sounds[i]; if (event->label == NULL) { continue; } gnt_tree_add_choice(GNT_TREE(tree), GINT_TO_POINTER(i), gnt_tree_create_row(GNT_TREE(tree), event->label, event->def), NULL, NULL); } gnt_tree_adjust_columns(GNT_TREE(tree)); gnt_box_add_widget(GNT_BOX(win), tree); box = gnt_hbox_new(FALSE); button = gnt_button_new(_("Test")); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(test_cb), NULL); gnt_box_add_widget(GNT_BOX(box), button); button = gnt_button_new(_("Reset")); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(reset_cb), NULL); gnt_box_add_widget(GNT_BOX(box), button); button = gnt_button_new(_("Choose...")); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(choose_cb), NULL); gnt_box_add_widget(GNT_BOX(box), button); gnt_box_add_widget(GNT_BOX(win), box); gnt_box_add_widget(GNT_BOX(win), gnt_line_new(FALSE)); /* Add new stuff before this */ box = gnt_hbox_new(FALSE); gnt_box_set_fill(GNT_BOX(box), TRUE); button = gnt_button_new(_("Save")); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(save_cb), win); gnt_box_add_widget(GNT_BOX(box), button); button = gnt_button_new(_("Cancel")); g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(cancel_cb), win); gnt_box_add_widget(GNT_BOX(box), button); gnt_box_add_widget(GNT_BOX(win), box); g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(release_pref_dialog), NULL); load_pref_window(finch_sound_get_active_profile()); gnt_widget_show(win); }