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

📄 gtk_i.c

📁 linux上播放midi音乐,但是要一些设置.可网上查找. 软件名称: TiMidity++-2.13.0.tar
💻 C
📖 第 1 页 / 共 2 页
字号:
/*    TiMidity++ -- MIDI to WAVE converter and player    Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>    Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>    This program is free software; you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    gtk_i.c - Glenn Trigg 29 Oct 1998*/#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H*/#include <string.h>#ifdef HAVE_GLOB_H#include <glob.h>#endif#if HAVE_SYS_PARAM_H#include <sys/param.h>#endif#include <gtk/gtk.h>#include "timidity.h"#include "common.h"#include "gtk_h.h"#include "pixmaps/playpaus.xpm"#include "pixmaps/prevtrk.xpm"#include "pixmaps/nexttrk.xpm"#include "pixmaps/rew.xpm"#include "pixmaps/ff.xpm"#include "pixmaps/restart.xpm"#include "pixmaps/quit.xpm"#include "pixmaps/quiet.xpm"#include "pixmaps/loud.xpm"#include "pixmaps/open.xpm"#include "pixmaps/keyup.xpm"#include "pixmaps/keydown.xpm"#include "pixmaps/slow.xpm"#include "pixmaps/fast.xpm"#include "pixmaps/timidity.xpm"static GtkWidget *create_menubar(void);static GtkWidget *create_button_with_pixmap(GtkWidget *, gchar **, gint, gchar *);static GtkWidget *create_pixmap_label(GtkWidget *, gchar **);static gint delete_event(GtkWidget *, GdkEvent *, gpointer);static void destroy (GtkWidget *, gpointer);static GtkTooltips *create_yellow_tooltips(void);static void handle_input(gpointer, gint, GdkInputCondition);static void generic_cb(GtkWidget *, gpointer);static void generic_scale_cb(GtkAdjustment *, gpointer);static void open_file_cb(GtkWidget *, gpointer);static void playlist_cb(GtkWidget *, guint);static void playlist_op(GtkWidget *, guint);static void file_list_cb(GtkWidget *, gint, gint, GdkEventButton *, gpointer);static void clear_all_cb(GtkWidget *, gpointer);static void filer_cb(GtkWidget *, gpointer);static void tt_toggle_cb(GtkWidget *, gpointer);static void locate_update_cb(GtkWidget *, GdkEventButton *, gpointer);static void my_adjustment_set_value(GtkAdjustment *, gint);static void set_icon_pixmap(GtkWidget *, gchar **);static GtkWidget *window, *clist, *text, *vol_scale, *locator;static GtkWidget *filesel = NULL, *plfilesel = NULL;static GtkWidget *tot_lbl, *cnt_lbl, *auto_next, *ttshow;static GtkTooltips *ttip;static int file_number_to_play; /* Number of the file we're playing in the list */static int max_sec, is_quitting = 0, locating = 0, local_adjust = 0;static GtkItemFactoryEntry ife[] = {    {"/File/Open", "<control>O", open_file_cb, 0, NULL},    {"/File/sep", NULL, NULL, 0, "<Separator>"},    {"/File/Load Playlist", "<control>L", playlist_cb,     'l', NULL},    {"/File/Save Playlist", "<control>S", playlist_cb,     's', NULL},    {"/File/sep", NULL, NULL, 0, "<Separator>"},    {"/File/Quit", "<control>Q", generic_cb, GTK_QUIT, NULL},    {"/Options/Auto next", "<control>A", NULL, 0, "<CheckItem>"},    {"/Options/Show tooltips", "<control>T", tt_toggle_cb, 0, "<CheckItem>"},    {"/Options/Clear All", "<control>C", clear_all_cb, 0, NULL}};/*----------------------------------------------------------------------*/static voidgeneric_cb(GtkWidget *widget, gpointer data){    gtk_pipe_int_write((int)data);    if((int)data == GTK_PAUSE) {	gtk_label_set(GTK_LABEL(cnt_lbl), "Pause");    }}static voidtt_toggle_cb(GtkWidget *widget, gpointer data){    if( GTK_CHECK_MENU_ITEM(ttshow)->active ) {	gtk_tooltips_enable(ttip);    }    else {	gtk_tooltips_disable(ttip);    }}static voidopen_file_cb(GtkWidget *widget, gpointer data){    if( ! filesel ) {	filesel = gtk_file_selection_new("Open File");	gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(filesel));	gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->ok_button),			   "clicked",			   GTK_SIGNAL_FUNC (filer_cb), (gpointer)1);	gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->cancel_button),			   "clicked",			   GTK_SIGNAL_FUNC (filer_cb), (gpointer)0);    }    gtk_widget_show(GTK_WIDGET(filesel));}static voidfiler_cb(GtkWidget *widget, gpointer data){    gchar *filenames[2];#ifdef GLOB_BRACE    int i;    gchar *patt;    glob_t pglob;    if((int)data == 1) {	patt = gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel));	if(glob(patt, GLOB_BRACE|GLOB_NOMAGIC|GLOB_TILDE, NULL, &pglob))	    return;	for( i = 0; i < pglob.gl_pathc; i++) {	    filenames[0] = pglob.gl_pathv[i];	    filenames[1] = NULL;	    gtk_clist_append(GTK_CLIST(clist), filenames);	}	globfree(&pglob);    }#else    if((int)data == 1) {	filenames[0] = gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel));	filenames[1] = NULL;	gtk_clist_append(GTK_CLIST(clist), filenames);    }#endif    gtk_widget_hide(filesel);    gtk_clist_columns_autosize(GTK_CLIST(clist));}static voidgeneric_scale_cb(GtkAdjustment *adj, gpointer data){    if(local_adjust)	return;    gtk_pipe_int_write((int)data);    /* This is a bit of a hack as the volume scale (a GtkVScale) seems       to have it's minimum at the top which is counter-intuitive. */    if((int)data == GTK_CHANGE_VOLUME) {	gtk_pipe_int_write(MAX_AMPLIFICATION - adj->value);    }    else {	gtk_pipe_int_write((int)adj->value*100);    }}static voidfile_list_cb(GtkWidget *widget, gint row, gint column,	     GdkEventButton *event, gpointer data){    gint	retval;    gchar	*fname;    if(event && (event->button == 3)) {	if(event->type == GDK_2BUTTON_PRESS) {	    gtk_clist_remove(GTK_CLIST(clist), row);	}	else {	    return;	}    }    retval = gtk_clist_get_text(GTK_CLIST(widget), row, 0, &fname);    if(retval) {	gtk_pipe_int_write(GTK_PLAY_FILE);	gtk_pipe_string_write(fname);	file_number_to_play=row;    }}static voidplaylist_cb(GtkWidget *widget, guint data){    const gchar	*pldir;    gchar	*plpatt;    if( ! plfilesel ) {	plfilesel = gtk_file_selection_new("");	gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(plfilesel));	pldir = g_getenv("TIMIDITY_PLAYLIST_DIR");	if(pldir != NULL) {	    plpatt = g_strconcat(pldir, "/*.tpl", NULL);	    gtk_file_selection_set_filename(GTK_FILE_SELECTION(plfilesel),					    plpatt);	    g_free(plpatt);	}	gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plfilesel)->ok_button),			   "clicked",			   GTK_SIGNAL_FUNC (playlist_op), (gpointer)1);	gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(plfilesel)->cancel_button),			   "clicked",			   GTK_SIGNAL_FUNC (playlist_op), NULL);    }    gtk_window_set_title(GTK_WINDOW(plfilesel), ((char)data == 'l')?			 "Load Playlist":			 "Save Playlist");    gtk_object_set_user_data(GTK_OBJECT(plfilesel), (gpointer)data);    gtk_file_selection_complete(GTK_FILE_SELECTION(plfilesel), "*.tpl");    gtk_widget_show(plfilesel);} /* playlist_cb */static voidplaylist_op(GtkWidget *widget, guint data){    int		i;    gchar	*filename[2], action, *rowdata, fname[BUFSIZ], *tmp;    FILE	*plfp;    gtk_widget_hide(plfilesel);    if(!data)	return;    action = (gchar)(int)gtk_object_get_user_data(GTK_OBJECT(plfilesel));    filename[0] = gtk_file_selection_get_filename(GTK_FILE_SELECTION(plfilesel));    if(action == 'l') {	if((plfp = fopen(filename[0], "r")) == NULL) {	    g_error("Can't open %s for reading.", filename[0]);	    return;	}	while(fgets(fname, BUFSIZ, plfp) != NULL) {	    if(fname[strlen(fname) - 1] == '\n')		fname[strlen(fname) - 1] = '\0';	    filename[0] = fname;	    filename[1] = NULL;	    gtk_clist_append(GTK_CLIST(clist), filename);	}	fclose(plfp);	gtk_clist_columns_autosize(GTK_CLIST(clist));    }    else if(action == 's') {	if((plfp = fopen(filename[0], "w")) == NULL) {	    g_error("Can't open %s for writing.", filename[0]);	    return;	}	for(i = 0; i < GTK_CLIST(clist)->rows; i++) {	    gtk_clist_get_text(GTK_CLIST(clist), i, 0, &rowdata);	    /* Make sure we have an absolute path. */	    if(*rowdata != '/') {		tmp = g_get_current_dir();		rowdata = g_strconcat(tmp, "/", rowdata, NULL);		fprintf(plfp, "%s\n", rowdata);		g_free(rowdata);		g_free(tmp);	    }	    else {		fprintf(plfp, "%s\n", rowdata);	    }	}	fclose(plfp);    }    else {	g_error("Invalid playlist action!.");    }} /* playlist_op */static voidclear_all_cb(GtkWidget *widget, gpointer data){    gtk_clist_clear(GTK_CLIST(clist));} /* clear_all_cb */static gintdelete_event(GtkWidget *widget, GdkEvent *event, gpointer data){    return (FALSE);}static voiddestroy (GtkWidget *widget, gpointer data){    is_quitting = 1;    gtk_pipe_int_write(GTK_QUIT);}static voidlocate_update_cb (GtkWidget *widget, GdkEventButton *ev, gpointer data){    if( (ev->button == 1) || (ev->button == 2)) {	if( ev->type == GDK_BUTTON_RELEASE ) {	    locating = 0;	}	else {	    locating = 1;	}    }}static voidmy_adjustment_set_value(GtkAdjustment *adj, gint value){    local_adjust = 1;    gtk_adjustment_set_value(adj, (gfloat)value);    local_adjust = 0;}voidLaunch_Gtk_Process(int pipe_number){    int	argc = 0;    GtkWidget *button, *mbar, *swin;    GtkWidget *table, *align, *handlebox;    GtkWidget *vbox, *hbox, *vbox2, *scrolled_win;    GtkObject *adj;    /* enable locale */    gtk_set_locale ();    gtk_init (&argc, NULL);    ttip = create_yellow_tooltips();    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);    gtk_widget_set_name(window, "TiMidity");    gtk_window_set_title(GTK_WINDOW(window), "TiMidity - MIDI Player");    gtk_window_set_wmclass(GTK_WINDOW(window), "timidity", "TiMidity");    gtk_signal_connect(GTK_OBJECT(window), "delete_event",		       GTK_SIGNAL_FUNC (delete_event), NULL);    gtk_signal_connect(GTK_OBJECT(window), "destroy",		       GTK_SIGNAL_FUNC (destroy), NULL);    vbox = gtk_vbox_new(FALSE, 0);    gtk_container_add(GTK_CONTAINER(window), vbox);    mbar = create_menubar();    gtk_box_pack_start(GTK_BOX(vbox), mbar, FALSE, FALSE, 0);    scrolled_win = gtk_scrolled_window_new(NULL, NULL);    gtk_box_pack_start(GTK_BOX(vbox), scrolled_win, TRUE, TRUE ,0);    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);    gtk_widget_show(scrolled_win);    text = gtk_text_new(NULL, NULL);    gtk_widget_show(text);    gtk_container_add(GTK_CONTAINER(scrolled_win), text);    hbox = gtk_hbox_new(FALSE, 4);    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 4);    gtk_widget_show(hbox);    adj = gtk_adjustment_new(0., 0., 100., 1., 20., 0.);    locator = gtk_hscale_new(GTK_ADJUSTMENT(adj));    gtk_scale_set_draw_value(GTK_SCALE(locator), TRUE);    gtk_signal_connect(GTK_OBJECT(adj), "value_changed",			GTK_SIGNAL_FUNC(generic_scale_cb),			(gpointer)GTK_CHANGE_LOCATOR);    gtk_signal_connect(GTK_OBJECT(locator), "button_press_event",			GTK_SIGNAL_FUNC(locate_update_cb),			NULL);    gtk_signal_connect(GTK_OBJECT(locator), "button_release_event",			GTK_SIGNAL_FUNC(locate_update_cb),			NULL);    gtk_range_set_update_policy(GTK_RANGE(locator),				GTK_UPDATE_DISCONTINUOUS);    gtk_scale_set_digits(GTK_SCALE(locator), 0);    gtk_widget_show(locator);    gtk_box_pack_start(GTK_BOX(hbox), locator, TRUE, TRUE, 4);    align = gtk_alignment_new(0., 1., 1., 0.);    gtk_widget_show(align);    cnt_lbl = gtk_label_new("00:00");    gtk_widget_show(cnt_lbl);    gtk_container_add(GTK_CONTAINER(align), cnt_lbl);    gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, TRUE, 0);    align = gtk_alignment_new(0., 1., 1., 0.);    gtk_widget_show(align);    tot_lbl = gtk_label_new("/00:00");    gtk_widget_show(tot_lbl);    gtk_container_add(GTK_CONTAINER(align), tot_lbl);    gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, TRUE, 0);    hbox = gtk_hbox_new(FALSE, 4);    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 4);    swin = gtk_scrolled_window_new(NULL, NULL);    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin),				   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);    clist = gtk_clist_new(1);    gtk_container_add(GTK_CONTAINER(swin), clist);    gtk_widget_show(swin);    gtk_widget_show(clist);    gtk_widget_set_usize(clist, 200, 10);    gtk_clist_set_reorderable(GTK_CLIST(clist), TRUE);    gtk_clist_set_button_actions(GTK_CLIST(clist), 0, GTK_BUTTON_SELECTS);    gtk_clist_set_button_actions(GTK_CLIST(clist), 1, GTK_BUTTON_DRAGS);    gtk_clist_set_button_actions(GTK_CLIST(clist), 2, GTK_BUTTON_SELECTS);    gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE);    gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 1, TRUE);    gtk_signal_connect(GTK_OBJECT(clist), "select_row",		       GTK_SIGNAL_FUNC(file_list_cb), NULL);    gtk_box_pack_start(GTK_BOX(hbox), swin, TRUE, TRUE, 0);    vbox2 = gtk_vbox_new(FALSE, 0);    gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, FALSE, 0);    gtk_widget_show(vbox2);    /* This is so the pixmap creation works properly. */    gtk_widget_realize(window);    set_icon_pixmap(window, timidity_xpm);    gtk_box_pack_start(GTK_BOX(vbox2),		       create_pixmap_label(window, loud_xpm),		       FALSE, FALSE, 0);    adj = gtk_adjustment_new(30., 0., (gfloat)MAX_AMPLIFICATION, 1., 20., 0.);    vol_scale = gtk_vscale_new(GTK_ADJUSTMENT(adj));    gtk_scale_set_draw_value(GTK_SCALE(vol_scale), FALSE);    gtk_signal_connect (GTK_OBJECT(adj), "value_changed",			GTK_SIGNAL_FUNC(generic_scale_cb),			(gpointer)GTK_CHANGE_VOLUME);    gtk_range_set_update_policy(GTK_RANGE(vol_scale),				GTK_UPDATE_DELAYED);    gtk_widget_show(vol_scale);    gtk_tooltips_set_tip(ttip, vol_scale, "Volume control", NULL);    gtk_box_pack_start(GTK_BOX(vbox2), vol_scale, TRUE, TRUE, 0);    gtk_box_pack_start(GTK_BOX(vbox2),		       create_pixmap_label(window, quiet_xpm),		       FALSE, FALSE, 0);    handlebox = gtk_handle_box_new();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -