📄 gtv.c
字号:
dialog_vbox2 = GTK_DIALOG (about_dialog)->vbox; gtk_object_set_data (GTK_OBJECT (about_dialog), "dialog_vbox2", dialog_vbox2); gtk_widget_show (dialog_vbox2); scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (scrolledwindow2); gtk_object_set_data_full (GTK_OBJECT (about_dialog), "scrolledwindow2", scrolledwindow2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scrolledwindow2); gtk_box_pack_start (GTK_BOX (dialog_vbox2), scrolledwindow2, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow2), 5); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); viewport2 = gtk_viewport_new (NULL, NULL); gtk_widget_ref (viewport2); gtk_object_set_data_full (GTK_OBJECT (about_dialog), "viewport2", viewport2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (viewport2); gtk_container_add (GTK_CONTAINER (scrolledwindow2), viewport2); text = gtk_text_new (NULL, NULL); gtk_widget_ref (text); gtk_object_set_data_full (GTK_OBJECT (about_dialog), "text", text, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (text); gtk_container_add (GTK_CONTAINER (viewport2), text); dialog_action_area2 = GTK_DIALOG (about_dialog)->action_area; gtk_object_set_data (GTK_OBJECT (about_dialog), "dialog_action_area2", dialog_action_area2); gtk_widget_show (dialog_action_area2); gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area2), 10); ok = gtk_button_new_with_label (" OK "); gtk_widget_ref (ok); gtk_object_set_data_full (GTK_OBJECT (about_dialog), "ok", ok, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (ok); gtk_box_pack_start (GTK_BOX (dialog_action_area2), ok, FALSE, FALSE, 0); return about_dialog;}static void gtv_about( GtkWidget* item, gpointer raw ){ static const char* msg = "gtv - Gtk+ MPEG Player\n" \ "(c) Michael Vance, 1999\n" \ " briareos@lokigames.com\n" \ "\n" \ "Built using:\n" \ "SMPEG - http://www.lokigames.com/development\n" \ "Gtk+ - http://www.gtk.org\n" \ "Glade - http://glade.pn.org\n" \ "\n" \ "Distributed under the GPL.\n"; GtkWidget* dialog = NULL; GtkWidget* ok = NULL; GtkWidget* text = NULL; gint ignored = 0; dialog = create_about_dialog( ); ok = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( dialog ), "ok" ) ); gtk_signal_connect( GTK_OBJECT( ok ), "clicked", GTK_SIGNAL_FUNC( gtv_dialog_cancel ), raw ); text = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( dialog ), "text" ) ); gtk_editable_insert_text( GTK_EDITABLE( text ), msg, strlen( msg ), &ignored ); /* HACK HACK HACK */ gtk_object_set_data( GTK_OBJECT( raw ), "dialog", dialog ); gtk_grab_add( dialog ); gtk_widget_show( dialog );}static void gtv_rewind( gpointer raw ){ SMPEG* mpeg = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); if( mpeg ) { SMPEG_Info* info = NULL; SMPEG_rewind( mpeg ); gtv_clear_screen( raw ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); SMPEG_getinfo( mpeg, info ); gtv_set_frame( raw, info->current_frame ); }}static void gtv_double( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; SDL_Surface* sdl_screen = NULL; SMPEG_Info* info = NULL; int stopped=0; int width,height; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); sdl_screen = (SDL_Surface*) gtk_object_get_data( GTK_OBJECT( raw ), "sdl_screen" ); if( mpeg && sdl_screen ) { GtkWidget* twotimes = NULL; gboolean active = FALSE; twotimes = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "twotimes" ) ); active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( twotimes ) ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); assert( info ); if (SMPEG_status(mpeg)==SMPEG_PLAYING) { SMPEG_pause(mpeg); stopped=1; } if( active ) { width = info->width * 2; height = info->height * 2; } else { width = info->width; height = info->height; } sdl_screen = SDL_SetVideoMode(width, height, sdl_screen->format->BitsPerPixel,sdl_screen->flags); gtv_center_window(sdl_screen); SMPEG_setdisplay( mpeg, sdl_screen, NULL, NULL ); gtk_object_set_data( GTK_OBJECT( raw ), "sdl_screen", sdl_screen ); SMPEG_scaleXY( mpeg, sdl_screen->w, sdl_screen->h ); gtv_center_window(sdl_screen); if (stopped) SMPEG_pause(mpeg); }}static void gtv_loop( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); if( mpeg ) { GtkWidget* loop = NULL; gboolean active = FALSE; loop = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "loop" ) ); active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( loop ) ); SMPEG_loop( mpeg, active ); }}static void gtv_audio( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); if( mpeg ) { GtkWidget* audio = NULL; gboolean active = FALSE; SMPEG_Info* info = NULL; audio = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "audio" ) ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( audio ) ); SMPEG_enableaudio( mpeg, active && info->has_audio ); }}static void gtv_filter( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg && info->has_video ) { GtkWidget* filter = NULL; gboolean active = FALSE; filter = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "filter" ) ); active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( filter ) ); if(active) { SMPEG_Filter * filter; /* Activate the bilinear filter */ filter = SMPEGfilter_bilinear(); filter = SMPEG_filter( mpeg, filter ); filter->destroy(filter); } else { SMPEG_Filter * filter; /* Reset to default (null) filter */ filter = SMPEGfilter_null(); filter = SMPEG_filter( mpeg, filter ); filter->destroy(filter); } }}static void gtv_play( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); if( mpeg ) { // gtv_rewind( raw ); SMPEG_play( mpeg ); }}static void gtv_pause( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); if( mpeg ) { SMPEG_pause( mpeg ); }}static void gtv_stop( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg ) { SMPEG_stop( mpeg ); gtv_rewind( raw ); SMPEG_getinfo( mpeg, info ); gtv_set_trackbar( raw, info->current_offset ); }}static void gtv_step( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg && info && info->has_video && ( SMPEG_status( mpeg ) != SMPEG_PLAYING ) ) { int next_frame = 0; GtkWidget* twotimes = NULL; gboolean active = FALSE; SDL_Surface* sdl_screen = NULL; SMPEG_getinfo( mpeg, info ); next_frame = info->current_frame + 1; twotimes = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "twotimes" ) ); active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( twotimes ) ); sdl_screen = (SDL_Surface*) gtk_object_get_data( GTK_OBJECT( raw ), "sdl_screen" ); SMPEG_renderFrame( mpeg, next_frame ); SMPEG_getinfo( mpeg, info ); if( info->current_frame != next_frame ) { GtkWidget *looping; /* Sam 5/31/2000 - Only loop if the looping toggle is set */ looping = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(raw), "loop")); if ( ! gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(looping)) ) { return; } gtv_rewind( raw ); gtv_step( NULL, raw ); } gtv_set_frame( raw, info->current_frame ); }}static void gtv_to_end( GtkWidget* item, gpointer raw ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; assert( raw ); mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg && info->has_video ) { GtkWidget* twotimes = NULL; gboolean active = FALSE; SDL_Surface* sdl_screen = NULL; SMPEG_stop( mpeg ); twotimes = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "twotimes" ) ); active = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( twotimes ) ); sdl_screen = (SDL_Surface*) gtk_object_get_data( GTK_OBJECT( raw ), "sdl_screen" ); if( active ) { SMPEG_renderFinal( mpeg, sdl_screen, 0, 0 ); } else { SMPEG_renderFinal( mpeg, sdl_screen, ( sdl_screen->w - info->width ) / 2, ( sdl_screen->h - info->height ) / 2 ); } SMPEG_getinfo( mpeg, info ); gtv_set_frame( raw, info->current_frame ); }}static void gtv_seek( GtkAdjustment* adjust, gpointer raw ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; assert( raw ); if(gtv_trackbar_dragging) return; mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg && info && info->total_size ) { /* In case file is growing while we're playing */ SMPEG_getinfo( mpeg, info ); SMPEG_seek(mpeg, (int)((info->total_size*adjust->value)/100)); } SMPEG_getinfo( mpeg, info ); gtv_set_frame( raw, info->current_frame );}static void gtv_trackbar_drag_on(GtkWidget *widget, gpointer raw){ gtv_trackbar_dragging = 1;}static void gtv_trackbar_drag_off(GtkWidget *widget, gpointer raw){ gtv_trackbar_dragging = 0;}static void gtv_set_frame( gpointer raw, int value ){ GtkWidget* frame = NULL; gchar buffer[32]; assert( raw ); assert( value >= 0 ); frame = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "frame" ) ); g_snprintf( buffer, 32, "%d", value ); gtk_label_set_text( GTK_LABEL( frame ), buffer );}static void gtv_set_fps( gpointer raw, float value ){ GtkWidget* fps = NULL; gchar buffer[32]; assert( raw ); assert( value >= 0.0 ); fps = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "fps" ) ); g_snprintf( buffer, 32, "%2.2f", value ); gtk_label_set_text( GTK_LABEL( fps ), buffer );}static void gtv_set_trackbar( gpointer raw, int value ){ SMPEG* mpeg = NULL; SMPEG_Info* info = NULL; GtkWidget* scale = NULL; GtkAdjustment* seek = NULL; assert( raw ); assert( value >= 0 ); if(gtv_trackbar_dragging) return; mpeg = (SMPEG*) gtk_object_get_data( GTK_OBJECT( raw ), "mpeg" ); info = (SMPEG_Info*) gtk_object_get_data( GTK_OBJECT( raw ), "info" ); if( mpeg && info && info->total_size ) { scale = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( raw ), "scale" ) ); seek = gtk_range_get_adjustment ( GTK_RANGE( scale ) ); seek->value = 100. * value / info->total_size; gtk_range_set_adjustment ( GTK_RANGE( scale ), seek ); gtk_range_slider_update ( GTK_RANGE( scale ) ); gtk_range_clear_background ( GTK_RANGE( scale ) ); gtk_range_draw_background ( GTK_RANGE( scale ) ); }}/* Drag-N-Drop support, contributed by */static void gtv_drag_data_received(GtkWidget * widget, GdkDragContext * context, gint x, gint y, GtkSelectionData * selection_data, guint info, guint time){ gchar *temp, *string; string = (gchar *)selection_data->data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -