📄 gtk_i.c
字号:
/* 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 + -