📄 gtv.c
字号:
/* remove newline at end of line, and the file:// url header at the begining, copied this code from the xmms source */ temp = strchr(string, '\n'); if (temp) { if (*(temp - 1) == '\r') *(temp - 1) = '\0'; *temp = '\0'; } if (!strncmp(string, "file:", 5)) string = string + 5; gtv_open_file(string, widget); gtv_play(NULL, widget);}static gint gtv_timer( gpointer raw ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg && info ) { if( SMPEG_status( mpeg ) == SMPEG_PLAYING ) { SMPEG_getinfo( mpeg, info ); gtv_set_frame( raw, info->current_frame ); gtv_set_fps( raw, info->current_fps ); gtv_set_trackbar( raw, info->current_offset ); } } return 1;}static void gtv_clear_screen( gpointer raw ){ SDL_Surface* sdl_screen = NULL; sdl_screen = (SDL_Surface*) gtk_object_get_data( GTK_OBJECT( raw ), "sdl_screen" ); if( sdl_screen ) { SDL_FillRect( sdl_screen, NULL, SDL_MapRGB( sdl_screen->format, 0, 0, 0 ) ); SDL_UpdateRect( sdl_screen, 0, 0, 0, 0 ); }}static void gtv_quit( GtkWidget* item, gpointer raw ){ gtv_close( NULL, raw ); gtk_exit( 0 );}static void gtv_connect( gpointer raw, gchar* name, gchar* signal, GtkSignalFunc func ){ GtkObject* item = NULL; assert( raw ); item = GTK_OBJECT( gtk_object_get_data( GTK_OBJECT( raw ), name ) ); assert( item ); gtk_signal_connect(item, signal, func, raw );}int main( int argc, char* argv[] ){ static GtkTargetEntry drop_types[] = { { "text/plain", 0, 1 } }; /* These are always on the stack until program exit. */ SMPEG_Info info; gchar filename_buffer[FILENAME_BUFFER_SIZE]; GtkWidget* window = NULL; memset( &info, 0, sizeof( info ) ); memset( &filename_buffer, 0, sizeof( gchar ) * FILENAME_BUFFER_SIZE ); gtk_set_locale(); gtk_init( &argc, &argv ); window = create_gtv_window( ); gtk_drag_dest_set(window, GTK_DEST_DEFAULT_ALL, drop_types, 1, GDK_ACTION_COPY); gtk_signal_connect( GTK_OBJECT( window ), "drag_data_received", GTK_SIGNAL_FUNC( gtv_drag_data_received ), window ); gtk_signal_connect( GTK_OBJECT( window ), "destroy", GTK_SIGNAL_FUNC( gtv_quit ), window ); gtk_object_set_data( GTK_OBJECT( window ), "info", &info ); gtk_object_set_data( GTK_OBJECT( window ), "mpeg", NULL ); gtk_object_set_data( GTK_OBJECT( window ), "sdl_screen", NULL ); gtk_object_set_data( GTK_OBJECT( window ), "filename_buffer", filename_buffer ); gtk_widget_show( window ); gtv_connect( window, "open", "activate", GTK_SIGNAL_FUNC( gtv_open ) ); gtv_connect( window, "close", "activate", GTK_SIGNAL_FUNC( gtv_close ) ); gtv_connect( window, "file_info", "activate", GTK_SIGNAL_FUNC( gtv_info ) ); gtv_connect( window, "quit", "activate", GTK_SIGNAL_FUNC( gtv_quit ) ); gtv_connect( window, "about", "activate", GTK_SIGNAL_FUNC( gtv_about ) ); gtv_connect( window, "play", "clicked", GTK_SIGNAL_FUNC( gtv_play ) ); gtv_connect( window, "pause", "clicked", GTK_SIGNAL_FUNC( gtv_pause ) ); gtv_connect( window, "stop", "clicked", GTK_SIGNAL_FUNC( gtv_stop ) ); gtv_connect( window, "step", "clicked", GTK_SIGNAL_FUNC( gtv_step ) ); gtv_connect( window, "to_end", "clicked", GTK_SIGNAL_FUNC( gtv_to_end ) ); gtv_connect( window, "twotimes", "toggled", GTK_SIGNAL_FUNC( gtv_double ) ); gtv_connect( window, "loop", "toggled", GTK_SIGNAL_FUNC( gtv_loop ) ); gtv_connect( window, "audio", "toggled", GTK_SIGNAL_FUNC( gtv_audio ) ); gtv_connect( window, "filter", "toggled", GTK_SIGNAL_FUNC( gtv_filter ) ); gtv_connect( window, "seek", "value_changed", GTK_SIGNAL_FUNC( gtv_seek ) ); gtv_connect( window, "scale", "button_press_event", GTK_SIGNAL_FUNC( gtv_trackbar_drag_on ) ); gtv_connect( window, "scale", "button_release_event", GTK_SIGNAL_FUNC( gtv_trackbar_drag_off ) ); /* gtk_idle_add_priority( G_PRIORITY_LOW, gtv_timer, window );*/ gtk_timeout_add( TIMER_TIMEOUT, gtv_timer, window ); gtv_set_frame( window, 0 ); gtv_set_fps( window, 0.0 ); gtv_set_buttons_sensitive( window, FALSE ); if( argc > 1 ) { gtv_open_file( argv[1], window ); } gtk_main( ); return 0;}static GtkWidget* create_gtv_window( void ){ GtkWidget *gtv_window; GtkWidget *vbox1; GtkWidget *menubar1; GtkWidget *file; GtkWidget *file_menu; GtkAccelGroup *file_menu_accels; GtkWidget *open; GtkWidget *close; GtkWidget *separator1; GtkWidget *file_info; GtkWidget *separator2; GtkWidget *quit; GtkWidget *help; GtkWidget *help_menu; GtkAccelGroup *help_menu_accels; GtkWidget *about; GtkWidget *table1; GtkObject *seek; GtkWidget *scale; GtkWidget *play; GtkWidget *pause; GtkWidget *stop; GtkWidget *step; GtkWidget *to_end; GtkWidget *twotimes; GtkWidget *loop; GtkWidget *audio; GtkWidget *filter; GtkWidget *label3; GtkWidget *fps; GtkWidget *label2; GtkWidget *frame; GtkAccelGroup *accel_group; accel_group = gtk_accel_group_new (); gtv_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_object_set_data (GTK_OBJECT (gtv_window), "gtv_window", gtv_window); gtk_window_set_title (GTK_WINDOW (gtv_window), "gtv"); gtk_widget_set_uposition (GTK_WIDGET (gtv_window), 0, 0); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox1); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (gtv_window), vbox1); menubar1 = gtk_menu_bar_new (); gtk_widget_ref (menubar1); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "menubar1", menubar1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (menubar1); gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0); file = gtk_menu_item_new_with_label ("File"); gtk_widget_ref (file); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "file", file, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (file); gtk_container_add (GTK_CONTAINER (menubar1), file); file_menu = gtk_menu_new (); gtk_widget_ref (file_menu); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "file_menu", file_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), file_menu); file_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (file_menu)); open = gtk_menu_item_new_with_label ("Open"); gtk_widget_ref (open); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "open", open, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (open); gtk_container_add (GTK_CONTAINER (file_menu), open); gtk_widget_add_accelerator (open, "activate", accel_group, GDK_O, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); close = gtk_menu_item_new_with_label ("Close"); gtk_widget_ref (close); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "close", close, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (close); gtk_container_add (GTK_CONTAINER (file_menu), close); gtk_widget_add_accelerator (close, "activate", accel_group, GDK_W, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); separator1 = gtk_menu_item_new (); gtk_widget_ref (separator1); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "separator1", separator1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (separator1); gtk_container_add (GTK_CONTAINER (file_menu), separator1); gtk_widget_set_sensitive (separator1, FALSE); file_info = gtk_menu_item_new_with_label ("Info"); gtk_widget_ref (file_info); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "file_info", file_info, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (file_info); gtk_container_add (GTK_CONTAINER (file_menu), file_info); gtk_widget_add_accelerator (file_info, "activate", accel_group, GDK_I, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); separator2 = gtk_menu_item_new (); gtk_widget_ref (separator2); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "separator2", separator2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (separator2); gtk_container_add (GTK_CONTAINER (file_menu), separator2); gtk_widget_set_sensitive (separator2, FALSE); quit = gtk_menu_item_new_with_label ("Quit"); gtk_widget_ref (quit); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "quit", quit, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (quit); gtk_container_add (GTK_CONTAINER (file_menu), quit); gtk_widget_add_accelerator (quit, "activate", accel_group, GDK_Q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); help = gtk_menu_item_new_with_label ("Help"); gtk_widget_ref (help); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "help", help, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (help); gtk_container_add (GTK_CONTAINER (menubar1), help); gtk_menu_item_right_justify (GTK_MENU_ITEM (help)); help_menu = gtk_menu_new (); gtk_widget_ref (help_menu); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "help_menu", help_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu); help_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (help_menu)); about = gtk_menu_item_new_with_label ("About"); gtk_widget_ref (about); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "about", about, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (about); gtk_container_add (GTK_CONTAINER (help_menu), about); gtk_widget_add_accelerator (about, "activate", accel_group, GDK_F1, 0, GTK_ACCEL_VISIBLE); table1 = gtk_table_new (4, 5, FALSE); gtk_widget_ref (table1); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "table1", table1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (table1); gtk_box_pack_start (GTK_BOX (vbox1), table1, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (table1), 5); gtk_table_set_row_spacings (GTK_TABLE (table1), 5); gtk_table_set_col_spacings (GTK_TABLE (table1), 5); seek = gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 0.0, 0.0); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "seek", seek, (GtkDestroyNotify) (0)); scale = gtk_hscale_new(GTK_ADJUSTMENT(seek)); gtv_trackbar_dragging = 0; gtk_widget_ref (scale); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "scale", scale, (GtkDestroyNotify) gtk_widget_unref); gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED); gtk_widget_show (scale); gtk_table_attach (GTK_TABLE (table1), scale, 0, 5, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); play = gtk_button_new_with_label (" Play "); gtk_widget_ref (play); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "play", play, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (play); gtk_table_attach (GTK_TABLE (table1), play, 0, 1, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); pause = gtk_button_new_with_label (" Pause "); gtk_widget_ref (pause); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "pause", pause, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pause); gtk_table_attach (GTK_TABLE (table1), pause, 1, 2, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); stop = gtk_button_new_with_label (" Stop "); gtk_widget_ref (stop); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "stop", stop, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (stop); gtk_table_attach (GTK_TABLE (table1), stop, 2, 3, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); step = gtk_button_new_with_label (" Step "); gtk_widget_ref (step); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "step", step, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (step); gtk_table_attach (GTK_TABLE (table1), step, 3, 4, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); to_end = gtk_button_new_with_label (" To End "); gtk_widget_ref (to_end); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "to_end", to_end, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (to_end); gtk_table_attach (GTK_TABLE (table1), to_end, 4, 5, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); twotimes = gtk_check_button_new_with_label ("Double"); gtk_widget_ref (twotimes); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "twotimes", twotimes, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (twotimes); gtk_table_attach (GTK_TABLE (table1), twotimes, 0, 1, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); loop = gtk_check_button_new_with_label ("Loop"); gtk_widget_ref (loop); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "loop", loop, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (loop); gtk_table_attach (GTK_TABLE (table1), loop, 1, 2, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); audio = gtk_check_button_new_with_label ("Audio"); gtk_widget_ref (audio); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "audio", audio, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (audio); gtk_table_attach (GTK_TABLE (table1), audio, 2, 3, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); filter = gtk_check_button_new_with_label ("Filter"); gtk_widget_ref (filter); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "filter", filter, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (filter); gtk_table_attach (GTK_TABLE (table1), filter, 3, 4, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); label3 = gtk_label_new ("Current frame:"); gtk_widget_ref (label3); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "label3", label3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label3); gtk_table_attach (GTK_TABLE (table1), label3, 0, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label3), 1, 0.5); fps = gtk_label_new ("<fps>"); gtk_widget_ref (fps); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "fps", fps, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (fps); gtk_table_attach (GTK_TABLE (table1), fps, 3, 4, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (fps), 1, 0.5); label2 = gtk_label_new ("fps"); gtk_widget_ref (label2); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "label2", label2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (label2); gtk_table_attach (GTK_TABLE (table1), label2, 4, 5, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5); frame = gtk_label_new ("<frame>"); gtk_widget_ref (frame); gtk_object_set_data_full (GTK_OBJECT (gtv_window), "frame", frame, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (frame); gtk_table_attach (GTK_TABLE (table1), frame, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (frame), 0, 0.5); gtk_window_add_accel_group (GTK_WINDOW (gtv_window), accel_group); return gtv_window;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -