📄 gui_main.c
字号:
gtk_tree_model_iter_children(GTK_TREE_MODEL(play_store), &iter, piter); } else { int n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(play_store), piter); gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), &iter, piter, n-1); } *piter = iter;}intchoose_prev_track(GtkTreeIter * piter) { GtkTreePath * p = gtk_tree_model_get_path(GTK_TREE_MODEL(play_store), piter); try_again_prev: if (gtk_tree_path_prev(p)) { if (gtk_tree_path_get_depth(p) == 1) { /* toplevel */ GtkTreeIter iter; gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(play_store), &iter)) { get_child_iter(&iter, 0/* last */); } *piter = iter; } else { gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), piter, p); } gtk_tree_path_free(p); return 1; } else { if (gtk_tree_path_get_depth(p) == 1) { /* toplevel */ GtkTreeIter iter; int n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(play_store), NULL); if (n) { gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), &iter, NULL, n-1); if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(play_store), &iter)) { get_child_iter(&iter, 0/* last */); } *piter = iter; gtk_tree_path_free(p); return 1; } else { gtk_tree_path_free(p); return 0; } } else { gtk_tree_path_up(p); goto try_again_prev; } }}intchoose_next_track(GtkTreeIter * piter) { try_again_next: if (gtk_tree_model_iter_next(GTK_TREE_MODEL(play_store), piter)) { GtkTreePath * p = gtk_tree_model_get_path(GTK_TREE_MODEL(play_store), piter); if (gtk_tree_path_get_depth(p) == 1) { /* toplevel */ if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(play_store), piter)) { get_child_iter(piter, 1/* first */); } } gtk_tree_path_free(p); return 1; } else { GtkTreePath * p = gtk_tree_model_get_path(GTK_TREE_MODEL(play_store), piter); if (gtk_tree_path_get_depth(p) == 1) { /* toplevel */ int n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(play_store), NULL); if (n) { gtk_tree_model_get_iter_first(GTK_TREE_MODEL(play_store), piter); if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(play_store), piter)) { get_child_iter(piter, 1/* first */); } gtk_tree_path_free(p); return 1; } else { gtk_tree_path_free(p); return 0; } } else { gtk_tree_path_up(p); gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), piter, p); gtk_tree_path_free(p); goto try_again_next; } }}/* simpler case than choose_next_track(); no support for wrap-around at end of list. * used by the timeout callback for track flow-through */intchoose_adjacent_track(GtkTreeIter * piter) { try_again_adjacent: if (gtk_tree_model_iter_next(GTK_TREE_MODEL(play_store), piter)) { GtkTreePath * p = gtk_tree_model_get_path(GTK_TREE_MODEL(play_store), piter); if (gtk_tree_path_get_depth(p) == 1) { /* toplevel */ if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(play_store), piter)) { get_child_iter(piter, 1/* first */); } } gtk_tree_path_free(p); return 1; } else { GtkTreePath * p = gtk_tree_model_get_path(GTK_TREE_MODEL(play_store), piter); if (gtk_tree_path_get_depth(p) == 1) { /* toplevel */ gtk_tree_path_free(p); return 0; } else { gtk_tree_path_up(p); gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), piter, p); gtk_tree_path_free(p); goto try_again_adjacent; } }}/* also used to pick the track numbered n_stop in the flattened tree */longcount_playlist_tracks(GtkTreeIter * piter, long n_stop) { GtkTreeIter iter; long i = 0; long n = 0; while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), &iter, NULL, i++)) { long c = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(play_store), &iter); long d = c; if (!c) ++c; if (n_stop > -1) { if (n_stop > c) { n_stop -= c; } else { if (d) { gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), piter, &iter, n_stop-1); return 0; } else { *piter = iter; return 0; } } } n += c; } return n;}intrandom_toplevel_item(GtkTreeIter * piter) { long n_items; long n; n_items = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(play_store), NULL); if (!n_items) { return 0; } n = (double)rand() * n_items / RAND_MAX; if (n == n_items) --n; gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(play_store), piter, NULL, n); return 1;}intrandom_first_track(GtkTreeIter * piter) { if (random_toplevel_item(piter)) { if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(play_store), piter)) { get_child_iter(piter, 1/* first */); } return 1; } else { return 0; }}intchoose_random_track(GtkTreeIter * piter) { long n_items; long n; if (options.album_shuffle_mode) { if (gtk_tree_store_iter_is_valid(play_store, piter)) { int d = gtk_tree_store_iter_depth(play_store, piter); if (d) { if (gtk_tree_model_iter_next(GTK_TREE_MODEL(play_store), piter)) { return 1; } } } return random_first_track(piter); } else { n_items = count_playlist_tracks(NULL, -1); if (n_items) { n = (double)rand() * n_items / RAND_MAX; if (n == n_items) { --n; } count_playlist_tracks(piter, n+1); return 1; } return 0; }}voidprepare_playback(GtkTreeIter * piter, cue_t * pcue) { mark_track(piter); cue_track_for_playback(piter, pcue); is_file_loaded = 1; toggle_noeffect(PLAY, TRUE);}voidunprepare_playback(void) { is_file_loaded = 0; current_file[0] = '\0'; zero_displays(); toggle_noeffect(PLAY, FALSE);}gintprev_event(GtkWidget * widget, GdkEvent * event, gpointer data) { GtkTreeIter iter; GtkTreePath * p; char cmd; cue_t cue; if (!allow_seeks) return FALSE; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(shuffle_button))) { /* normal or repeat mode */ p = get_playing_path(play_store); if (p != NULL) { gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); unmark_track(&iter); if (choose_prev_track(&iter)) { mark_track(&iter); } } else { if (choose_first_track(&iter)) { mark_track(&iter); } } } else { /* shuffle mode */ p = get_playing_path(play_store); if (p != NULL) { gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); unmark_track(&iter); } if (choose_random_track(&iter)) { mark_track(&iter); } } if (is_file_loaded) { if ((p = get_playing_path(play_store)) == NULL) { if (is_paused) { is_paused = 0; toggle_noeffect(PAUSE, FALSE); stop_event(NULL, NULL, NULL); } return FALSE; } gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); cue_track_for_playback(&iter, &cue); if (is_paused) { is_paused = 0; toggle_noeffect(PAUSE, FALSE); toggle_noeffect(PLAY, TRUE); } cmd = CMD_CUE; rb_write(rb_gui2disk, &cmd, sizeof(char)); rb_write(rb_gui2disk, (void *)&cue, sizeof(cue_t)); try_waking_disk_thread(); } return FALSE;}gintnext_event(GtkWidget * widget, GdkEvent * event, gpointer data) { GtkTreeIter iter; GtkTreePath * p; char cmd; cue_t cue; if (!allow_seeks) return FALSE; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(shuffle_button))) { /* normal or repeat mode */ p = get_playing_path(play_store); if (p != NULL) { gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); unmark_track(&iter); if (choose_next_track(&iter)) { mark_track(&iter); } } else { if (choose_first_track(&iter)) { mark_track(&iter); } } } else { /* shuffle mode */ p = get_playing_path(play_store); if (p != NULL) { gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); unmark_track(&iter); } if (choose_random_track(&iter)) { mark_track(&iter); } } if (is_file_loaded) { if ((p = get_playing_path(play_store)) == NULL) { if (is_paused) { is_paused = 0; toggle_noeffect(PAUSE, FALSE); stop_event(NULL, NULL, NULL); } return FALSE; } gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); cue_track_for_playback(&iter, &cue); if (is_paused) { is_paused = 0; toggle_noeffect(PAUSE, FALSE); toggle_noeffect(PLAY, TRUE); } cmd = CMD_CUE; rb_write(rb_gui2disk, &cmd, sizeof(char)); rb_write(rb_gui2disk, (void *)&cue, sizeof(cue_t)); try_waking_disk_thread(); } return FALSE;}gintplay_event(GtkWidget * widget, GdkEvent * event, gpointer data) { GtkTreeIter iter; GtkTreePath * p; char cmd; cue_t cue; if (is_paused) { is_paused = 0; toggle_noeffect(PAUSE, FALSE); send_cmd = CMD_RESUME; rb_write(rb_gui2disk, &send_cmd, 1); try_waking_disk_thread(); return FALSE; } cmd = CMD_CUE; cue.filename = NULL; p = get_playing_path(play_store); if (p != NULL) { gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); prepare_playback(&iter, &cue); } else { if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(shuffle_button))) { /* normal or repeat mode */ if (choose_first_track(&iter)) { prepare_playback(&iter, &cue); } else { unprepare_playback(); } } else { /* shuffle mode */ if (choose_random_track(&iter)) { prepare_playback(&iter, &cue); } else { unprepare_playback(); } } } if (cue.filename == NULL) { stop_event(NULL, NULL, NULL); } else { rb_write(rb_gui2disk, &cmd, sizeof(char)); rb_write(rb_gui2disk, (void *)&cue, sizeof(cue_t)); try_waking_disk_thread(); } return FALSE;}gintpause_event(GtkWidget * widget, GdkEvent * event, gpointer data) { if ((!allow_seeks) || (!is_file_loaded)) { toggle_noeffect(PAUSE, FALSE); return FALSE; } if (!is_paused) { is_paused = 1; toggle_noeffect(PLAY, FALSE); send_cmd = CMD_PAUSE; rb_write(rb_gui2disk, &send_cmd, 1); } else { is_paused = 0; toggle_noeffect(PLAY, TRUE); send_cmd = CMD_RESUME; rb_write(rb_gui2disk, &send_cmd, 1); } try_waking_disk_thread(); return FALSE;}gintstop_event(GtkWidget * widget, GdkEvent * event, gpointer data) { char cmd; cue_t cue; is_file_loaded = 0; current_file[0] = '\0'; gtk_adjustment_set_value(GTK_ADJUSTMENT(adj_pos), 0.0f); zero_displays(); toggle_noeffect(PLAY, FALSE); toggle_noeffect(PAUSE, FALSE); if (is_paused) { is_paused = 0; } cmd = CMD_CUE; cue.filename = NULL; rb_write(rb_gui2disk, &cmd, sizeof(char)); rb_write(rb_gui2disk, (void *)&cue, sizeof(cue_t)); try_waking_disk_thread(); /* hide cover */ cover_show_flag = 0; gtk_widget_hide(cover_image_area); gtk_widget_hide(c_event_box); return FALSE;}/* called when a track ends without user intervention */voiddecide_next_track(cue_t * pcue) { GtkTreePath * p; GtkTreeIter iter; p = get_playing_path(play_store); if (p != NULL) { /* there is a marked track in playlist */ if ((!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(shuffle_button))) && (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(repeat_button)))) { /* normal or list repeat mode */ gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); unmark_track(&iter); if (choose_adjacent_track(&iter)) { prepare_playback(&iter, pcue); } else { if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(repeat_all_button))) { /* normal mode */ allow_seeks = 1; changed_pos(GTK_ADJUSTMENT(adj_pos), NULL); unprepare_playback(); } else { /* list repeat mode */ if (choose_first_track(&iter)) { prepare_playback(&iter, pcue); } else { allow_seeks = 1; changed_pos(GTK_ADJUSTMENT(adj_pos), NULL); unprepare_playback(); } } } } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(repeat_button))) { /* track repeat mode */ gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); prepare_playback(&iter, pcue); } else { /* shuffle mode */ gtk_tree_model_get_iter(GTK_TREE_MODEL(play_store), &iter, p); gtk_tree_path_free(p); unmark_track(&iter); if (choose_random_track(&iter)) { prepare_playback(&iter, pcue);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -