/** \fn A_openAvi \brief Open (replace mode) a video */ int A_openAvi (const char *name) { uint8_t res; char *longname; uint32_t magic[4]; uint32_t id = 0; if (playing) return 0; /// check if name exists FILE *fd; fd = ADM_fopen(name, "rb"); if (!fd) { if (errno == EACCES) { GUI_Error_HIG(QT_TRANSLATE_NOOP("adm", "Permission error"), QT_TRANSLATE_NOOP("adm", "Cannot open \"%s\"."), name); } if (errno == ENOENT) { GUI_Error_HIG(QT_TRANSLATE_NOOP("adm", "File error"), QT_TRANSLATE_NOOP("adm", "\"%s\" does not exist."), name); } return 0; } if (4 == fread(magic, 4, 4, fd)) id = R32(magic[0]); fclose(fd); GUI_close(); // Cleanup // DIA_StartBusy (); /* ** we may get a relative path by cmdline */ longname = ADM_PathCanonize(name); // check if avisynth input is given if (fourCC::check(id, (uint8_t *) "ADAP")) res = video_body->addFile(AVS_PROXY_DUMMY_FILE); else res = video_body->addFile(longname); // DIA_StopBusy (); // forget last project file video_body->setProjectName(""); if (res != ADM_OK) // an error occured { delete[] longname; if (ADM_IGN == res) { return 0; } if (fourCC::check(id, (uint8_t *) "//AD")) { GUI_Error_HIG(QT_TRANSLATE_NOOP("adm", "Cannot open project using the video loader."), QT_TRANSLATE_NOOP("adm", "Try 'File' -> 'Load/Run Project...'")); } else { GUI_Error_HIG(QT_TRANSLATE_NOOP("adm", "Could not open the file"), NULL); } return 0; } { int i; FILE *fd = NULL; char magic[4]; /* check myself it is a project file (transparent detected and read ** by video_body->addFile (name); */ //#warning FIXME #if 0 if ((fd = ADM_fopen(longname, "rb"))) { if (fread(magic, 4, 1, fd) == 4) { /* remember a workbench file */ if (!strncmp(magic, "ADMW", 4)) { actual_workbench_file = ADM_strdup(longname); } } fclose(fd); } #endif /* remember any video or workbench file to "recent" */ prefs->set_lastfile(longname); UI_updateRecentMenu(); updateLoaded(); if (currentaudiostream) { uint32_t nbAudio; audioInfo *infos = NULL; if (video_body->getAudioStreamsInfo(admPreview::getCurrentPts() + 1, &nbAudio, &infos)) { if (nbAudio > 1) { // Multiple track warn user GUI_Info_HIG(ADM_LOG_INFO, QT_TRANSLATE_NOOP("adm", "Multiple Audio Tracks"), QT_TRANSLATE_NOOP("adm", "The file you just loaded contains several audio tracks.\n" "Go to Audio->MainTrack to select the active one.")); } } if (infos) delete [] infos; // Revert mixer to copy //setCurrentMixerFromString("NONE"); EditableAudioTrack *ed = video_body->getDefaultEditableAudioTrack(); if (ed) ed->audioEncodingConfig.audioFilterSetMixer(CHANNEL_INVALID); } for (i = strlen(longname); i >= 0; i--) { #ifdef _WIN32 if (longname[i] == '\\' || longname[i] == '/') #else if (longname[i] == '/') #endif { i++; break; } } UI_setTitle(longname + i); } delete[] longname; return 1; }
///_____________________________________________________ /// retrieve gtkwidget through their name /// the aim is to avoid having to modify the glade generated file ///_____________________________________________________ uint8_t bindGUI( void ) { #define ADM_LOOKUP(a,b) a= lookup_widget (guiRootWindow,#b);if(!a) return 0; ADM_LOOKUP(guiDrawingArea,guiDrawing); ADM_LOOKUP(guiSlider,sliderNavigate); sliderAdjustment=gtk_range_get_adjustment (GTK_RANGE(guiSlider)); ADM_LOOKUP(guiMarkA,labelMarkA); ADM_LOOKUP(guiMarkB,labelMarkB); ADM_LOOKUP(guiCurFrame,boxCurFrame); ADM_LOOKUP(guiTotalFrame,labelTotalFrame); ADM_LOOKUP(guiCurTime,boxCurTime); ADM_LOOKUP(guiTotalTime,labelTotalTime); #if 0 ADM_LOOKUP(guiPreviewToggle,toggletoolbuttonPreview); ADM_LOOKUP(guiOutputToggle,toggletoolbuttonOutput); ADM_LOOKUP(guiAudioToggle,togglebuttonAudio); ADM_LOOKUP(guiVideoToggle,togglebuttonVideo); #endif #undef ADM_LOOKUP // bind menu #define CALLBACK(x,y) gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,#x)), "activate", \ GTK_SIGNAL_FUNC(guiCallback), (void *) y) #include "GUI_menumap.h" #undef CALLBACK /// /bind menu // destroy gtk_object_set_data_full(GTK_OBJECT(guiRootWindow), "guiRootWindow", guiRootWindow, (GtkDestroyNotify) destroyCallback); // now add callbacks gtk_widget_add_events(guiRootWindow, GDK_BUTTON_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(guiRootWindow), "button_press_event", GTK_SIGNAL_FUNC(UI_returnFocus), NULL); gtk_signal_connect(GTK_OBJECT(guiSlider), "button_press_event", GTK_SIGNAL_FUNC(UI_SliderPressed), NULL); gtk_signal_connect(GTK_OBJECT(guiSlider), "button_release_event", GTK_SIGNAL_FUNC(UI_SliderReleased), NULL); // Current Frame gtk_signal_connect(GTK_OBJECT(guiCurFrame), "focus_in_event", GTK_SIGNAL_FUNC(UI_grabFocus), (void *) NULL); gtk_signal_connect(GTK_OBJECT(guiCurFrame), "focus_out_event", GTK_SIGNAL_FUNC(UI_loseFocus), (void *) NULL); gtk_signal_connect(GTK_OBJECT(guiCurFrame), "activate", GTK_SIGNAL_FUNC(UI_focusAfterActivate), (void *) ACT_JumpToFrame); // Volume gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,"hscalVolume")), "value_changed", GTK_SIGNAL_FUNC(volumeChange), (void *) NULL); // Jog gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,"jogg")), "value_changed", GTK_SIGNAL_FUNC(jogChange), (void *) NULL); // Time Shift gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,"spinbuttonTimeShift")), "focus_in_event", GTK_SIGNAL_FUNC(UI_grabFocus), (void *) NULL); gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,"spinbuttonTimeShift")), "focus_out_event", GTK_SIGNAL_FUNC(UI_loseFocus), (void *) NULL); gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,"spinbuttonTimeShift")), "activate", GTK_SIGNAL_FUNC(UI_focusAfterActivate), (void *) ACT_TimeShift); #define ADD_SIGNAL(a,b,c) gtk_signal_connect(GTK_OBJECT(a), b, GTK_SIGNAL_FUNC(guiCallback), (void *) c); ADD_SIGNAL(guiSlider,"value_changed",ACT_Scale); ADD_SIGNAL(lookup_widget(guiRootWindow,"spinbuttonTimeShift"),"value_changed",ACT_TimeShift); // Callbacks for buttons uint32_t nb=sizeof(buttonCallback)/sizeof(buttonCallBack_S); GtkWidget *bt; for(uint32_t i=0;i<nb;i++) { bt= lookup_widget (guiRootWindow,buttonCallback[i].name); if(!bt) { printf("Binding failed for %s\n",buttonCallback[i].name); ADM_assert(0); } ADD_SIGNAL(bt,buttonCallback[i].signal,buttonCallback[i].action); GTK_WIDGET_UNSET_FLAGS (bt, GTK_CAN_FOCUS); } GTK_WIDGET_SET_FLAGS (lookup_widget(guiRootWindow,"boxCurFrame"), GTK_CAN_FOCUS); // set some tuning gtk_widget_set_usize(guiDrawingArea, 512, 288); // hscale GTK_WIDGET_UNSET_FLAGS (guiSlider, GTK_CAN_FOCUS); gtk_widget_show(guiSlider); // And, the size now scales to the width of the window. gtk_widget_set_usize(guiSlider, 0, 0); // Plus, two-decimal precision. gtk_scale_set_digits(GTK_SCALE(guiSlider), 2); // And continuous updates! gtk_range_set_update_policy (GTK_RANGE (guiSlider), GTK_UPDATE_CONTINUOUS); gtk_range_set_range(GTK_RANGE(guiSlider),0,100.00); // keyboard events gtk_signal_connect(GTK_OBJECT(guiDrawingArea), "expose_event", GTK_SIGNAL_FUNC(on_drawingarea1_expose_event), NULL); // Finally add video codec... uint32_t nbVid; const char *name; GtkComboBox *combo_box; nbVid=encoderGetNbEncoder(); combo_box=GTK_COMBO_BOX(lookup_widget(guiRootWindow,VIDEO_WIDGET)); gtk_combo_box_remove_text(combo_box,0); printf("Found %d video encoder\n",nbVid); for(uint32_t i=0;i<nbVid;i++) { name=encoderGetIndexedName(i); gtk_combo_box_append_text (combo_box,QT_TR_NOOP(name)); } gtk_combo_box_set_active(combo_box,0); on_video_change(); // And A codec // Finally add video codec... uint32_t nbAud; nbAud=audioFilterGetNbEncoder(); combo_box=GTK_COMBO_BOX(lookup_widget(guiRootWindow,AUDIO_WIDGET)); gtk_combo_box_remove_text(combo_box,0); printf("Found %d audio encoder\n",nbAud); for(uint32_t i=0;i<nbAud;i++) { name=audioFilterGetIndexedName(i); gtk_combo_box_append_text (combo_box,QT_TR_NOOP(name)); } gtk_combo_box_set_active(combo_box,0); on_audio_change(); /* Fill in output format window */ uint32_t nbFormat; nbFormat=sizeof(ADM_allOutputFormat)/sizeof(ADM_FORMAT_DESC); combo_box=GTK_COMBO_BOX(lookup_widget(guiRootWindow,FORMAT_WIDGET)); gtk_combo_box_remove_text(combo_box,0); printf("Found %d Format \n",nbFormat); for(uint32_t i=0;i<nbFormat;i++) { gtk_combo_box_append_text (combo_box,QT_TR_NOOP(ADM_allOutputFormat[i].text)); } gtk_combo_box_set_active(combo_box,0); /* File in preview mode combobox */ const char *previewText[]= { QT_TR_NOOP("Input"), QT_TR_NOOP("Output"), QT_TR_NOOP("Side"), QT_TR_NOOP("Top"), QT_TR_NOOP("Separate") }; combo_box=GTK_COMBO_BOX(lookup_widget(guiRootWindow,PREVIEW_WIDGET)); gtk_combo_box_remove_text(combo_box,0); for(uint32_t i=0;i<sizeof(previewText)/sizeof(char*);i++) { name=previewText[i]; gtk_combo_box_append_text (combo_box,(name)); } gtk_combo_box_set_active(combo_box,0); // Format gtk_combo_box_set_active(GTK_COMBO_BOX(lookup_widget(guiRootWindow,FORMAT_WIDGET)),0); // gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,VIDEO_WIDGET)), "changed", GTK_SIGNAL_FUNC(on_video_change), NULL); gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,AUDIO_WIDGET)), "changed", GTK_SIGNAL_FUNC(on_audio_change), NULL); gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,PREVIEW_WIDGET)), "changed", GTK_SIGNAL_FUNC(on_preview_change), NULL); gtk_signal_connect(GTK_OBJECT(lookup_widget(guiRootWindow,FORMAT_WIDGET)), "changed", GTK_SIGNAL_FUNC(on_format_change), NULL); // Add initial recent files UI_updateRecentMenu( ); // //CYB 2005.02.22: DND (START) // Set up avidemux as an available drag'n'drop target. gtk_drag_dest_set(guiRootWindow, GTK_DEST_DEFAULT_ALL, target_table,sizeof(target_table)/sizeof(GtkTargetEntry), (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_DEFAULT)); g_signal_connect(GTK_OBJECT(guiRootWindow), "drag_data_received", GTK_SIGNAL_FUNC(DNDDataReceived),NULL); //CYB 2005.02.22: DND (END) // Allow shrink //GTK_WINDOW ( guiRootWindow ) ->allow_shrink = FALSE; //GTK_WINDOW ( guiDrawingArea ) ->allow_shrink = FALSE; // By default enable arrow keys UI_arrow_enabled(); // Add custom menu GUI_initCustom(); return 1; }