⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui_main.c

📁 Aqualung is an advanced music player primarily targeted for the GNU/Linux operating system, but als
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -